您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
nginx-nginx单机1W并发优化
发布时间:2017-11-23 12:21:01编辑:雪饮阅读()
实验环境:
3台centosX64-6.5,每台2G内存,20G容量sd硬盘
其中一台为nginx服务器端,另外两台为ab测试客户端。
本次实验数据均参考上面配置,所以不同配置在做实验时相同参数未必能达到同样的效果。
并发优化前:
并发为2000,总请求数为80000后查看请求结果,发现完成总请求是80000,其中失败请求是5099。
Complete requests: 80000
Failed requests: 5099
用亿图图示专家画出思维导图:
各优化项配置:
(1)socket->nginx->keep_alivetime优化:
说到keep_alivetime优化则不得不提到ab测试工具的-k参数,-k参数指定了每次会话的可复用性。在http1.0协议中客户端与服务端的请求流程如下:
http1.0
client server
请求 应答 断开
请求 应答 断开
… … …
而在http1.1中一次请求中可以取得多个数据。
如请求一个页面是index.php而该页面中包含引入的css,js等外部文件也需要请求过来时则仍然使用index.php所在的请求。排队一次,取好多东西。
若是http1.0中则index.php请求完毕后,对于引入的css,js等外部文件则分别需要建立新的请求去获取。
而ab测试工具的-k启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能。也就是http1.1的会话可复用的特性。
ab测试如:
ab -c 5000 -n 80000 -k http://192.168.0.22/index.html
服务端nginx中keep_alivetime优化的配置:
在http全局段中将keepalive_timeout设置为0,默认为65
keepalive_timeout 0;
#keepalive_timeout 65;
如果此时在浏览器中访问请求地址,会发现控制台中network项中headers的响应头中多出”Connection:close”,一般没有优化过该选项的则默认是” Connection:keep-alive”,优化该选项后默认的” Connection:keep-alive”没有了,并取而代之的是关闭即”Connection:close”
如果该项没有优化时,则会发现http://192.168.0.22/status所反应服务端信息中的Waiting值显著增多。
(2) socket->nginx->worker_connections优化:
该项是nginx允许的子进程最大可以打开的连接数。
nginx中配置示例如:
events {
worker_connections 10240;
}
这里将events段中的worker_connections由默认的1024修改为10240。
(3) socket->系统层面->somaxconn优化:
和worker_connections差不多,不过somaxconn是系统层面的最大连接数限制,而不是应用层面上的。
somaxconn是系统运行状态的状态值,并非真正的文件,该值从内存读取过来,所以修改该内存就会立即生效
使用more命令查看somaxconn在系统中默认为128
more /proc/sys/net/core/somaxconn
我们可以使用echo命令来修改该值
echo 50000 > /proc/sys/net/core/somaxconn
(4) socket->系统层面-> tcp_tw_recycle优化:
表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
可以使用cat命令来查看,如
cat /proc/sys/net/ipv4/tcp_tw_recycle
开启tcp_tw_recycle
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
服务器端设置最大文件打开数为20000:ulimit -n 20000
(5) socket->系统层面->tcp_tw_reuse优化:
空的tcp是否允许回收利用,表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
和tcp_tw_recycle一样默认为0,表示关闭,开启tcp_tw_reuse
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
(6) socket->系统层面->关闭洪水抵御策略:
认识linux的洪水攻击抵御策略:
先在客户端用5000并发,80000总请求如:
ab -c 5000 -n 80000 http://192.168.0.22/index.html
测试完毕后查看服务端系统信息,dmesg可以查看系统信息,我们只看最后10行(管道处使用tail),命令如:dmesg|tail
查询结果如:
8021q: adding VLAN 0 to HW filter on device eth0
SELinux: initialized (dev autofs, type autofs), uses genfs_contexts
SELinux: initialized (dev autofs, type autofs), uses genfs_contexts
SELinux: initialized (dev autofs, type autofs), uses genfs_contexts
fuse init (API version 7.13)
SELinux: initialized (dev fuse, type fuse), uses genfs_contexts
ISO 9660 Extensions: Microsoft Joliet Level 3
ISO 9660 Extensions: RRIP_1991A
SELinux: initialized (dev sr0, type iso9660), uses genfs_contexts
possible SYN flooding on port 80. Sending cookies.
信息中“possible SYN flooding on port 80. Sending cookies.”是指对于80端口采用了Sending cookies的方式来进行洪水抵御。由于测试工具对于nginx的压力测试被系统误认为是洪水攻击了。
查看洪水抵御:
值为1表示开启,值为0表示关闭:
more /proc/sys/net/ipv4/tcp_syncookies
关闭洪水抵御:
echo 0 > /proc/sys/net/ipv4/tcp_syncookies
(7)文件->nginx-> worker_rlimit_nofile优化:
worker_rlimit_nofile千万别和worker_connections弄混了,虽然同属于nginx中的,但worker_connections是nginx中子进程允许的最大打开连接数,worker_rlimit_nofile则是nginx中子进程允许打开的最大文件数。
配置如:
worker_processes 1;
worker_rlimit_nofile 10000;
在全局配置中worker_processes配置下面直接添加该项即可。
(8)注意
有时候发现ab测试工具的结果中请求失败个数为0,而服务端http://192.168.0.22/status所反应的活动连接经常是低于你测试的并发数的,此时可能是ab测试工具所在的客户端机器的配置问题使得ab测试工具自己先扛不住了,就好比你要去打人,首先你要有能力打倒人家才行。
客户端机器提升最大连接数:
echo 50000 > /proc/sys/net/core/somaxconn
另外,在http://192.168.0.22/status中多观察控制台中network中的Time字段所呈现的每次请求耗费时间,时间越稳定且越耗费的少肯定是最好的啦。
关键字词:nginx,并发,单机,优化