技术开发 频道

为高负载网络优化Nginx和Node.js

        【IT168 技术】在搭建高吞吐量web应用这个议题上,NginX和Node.js可谓是天生一对。他们都是基于事件驱动模型而设计,可以轻易突破Apache等传统web服务器的C10K瓶颈。预设的配置已经可以获得很高的并发,不过,要是大家想在廉价硬件上做到每秒数千以上的请求,还是有一些工作要做的。

  这篇文章假定读者们使用NginX的HttpProxyModule来为上游的node.js服务器充当反向代理。我们将介绍Ubuntu 10.04以上系统sysctl的调优,以及node.js应用与NginX的调优。当然,如果大家用的是Debian系统,也能达到同样的目标,只不过调优的方法有所不同而已。

  网络调优

  如果不先对Nginx和Node.js的底层传输机制有所了解,并进行针对性优化,可能对两者再细致的调优也会徒劳无功。一般情况下,Nginx通过TCP socket来连接客户端与上游应用。

  我们的系统对TCP有许多门限值与限制,通过内核参数来设定。这些参数的默认值往往是为一般的用途而定的,并不能满足web服务器所需的高流量、短生命的要求。

  这里列出了调优TCP可供候选的一些参数。为使它们生效,可以将它们放在/etc/sysctl.conf文件里,或者放入一个新配置文件,比如/etc/sysctl.d/99-tuning.conf,然后运行sysctl -p,让内核装载它们。我们是用sysctl-cookbook来干这个体力活。

  需要注意的是,这里列出来的值是可以安全使用的,但还是建议大家研究一下每个参数的含义,以便根据自己的负荷、硬件和使用情况选择一个更加合适的值。

net.ipv4.ip_local_port_range='1024 65000'
net.ipv4.tcp_tw_reuse
='1'
net.ipv4.tcp_fin_timeout
='15'
net.core.netdev_max_backlog
='4096'
net.core.rmem_max
='16777216'
net.core.somaxconn
='4096'
net.core.wmem_max
='16777216'
net.ipv4.tcp_max_syn_backlog
='20480'
net.ipv4.tcp_max_tw_buckets
='400000'
net.ipv4.tcp_no_metrics_save
='1'
net.ipv4.tcp_rmem
='4096 87380 16777216'
net.ipv4.tcp_syn_retries
='2'
net.ipv4.tcp_synack_retries
='2'
net.ipv4.tcp_wmem
='4096 65536 16777216'
vm.min_free_kbytes
='65536'

  重点说明其中几个重要的。

  net.ipv4.ip_local_port_range

  为了替上游的应用服务下游的客户端,NginX必须打开两条TCP连接,一条连接客户端,一条连接应用。在服务器收到很多连接时,系统的可用端口将很快被耗尽。通过修改net.ipv4.ip_local_port_range参数,可以将可用端口的范围改大。如果在/var/log/syslog中发现有这样的错误: “possible SYN flooding on port 80. Sending cookies”,即表明系统找不到可用端口。增大net.ipv4.ip_local_port_range参数可以减少这个错误。

  net.ipv4.tcp_tw_reuse

  当服务器需要在大量TCP连接之间切换时,会产生大量处于TIME_WAIT状态的连接。TIME_WAIT意味着连接本身是关闭的,但资源还没有释放。将net_ipv4_tcp_tw_reuse设置为1是让内核在安全时尽量回收连接,这比重新建立新连接要便宜得多。

  net.ipv4.tcp_fin_timeout

  这是处于TIME_WAIT状态的连接在回收前必须等待的最小时间。改小它可以加快回收。

  如何检查连接状态

  使用netstat:

  netstat -tan | awk '{print $6}' | sort | uniq -c

  或使用ss:

  ss -s

0
相关文章