nginx性能优化

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加载不正常
原文地址:https://www.cnblogs.com/wxl-dede/p/5137772.html