发送邮件常见错误总结

运维技术koyo 发表了文章 • 0 个评论 • 26 次浏览 • 19 小时前 • 来自相关话题

情况1:550 Mail content denied这种是内容的问题,用户加服务器IP白名单就可以了。
 
情况2:550 Connection denied出错原因:该服务器IP的发信频率大幅度超过QQ邮箱限制。

情况3:550 Connection frequency limited出错原因:该服务器IP的发信频率超过腾讯邮箱限制。

情况4:550 5.5.0 Invalid EHLO/HELO domain原因:邮箱不存在
 
情况5:status=deferred用户把我们发送邮件当作垃圾邮件过滤掉了
 
情况6:host xxx.mail.eo.outlook.com[xxx.xxx.163.247] said: 550
5.7.1 Service unavailable; Client host [xxx.xxx.xxx..16] blocked using FBLW15;
To request removal from this list please forward this message to
delist@messaging.microsoft.com (in reply to RCPT TO command)客户的邮件系统是Exchange,不知微软的过滤规则为何挡了邮件,为了让微软把我们移出黑名单,只能给他们发邮件申诉了,delist@messaging.microsoft.com,申诉邮件内容:Please Help me out to solve the belowisuue.
My Below IP Address are showing Blacklisted on below dns address IP Address:IP xxx.xxx.xxx.xxx . Please Help me and removemy ip from black list Thank you!
xxxxx十分钟以后,会收到微软回复的邮件:Hello ,
Thank you for your delisting request SRX1251909371ID. Your ticket was received on (Jun 25 2014 07:59 AM UTC) and will be responded to within 24 hours.
Our team will investigate the address that you have requested to be removed from our blocklist. If for any reason we are not able to remove your address, one of our technical support representatives will respond to you with additional information.
Regards,
Technical Support耐心等待微软恢复你的邮件白名单。

情况7:status=bounced (host mx54.dns.com.cn[220.181.130.176]said: 550 Does not like recipient,your
mail is rejected! (in reply to end of DATA command)); sender non-delivery notification: F20F2DD80FC;removed出错原因:对方某一台收件服务器当时正处在繁忙之中或者我们的服务器和对方链接并不是很顺畅
解决方法:有可能是暂时的情况,用别的地址测试一下,看看是否被退信,或者过一段时间再发送一下
 
情况8:1)status=bounced(hostmx3.qq.com[183.60.2.53]said:550Mailboxnotfound.http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000728 (in reply to RCPT TO command)); sender non-delivery notification: 9CC7FDD8084; removed
2)status=bounced (host 163mx01.mxmail.netease.com[220.181.12.62] said: 550 User not found: cjld@163.com (in reply to RCPT TO command)); sender non-delivery notification: 8FD7CA00013A; removed出错原因:收件人地址不存在或者收件人地址写错
解决方法:核对地址后重新发送
 
情况9:status=deferred(hostmxzwg4.mxhichina.com[58.68.254.104]said:450MI:IPBhttp://www.net.cn/service/faq/youx/mailsy/200905/3781.html (in reply to MAIL FROM command))出错原因:450MI:IPB发信IP被暂时禁止,请检查是否有用户发送病毒或者垃圾邮件。
解决方法:联系您的企业邮箱运营商
 
情况10:status=deferred(connecttoapllo-zm.com[60.191.124.236]:25:Connectiontimedout);from=<jinxiuren@hanshitx.com>, size=24500463, nrcpt=2 (queue active);解决方法:用nslookup查询对方邮箱服务器的ip地址,通过 telnet 对方服务器的25端口等方式确认是网络连接不正常还是由于对方服务器的25端口没有响应。一般说来,无论是网络故障还是对方系统故障,都能被对方系统管理员很快被发现和恢复,所以可以选择再次发送进行尝试。对于部分国外的邮件服务商,出现这种情况持续的时间会比较长,如果尝试超过1天都不能成功,建议先使用其他方式与收件人联系。
 
情况11:1)status=bounced (host sohumx1.sohu.com[220.181.26.202] said: 553 5.7.3 CONTENT REJECT:10.10.71.82.2011062016.XXD6ywq8:dspam check:5:http://mail.sohu.com/info/policy/12 (in reply to end of DATA command));
2)Recipient address rejected: User unknown in local recipient table出错原因:1)内容被拒绝,可能是收件人对所接收的邮件进行了设置,内容中含有特定词汇等会被拒绝
                   2)收件人地址被拒绝
        
解决方法:核实对方是否对内容及账户进行了设置之后重新发送

情况12:.Clienthostrejected: Access denied; from=<cici@ybxchina.com> to=<terancetan@lovelylace.com> proto=SMTP helo=<hjy1>出错原因:客户端主机被拒绝
解决方法:看一下客户端接收邮件服务器设置是否正确,“我的服务器需要身份验证”是否打钩,测试一下发信25口是否已连接
 
情况13: status=bounced (host mx1.mail.cnb.yahoo.com[203.209.228.250] said: 554 delivery error: dd Sorry your message to weixing201314@yahoo.com.cn cannot be delivered. This account has been disabled or discontinued [#102]. - mta1004.mail.cnb.yahoo.com (in reply to end of DATA command)); sender non-delivery notification: 1C580DD80B4; removed出错原因:对方账号被停用或者不可用
解决方法:正常退信,换账号发送
 
情况14:9status=bounced (message size 24864357 exceeds size limit 10240000 of server cluster4.us.messagelabs.com[98.126.139.202]); sender non-delivery notification: C6A3BDD8078; removed出错原因:邮件过大,超出对方单封邮件接收范围
解决方法:对方换账号,重新发送 查看全部
mail.png

情况1:
550 Mail content denied
这种是内容的问题,用户加服务器IP白名单就可以了。
 
情况2:
550 Connection denied
出错原因:该服务器IP的发信频率大幅度超过QQ邮箱限制。

情况3:
550 Connection frequency limited
出错原因:该服务器IP的发信频率超过腾讯邮箱限制。

情况4:
550 5.5.0 Invalid EHLO/HELO domain
原因:邮箱不存在
 
情况5:
status=deferred
用户把我们发送邮件当作垃圾邮件过滤掉了
 
情况6:
host xxx.mail.eo.outlook.com[xxx.xxx.163.247] said: 550
5.7.1 Service unavailable; Client host [xxx.xxx.xxx..16] blocked using FBLW15;
To request removal from this list please forward this message to
delist@messaging.microsoft.com (in reply to RCPT TO command)
客户的邮件系统是Exchange,不知微软的过滤规则为何挡了邮件,为了让微软把我们移出黑名单,只能给他们发邮件申诉了,delist@messaging.microsoft.com,申诉邮件内容:
Please Help me out to solve the belowisuue.
My Below IP Address are showing Blacklisted on below dns address IP Address:IP xxx.xxx.xxx.xxx . Please Help me and removemy ip from black list Thank you!
xxxxx
十分钟以后,会收到微软回复的邮件:
Hello ,
Thank you for your delisting request SRX1251909371ID. Your ticket was received on (Jun 25 2014 07:59 AM UTC) and will be responded to within 24 hours.
Our team will investigate the address that you have requested to be removed from our blocklist. If for any reason we are not able to remove your address, one of our technical support representatives will respond to you with additional information.
Regards,
Technical Support
耐心等待微软恢复你的邮件白名单。

情况7:
status=bounced (host mx54.dns.com.cn[220.181.130.176]said: 550 Does not like recipient,your
mail is rejected! (in reply to end of DATA command)); sender non-delivery notification: F20F2DD80FC;removed
出错原因:对方某一台收件服务器当时正处在繁忙之中或者我们的服务器和对方链接并不是很顺畅
解决方法:有可能是暂时的情况,用别的地址测试一下,看看是否被退信,或者过一段时间再发送一下
 
情况8:
1)status=bounced(hostmx3.qq.com[183.60.2.53]said:550Mailboxnotfound.http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000728 (in reply to RCPT TO command)); sender non-delivery notification: 9CC7FDD8084; removed
2)status=bounced (host 163mx01.mxmail.netease.com[220.181.12.62] said: 550 User not found: cjld@163.com (in reply to RCPT TO command)); sender non-delivery notification: 8FD7CA00013A; removed
出错原因:收件人地址不存在或者收件人地址写错
解决方法:核对地址后重新发送
 
