Nginx日常优化
- 一、配置nginx worker进程个数
- 二、根据cpu核数进行nginx进程优化
- 1、四核CPU服务器
- 2、八核CPU服务器
- 三、开启压缩功能
- 完整配置
- 四、事件处理模型优化
- 五、隐藏nginx header内版本号信息
- 六、防止后台爬虫设置
- 七、屏蔽特定的方法
- 八、禁止非法访问脚本
- 九、屏蔽几个目录字段
- 十、优雅页面展示
- 十一、防止ab工具压测
- 十二、上传文件大小限制
- 十三、fastcgi调优
- 完整配置
- 十四、更改默认用户及用户组
- 第一种
- 第二种
- 十五、开启高效文件传输模式
- 十六、设置连接超时时间
- 十七、proxy.conf配置文件参数
- 十八、配置nginx expires功能
一、配置nginx worker进程个数
在高并发场景,我们需要事先启动更多的nginx进程以保证快速响应并处理用户的请求
worker_processes 1;
指定了nginx要开启的进程数。建议指定和CPU的数量相等或乘2的进程数。
worker_processes参数开始的设置可以等于CPU的个数或核数(worker_cpu_affinity参数中的配置可以指定第一个到最后一个进程分别使用的哪个cpu),进程数多一些,起始提供服务时就不会临时启动新进程提供服务,减少了系统开销,提升了服务速度。特殊场合也可以考虑提高至CPU*2的进程数,具体情况要根据实际的业务来选择,因为这个参数,除了CPU核数的影响外,和硬盘存储的数据以及负载也有关。
grep "physical id" /proc/cpuinfo #查看CPU个数
二、根据cpu核数进行nginx进程优化
1、四核CPU服务器
worker_cpu_affinity 0001 0010 0100 1000;
#nginx进程CPU亲和力,即把不同的进程分给不同的CPU处理。这里0001 0010 0100 1000是掩码,分别代表第1、2、3、4颗cpu核心。
2、八核CPU服务器
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000;
三、开启压缩功能
gzip on;
#开启压缩功能
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location, if in location
gzip_min_length 1k;
#设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默 认值是0,不管页面多大都进行压缩。建议设旦成大于1K。如果小于lK可能会越压越大。
Syntax: gzip_min_length length;
Default: gzip_min_length 20;
Context: http, server, location
gzip_buffers 4 16k;
#压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
Syntax: gzip_buffers number size;
Default: gzip_buffers 32 4k|16 8k;
Context: http, server, location
gzip_http_version 1.0;
#压缩版本(默认1. l,前端为squid2.5时使用1.0)用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器己经支持GZIP解压,使用默认即可。
Syntax: gzip_http_version 1.0 | 1.1;
Default: gzip_http_version 1.1;
Context: http, server, location
gzip_comp_level 2;
#压缩比率;用来指定GZIP压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。
Syntax: gzip_comp_level level;
Default: gzip_comp_level 1;
Context: http, server, location
gzip_types text/plain application/javascript test/css text/xml;
#用来指定压缩的类型,"text/html”类型.总是会被压缩。
提示:gzip_types类型不同的版本可能不同,可以查看:cat /application//nginx/conf/mime.types
Syntax: gzip_types mime-type ...;
Default: gzip_types text/html;
Context: http, server, location
gzip_vary on;
#vary header支持。该选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过Nginx压缩的数据。(让前端的缓存不解压缩发送给客户端)
Syntax: gzip_vary on | off;
Default: gzip_vary off;
Context: http, server, location
完整配置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/plain application/javascript test/css text/xml;
gzip_vary on;
四、事件处理模型优化
nginx的连接处理机制在于不同的操作系统采用不同的10模型,在linux使用epoll的IO多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/Poll方式的IO多路复用模型,在windows使用的是icop等等。
events {
use epoll;
woker_connections 65535;
multi_accept on;
}
五、隐藏nginx header内版本号信息
一些特定的系统及服务漏洞一般都和特定的软件及版本号有关,我们应尽量隐藏服务器的敏感信息(软件名称及版本等信息),这样黑客无法猜到有漏洞的服务是否是对应服务的版本,从而确保web服务器最大的安全。
Syntax: server_tokens on | off | string;
Default: server_tokens on;
Context: http, server, location
六、防止后台爬虫设置
http {
... ...
if ($http_user_agent ~* "Robot|bingbot|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|YisouSpider|MSNBot|ia_archiver|Tomato Bot|MJ12bot|DotBot|JikeSpider|YandexBot|AhrefsBot|Wget|SafeDNSBot|SemrushBot") {
return 404;
}
... ...
}
七、屏蔽特定的方法
只允许GET、POST、HEAD
http {
... ...
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 405;
}
... ...
}
八、禁止非法访问脚本
http {
... ...
location ~* \.(sh|php|php5|bat|bash|conf|cnf|bak|save|sql|mdb|svn|git|old)$ {
return 404;
}
... ...
}
九、屏蔽几个目录字段
http {
... ...
location ~* /(tmp|manager)/ {
deny all;
}
... ...
}
十、优雅页面展示
如果网站出现错误,用户的体验就会降低,做一个类似正在维护的页面可以防止这种情况
server {
listen 80;
server_name www.XXX.com ;
index index.html index.htm index.php;
root /opt/www/;
location ~ .*.(php|php5)?$ {
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
}
error_page 404 = /404.html;
创建自己的404.html页面,放在站点目录下面
error_page 500 502 503 504 = /50x.html;
十一、防止ab工具压测
location / {
... ...
if ( $http_user_agent ~ "Wget|ApacheBench" ) {
set $block_user_agent 1;
}
if ( $block_user_agent = 1 ) {
return 403;
}
... ...
}
十二、上传文件大小限制
client_max_body_size 10m;
#限制上传文件最大为10M
Syntax: client_max_body_size size;
Default: client_max_body_size 1m;
Context: http, server, location
十三、fastcgi调优
fastcgi_connect_timeout 300;
#指定连接到后端fastCGI的超时时间
Syntax: fastcgi_connect_timeout time;
Default: fastcgi_connect_timeout 60s;
Context: http, server, location
fastcgi_send_timeout 300;
#向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间
Syntax: fastcgi_send_timeout time;
Default: fastcgi_send_timeout 60s;
Context: http, server, location
fastcgi_read_timeout 300;
#指定接收FastcGI应答的超时时间,这个值是指己经完成两次握手后接收FastCGI应答的超时时间。
Syntax: fastcgi_read_timeout time;
Default: fastcgi_read_timeout 60s;
Context: http, server, location
fastcgi_buffer_size 64k;
#指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以置为fastcgi_buffers选项指定的缓冲区大小。
Syntax: fastcgi_buffer_size size;
Default: fastcgi_buffer_size 4k|8k;
Context: http, server, location
fastcgi_buffers 4 64k;
#指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为"16 16k"、"16 16k"
Syntax: fastcgi_buffers number size;
Default: fastcgi_buffers 8 4k|8k;
Context: http, server, location
fastcgi_busy_buffers_size 128k;
#建议为fastcgi_buffers的两倍
fastcgi_temp_file_write_size 128k;
#在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,设置上述数值设置太小时若负载上来时可能报502 Bad Gateway
fastcgi_cache oldboy_nginx;
#表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发生,但是开启缓存也可能会引起其它问题,要根据具体情况选择。
fastcgi_cache_valid 200 302 1h;
#用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一个小时.
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
#缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数
完整配置
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_cache oldboy_nginx;
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
fastcgi_cache_min_uses 1;
十四、更改默认用户及用户组
nginx服务启动,使用的默认用户是nobody
为了防止黑客猜到这个用户,我们需要更改下特殊的用户名,提供nginx服务用
更改默认用户的方法有两种
第一种
user nginx nginx #配置文件中修改
设置Nginx worker进程运行的用户以及用户组,如果注释或不设置,默认即是nobody用户和组,不推荐使用nobody用户名称,最好采用一个普通用户,如nginx。注意Nginx的主进程还是以root身份运行的,后文也会有不用root进程起服务的配置。
useradd -s /sbin/nologin -M nginx #建立nginx用户
第二种
useradd -s /sbin/nologin -M nginx #先添加一个用户
./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
#编译nginx时指定用户
ps -ef|grep nginx|grep -v grep #检查nginx进程的对应用户
十五、开启高效文件传输模式
sendfile on;
tcp_nopush on;
#sendfile参数用于开启文件高效传输模式。同时将tcp_nopush和tcp_nodelay两个指令设为on用于防止网络阻塞
Syntax: sendfile on | off;
Default: sendfile off;
Context: http, server, location, if in location
十六、设置连接超时时间
keepalive_timeout 65;
#设置客户端连接保持会话的超时时间。超过这个时间,服务器会关闭该连接
tcp_nodelay on;
#打开tcp_nodelay,在包含了keepalive参数才有效
client_header_timeout 15;
#设置客户端请求头读取超时时间.如超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request timeout(408)"错误,默认值是60。
client_body_timeout 15;
#设置客户端请求主体读取超时时间。如超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request timeout(408)错误,默认值是60。
send_timeout 15;
#指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
Syntax: client_header_timeout time;
Default: client_header_timeout 60s;
Context: http, server
十七、proxy.conf配置文件参数
vi /application/nginx/conf/proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 50m;
client_body_buffer_size 256k;
proxy_connect_timeout 30;
proxy_send_timeout 30;
proxy_read_timeout 60;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_max_temp_file_size 128m;
proxy_store on;
proxy_store_access user:rw group:rw all:r;
#nginx cache
#client_body_temp_path /data/nginx_cache/client_body 1 2;
#proxy_temp_path /usr/local/nginx/proxy_temp 1 2;
十八、配置nginx expires功能
在网站开发和运营中,对于图片,css,js等元素更改机会较少,特别是图片,这时可以将图片设置在浏览器本地缓存365天或更长,CSS,JS,html等代码缓存10天,这样用户第一次打开页面后,会在本地的浏览器缓存相应的上述内容,这样的缓存可以提高下次用户打开类该页面的加载速度,并节省服务器端大量的带宽。此功能同apache的expires,。这里通过location的功能,将需要缓存的扩展名列出来,然后指定缓存时间
expires功能优点
Expires可以降低网站购买的带宽,节约成本,同时提升了用户访问体验,减轻服务器的压力,是web服务非常重要的功能
expires功能缺点
被缓存的页面或数据更新了,用户看到的可能还是旧的内容,反而影响用户体验
解决办法:
第一个 缩短缓存时间,例如:1天,不彻底,除非更新频率大于1天
第二个 对缓存的对象改名。图片,附件一般不会被用户修改,如果用户修改了,实际上也都是更改文件名里新传了而己。网站升级对于js,css元素,一般可以改名。把js,css推送到CDN
一般不希望被缓存的内容
1)广告图片
2)网站流量统计文件
3)更新频繁的文件
Syntax: expires [time|epoch|max|off]
Default: expires off
Context: http, server, location
例:控制图片等过期时间为30天,当然这个时间可以设置的更长。具体视情况而定
location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {
expires 30d;
}
比如控制匹配/resource/或者/mediatorModule/里所有的文件缓存设置到最长时间
location ~ /(resource|mediatorModule)/ {
root /opt/demo;
expires max;
}