作?NetSeek http://www.linuxtone.org (ITq维专家||集群架构|性能调优)
Ƣ迎转蝲,转蝲时请务必以超链接形式标明文章原始出处和作者信息及(qing)本声?
首发旉: 2008-11-25 更新旉:2009-1-14
??br />
一?nbsp; Nginx 基础知识
二?nbsp; Nginx 安装?qing)调?/em>
三?nbsp; Nginx Rewrite
四?nbsp; Nginx Redirect
五?nbsp; Nginx 目录自动加斜U?
六?nbsp; Nginx Location
七?nbsp; Nginx expires
八?nbsp; Nginx 防盗?/em>
?ji)?nbsp; Nginx 讉K控制
十?nbsp; Nginx日志处理
十一?nbsp; Nginx Cache
十二?nbsp; Nginx负蝲均衡
十三? Nginx单优?/em>
十四?nbsp; 如何构徏高性能的LEMP环境
十五?nbsp; Nginx服务监控
十六?nbsp; 常见问题?sh)错误处?
十七?nbsp; 相关资源下蝲
【前a】:(x)
~写此技术指南在于推q普?qing)NGINX在国内的使用Q更方便的帮助大家了(jin)解和掌握NGINX的一些用技巧。本指南很多技巧来自于|络和工作中或网l上朋友们问我的问题.在此对网l上愿意分n的朋友们表示感谢和致意!Ƣ迎大家和我一起丰富本技术指南提出更好的Q请朋友们关? http://www.linuxtone.org 技术分享社? 互想学习(fn)共同q步!
一?Nginx 基础知识
1、简?br />
Nginx ("engine x") 是一个高性能?HTTP ?反向代理 服务器,也是一?IMAP/POP3/SMTP 代理服务器?Nginx 是由 Igor Sysoev Z|斯讉K量第二的 Rambler.ru 站点开发的Q它已经在该站点q行过两年半了(jin)。Igor 源代码以类BSD许可证的形式发布。尽还是测试版Q但是,Nginx 已经因ؓ(f)它的E_性、丰富的功能集、示例配|文件和低系l资源的消耗而闻名了(jin)?br />
更多的请见官方wiki: http://wiki.codemongers.com/
2?Nginx的优?br />
nginx做ؓ(f)HTTP服务器,有以下几基本特性:(x)
1) 处理?rn)态文Ӟ索引文g以及(qing)自动索引Q打开文g描述W缓Ԍ
2) 无缓存的反向代理加速,单的负蝲均衡和容错.
3) FastCGIQ简单的负蝲均衡和容错.
4)
模块化的l构。包括gzipping, byte ranges, chunked responses, 以及(qing)
SSI-filter{filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSIQ则q项处理可以q行q行Q而不需要相互等待?/span>
5) 支持SSL ?TLS SNIQ?br />
Nginx专ؓ(f)性能优化而开发,性能是其最重要的考量, 实现上非常注重效?。它支持内核Poll模型Q能l受高负载的考验, 有报告表明能支持高达 50,000 个ƈ发连接数?br />
Nginxh很高的稳定性。其它HTTP服务器,当遇到访问的峰|或者有人恶意发h速连接时Q也很可能会(x)D服务器物理内存耗尽频繁交换Q失d应,只能重启服务器。例如当前apache一旦上?00个以上进E,web?
应速度明N常缓慢了(jin)。而Nginx采取?jin)分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的q?
接,它只?.5M内存Q所以类似DOSq样的攻dnginx来说基本上是毫无用处的。就E_性而言, nginx比lighthttpd更胜一{V?br />
Nginx支持热部|Ӏ它的启动特别容? q且几乎可以做到7*24不间断运行,即ɘq行C月也不需要重新启动。你q能够在不间断服务的情况下,对Y件版本进行进行升U?br />
Nginx采用master-slave模型, 能够充分利用SMP的优势,且能够减工作进E在盘I(y)/O的阻塞gq。当采用select()/poll()调用Ӟq可以限制每个进E的q接数?br />
Nginx
代码质量非常高,代码很规范, 手法成熟Q?模块扩展也很Ҏ(gu)。特别值得一提的是强大的Upstream与Filter链?
Upstream如reverse proxy,
与其他服务器通信模块的编写奠定了(jin)很好的基。而Filter链最L(fng)部分是各个filter不必{待前一个filter执行完毕。它可以把前一?
filter的输出做为当前filter的输入,q有点像Unix的管Uѝ这意味着Q一个模块可以开始压~从后端服务器发送过来的hQ且可以在模块接?
完后端服务器的整个请求之前把压羃{向客L(fng)?br />
Nginx采用?jin)一些os提供的最新特性如对sendfile (Linux 2.2+)Qaccept-filter (FreeBSD 4.1+)QTCP_DEFER_ACCEPT (Linux 2.4+) 的支持,从而大大提高(sh)(jin)性能
二?Nginx 安装?qing)调?/strong>
1、Pcre 安装
2. nginx ~译安装
更详l的模块定制与安装请参照官方wiki.
3、Nginx 配置文g试Q?/p>
3、Nginx 启动Q?/p>
4、Nginx 配置文g修改重新加蝲Q?/p>
` 四?Nginx Redirect 五?Nginx 目录自动加斜U? ?nbsp; Nginx Location 2、根据判断某个目?/p>
八?nbsp; Nginx 防盗?/strong> 2. 针对不同的目?/p>
3. 同实现防盗链和expires的方?/p>
?ji)?Nginx 讉K控制 2. Nginx 止讉K某类型的文g. Ҏ(gu)2: 实例: 3. 使用ngx_http_access_module限制ip讉K 详细参见wiki: http://wiki.codemongers.com/NginxHttpAccessModule#allow 只允许客房端一个线E?每个U程20k. 6. 上文件大限?br />
主配|文仉加入如下Q具体大根据你自己的业务做调整?br />
client_max_body_size 10m; 更多的日志分析与处理关?同时Ƣ迎你参加讨?:http://bbs.linuxtone.org/forum-8-1.html 其中Q?br />
proxy_store on用来启用~存到本地的功能Q?br />
proxy_temp_path用来指定~存在哪个目录下Q如Qproxy_temp_path html; x(chng)成有条g地去执行proxy_passQ这个条件就是当h的文件在本地的proxy_temp_path指定的目录下不存在时Q再向后端拉取?br />
在需要用负载均衡的server中增?br />
proxy_pass http://bbs.linuxtone.org/; #vi linuxtone_lb.conf 注释掉或删掉q几行,重新~译卛_?br />
2) 修改nginx_http_header_filter_module 修改?/p>
a) 修改nginx_http_header_filter_module 修改? 修改后重新编译一下环? 利用curl命o(h)查看服务器header 3.为特定的CPU指定CPUcd~译优化. ~译nginx 加蝲google_perftools_module: #佉K|立即生?br />
/sbin/sysctl -p #vi /etc/nginx-rrd.conf //Ҏ(gu)你的具体情况做调? (g)插?/p>
在cacti理面板导入 6、如何关闭Nginx的LOG 其中以下q项挺值得留意的?br />
Tcmalloc 不单可用?Mysql 的优化,q能应用?Nginx 4.Tcmalloc优化Nginx 性能
三、Nginx Rewrite
1. Nginx Rewrite 基本标记(flags)
last - 基本上都用这个Flag?/em>
ȝ当于Apache里的[L]标记Q表C完成rewriteQ不再匹配后面的规则
break - 中止RewirteQ不再l匹?/em>
redirect - q回临时重定向的HTTP状?02
permanent - q回怹重定向的HTTP状?01
d有的url支持正则 重写的url不支持正?/strong>
2. 正则表达式匹配,其中Q?br />
* ~ 为区分大写匚w
* ~* Z区分大小写匹?/em>
* !~?~* 分别为区分大写不匹配及(qing)不区分大写不匹?/em>
3. 文g?qing)目录匹配,其中Q?br />
* -f?-f用来判断是否存在文g
* -d?-d用来判断是否存在目录
* -e?-e用来判断是否存在文g或目?/em>
* -x?-x用来判断文g是否可执?/em>
3. Nginx 的一些可用的全局变量Q可用做条g判断Q?/p>
所有linuxtone.org与netseek.linuxtone.org域名全部自蟩转到http://www.linuxtone.org
1Q基本语?[和上面rewrite正则匚w语法基本一致]
location [=|~|~*|^~] /uri/ { … }
* ~ 为区分大写匚w
* ~* Z区分大小写匹?/em>
* !~?~*分别为区分大写不匹配及(qing)不区分大写不匹?/em>
CZ1:
location = / {
# matches the query / only.
# 只匹?/ 查询?/em>
}
匚wM查询Q因为所有请求都?/ 开头。但是正则表辑ּ规则和长的块规则被优先和查询匹?/strong>
CZ2:
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching,
# so regular expressions will not be checked.
# 匚wM?/images/ 开头的M查询q且停止搜烦(ch)。Q何正则表辑ּ不?x)被试?br />
CZ3:
location ~* .(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by
}
# 匚wM?gif、jpg ?jpeg l尾的请求?/strong>
七?Nginx expires
1Q根据文件类型expires
1. 针对不同的文件类?/p>
1. Nginx w䆾证验?/p>
如,Nginx下禁止访?.txt文gQ配|方法如?
止讉K某个目录
4. Nginx 下蝲限制q发和速率
【注?span style="color: #008000;">limit_zone linuxtone $binary_remote_addr 10m; q个可以定义在主?/span>
5. Nginx 实现Apache一L(fng)录列?/p>
十?nbsp; Nginx 日志处理
1.Nginx 日志切割
#contab -e
59 23 * * * /usr/local/sbin/logcron.sh /dev/null 2>&1
[root@count ~]# cat /usr/local/sbin/logcron.sh
2.利用AWSTATS分析NGINX日志
讄好Nginx日志格式,仍后利用awstatsq行分析.
请参? http://bbs.linuxtone.org/thread-56-1-1.html
3. Nginx 如何不记录部分日?br />
日志太多Q每天好几个GQ少记录一些,下面的配|写到server{}D中可以了(jin)
location ~ .*.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$
{
access_log off;
}
十一、Nginx Cache服务配置
如果需要将文g~存到本圎ͼ则需要增加如下几个子参数Q?/p>
在经q上一步配|之后,虽然文g被缓存到?jin)本地磁盘?sh)Q但每次h仍会(x)向远端拉取文ӞZ(jin)避免去远端拉取文Ӟ必须修改
更多更高U的应用可以研究ncache,详细请参?a target="_blank">http://bbs.linuxtone.org 里ncache相关的脓(chung)?
十二、Nginx 负蝲均衡
1. Nginx 负蝲均衡基础知识
nginx的upstream目前支持4U方式的分配
1)、轮询(默认Q?/span>
每个h按时间顺序逐一分配C同的后端服务器,如果后端服务器down掉,能自动剔除?/span>
2)、weight
指定轮询几率Qweight和访问比率成正比Q用于后端服务器性能不均的情c(din)?/span>
2)、ip_hash
每个h按访问ip的hashl果分配Q这h个访客固定访问一个后端服务器Q可以解决session的问题?/span>
3)、fairQ第三方Q?/span>
按后端服务器的响应时间来分配hQ响应时间短的优先分配?
4)、url_hashQ第三方Q?/span>
2. Nginx 负蝲均衡实例1
每个讑֤的状态设|ؓ(f):
a) down 表示单前的server暂时不参与负?/span>
b) weight 默认?.weight大Q负载的权重p大?/span>
c) max_fails Q允许请求失败的ơ数默认?.当超q最大次数时Q返回proxy_next_upstream 模块定义的错?/span>
d) fail_timeout:max_failsơ失败后Q暂停的旉?/span>
e) backupQ?其它所有的非backup机器down或者忙的时候,hbackup机器。所以这台机器压力会(x)最轅R?/span>
nginx支持同时讄多组的负载均衡,用来l不用的server来用?br />
client_body_in_file_only 讄为On 可以讲client postq来的数据记录到文g中用来做debug
client_body_temp_path 讄记录文g的目?可以讄最?层目?br />
location 对URLq行匚w.可以q行重定向或者进行新的代?负蝲均衡
3. Nginx 负蝲均衡实例 2
按访问url的hashl果来分配请求,使每个url定向到同一个后端服务器Q后端服务器为缓存时比较有效,也可以用作提高Squid~存命中?
单的负蝲均等实例:
#vi nginx.conf //nginx主配|文件核?j)配|?/p>
十三、Nginx单优?/strong>
1. 减小nginx~译后的文g大小 (Reduce file size of nginx)
默认的nginx~译选项里居然是用debug模式(-g)的(debug模式?x)插入很多跟t和ASSERT之类Q,~译以后一个nginx有好几兆。去掉nginx的debug模式~译Q编译以后只有几百K
?auto/cc/gccQ最后几行有Q?br />
# debug
2. 修改Nginx的header伪装服务?br />
1) 修改nginx.h
#vi nginx-0.7.30/src/http/ngx_http_header_filter_module.c
如?/p>
#vi nginx-0.7.30/src/http/ngx_http_special_response.c
如下:(x)
404错误的时候显C效果图Q如果没有指定错误页的话Q:(x)
默认nginx使用的GCC~译参数?O
需要更加优化可以用以下两个参?br />
--with-cc-opt='-O3'
--with-cpu-opt=opteron
使得~译针对特定CPU以及(qing)增加GCC的优?
此方法仅Ҏ(gu)能有所改善q不?x)有很大的性能提升Q供朋友们参?
CPUDcd定: # cat /proc/cpuinfo | grep "model name"
~译优化参数参考:(x)http://en.gentoo-wiki.com/wiki/Safe_Cflags
4.Tcmalloc优化Nginx 性能
./configure --with-google_perftools_module
在主配置文g加入nginx.conf d:
google_perftools_profiles /path/to/profile;
5.内核参数优化
# vi /etc/sysctl.conf #在末֢加以下内容:(x)
十四、如何构建高性的LEMP
请参? http://www.linuxtone.org/lemp/lemp.pdf
1、提供完整的配置脚本下蝲Q?a target="_blank">http://www.linuxtone.org/lemp/scripts.tar.gz
2、提供NGINX常见配置范例?虚拟LQ防盗链QRewrite,讉K控制Q负载均?br />
Discuz相关E序?rn)态化?qing)等{?,你只要稍E修改即可线上应用?3、将原版的xcache替换成EAQƈ提供相关单调优脚本及(qing)配置文g?br />
更多的及(qing)更新资料请关? http://www.linuxtone.org
十五、Nginx监控
1?nbsp; RRDTOOL+Perl脚本d监控
先安装好rrdtool Q关于rrdtool本文不作介绍Q具体安装请参照linuxtone监控版块.
#cd /usr/local/sbnin
#wget http://blog.kovyrin.net/files/mrtg/rrd_nginx.pl.txt
#mv rrd_nginx.pl.txt rrd_nginx.pl
#chmod a+x rrd_nginx.pl
#vi rrd_nginx.pl //配置脚本文g讄好\?br />
#!/usr/bin/perl
use RRDs;
use LWP::UserAgent;
# define location of rrdtool databases
my $rrd = '/data/www/wwwroot/nginx/rrd';
# define location of images
my $img = '/data/www/wwwroot/nginx/html';
# define your nginx stats URL
my $URL = "http://219.232.244.13/nginx_status";
…………
【注】根据自己具体的状况修改相应的\?
#crontab –e //加入如下
* * * * * /usr/local/sbin/rrd_nginx.pl
重启crond后,通过配置nginx虚拟L指到/data/www/wwwroot/nginx/html目录Q通过crond自动执行perl脚本?x)生成很多图?
http://xxx/connections-day.png卛_看到服务器状态图?br />
2?nbsp; 官方Nginx-rrd 监控服务Q多虚拟LQ(推荐Q?br />
|址Q?a target="_blank">http://www.nginx.eu/nginx-rrd.html
此解x(chng)案其实是Z上述监控Ҏ(gu)的一个改q和增强Q同样先安装好rrdtoolq个d工具和相应的perl模块再做如下操作Q?br />
# yum install perl-HTML*
先徏立好生成的库存和囄存放?/p>
SEVERS_URL 格式 http://domain1/nginx_status;domain1 http://domain2/nginx_status;domain2
q种格式监控多虚拟主接状态:(x)
重点启crond服务Q仍后通过http://219.32.205.13/nginx/html/ 卛_讉K。配|过E很单!
3?nbsp; CACTI模板监控Nginx
利用Nginx_status状态来d实现CACTI监控
nginx~译时允许http_stub_status_module
# vi /usr/local/nginx/conf/nginx.conf
cacti_graph_template_nginx_clients_stat.xml
cacti_graph_template_nginx_sockets_stat.xml
十六、常见问题(sh)错误处理
1?00 bad request错误的原因和解决办法
配置nginx.conf相关讄如下.
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
Ҏ(gu)具体情况调整Q一般适当调整值就可以?br />
2、Nginx 502 Bad Gateway错误
proxy_next_upstream error timeout invalid_header http_500 http_503;
或者尝试设|?
large_client_header_buffers 4 32k;
3、Nginx出现?13 Request Entity Too Large错误
q个错误一般在上传文g的时候会(x)出现Q?br />
~辑Nginx主配|文件Nginx.confQ找到http{}D,d
client_max_body_size 10m; //讄多大Ҏ(gu)自己的需求作调整.
如果q行php的话q个大小client_max_body_size要和php.ini中的如下值的最大g致或者稍大,q样׃?x)因为提交数据大不一致出现的错误?br />
post_max_size = 10M
upload_max_filesize = 2M
4、解?04 Gateway Time-out(nginx)
遇到q个问题是在升discuz论坛的时候遇到的
一般看? q种情况可能是由于nginx默认的fastcgiq程响应的缓冲区太小造成? q将Dfastcgiq程被挂? 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能D504 Gateway Time-out
现在的网? 其某些论坛有大量的回复和很多内容的, 一个页面甚x(chng)几百K?br />
默认的fastcgiq程响应的缓冲区?K, 我们可以讄大点
在nginx.conf? 加入Q?fastcgi_buffers 8 128k
q表C|fastcgi~冲Zؓ(f)8×128k
当然如果(zhn)在q行某一即时的操作, 可能需要nginx的超时参数调大点Q例如设|成60U:(x)send_timeout 60;
只是调整?jin)这两个参? l果是没有再显C那个超? 可以说效果不? 但是也可能是׃其他的原? 目前关于nginx的资料不是很? 很多事情都需要长期的l验累计才有l果, 期待(zhn)的发现?
5、如何用Nginx Proxy
朋友一台服务器q行tomcat ?080端口,IP:192.168.1.2:8080,另一台机器IP:192.168.1.8. 朋友想通过讉Khttp://192.168.1.8卛_讉Ktomcat服务.配置如下:
?92.168.1.8的nginx.conf上配|如?
access_log /dev/null; error_log /dev/null;
十七、相兌源下?/strong>
1.nginx配置CZ?qing)脚本下?
# wget http://www.linuxtone.org/lemp/scripts.tar.gz #此脚本范例定期更?
虽说 Nginx 本n的性能跟系l占用已l做到很优秀?/p>