Nginx服务优化——性能与安全

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx服务优化——性能与安全相关的知识,希望对你有一定的参考价值。

1.隐藏Nginx的版本

    一般来说,软件的漏洞都和版本有关的。为了减少被人针对某一版本的恶意攻击,我们可以把我们的nginx版本隐藏起来,提高被攻击的门槛。在隐藏版本号之前,我们可以通过curl获取到软件版本。

技术分享图片

    隐藏Nginx的版本号可以通过修改nginx.conf配置文件,在http段标签内添加 "server_tokens off"的参数

技术分享图片

    修改之后检查语法问题,没有的话重载配置文件

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload

    再次用curl来检查,可以看到已经把nginx的版本信息给隐藏了。

技术分享图片

    如果要做到像下图百度那样修改服务器的名称,需要Nginx的源码文件然后编译安装的,这里就不做介绍,请自行百度。

技术分享图片

2.优化Nginx服务的worker进程的个数

    在高并发,高访问量的web服务场景,需要事先启动好更多的Nginx进程,以保证快速响应并处理大量并发用户的请求。Nginx有Master进程和worker进程之分,Master为管理进程,真正负责响应处理请求的是worker进程。在搭建Nginx服务时,如果我们不知道如何调整,我们可以把worker数目调整为CPU数目一致;在高并发的场合下,可能worker的数目为CPU的两倍。worker的数目调整很简单,在nginx.conf的配置文件下,直接修改即可。下面我们来验证下究竟多少的worker才合适。

    (1)cpu核心数目为2(单核双线程),worker数目为1的性能情况

技术分享图片

技术分享图片

    在并发量为1000和并发为5000测试到的性能结果(本打算测试并发10000的情况,结果测试的客户机承受不了,挂了)

技术分享图片

技术分享图片

    可以看出,在并发为1000的时候,处理页面的速度更快,差不多是3倍的差距。在并发5000的时候,已经出现了失败的情况,也就是说服务器的性能处理不过来了,下面我们修改worker数目之后对比下。

    (2)cpu核心数目为2(单核双线程),worker数目为2的性能情况

技术分享图片   

技术分享图片

    在并发量为1000和并发为5000测试到的性能结果

技术分享图片

技术分享图片

    从测试的结果中可以看出,修改了worker数目之后。Nginx的处理速度下降了,但是在高并发的情况下缺不出现失败的情况,也就是说处理并发的能力提高了。至于怎么调整,还是需要根据实际情况来调整。

3.绑定不同的Nginx进程到不同的CPU上

    在nginx.conf配置文件里面添加一行来给不同的进程分配CPU

  1 worker_processes  2;
  2 worker_cpu_affinity 01 10;        #01、10为掩码,意思是使用第一个CPU和第二个CPU

    然后测试,结果如下。对比发现没有任何的性能提升,应该是Nginx程序本身已经做了优化,自己分配好CPU的调度。在测试的时候发现,CPU的使用率两个都比较平均的。

技术分享图片

技术分享图片

4.开启高效文件传输模式

    sendfile参数用于开启文件的高效传输模式。同时吧tcp_nopush和tcp_nodelay两个参数设置为on,可以防止网络及磁盘I/O阻塞,提升Nginx工作效率。

sendfile        on;
tcp_nopush	on;
tcp_nodelay	on;

开启之后发现性能也是没有什么提升,查看nginx.conf.default发现这是默认开启的了。

技术分享图片

5.优化Nginx连接参数,调整连接超时时间

    在Nginx建立了连接之后,当服务器建立的连接没有接收处理的请求时,可以在指定的时间内就让它超时自动退出。还有当Nginx和FastCGI服务建立连接请求php是,如果因为一些原因(负载高,停止响应),FastCGI服务无法给Nginx返回数据,此时可以通过配置Nginx服务参数使其不会死等,因为前面用户还在等待它返回的数据。例如,可以设置如果请求FastCGI 10秒内不能返回数据,那么Nginx就中断本次请求,向用户汇报取不到数据的错误。

    实际上,这些参数用默认的即可,下面是一些参考的配置。

keepalive_timeout 60;        #设置客户端连接会话保持时间为60秒,超过这个时间,服务器会关闭该连接
client_header_timeout 15;    #设置读取客户请求头数据的超时时间,超过这个时间,客户端没有返回完整的header数据,服务器将返回"request time out" 
client_body_timeout 15;      #设置读取客户端请求主题的超时时间
send_timeout 25;             #指定响应客户端的超时时间,如果超过这个时间客户端没有活动,Nginx会关闭连接。

6.上传文件大小的限制(以wordpress为例)

    之前我们在Nginx服务器上搭建了wordpress程序,wordpress程序上传文件的大小限制是2M。在今时今日来说,这个限制太小了,我们把它修改为8M看看。

技术分享图片

    用vim打开/usr/local/php/lib/php.ini文件,然后把upload_max_filesize的值改为8M,重启php-fpm服务。

技术分享图片

    然后我们看到wordpress的多媒体上传页面已经显示为8M,上传一个大小为3M的图片,测试

技术分享图片

    出现了以下的错误,实际上上传的文件还是过大了。这个过大是Nginx服务认为过大了,Nginx的文件大小限制也是需要设置下的。

技术分享图片

    用vim打开nginx.conf,在http区块添加一行,然后重新加载nginx配置文件。然后上传成功。

client_max_body_size 8m;

技术分享图片

7.设置Nginx expires缓存

    Nginx的expires的功能就是为用户访问的网站内容设定一个过期的时间,当用户第一次访问这些内容时,会把这些内容存储到浏览器本地,这样用户第二次及以后继续访问该网站时,浏览器会检查加载已经缓存到浏览器本地的内容,就不会去服务器下载了,知道缓存的内容过期或被清除为止。

    expires可以减低网站的带宽,节约成本;加快用户的访问网站的速度,提升用户访问体验。但是如果网站更新内容比较频繁的话,就需要另外注意当用户更新的时候,用户看到的是不是缓存下来旧的内容。所以,这个expires的时间,我们要根据实际情况去更改,下面我们设置wordpress的css和图片内容缓存的时间为7天。在虚拟主机blog.conf的配置文件里面添加几行:

	location ~ .*\.(gif|jpeg|jpg|bmp|png|swf)$ {
		expires 7d;
		root html/blog;
	}
	location ~ .*\.(js|css)?$ {
		expires 7d;
	}

    检查语法没有问题之后,重载配置文件,然后用curl来检查,看到了expires的时间为7天。

技术分享图片

    





以上是关于Nginx服务优化——性能与安全的主要内容,如果未能解决你的问题,请参考以下文章

安全开发运维必备的Nginx代理Web服务器性能优化与安全加固配置

nginx 性能优化

Nginx优化与防盗链

Nginx服务学习

web安全与性能优化(web 攻击)

nginx调优参数整理总结