Nginx日常优化参数

一、配置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;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屎到淋头还嚼便

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值