情况9:
status=deferred(hostmxzwg4.mxhichina.com[58.68.254.104]said:450MI:IPBhttp://www.net.cn/service/faq/youx/mailsy/200905/3781.html (in reply to MAIL FROM command))
出错原因:450MI:IPB发信IP被暂时禁止,请检查是否有用户发送病毒或者垃圾邮件。
解决方法:联系您的企业邮箱运营商
 
情况10:
status=deferred(connecttoapllo-zm.com[60.191.124.236]:25:Connectiontimedout);from=<jinxiuren@hanshitx.com>, size=24500463, nrcpt=2 (queue active);
解决方法:用nslookup查询对方邮箱服务器的ip地址,通过 telnet 对方服务器的25端口等方式确认是网络连接不正常还是由于对方服务器的25端口没有响应。一般说来,无论是网络故障还是对方系统故障,都能被对方系统管理员很快被发现和恢复,所以可以选择再次发送进行尝试。对于部分国外的邮件服务商,出现这种情况持续的时间会比较长,如果尝试超过1天都不能成功,建议先使用其他方式与收件人联系。
 
情况11:
1)status=bounced (host sohumx1.sohu.com[220.181.26.202] said: 553 5.7.3 CONTENT REJECT:10.10.71.82.2011062016.XXD6ywq8:dspam check:5:http://mail.sohu.com/info/policy/12 (in reply to end of DATA command));
2)Recipient address rejected: User unknown in local recipient table
出错原因:1)内容被拒绝,可能是收件人对所接收的邮件进行了设置,内容中含有特定词汇等会被拒绝
                   2)收件人地址被拒绝
        
解决方法:核实对方是否对内容及账户进行了设置之后重新发送

情况12:
.Clienthostrejected: Access denied; from=<cici@ybxchina.com> to=<terancetan@lovelylace.com> proto=SMTP helo=<hjy1>
出错原因:客户端主机被拒绝
解决方法:看一下客户端接收邮件服务器设置是否正确,“我的服务器需要身份验证”是否打钩,测试一下发信25口是否已连接
 
