如何优化Nginx和Nodejs(nginx调优和优化)

如何优化Nginx和Nodejs(nginx调优和优化)

浏览次数:
信息来源: 用户投稿
更新日期: 2025-11-29
文章简介

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

2025阿里云双十一服务器活动

网络调优如果不先对nginx和node.js的底层传输机制有所了解,并进行针对性优化,可能对两者再细致的调优也会徒劳无功。一般情况下,nginx通过tcpsocket来连接客户端与上游应用。我们的系统对tcp有许多门限值与限制,通过内核参数来设定。这些参数的默认值往往是为一般的用途而定的,并不能满足web服务器所需的高流量、短生命的要求。这里列出了调优tcp可供候选的一些参数。为使它们生效,可以将它们放在/etc/sysctl.conf文件里,或者放入一个新配置文件,比如/etc/sysctl.d/99-tuning.conf,然后运行sysctl-p,让内核装载它们。我们是用sysctl-cookbook来干这个体力活。需要注意的是,这里列出来的值是可以安全使用的,但还是建议大家研究一下每个参数的含义,以便根据自己的负荷、硬件和使用情况选择一个更加合适的值。

<spanstyle="font-size:14px;color:#009900;font-family:microsoftyahei">net.ipv4.ip_local_port_range='102465000'

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='40968738016777216'

net.ipv4.tcp_syn_retries='2'

net.ipv4.tcp_synack_retries='2'

net.ipv4.tcp_wmem='40966553616777216'

vm.min_free_kbytes='65536'</span>

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

net.ipv4.ip_local_port_range

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

net.ipv4.tcp_tw_reuse如何优化Nginx和Nodejs,nginx调优和优化

net.ipv4.tcp_fin_timeout

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

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

或使用ss:

tcp:47461(estab311,closed47135,orphaned4,synrecv0,timewait47135/0),ports33938

frag000

upstreambackend_nodejs{

servernodejs-3:5016max_fails=0fail_timeout=10s;

servernodejs-4:5016max_fails=0fail_timeout=10s;

servernodejs-5:5016max_fails=0fail_timeout=10s;

servernodejs-6:5016max_fails=0fail_timeout=10s;

}

我还按它的建议修改了server一节的proxy设置。同时,加了一个proxy_next_upstream来跳过故障的服务器,调整了客户端的keepalive_timeout,并关闭访问日志。配置变成这样:

server_namefast.gosquared.com;

proxy_next_upstreamerrortimeouthttp_500http_502http_503http_504;

proxy_set_headerconnection"";

proxy_passhttp://backend_nodejs;

}

采用新的配置后,我发现服务器们占用的socket降低了90%。现在可以用少得多的连接来传输请求了。新的输出如下:

tcp:4675(estab485,closed4183,orphaned0,synrecv0,timewait4183/0),ports2768

inet5055014

得益于事件驱动式设计可以异步处理i/o,node.js开箱即可处理大量的连接和请求。虽然有其它一些调优手段,但这篇文章将主要关注node.js的进程方面。node是单线程的,不会自动使用多核。也就是说,应用不能自动获得服务器的全部能力。实现node进程的集群化我们可以修改应用,让它fork多个线程,在同一个端口上接收数据,从而实现负载的跨越多核。node有一个cluster模块,提供了实现这个目标所必需的所有工具,但要将它们加入应用中还需要很多体力活。如果你用的是express,ebay有一个叫cluster2的模块可以用。防止上下文切换当运行多个进程时,应该确保每个cpu核同一时间只忙于一个进程。一般来说,如果cpu有n个核,我们应该生成n-1个应用进程。这样可以确保每个进程都能得到合理的时间片,而剩下的一个核留给内核调度程序运行其它任务。我们还要确保服务器上基本不执行除node.js外的其它任务,防止出现cpu的争用。我们曾经犯过一个错误,在服务器上部署了两个node.js应用,然后每个应用都开了n-1个进程。结果,它们互相之间抢夺cpu,导致系统的负荷急升。虽然我们的服务器都是8核的机器,但仍然可以明显地感觉到由上下文切换引起的性能开销。上下文切换是指cpu为了执行其它任务而挂起当前任务的现象。在切换时,内核必须挂起当前进程的所有状态,然后装载和执行另一个进程。为了解决这个问题,我们减少了每个应用开启的进程数,让它们公平地分享cpu,结果系统负荷就降了下来:请注意上图,看系统负荷(蓝线)是如何降到cpu核数(红线)以下的。在其它服务器上,我们也看到了同样的情况。既然总的工作量保持不变,那么上图中的性能改善只能归功于上下文切换的减少。

以上就是如何优化Nginx和Node.js的详细内容,更多请关注主机测评网其它相关文章!

标签:
租站群服务器能做什么(租服务器是干什么用的)
« 上一篇
返回列表
下一篇 »

如本文对您有帮助,就请抽根烟吧!