event段优化
- 使用epoll事件驱动,比默认selec、poll更高效。
- 加大worker_connection 65535,使得nginx并发能够执行更多的连接
如果设定过小,在高并发的情况下,会在日志中有 work_connection is not enough while accepting new connection on
同时也要修改操作系统的进程最大可处理的文件句柄值
echo 131070 > /proc/sys/fs/file-max; sysctl –p
否则有可能会出现worker_connection are more than open file resource limit
网络的优化
- 设定合适的keepaliave_timeout
keepalive_timeout 60 50;
客户端在60秒内无活动的话,服务器关闭连接
????向客户端发送keepaliave_timeout时间是50秒
- send_timeout 10
设定如果客户端10s内没响应,nginx服务器则关闭连接
- client_header_buffer_size 4k
设定nginx服务器可缓冲客户端http头部的大小,一般设定为和内存分页(getconf PAGESIZE)的大小一样。默认为1k,如果设置过小,客户端的cookie的值设定的也比较大的话,可能会出现400的错误
- multi_accept允许nginx尽可能多的接收网络连接
针对CPU的优化
- worker_processess 4;设定和CPU的核心数一样就行(lscpu)
- work_cpu_affinity 0001,0010,0100,1000;每个进程运行在相应的进程上
内核的优化
- net.ipv4.tcp_max_tw_buckets = 6000
timewait的数量,默认是180000,因此如果想把timewait降下了就要把tcp_max_tw_buckets值减小
- 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.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小时。
日志优化
其实也可说是降低IO负载
在高并发的情况下,且不考虑访问的日志access.log可以直接关闭;
error_log logs/error.log crit;????????????????提升错误日志级别
带宽优化
可以说是压缩数据,减少网络压力,但会消耗一定的CPU,不过CPU一般不会出现瓶颈
- gzip on打开压缩功能
- gzip_http_version 1.0|1.1;默认的是http1.1,对于老的浏览器可能不支持压缩,不过此项较少设定
- gzip_min_length 1024; 一般较大的数据才会有压缩的效果,小的数据可能压缩后变大
- gzip_comp_level 4;????1压缩比例小,9压缩比例大最耗时。
- gzip_disable "MSIE [4-6]\."; IE6不启用压缩功能
- gzip_types text/plain application/x-javascript text/css text/html application/xml; 定义使用压缩媒体的类型
- gzip_vary on; 在http头部添加"Vary Accept-Encoding"用于通知浏览器数据已经被压缩过,这对于不具有解压数据包能力的浏览器有用。
也可这样添加在首部add_head Vary Accept-Encoding gzip;
- 一般在前端nginx上使用,但后端不使用数据压缩。否则的可能导致js加载不正常