情况13:
 status=bounced (host mx1.mail.cnb.yahoo.com[203.209.228.250] said: 554 delivery error: dd Sorry your message to weixing201314@yahoo.com.cn cannot be delivered. This account has been disabled or discontinued [#102]. - mta1004.mail.cnb.yahoo.com (in reply to end of DATA command)); sender non-delivery notification: 1C580DD80B4; removed
出错原因:对方账号被停用或者不可用
解决方法:正常退信,换账号发送
 
情况14:
9status=bounced (message size 24864357 exceeds size limit 10240000 of server cluster4.us.messagelabs.com[98.126.139.202]); sender non-delivery notification: C6A3BDD8078; removed
出错原因:邮件过大,超出对方单封邮件接收范围
解决方法:对方换账号,重新发送

Python生成器解析式和Zip函数介绍

编程语言采菊篱下 发表了文章 • 0 个评论 • 28 次浏览 • 2 天前 • 来自相关话题

生成器解析式

对列表解析来说,只需要简单的把中括号换成小括号就可以了,生成器解析式是按需计算的或者说延迟计算的或者叫惰性求值。
 
#!/usr/bin/env python3
# Author: nock

def inc(x):
print('inc {0}'.format(x))
return x + 1

# 生成一个迭代器对象
obj = (inc(x) for x in range(10))
print(obj)

Result:
<generator object <genexpr> at 0x107d87678>#!/usr/bin/env python3
# Author: nock

# 生成一个迭代器对象
obj = (x for x in range(10))
l = [x for x in range(10)]

print(next(obj))
print(next(obj))
print(next(obj))

print(l[4])
try:
print(obj[1])
except Exception as e:
print("Exception is: {0}".format(e))
print(next(obj))Result:
0
1
2
4
Exception is: 'generator' object is not subscriptable
3生成器无下标获取。
 

Zip





zip 函数用于合并多个可迭代对象,合并后的长度等于最短的可迭代对象的长度 查看全部


生成器解析式


对列表解析来说,只需要简单的把中括号换成小括号就可以了,生成器解析式是按需计算的或者说延迟计算的或者叫惰性求值。
 
#!/usr/bin/env python3
# Author: nock

def inc(x):
print('inc {0}'.format(x))
return x + 1

# 生成一个迭代器对象
obj = (inc(x) for x in range(10))
print(obj)

Result:
<generator object <genexpr> at 0x107d87678>
#!/usr/bin/env python3
# Author: nock

# 生成一个迭代器对象
obj = (x for x in range(10))
l = [x for x in range(10)]

print(next(obj))
print(next(obj))
print(next(obj))

print(l[4])
try:
print(obj[1])
except Exception as e:
print("Exception is: {0}".format(e))
print(next(obj))
Result:
0
1
2
4
Exception is: 'generator' object is not subscriptable
3
生成器无下标获取。
 


Zip


zip.png

zip 函数用于合并多个可迭代对象,合并后的长度等于最短的可迭代对象的长度

Docker数据将根分区磁盘占满了

大数据/云计算push 回复了问题 • 2 人关注 • 1 个回复 • 22 次浏览 • 2 天前 • 来自相关话题

代理到底有几种功能模式?

运维技术Ansible 发表了文章 • 0 个评论 • 171 次浏览 • 3 天前 • 来自相关话题

通常我们都知道Nginx性能很高,尤其是作为一个代理服务器,因为它用的是epoll模型,就比如Python Django Web的性能不行,我们可能就会在前端加一个nginx代理,从而提高总体的处理性能问题,但是我们常说的代理,值的是什么类型的代理呢,你知道吗?
 
代理服务技术是在互联网早期就出现被使用的。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。常用的代理技术分为正向代理、反向代理和透明代理。本文就是针对这三种代理来讲解一些基本原理和具体的适用范围和nginx的配置案例,便于大家更深入理解代理服务技术。
 

一、正向代理(Forward Proxy)

一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。
 
正向代理(forward)是一个位于客户端 【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理,如下图所示:




从上面的概念中,我们看出,文中所谓的正向代理就是代理服务器【Z】替代访问方【用户A】去访问目标服务器【服务器B】。
 
这就是正向代理的意义所在。而为什么要用代理服务器【Z】去代替访问方【用户A】去访问服务器【B】呢?为什么不直接访问呢,这就要从场景和代理服务器使用的意义说起。
 
使用正向代理的意义和场景有如下几种:
 
1、用户访问本来无法访问的服务器B的资源




假设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。但是如果用户A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在路由器R1或R2节点中,而是通过其它的路由节点访问服务器B,那么用户A就可以得到服务器B的数据了。

现实中的例子就是“翻墙”。不过自从VPN技术被广泛应用外,“翻墙”不但使用了传统的正向代理技术,有的还使用了VPN技术。
 
2、加速访问服务器B资源
这种说法目前不像以前那么流行了,主要是带宽流量的飞速发展。早期的正向代理中,很多人使用正向代理就是提速。
 
还是如图2假设用户A到服务器B,经过R1路由器和R2路由器,而R1到R2路由器的链路是一个低带宽链路。而用户A到代理服务器Z,从代理服务器Z到服务器B都是高带宽链路。那么很显然就可以加速访问服务器B了。
 
3、Cache作用




Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术。如上图所示,如果在用户A访问服务器B某数据F之前,已经有人通过代理服务器Z访问过服务器B上得数据F,那么代理服务器Z会把数据F保存一段时间,如果有人正好取该数据F,那么代理服务器Z不再访问服务器B,而把缓存的数据F直接发给用户A。这一技术在Cache中术语就叫Cache命中。如果有更多的像用户A的用户来访问代理服务器Z,那么这些用户都可以直接从代理服务器Z中取得数据F,而不用千里迢迢的去服务器B下载数据了。
 
4、客户端访问授权
这方面的内容现今使用的还是比较多的,例如一些公司采用ISA Server做为正向代理服务器来授权用户是否有权限访问互联网,如下图所示:




如上图防火墙作为网关,用来过滤外网对其的访问。假设用户A和用户B都设置了代理服务器,用户A允许访问互联网,而用户B不允许访问互联网(这个在代理服务器Z上做限制)这样用户A因为授权,可以通过代理服务器访问到服务器B,而用户B因为没有被代理服务器Z授权,所以访问服务器B时,数据包会被直接丢弃。
 
5、隐藏访问者的行踪
如下图所示,我们可以看出服务器B并不知道访问自己的实际是用户A,因为代理服务器Z代替用户A去直接与服务器B进行交互。如果代理服务器Z被用户A完全控制(或不完全控制),会惯以“肉鸡”术语称呼。




 
总结正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
 
Nginx正向代理配置示例如下:
server{
resolver 8.8.8.8;
resolver_timeout 30s;
listen 82;
location / {
proxy_pass http://$http_host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
}
}1、不能有hostname。 
2、必须有resolver, 即dns,即上面的8.8.8.8,超时时间(30秒)可选。 
3、配置正向代理参数,均是由 Nginx 变量组成。
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host; 4、配置缓存大小,关闭磁盘缓存读写减少I/O,以及代理连接超时时间。
proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30; 5、配置代理服务器 Http 状态缓存时间。  
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m; 配置好后,重启nginx,以浏览器为例,要使用这个代理服务器,则只需将浏览器代理设置为http://+服务器ip地址+:+82(82是刚刚设置的端口号)即可使用了。


二、反向代理(reverse proxy)

反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
 
使用反向代理服务器的作用如下:
 
1、保护和隐藏原始资源服务器




用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。
 
2、负载均衡




当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。

当然反向代理服务器像正向代理服务器一样拥有Cache的作用,它可以缓存原始资源服务器B的资源,而不是每次都要向原始资源服务器组请求数据,特别是一些静态的数据,比如图片和文件,如果这些反向代理服务器能够做到和用户X来自同一个网络,那么用户X访问反向代理服务器X,就会得到很高质量的速度。这正是CDN技术的核心。如下图所示:




我们并不是讲解CDN,所以去掉了CDN最关键的核心技术智能DNS。只是展示CDN技术实际上利用的正是反向代理原理这块。

反向代理结论与正向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

基本上,网上做正反向代理的程序很多,能做正向代理的软件大部分也可以做反向代理。开源软件中最流行的就是squid,既可以做正向代理,也有很多人用来做反向代理的前端服务器。另外MS ISA也可以用来在Windows平台下做正向代理。反向代理中最主要的实践就是WEB服务,近些年来最火的就是Nginx了。网上有人说Nginx不能做正向代理,其实是不对的。Nginx也可以做正向代理,不过用的人比较少了。
 
Nginx反向代理示例:
http {
# 省略了前面一般的配置,直接从负载均衡这里开始
# 设置地址池,后端3台服务器
upstream http_server_pool {
server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=30s;
server 192.168.1.3:8080 weight=3 max_fails=2 fail_timeout=30s;
server 192.168.1.4:8080 weight=4 max_fails=2 fail_timeout=30s;
}
# 一个虚拟主机,用来反向代理http_server_pool这组服务器
server {
listen 80;
# 外网访问的域名
server_name www.test.com;
location / {
# 后端服务器返回500 503 404错误,自动请求转发到upstream池中另一台服务器
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_pass http://http_server_pool;
proxy_set_header Host www.test.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log logs/www.test.com.access.log combined;
}
}最简单的反向代理演示(在一台服务器上做代理服务器,将http请求转发到另一台IIS服务器上,通过二级域名形式访问。)编辑vim nginx.conf
server {
listen 80;
server_name test.zhoumengkang.com;
location / {
proxy_pass http://121.199.**.*:80;
}
}参考:http://www.blogjava.net/xiaomage234/archive/2011/09/08/358247.html 
 

三、透明代理

如果把正向代理、反向代理和透明代理按照人类血缘关系来划分的话。那么正向代理和透明代理是很明显堂亲关系,而正向代理和反向代理就是表亲关系了 。

透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。

透明代理实践的例子就是时下很多公司使用的行为管理软件。如下图所示:




用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据。
 
Nginx透明代理配置示例:
# cat /etc/nginx/sites-enabled/proxy
server {
resolver 8.8.8.8;
access_log off;
listen [::]:8080;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
}
}

iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080RAW Paste Data# cat /etc/nginx/sites-enabled/proxy
server {
resolver 8.8.8.8;
access_log off;
listen [::]:8080;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
}
}

iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080参考:
http://z00w00.blog.51cto.com/515114/1031287  
https://mengkang.net/78.html   查看全部
通常我们都知道Nginx性能很高,尤其是作为一个代理服务器,因为它用的是epoll模型,就比如Python Django Web的性能不行,我们可能就会在前端加一个nginx代理,从而提高总体的处理性能问题,但是我们常说的代理,值的是什么类型的代理呢,你知道吗?
 
代理服务技术是在互联网早期就出现被使用的。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。常用的代理技术分为正向代理、反向代理和透明代理。本文就是针对这三种代理来讲解一些基本原理和具体的适用范围和nginx的配置案例,便于大家更深入理解代理服务技术。
 


一、正向代理(Forward Proxy)


一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。
 
正向代理(forward)是一个位于客户端 【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理,如下图所示:
ForwardAgent.png

从上面的概念中,我们看出,文中所谓的正向代理就是代理服务器【Z】替代访问方【用户A】去访问目标服务器【服务器B】。
 
这就是正向代理的意义所在。而为什么要用代理服务器【Z】去代替访问方【用户A】去访问服务器【B】呢?为什么不直接访问呢,这就要从场景和代理服务器使用的意义说起。
 
使用正向代理的意义和场景有如下几种:
 
1、用户访问本来无法访问的服务器B的资源
SpeedAccess.png

假设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点,如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。但是如果用户A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在路由器R1或R2节点中,而是通过其它的路由节点访问服务器B,那么用户A就可以得到服务器B的数据了。

现实中的例子就是“翻墙”。不过自从VPN技术被广泛应用外,“翻墙”不但使用了传统的正向代理技术,有的还使用了VPN技术。
 
2、加速访问服务器B资源
这种说法目前不像以前那么流行了,主要是带宽流量的飞速发展。早期的正向代理中,很多人使用正向代理就是提速。
 
还是如图2假设用户A到服务器B,经过R1路由器和R2路由器,而R1到R2路由器的链路是一个低带宽链路。而用户A到代理服务器Z,从代理服务器Z到服务器B都是高带宽链路。那么很显然就可以加速访问服务器B了。
 
3、Cache作用
CacheFile.png

Cache(缓存)技术和代理服务技术是紧密联系的(不光是正向代理,反向代理也使用了Cache(缓存)技术。如上图所示,如果在用户A访问服务器B某数据F之前,已经有人通过代理服务器Z访问过服务器B上得数据F,那么代理服务器Z会把数据F保存一段时间,如果有人正好取该数据F,那么代理服务器Z不再访问服务器B,而把缓存的数据F直接发给用户A。这一技术在Cache中术语就叫Cache命中。如果有更多的像用户A的用户来访问代理服务器Z,那么这些用户都可以直接从代理服务器Z中取得数据F,而不用千里迢迢的去服务器B下载数据了。
 
4、客户端访问授权
这方面的内容现今使用的还是比较多的,例如一些公司采用ISA Server做为正向代理服务器来授权用户是否有权限访问互联网,如下图所示:
AccessAuth.png

如上图防火墙作为网关,用来过滤外网对其的访问。假设用户A和用户B都设置了代理服务器,用户A允许访问互联网,而用户B不允许访问互联网(这个在代理服务器Z上做限制)这样用户A因为授权,可以通过代理服务器访问到服务器B,而用户B因为没有被代理服务器Z授权,所以访问服务器B时,数据包会被直接丢弃。
 
5、隐藏访问者的行踪
如下图所示,我们可以看出服务器B并不知道访问自己的实际是用户A,因为代理服务器Z代替用户A去直接与服务器B进行交互。如果代理服务器Z被用户A完全控制(或不完全控制),会惯以“肉鸡”术语称呼。
Hidden.png

 
总结正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的端口。
 
Nginx正向代理配置示例如下:
server{
resolver 8.8.8.8;
resolver_timeout 30s;
listen 82;
location / {
proxy_pass http://$http_host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
}
}
1、不能有hostname。 
2、必须有resolver, 即dns,即上面的8.8.8.8,超时时间(30秒)可选。 
3、配置正向代理参数,均是由 Nginx 变量组成。
proxy_pass $scheme://$host$request_uri;  
proxy_set_header Host $http_host;
4、配置缓存大小,关闭磁盘缓存读写减少I/O,以及代理连接超时时间。
proxy_buffers 256 4k;  
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
5、配置代理服务器 Http 状态缓存时间。  
proxy_cache_valid 200 302 10m;  
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
配置好后,重启nginx,以浏览器为例,要使用这个代理服务器,则只需将浏览器代理设置为http://+服务器ip地址+:+82(82是刚刚设置的端口号)即可使用了。


二、反向代理(reverse proxy)


反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。
 
使用反向代理服务器的作用如下:
 
1、保护和隐藏原始资源服务器
RevProxy.png

用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。
 
2、负载均衡
LoadBlance.png

当反向代理服务器不止一个的时候,我们甚至可以把它们做成集群,当更多的用户访问资源服务器B的时候,让不同的代理服务器Z(x)去应答不同的用户,然后发送不同用户需要的资源。

当然反向代理服务器像正向代理服务器一样拥有Cache的作用,它可以缓存原始资源服务器B的资源,而不是每次都要向原始资源服务器组请求数据,特别是一些静态的数据,比如图片和文件,如果这些反向代理服务器能够做到和用户X来自同一个网络,那么用户X访问反向代理服务器X,就会得到很高质量的速度。这正是CDN技术的核心。如下图所示:
CdnProxy.png

我们并不是讲解CDN,所以去掉了CDN最关键的核心技术智能DNS。只是展示CDN技术实际上利用的正是反向代理原理这块。

反向代理结论与正向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

基本上,网上做正反向代理的程序很多,能做正向代理的软件大部分也可以做反向代理。开源软件中最流行的就是squid,既可以做正向代理,也有很多人用来做反向代理的前端服务器。另外MS ISA也可以用来在Windows平台下做正向代理。反向代理中最主要的实践就是WEB服务,近些年来最火的就是Nginx了。网上有人说Nginx不能做正向代理,其实是不对的。Nginx也可以做正向代理,不过用的人比较少了。
 
Nginx反向代理示例:
http {
# 省略了前面一般的配置,直接从负载均衡这里开始
# 设置地址池,后端3台服务器
upstream http_server_pool {
server 192.168.1.2:8080 weight=2 max_fails=2 fail_timeout=30s;
server 192.168.1.3:8080 weight=3 max_fails=2 fail_timeout=30s;
server 192.168.1.4:8080 weight=4 max_fails=2 fail_timeout=30s;
}
# 一个虚拟主机,用来反向代理http_server_pool这组服务器
server {
listen 80;
# 外网访问的域名
server_name www.test.com;
location / {
# 后端服务器返回500 503 404错误,自动请求转发到upstream池中另一台服务器
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_pass http://http_server_pool;
proxy_set_header Host www.test.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log logs/www.test.com.access.log combined;
}
}
最简单的反向代理演示(在一台服务器上做代理服务器,将http请求转发到另一台IIS服务器上,通过二级域名形式访问。)编辑vim nginx.conf
server {
listen 80;
server_name test.zhoumengkang.com;
location / {
proxy_pass http://121.199.**.*:80;
}
}
参考:http://www.blogjava.net/xiaomage234/archive/2011/09/08/358247.html 
 


三、透明代理


如果把正向代理、反向代理和透明代理按照人类血缘关系来划分的话。那么正向代理和透明代理是很明显堂亲关系,而正向代理和反向代理就是表亲关系了 。

透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的request fields(报文),并会传送真实IP。注意,加密的透明代理则是属于匿名代理,意思是不用设置使用代理了。

透明代理实践的例子就是时下很多公司使用的行为管理软件。如下图所示:
tmproxy.png

用户A和用户B并不知道行为管理设备充当透明代理行为,当用户A或用户B向服务器A或服务器B提交请求的时候,透明代理设备根据自身策略拦截并修改用户A或B的报文,并作为实际的请求方,向服务器A或B发送请求,当接收信息回传,透明代理再根据自身的设置把允许的报文发回至用户A或B,如上图,如果透明代理设置不允许访问服务器B,那么用户A或者用户B就不会得到服务器B的数据。
 
Nginx透明代理配置示例:
# cat /etc/nginx/sites-enabled/proxy
server {
resolver 8.8.8.8;
access_log off;
listen [::]:8080;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
}
}

iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080
RAW Paste Data
# cat /etc/nginx/sites-enabled/proxy
server {
resolver 8.8.8.8;
access_log off;
listen [::]:8080;
location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
proxy_buffers 256 4k;
proxy_max_temp_file_size 0k;
}
}

iptables -t nat -A PREROUTING -s 10.8.0.0/24 -p tcp --dport 80 -j DNAT --to 192.168.0.253:8080
参考:
http://z00w00.blog.51cto.com/515114/1031287  
https://mengkang.net/78.html  

卓易科技-业务运维 [上海招聘]

回复

求职招聘信息OpenSkill 发起了问题 • 1 人关注 • 0 个回复 • 69 次浏览 • 5 天前 • 来自相关话题

MYSQL不同库质检查询

数据库采菊篱下 回复了问题 • 2 人关注 • 1 个回复 • 48 次浏览 • 5 天前 • 来自相关话题

解锁Python集合推导式和字典推导式

编程语言采菊篱下 发表了文章 • 0 个评论 • 51 次浏览 • 5 天前 • 来自相关话题

集合推导式

集合推导式(set comprehensions)跟列表推导式也是类似的, 唯一的区别在于它们使用大括号{}表示。Code:
sets = {x for x in range(10)}
Result:
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}



