Nginx配置和优化
1.隐藏版本号
默认情况下,使用curl命令会把nginx的版本信息等获取到,如:
[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php" HTTP/1.1 200 OK Server:nginx/1.6.3 Date: Wed, 24 Jun 2015 02:50:59 GMT Content-Type: text/html Connection: keep-alive X-Powered-By: PHP/5.4.30
现在通过添加server_tokensoff参数隐藏版本号.在http{}模块中添加
http { .... server_tokens off; }
继续curl一下,发现Server:后边的nginx版本号已经没了
[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php" HTTP/1.1 200 OK Server:nginx Date: Wed, 24 Jun 2015 02:54:54 GMT Content-Type: text/html Connection: keep-alive X-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, while worker_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压缩之前;
[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php" HTTP/1.1 200 OK Server: nginx Date: Wed, 24 Jun 2015 04:51:53 GMT Content-Type: text/html Connection: keep-alive X-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表示压缩已经开启
[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php" HTTP/1.1 200 OK Server: nginx Date: Wed, 24 Jun 2015 04:53:46 GMT Content-Type: text/html Connection: keep-alive Vary:Accept-Encoding X-Powered-By: PHP/5.4.30
7.配置nginx expires缓存
expire功能优点
(1)expires可以降低网站购买的贷款,节约成本
(2)同时提升用户访问体验
(3)减轻服务的压力,节约服务器成本,甚至可以节约人力成本,是web服务非常重要的功能。
expire功能缺点:
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验。
解决办法:
第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天
第二个 对缓存的对象改名
a.图片,附件一般不会被用户修改,如果用户修改了,实际上也是更改文件名重新传了而已
b.网站升级对于js,css元素,一般可以改名,把css,js,推送到CDN。
配置方法:
配置前curl一下
[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/index.php" HTTP/1.1 200 OK Server: nginx Date: Wed, 24 Jun 2015 04:53:46 GMT Content-Type: text/html Connection: keep-alive Vary: Accept-Encoding X-Powered-By: PHP/5.4.30
现在设置缓存图片1个月,css、javascript、flush等缓存一天
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}
location ~.*\.(js|css|javascript|fluash)$ {
expires 24h;
}
重新curl一下,发现expires 缓存到了下个月今天
[[email protected]_machine ~]# curl -I -H"www.beyond.com" "http://172.16.254.5/du.jpg" HTTP/1.1 200 OK Server: nginx/1.6.3 Date: Wed, 24 Jun 2015 05:20:34 GMT Content-Type: image/jpeg Content-Length: 27696 Last-Modified: Mon, 07 Jul 201404:26:08 GMT Connection: keep-alive ETag: "53ba2160-6c30" Expires:Fri, 24 Jul 2015 05:20:34 GMT Cache-Control: max-age=2592000 Accept-Ranges: bytes
8.nginx错误页面友好显示
当访问网站出现400 403 404 405 408 410,500 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和相关网页
效果:
[[email protected]_machine ~]# curl -H "www.beyond.com""http://172.16.254.5/aaa.php" <!DOCTYPE html> <html> <head> <title>Error</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial,sans-serif; } </style> </head> <body> <h1>40x error</h1> <h1>40x error</h1> <h1>40x error</h1> <h1>40x error</h1> <h1>40x error</h1> <h1>40x error</h1> <h1>40x error</h1> <h1>40x error</h1> <h1>40x error</h1> <h1>40x error</h1> <h1>40x error</h1> </body> </html>
注意,也可以将错误重定向到其他的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 ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$ { deny all; } 注意需要放在php解析location的下面 Nginx禁止访问*.txt,*.doc location ~* \.(txt|doc)$ { if (-f $request_filename) { root /data/www/www; #rewrite …..可以重定向到某个URL break; } }
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/core sed -n ‘13,17p‘nginx.h #define NGINX_VERSION "1.6.2" 修改为想要的版本号如2.4.3 #define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改为想要修改的软件名称,如Apache。