Nginx配置和优化

1.隐藏版本号

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

[root@transit_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版本号已经没了

[root@transit_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压缩之前;

[root@transit_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表示压缩已经开启

[root@transit_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功能优点

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 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个月,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 OK
Server: nginx/1.6.3
Date: Wed, 24 Jun 2015 05:20:34 GMT
Content-Type: p_w_picpath/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 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,*.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。