集合解析把列表解析中的中括号变成大括号,返回集合。
 
下面我们来个应用场景,一直一个列表中有很多元素,我们做到快速去重。Code:
heavy = {x for x in [2, 3, 5, 3, 5, 2, 6]}
print(heavy)
Result:
{2, 3, 5, 6}集合推导式生成内容,结果要是可hash的:





字典推导式

字典推导式(dict comprehensions)和列表推导的使用方法也是类似的。




字典解析也是使用大括号包围,并且需要两个表达式,一个生成key, 一个生成value 两个表达式之间使用冒号分割,返回结果是字典.

说了这么多推导式,为什么没有元组推导式呢,元组和列表的操作几乎是一样的,除了不可变特性以外Code:
tuple([x for x in range(10)])
Result:
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 查看全部


集合推导式


集合推导式(set comprehensions)跟列表推导式也是类似的, 唯一的区别在于它们使用大括号{}表示。
Code:
sets = {x for x in range(10)}
Result:
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
type.png

集合解析把列表解析中的中括号变成大括号,返回集合。
 
下面我们来个应用场景,一直一个列表中有很多元素,我们做到快速去重。
Code:
heavy = {x for x in [2, 3, 5, 3, 5, 2, 6]}
print(heavy)
Result:
{2, 3, 5, 6}
集合推导式生成内容,结果要是可hash的:
hashable.png


