• 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加载不正常
  • 相关阅读:
    无题
    生活真像小说
    草样年华
    Intentional Programming
    厌倦说话
    解释 Intentional Programming
    开始折腾iphone cdma 恢复,降级,刷机,越狱,手编,写号
    新手如何成为更好的图形设计师
    Grunt.js 初使用
    有抱负的程序员应看的10个TED演讲
  • 原文地址:https://www.cnblogs.com/wxl-dede/p/5137772.html
Copyright © 2020-2023  润新知