本文主要是介绍nginx优化,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
(一)nginx配置优化
nginx的优化通常会通过nginx配置进行优化,常用的配置如下
- worker_process 8:配置nginx进程数,通常会按照CPU数量的倍数进行配置
- worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000:为每个进程分配CPU,可以为进程分配多个CPU,格式为二进制格式
- worker_rlimit_nofile 65535:nginx进程最多打开的文件描述符数目,理论上为系统最多打开文件那数除以进程数。查看linux最大打开文件数的命令为
sysctl -a | grep fs.file
- use epoll:作用于event的I/O多路复用模型,nginx针对不同的操作系统,拥有不同的时间模型;其中包括
- 标准事件模型(如果当前系统不存在更有效的方法,nginx会选择select或poll))
(1)Select
(2)poll - 高效事件模型
(1)Kqueue:使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
(2)Epoll: 使用于Linux内核2.6版本及以后的系统。
(3)/dev/poll:使用于 Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
(4)Eventport:使用于 Solaris 10. 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
- worker_connections 65535:每个进程的最大连接数,理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections
- keepalive_timeout 60:不限制超时时间,会导致请求堆积,从而导致资源浪费。
- client_header_buffer_size 4k:客户端请求头的缓存区大小,可以根据系统的分页大小设置,请求头的大小通常不超过1k,一般系统分页大小超过1k,查看系统分页大小命令为
getconf PAGESIZE
- open_file_cache max=65535 inactive=60s:max为文件缓存数量,inactive是指经过多长时间文件没有被请求即删除缓存
- open_file_cache_valid 80s:设置多长时间检查一次缓存的有效信息
- open_file_cache_min_uses 1:open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除
(二)nginx内核优化
- net.ipv4.tcp_max_tw_buckets = 6000:timewait的最大数量,默认值为180000
- net.ipv4.ip_local_port_range = 1024 65000:允许系统打开的端口范围
- net.ipv4.tcp_tw_recycle = 1:启用timewait快速回收
- net.ipv4.tcp_tw_reuse = 1:开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接
- net.ipv4.tcp_syncookies = 1:开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理
- net.core.somaxconn = 262144:web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值
- net.core.netdev_max_backlog = 262144:每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
- net.ipv4.tcp_max_orphans = 262144:系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
- net.ipv4.tcp_max_syn_backlog = 262144:记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128
- net.ipv4.tcp_timestamps = 0:时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种"异常"的数据包。这里需要将其关掉
- net.ipv4.tcp_synack_retries = 1:为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
- net.ipv4.tcp_syn_retries = 1:在内核放弃建立连接之前发送SYN包的数量
- net.ipv4.tcp_fin_timeout = 1:如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些
- net.ipv4.tcp_keepalive_time = 30:当keepalive启用的时,TCP发送keepalive消息的频度。缺省默认为2小时
备注:笔记而已,实际未验证,后续方便自己研究。。。
这篇关于nginx优化的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!