字典推导式


字典推导式(dict comprehensions)和列表推导的使用方法也是类似的。
dictreb.png

字典解析也是使用大括号包围,并且需要两个表达式,一个生成key, 一个生成value 两个表达式之间使用冒号分割,返回结果是字典.

说了这么多推导式,为什么没有元组推导式呢,元组和列表的操作几乎是一样的,除了不可变特性以外
Code:
tuple([x for x in range(10)])
Result:
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

Python使用类来写装饰器

编程语言采菊篱下 发表了文章 • 0 个评论 • 48 次浏览 • 6 天前 • 来自相关话题

前两天发现了装饰器可以直接使用类来写,分享一下,需要用类里面的__call__方法,__call__方法就是可以把这个实例当成一个函数来调用,如果正常使用类里面的方法的话,实例方法要先实例化类,然后才能调用,静态方法、类方法则需要用类名或者实例化之后的对象来调用,而实例化之后的这个对象,是不能被调用的,__call__方法就是把这个实例变成一个可以调用的对象,也就是说实例化之后,这个对象就可以和一个普通函数一样被调用。

示例代码如下:
class Foo:
def __call__(self, *args, **kwargs):
print('call....')
def test(self):#
print('test....')
if __name__ == '__main__':
t = Foo()#实例化类
t.test()#正常调用实例方法
t()#直接调用实例化之后的对象运行结果:
>>>test.... #这个是调用test方法的时候输出的
>>>call....#这个是执行调用这个实例化之后的方法输出的理解了上面的之后,就可以使用class来写一个装饰器了,计算程序的运行时间,当然思想和以前用函数写装饰器是一样的
class Fuck(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
import time
start_time = time.time()
res = self.func(*args, **kwargs)
end_time = time.time()
print('the function "%s" run time is %s' % (self.func.__name__,
(end_time - start_time)))
return res
@Fuck
def run(name):
import time
time.sleep(1)
return 'sb_%s' % name
print(run('hyf'))运行结果:
>>>the function "run" run time is 1.0001001358032227#这个是装饰器帮我们计算的函数运行时间
>>>sb_hyf#这个是正常运行run函数的时候,返回的值
原文地址:http://www.nnzhp.cn/blog/2017/01/16/1/  查看全部
前两天发现了装饰器可以直接使用类来写,分享一下,需要用类里面的__call__方法,__call__方法就是可以把这个实例当成一个函数来调用,如果正常使用类里面的方法的话,实例方法要先实例化类,然后才能调用,静态方法、类方法则需要用类名或者实例化之后的对象来调用,而实例化之后的这个对象,是不能被调用的,__call__方法就是把这个实例变成一个可以调用的对象,也就是说实例化之后,这个对象就可以和一个普通函数一样被调用。

示例代码如下:
class Foo:
def __call__(self, *args, **kwargs):
print('call....')
def test(self):#
print('test....')
if __name__ == '__main__':
t = Foo()#实例化类
t.test()#正常调用实例方法
t()#直接调用实例化之后的对象
运行结果:
>>>test.... #这个是调用test方法的时候输出的
>>>call....#这个是执行调用这个实例化之后的方法输出的
理解了上面的之后,就可以使用class来写一个装饰器了,计算程序的运行时间,当然思想和以前用函数写装饰器是一样的
class Fuck(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
import time
start_time = time.time()
res = self.func(*args, **kwargs)
end_time = time.time()
print('the function "%s" run time is %s' % (self.func.__name__,
(end_time - start_time)))
return res
@Fuck
def run(name):
import time
time.sleep(1)
return 'sb_%s' % name
print(run('hyf'))
运行结果:
>>>the function "run" run time is 1.0001001358032227#这个是装饰器帮我们计算的函数运行时间
>>>sb_hyf#这个是正常运行run函数的时候,返回的值
原文地址:http://www.nnzhp.cn/blog/2017/01/16/1/ 

解锁Python列表推导式

编程语言采菊篱下 发表了文章 • 0 个评论 • 66 次浏览 • 2017-03-18 00:28 • 来自相关话题

Pythonic的核心就是Python之禅,而Python的列表推导式就得以很好的体现。

列表推导式

定义:
列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表。

它的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是0个或多个for或者if语句。那个表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以if和for语句为上下文的表达式运行完成之后产生。
 
列表解析的一般形式:
[expr for item in itratorable]
Code: [2 ** n for n in range(10)]

Result: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]



列表解析返回的是列表, 列表的内容是表达式执行的结果.
 
[expr for item in iterable if cond]

[x ** 0.5 for x in range(10) if x % 2 == 0]
[0.0, 1.4142135623730951, 2.0, 2.449489742783178, 2.8284271247461903][expr for item in iterable if cond1 if cond2]

[x for x in range(10) if x % 2 == 0 if x > 1]
[2, 4, 6, 8][expr for item1 in iterable1 for item2 in iterable2]

[(x, y) for x in range(10) for y in range(10) if (x+y) %2 == 0]







列表解析用于对可迭代对象做过滤和转换,返回值是列表.
 
特性一:代码变短,可读性更好




从上图代码示例中我们明显可以看出,列表推导式相比常规方法,写出来的代码更加符合pythonic,更加简短,可读性更好。
 
有些人甚至更喜欢使用它而不是filter函数生成列表,但是当你使用列表推导式效果会更加,列表推导式在有些情况下超赞,特别是当你需要使用for循环来生成一个新列表.
 
特征二:推导式速度更快
#!/usr/bin/env python3
# author: nock
import timeit

lst = list(range(10))
# 常规方法
def origin(lst):
plus_one = []
for i in lst:
plus_one.append(i + 1)
return plus_one

# 列表推导式
def fast(lst):
return [ x + 1 for x in lst ]

otime = timeit.timeit('origin(range(10))', globals=globals())
print("func origin exec time is {0}".format(otime))

ftime = timeit.timeit('fast(range(10))', globals=globals())
print("func origin exec time is {0}".format(ftime))结果:
func origin exec time is 2.1059355960023822
func origin exec time is 1.6507169340038672
如果你使用map或者filter结合lambda生成列表,也是没有列表推导式速度快的,有兴趣的可以自己Coding一下。
  查看全部
Pythonic的核心就是Python之禅,而Python的列表推导式就得以很好的体现。


列表推导式


定义:
列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表。

它的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是0个或多个for或者if语句。那个表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以if和for语句为上下文的表达式运行完成之后产生。
 
列表解析的一般形式:
[expr for item in itratorable]

Code: [2 ** n for n in range(10)]

Result: [1, 2, 4, 8, 16, 32, 64, 128, 256, 512]
listresult.png

列表解析返回的是列表, 列表的内容是表达式执行的结果.
 
[expr for item in iterable if cond]

[x ** 0.5 for x in range(10) if x % 2 == 0]
[0.0, 1.4142135623730951, 2.0, 2.449489742783178, 2.8284271247461903]
[expr for item in iterable if cond1 if cond2]

[x for x in range(10) if x % 2 == 0 if x > 1]
[2, 4, 6, 8]
[expr for item1 in iterable1 for item2 in iterable2]

[(x, y) for x in range(10) for y in range(10) if (x+y) %2 == 0]
listerror.png

listdie.png

列表解析用于对可迭代对象做过滤和转换,返回值是列表.
 
特性一:代码变短,可读性更好
list.png

从上图代码示例中我们明显可以看出,列表推导式相比常规方法,写出来的代码更加符合pythonic,更加简短,可读性更好。
 
有些人甚至更喜欢使用它而不是filter函数生成列表,但是当你使用列表推导式效果会更加,列表推导式在有些情况下超赞,特别是当你需要使用for循环来生成一个新列表.
 
特征二:推导式速度更快
#!/usr/bin/env python3
# author: nock
import timeit

lst = list(range(10))
# 常规方法
def origin(lst):
plus_one = []
for i in lst:
plus_one.append(i + 1)
return plus_one

# 列表推导式
def fast(lst):
return [ x + 1 for x in lst ]

otime = timeit.timeit('origin(range(10))', globals=globals())
print("func origin exec time is {0}".format(otime))

ftime = timeit.timeit('fast(range(10))', globals=globals())
print("func origin exec time is {0}".format(ftime))
结果:
func origin exec time is 2.1059355960023822
func origin exec time is 1.6507169340038672

如果你使用map或者filter结合lambda生成列表,也是没有列表推导式速度快的,有兴趣的可以自己Coding一下。
 

Nginx缓存静态页面

运维技术mark 发表了文章 • 0 个评论 • 114 次浏览 • 2017-03-16 15:01 • 来自相关话题

首先介绍一下弄这个的初衷。
其实初衷很简单公司需要这个,然后你就去实现没有什么更高大上的理由,原理什么的我也不打算介绍了, 个人不太喜欢这些咬文爵字的东西。
 
其次做这个需要用到ngx_cache_purge 缓存模块。
不清楚自己的nginx有没有添加这个模块的童鞋可以使用nginx -V查看具体如下:[root@localhost sbin]# ./nginx -V
nginx version: nginx/1.10.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --add-module=/root/ngx_cache_purge-2.3 --with-http_perl_module --with-ld-opt=-Wl,-E

如果看到了ngx_cache_purge则已经添加了这个模块。你可以直接跳到最下面看看是不是你想要的, 好了,废话不多说。

一、编译安装Nginx

首先下载nginx和ngx_cache_purge 缓存模块
附:
nginx下载地址:http://nginx.org/download/nginx-1.10.3.tar.gz
ngx_cache_purge下载地址:http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
 
开始编译安装cd /usr/local/
wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar zxvf nginx-1.10.3.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar -xvf ngx_cache_purge-2.3.tar.gz
./configure --prefix=/usr/local/nginx --add-module=../ngx_cache_purge-2.3 --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_perl_module --with-ld-opt="-Wl,-E"


 附Nginx编译安装时可能遇到的问题:/configure: error: the HTTP rewrite module requires the PCRE library.
解决方法:安装pcre
# yum -y install pcre pcre-devel

缺少ssl错误,错误信息如下:
./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library. You can either disable the module by using
--without-http-cache option, or install the OpenSSL library into the system,
or build the OpenSSL library statically from the source with nginx by using
--with-http_ssl_module --with-openssl=<path> options.
解决方法:安装openssl
# yum -y install openssl openssl-devel

缺少编译器,错误信息如下:
./configure: error: C compiler cc is not found
解决方法:安装gcc-c++
# yum -y install gcc-c++ autoconf automake
autoconf是自动配置,automake是自动编译

缺少zlib包,错误信息如下:
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using –without-http_gzip_module
option, or install the zlib library into the system, or build the zlib
library
statically from the source with nginx by using –with-zlib=<path> option.
解决方法:安装zlib
# yum install -y zlib-devel

缺少libxml2,错误信息如下:
./configure: error: the HTTP XSLT module requires the libxml2/libxslt
libraries. You can either do not enable the module or install the libraries.
解决方法:
# yum -y install libxml2 libxml2-dev
# yum -y install libxslt-devel

http_image_filter_module是nginx提供的集成图片处理模块,需要gd-devel的支持,错误信息如下:
./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.
解决方法:
# yum -y install gd-devel

缺少ExtUtils,错误信息如下:
./configure: error: perl module ExtUtils::Embed is required
解决方法:
# yum -y install perl-devel perl-ExtUtils-Embed

缺少GeoIP,错误信息如下:
./configure: error: the GeoIP module requires the GeoIP library.
You can either do not enable the module or install the library.
解决方法:
# yum -y install GeoIP GeoIP-devel GeoIP-data

 

二、配置nginx.conf

安装完成后编辑nginx的配置文件位于/usr/local/nginx/conf/nginx.conf# cd /usr/local/nginx/conf/
# cp nginx.conf nginx.conf.bak #先将nginx的配置文件进行备份
可以利用nginx -V查看是否添加了ngx_cache_purge 缓存模块(如何查看文章头部)
配置的一些详细的参数我在我的nginx配置文件中有详细的注释。
所以这里就不多讲,可以根据我的进行修改
最后附上自己的配置文件[root@localhost sbin]# cat ../conf/nginx.conf
user nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
worker_connections 1024; #单个后台worker process进程的最大并发链接数
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间
tcp_nodelay on;
gzip on; #开启gzip压缩
gzip_disable "MSIE [1-6].";
client_header_buffer_size 128k; #设定请求缓冲
large_client_header_buffers 4 128k;
proxy_buffering on; #开启代理缓存
proxy_connect_timeout 5; #连接超时时间,超时时间设置不要超过75秒,至于为什么i don't konw
proxy_read_timeout 60; #设置与代理服务器两次读取的间隔时间
proxy_send_timeout 5; #设置后端服务器数据回传时间就是在规定时间之内后端服务器必须传完所有的数据,如果超时nginx会关闭连接
proxy_buffer_size 16k; #设置nginx保存用户头部信息的缓存区大小
proxy_buffers 4 64k; #缓存区大小
proxy_busy_buffers_size 128k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 128k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_path /tmp/temp_cache1; #临时缓存目录
proxy_cache_path /tmp/cache1 levels=1:2 keys_zone=cache_one:200m inactive=30d max_size=5g;
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,30天没有被访问的内容自动清除,硬盘缓存空间大小为5GB。

#定义反向代理
upstream backend_server {
server 192.168.58.139:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.58.140:80 weight=1 max_fails=2 fail_timeout=30s;
}

server {
listen 80;
server_name localhost;

# #charset koi8-r;
# #access_log logs/host.access.log main;

#缓存html页面,可以缓存伪静态
location ~ .*\.html$ {
proxy_pass http://backend_server;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_next_upstream http_502 http_504 error timeout invalid_header; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_cache_valid 200 302 1d; #状态为200、302的缓存1天
proxy_cache_valid 301 2d; #状态为301的缓存2天
proxy_cache_valid any 1m; #有效缓存大小
expires 1d; #浏览器过期时间设置1天
proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; #忽略头部禁止缓存申明,类似与CDN的强制缓存功能
add_header Nginx-Cache "$upstream_cache_status"; #在header中插入缓存状态,命中缓存为HIT,没命中则为MISS
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

#禁止访问 .htxxx 文件
location ~ /\.ht {
deny all;
}

#用于清除缓存,假设一个URL为http://192.168.8.42/test.txt,通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存。
location ~ /purge(/.*) {
#设置只允许指定的IP或IP段才可以清除URL缓存。
allow 127.0.0.1;
allow 192.168.58.0/24;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}

#动态页面直接放过不缓存
location ~ .*\.(php|jsp|cgi)(.*){
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

#设置缓存黑名单,不缓存指定页面,比如wp后台或其他需要登录态的页面,用分隔符隔开
#location ~ ^/(wp-admin|system)(.*)$ {
# proxy_pass http://backend_server;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#}

#location / {
# proxy_cache cache_one;
# proxy_next_upstream http_502 http_504 error timeout invalid_header; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
# proxy_cache_valid 200 304 12h; #对不同的HTTP状态码设置不同的缓存时间
# proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
# proxy_set_header Host $host;
# proxy_set_header X-Forwarded-For $remote_addr;
# proxy_pass http://backend_server;
# expires 1d;
#}

}

}

打完收工.................... 查看全部
首先介绍一下弄这个的初衷。
其实初衷很简单公司需要这个,然后你就去实现没有什么更高大上的理由,原理什么的我也不打算介绍了, 个人不太喜欢这些咬文爵字的东西。
 
其次做这个需要用到ngx_cache_purge 缓存模块。
不清楚自己的nginx有没有添加这个模块的童鞋可以使用nginx -V查看具体如下:
[root@localhost sbin]# ./nginx -V
nginx version: nginx/1.10.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --add-module=/root/ngx_cache_purge-2.3 --with-http_perl_module --with-ld-opt=-Wl,-E

如果看到了ngx_cache_purge则已经添加了这个模块。你可以直接跳到最下面看看是不是你想要的, 好了,废话不多说。


一、编译安装Nginx


首先下载nginx和ngx_cache_purge 缓存模块
附:
nginx下载地址:http://nginx.org/download/nginx-1.10.3.tar.gz
ngx_cache_purge下载地址:http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
 
开始编译安装
cd /usr/local/
wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar zxvf nginx-1.10.3.tar.gz
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar -xvf ngx_cache_purge-2.3.tar.gz
./configure --prefix=/usr/local/nginx --add-module=../ngx_cache_purge-2.3 --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_perl_module --with-ld-opt="-Wl,-E"


 附Nginx编译安装时可能遇到的问题:
/configure: error: the HTTP rewrite module requires the PCRE library.
解决方法:安装pcre
# yum -y install pcre pcre-devel

缺少ssl错误,错误信息如下:
./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library. You can either disable the module by using
--without-http-cache option, or install the OpenSSL library into the system,
or build the OpenSSL library statically from the source with nginx by using
--with-http_ssl_module --with-openssl=<path> options.
解决方法:安装openssl
# yum -y install openssl openssl-devel

缺少编译器,错误信息如下:
./configure: error: C compiler cc is not found
解决方法:安装gcc-c++
# yum -y install gcc-c++ autoconf automake
autoconf是自动配置,automake是自动编译

缺少zlib包,错误信息如下:
./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using –without-http_gzip_module
option, or install the zlib library into the system, or build the zlib
library
statically from the source with nginx by using –with-zlib=<path> option.
解决方法:安装zlib
# yum install -y zlib-devel

缺少libxml2,错误信息如下:
./configure: error: the HTTP XSLT module requires the libxml2/libxslt
libraries. You can either do not enable the module or install the libraries.
解决方法:
# yum -y install libxml2 libxml2-dev
# yum -y install libxslt-devel

http_image_filter_module是nginx提供的集成图片处理模块,需要gd-devel的支持,错误信息如下:
./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.
解决方法:
# yum -y install gd-devel

缺少ExtUtils,错误信息如下:
./configure: error: perl module ExtUtils::Embed is required
解决方法:
# yum -y install perl-devel perl-ExtUtils-Embed

缺少GeoIP,错误信息如下:
./configure: error: the GeoIP module requires the GeoIP library.
You can either do not enable the module or install the library.
解决方法:
# yum -y install GeoIP GeoIP-devel GeoIP-data

 


二、配置nginx.conf


安装完成后编辑nginx的配置文件位于/usr/local/nginx/conf/nginx.conf
# cd /usr/local/nginx/conf/
# cp nginx.conf nginx.conf.bak #先将nginx的配置文件进行备份

可以利用nginx -V查看是否添加了ngx_cache_purge 缓存模块(如何查看文章头部)
配置的一些详细的参数我在我的nginx配置文件中有详细的注释。
所以这里就不多讲,可以根据我的进行修改
最后附上自己的配置文件
[root@localhost sbin]# cat ../conf/nginx.conf
user nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,
#仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
worker_connections 1024; #单个后台worker process进程的最大并发链接数
# 并发总数是 worker_processes 和 worker_connections 的乘积
# 即 max_clients = worker_processes * worker_connections
# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么
# 为什么上面反向代理要除以4,应该说是一个经验值
# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
# worker_connections 值的设置跟物理内存大小有关
# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
# 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
# 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
# $ cat /proc/sys/fs/file-max
# 输出 34336
# 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
# 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
# 使得并发总数小于操作系统可以打开的最大文件数目
# 其实质也就是根据主机的物理CPU和内存进行配置
# 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
# ulimit -SHn 65535
}
http {
#设定mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间
tcp_nodelay on;
gzip on; #开启gzip压缩
gzip_disable "MSIE [1-6].";
client_header_buffer_size 128k; #设定请求缓冲
large_client_header_buffers 4 128k;
proxy_buffering on; #开启代理缓存
proxy_connect_timeout 5; #连接超时时间,超时时间设置不要超过75秒,至于为什么i don't konw
proxy_read_timeout 60; #设置与代理服务器两次读取的间隔时间
proxy_send_timeout 5; #设置后端服务器数据回传时间就是在规定时间之内后端服务器必须传完所有的数据,如果超时nginx会关闭连接
proxy_buffer_size 16k; #设置nginx保存用户头部信息的缓存区大小
proxy_buffers 4 64k; #缓存区大小
proxy_busy_buffers_size 128k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 128k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_path /tmp/temp_cache1; #临时缓存目录
proxy_cache_path /tmp/cache1 levels=1:2 keys_zone=cache_one:200m inactive=30d max_size=5g;
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,30天没有被访问的内容自动清除,硬盘缓存空间大小为5GB。

#定义反向代理
upstream backend_server {
server 192.168.58.139:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.58.140:80 weight=1 max_fails=2 fail_timeout=30s;
}

server {
listen 80;
server_name localhost;

# #charset koi8-r;
# #access_log logs/host.access.log main;

#缓存html页面,可以缓存伪静态
location ~ .*\.html$ {
proxy_pass http://backend_server;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_next_upstream http_502 http_504 error timeout invalid_header; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
proxy_cache_valid 200 302 1d; #状态为200、302的缓存1天
proxy_cache_valid 301 2d; #状态为301的缓存2天
proxy_cache_valid any 1m; #有效缓存大小
expires 1d; #浏览器过期时间设置1天
proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie"; #忽略头部禁止缓存申明,类似与CDN的强制缓存功能
add_header Nginx-Cache "$upstream_cache_status"; #在header中插入缓存状态,命中缓存为HIT,没命中则为MISS
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

#禁止访问 .htxxx 文件
location ~ /\.ht {
deny all;
}

#用于清除缓存,假设一个URL为http://192.168.8.42/test.txt,通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存。
location ~ /purge(/.*) {
#设置只允许指定的IP或IP段才可以清除URL缓存。
allow 127.0.0.1;
allow 192.168.58.0/24;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}

#动态页面直接放过不缓存
location ~ .*\.(php|jsp|cgi)(.*){
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

#设置缓存黑名单,不缓存指定页面,比如wp后台或其他需要登录态的页面,用分隔符隔开
#location ~ ^/(wp-admin|system)(.*)$ {
# proxy_pass http://backend_server;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#}

#location / {
# proxy_cache cache_one;
# proxy_next_upstream http_502 http_504 error timeout invalid_header; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
# proxy_cache_valid 200 304 12h; #对不同的HTTP状态码设置不同的缓存时间
# proxy_cache_key $host$uri$is_args$args; #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
# proxy_set_header Host $host;
# proxy_set_header X-Forwarded-For $remote_addr;
# proxy_pass http://backend_server;
# expires 1d;
#}

}

}

打完收工....................