Nginx配置和优化

1.隐藏版本号

默认情况下,使用curl命令会把nginx的版本信息等获取到,如:

[root@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php" HTTP/1.1 200 OKServer:nginx/1.6.3Date: Wed, 24 Jun 2015 02:50:59 GMTContent-Type: text/htmlConnection: keep-aliveX-Powered-By: PHP/5.4.30

现在通过添加server_tokensoff参数隐藏版本号.在http{}模块中添加

http {....server_tokens off;}

继续curl一下,发现Server:后边的nginx版本号已经没了

[root@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"HTTP/1.1 200 OKServer:nginxDate: Wed, 24 Jun 2015 02:54:54 GMTContent-Type: text/htmlConnection: keep-aliveX-Powered-By: PHP/5.4.30

2.客户端curl某个页面,返回404

server模块中加入下面规则即可

if ($http_user_agent ~*"curl"){            return 404;        }

3.根据CPU核数进行nginx进程优化

四核cpu配置:worker_processes    4;worker_cpu_affinity 0001 0010 01001000;八核cpu服务器参数配置:worker_processes    8;worker_cpu_affinity 0000000100000010 00000100 00001000 00010000 00100000 01000000 10000000;worker_cpu_affinity 0001 0010 01001000 0001 0010 0100 1000;官方文档说明worker_processes    4;worker_cpu_affinity 0001 0010 01001000;binds each worker process to aseparate CPU, whileworker_processes    2;  4核2进程worker_cpu_affinity 0101 1010;

4.调整nginx事件处理模型、客户端最大连接数、最大打开的文件数

4.1 nginx 的连接处理机制在不同的操作系统上采用不用的IO模型,在linux下,nginx使用epoll的IO多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。

根据系统类型不同选择不同的事务处理模型,选择有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];”我们使用的是Centos6.4的linux,因此将nginx的事件处理模型调整为epool模型。

4.2调整nginx worker单个进程允许的客户端最大连接数,这个值根据服务器性能和程序的内存来指定(一个进程启动使用的内存根据程序确定),这个参数是单个进程的最大链接数,实际最大链接数是worker进程数乘以这个数。

Max_client=worker_processes*worker_connections

4.3配置nginx worker进程最大打开文件数,相当于系统ulimit –HSn,注意配置参数不是越大越好,最好设为服务器承受的极限点,最好与ulimit-n的值保持一致

 

events {

use epoll;

worker_connections 1024;

worker_rlimit_nofile65535;

 

}

5.设置连接超时时间

http {..........keepalive_timeout 60;###设置客户端连接保持会话的超时时间,超过这个时间,服务器会关闭该连接。tcp_nodelay on;####打开tcp_nodelay,在包含了keepalive参数才有效client_header_timeout 15;####设置客户端请求头读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误client_body_timeout 15;####设置客户端请求主体读取超时时间,如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误send_timeout 15;####指定响应客户端的超时时间。这个超过仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。...... }

 

6.配置gzip压缩功能

Gzip压缩是可以节省带宽,提高传输效率,但是由于是在服务器上进行压缩,会消耗服务器起源

使用的是nginx_http_gzip_module模块

参数:

gzip on;

###开启压缩功能

 

gzip_min_length  1k;

###设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,不管页面多大都进行压缩,建议设置成大于1K,如果小与1K可能会越压越大。

 

gzip_buffers     4 32k;

###压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。

 

gzip_http_version 1.1;

###压缩版本(默认1.1,前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可

 

gzip_comp_level 9;

###压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,但是处理慢,也比较消耗CPU资源。

 

gzip_types  text/css text/xml application/javascript;

###用来指定压缩的类型,‘text/html’类型总是会被压缩。

 

gzip_vary on;

###vary header支持,改选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过nginx压缩的数据。

具体配置:

没配置gzip压缩之前;

[root@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"HTTP/1.1 200 OKServer: nginxDate: Wed, 24 Jun 2015 04:51:53 GMTContent-Type: text/htmlConnection: keep-aliveX-Powered-By: PHP/5.4.30

http模块中添加下面参数

gzip on;gzip_min_length  1k;gzip_buffers     4 32k;gzip_http_version 1.1;gzip_comp_level 9;gzip_types  text/css text/xml application/javascript;gzip_vary on;

重新curl一下,出现vary表示压缩已经开启

[root@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"HTTP/1.1 200 OKServer: nginxDate: Wed, 24 Jun 2015 04:53:46 GMTContent-Type: text/htmlConnection: keep-aliveVary:Accept-EncodingX-Powered-By: PHP/5.4.30

 

7.配置nginx expires缓存

expire功能优点

1expires可以降低网站购买的贷款,节约成本

2)同时提升用户访问体验

3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。

expire功能缺点:

被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。

解决办法:

第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1

第二个 对缓存的对象改名

a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已

b.网站升级对于jscss元素,一般可以改名,把cssjs,推送到CDN

配置方法:

配置前curl一下

 

[root@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php"HTTP/1.1 200 OKServer: nginxDate: Wed, 24 Jun 2015 04:53:46 GMTContent-Type: text/htmlConnection: keep-aliveVary: Accept-EncodingX-Powered-By: PHP/5.4.30

现在设置缓存图片1个月,cssjavascriptflush等缓存一天

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {

expires 30d;

}

location ~.*\.(js|css|javascript|fluash)$ {

expires 24h;

}

重新curl一下,发现expires 缓存到了下个月今天

[root@transit_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/du.jpg"   HTTP/1.1 200 OKServer: nginx/1.6.3Date: Wed, 24 Jun 2015 05:20:34 GMTContent-Type: p_w_picpath/jpegContent-Length: 27696Last-Modified: Mon, 07 Jul 201404:26:08 GMTConnection: keep-aliveETag: "53ba2160-6c30"Expires:Fri, 24 Jul 2015 05:20:34 GMTCache-Control: max-age=2592000Accept-Ranges: bytes

 

8.nginx错误页面友好显示

当访问网站出现400 403 404 405 408 410500 501 502 503 504 等状态码时,可以将其重定向到一个友好页面,提升用户体验。

配置方法:

1)在http模块中开启:fastcgi_intercept_errors on;  (注意必须开启,否则不生效)

2)在http或者server模块配置下面参数

error_page  500 501 502 503 504 /error/5-error.html;   

error_page 400 403 404 405 408 410 411 412413 414 415 /error/4-error.html;

注意:这里是相对路径,‘/’表示网站根目录,如果需要自定义目录的话,需要在下面添加location指定该目录位置

3)确保在网站根目录下存在error和相关网页

 

效果:

[root@transit_machine ~]# curl  -H "www.beyond.com""http://172.16.254.5/aaa.php"    Error

40x error

40x error

40x error

40x error

40x error

40x error

40x error

40x error

40x error

40x error

40x error

注意,也可以将错误重定向到其他的url连接

下面是天猫的nginx优雅显示案例

error_page  500 501 502 503 504 http://err.tmall.com/error2.html;

error_page 400 403 404 405 408 410 411 412413 414 415 http://err.tmall.com/error1.html;

 

9.nginx设置防掉链

防盗链就是其他网站通过url引用你网站上的资源,达到填充本网站的显示效果,这样会增加自己的带宽,增加服务器的压力。

解决办法:

location ~* \.(gif|jpg|png|swf|flv)${valid_referers none blocked www.beyond.comwww.zsms.com;if ($invalid_referer) {rewrite ^/ http://www.beyond.com/403.html;#return 404;}}第一行:gif|jpg|png|swf|flv表示对gif、jpg、png、swf、flv后缀的文件实行防盗链第二行:www.beyond.com www.zsms.com表示对www.beyond.com www.zsms.com这2个来路进行判断if{}里面内容的意思是,如果来路不是指定来路就跳转到错误页面,当然直接返回404也是可以的。

 

10.nginx限制访问

10.1 根据扩展名限制程序和目录访问,可以防止通过访问网页,而执行网页上的脚本

 

Nginx限制访问指定目录:location ~ ^/p_w_picpaths/.*\.(php|php5|.sh|.pl|.py)$ {deny all;}注意需要放在php解析location的下面 Nginx禁止访问*.txt,*.doclocation ~* \.(txt|doc)$ {if (-f $request_filename) {root /data/www/www;#rewrite …..可以重定向到某个URLbreak;}}

10.2 限制ip访问

location / {deny 192.168.1.1;allow 192.168.1.0/24;allow 10.1.1.0/16;deny all;}或者if ( $remote_addr = 10.0.0.7 ) {return 403;}

10.3限制客户端类型:可有效防止爬虫

下面内容可以防止爬虫if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot"){return 403;} 禁止某类浏览器访问if ($http_user_agent ~* "Firefox|MSIE"){return 403;rewrite ^(.*) http://blog.etiantian.org/$1 permanent;}

 

11.Nginx修改源码隐藏软件名称及版本号

这个需要在编译安装之前进行修改,修改的是源码包的内容

cd nginx-1.6.2/src/coresed -n '13,17p'nginx.h#define NGINX_VERSION  "1.6.2" 修改为想要的版本号如2.4.3#define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改为想要修改的软件名称,如Apache。