利用NginX和Node.js搭建高吞吐量web应用

网络调优;net.ipv4.ip_local_port_range;net.ipv4.tcp_tw_reuse;net.ipv4.tcp_fin_timeout;如何检查连接状态

利用NginX和Node.js搭建高吞吐量web应用

译者:AlfredCheung

在搭建高吞吐量web应用这个议题上,NginXNode.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

NginX

随着web服务器的负载逐渐升高,我们就会开始遭遇nginx的某些奇怪限制。连接被丢弃,内核不停报syn flood。而这时,平均负荷和CPU使用率都很小,服务器明明是可以处理更多连接的状态,真令人沮丧。

经过调查,发现有非常多处于TIME_WAIT状态的连接。这是其中一个服务器的输出:

ss -s

total: 388 (kernel 541)

tcp:   47461 (estab 311, closed 47135, orphaned 4, synrecv 0, timewait 47135/0), ports 33938

transport Total     IP        IPv6

*          541       –         –        

raw        0         0         0        

udp        13        10        3        

tcp        326       325       1        

inet       339       335       4        

frag       0         0         0

有47135个TIME_WAIT连接!而且,从ss可以看出,它们都是已经关闭的连接。这说明,服务器已经消耗了绝大部分可用端口,同时也暗示我们,服务器是为每个连接都分配了新端口。调优网络对这个问题有一点帮助,但是端口仍然不够用。

经过继续研究,我找到了一个关于上行连接keepalive指令的文档,它写道:

设置通往上游服务器的最大空闲保活连接数,这些连接会被保留在工作进程的缓存中。

有趣。理论上,这个设置是通过在缓存的连接上传递请求来尽可能减少连接的浪费。文档中还提到,我们应该把proxy_http_version设为”1.1″,并清除”Connection”头部。经过进一步的研究,我发现这是一种很好的想法,因为HTTP/1.1相比HTTP1.0,大大优化了TCP连接的使用率,而Nginx默认用的是HTTP/1.0。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年5月4日 01:18:49
下一篇 2024年5月4日 01:20:54

相关推荐

  • linux心跳机制,nginx心跳检测机制

    什么是心跳机制 1、“心跳检测包”是属于TCP协议底层的检测机制,上位机软件只是解析显示网口的有用数据包,收到心跳包报文属于TCP协议层的数据,一般软件不会将它直接在应用层显示出来,所以看不到。 2、心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。 3、这样大家就明白了,其实心跳过速时,由于心肌长时间处于收缩状…

    2024年5月15日
    4100
  • linuxbinding.node的简单介绍

    为什么binding.node出错 为什么binding.node出错 在前两个例子中用到了输入和输出函数scanf和 printf,在以后要详细介绍。这里我们先简单介绍一下它们的格式,以便下面使用。scanf和 printf这两个函数分别称为格式输入函数和格式输出函数。 如果package.json中引用了gulp-sass,有时候安装或这运行也会出问题,…

    2024年5月14日
    4700
  • c语言node,c语言node类型是什么

    c语言bstnode是什么意思 1、应该指的是BTNode* T吧。这是指向根节点的指针。根据代码,BTNode的定义至少如下:typedef struct { int data;struct BTNode* lchild;struct BTNode* rchild;} BTNode;经验之谈:不把代码抄在笔记本上,而是输入到电脑里。 2、否则将k和根结点的…

    2024年5月13日
    3900
  • java中nginx配置,java修改nginx配置文件

    nginx+java的一点配置问题 1、你这样配置是不行的,把你放js的目录这要写 server { listen 80;server_name js.web.com root e:/statics;} 然后用jhttp://js.web.com/resouces/js/jquery-js 就没问题了。 2、在http参数配置中可以配置nginx的http项…

    2024年5月10日
    4300
  • linux启动nigux,Linux启动nginx

    linux软件启动命令linux软件启动 GNOME桌面环境在终端中运行这个命令,启动StartupApplicationsPreferences(启动应用程序首选项)GUI。$gnome-session-properties点击Add(添加)按钮,即可配置一个新的启动应用程序。 首先确保Linux虚拟机挂载了光盘,然后重启服务器,进入重启界面按Ctrl+A…

    2024年5月9日
    3600
  • linux吞吐量查看命令,linux查看网络吞吐量

    linux上用jmeter做压测吞吐量上不去? 1、脚本尽量最小变量 ,多个线程组下CSV文件设置,如果 只在当前线程组 使用变量,尽量不使用“全部现场”。 2、如果是Windows当主机,重启一下jmeter在运行-远程启动既可以看到压测机。如果是Linux下主机,需要用到命令:我是在测试jmx脚本的目录下执行,这样方便收集信息。 3、jmeter压测方法…

    2024年4月10日
    4800
  • linuxsvnnginx安装配置,linux nginx安装配置

    Linux难学吗? Linux相当于来讲不难,但想要完全掌握并非易事,需要付出足够的时间和精力,而且涉及的内容有很多,所以想要学好Linux,必须选择合适的方式;如果没有基础的话,建议大家报班学习,这样效果更好,对以后发展也更有帮助。 Linux是免费开源的操作系统,相对于来说Linux还是非常好学的,要比编程更加简单一些,不过具体的情况需要结合个人情况来决…

    2024年4月9日
    4700
  • c语言中node(c语言中not declared in this scope)

    今天给各位分享c语言中node的知识,其中也会对c语言中not declared in this scope进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! 本文目录一览: 1、C语言链表那一块,Node * 和 *list 分别是什么意思2、C++里创建链表时Node是什么意思?Node需要在函数头定义么?要的话怎么定义?3、c语言结…

    2024年4月2日
    6800
  • c语言node是干嘛的

    node.js干嘛的和JavaScript啥区别 node.js 和 javascript 从本质上来说没有什么区别,语言是一样的,都是javascript语言编写。但是,node.js 主要从事后台操作,javascript主要操作HTML的元素(前端)。 node.js是什么,和javascript有什么关系? 是一种可能用JS语言的后端程式设计方式。j…

    2024年3月24日
    5300
  • 用nginx访问linux中图片,nginx输出真正访问路径

    linux安装禅道用nginx行吗_禅道安装教程linux 选择你要安装的nginx版本,这里,我选择的是 nginx-2 。具体的下载链接为:http://nginx.org/download/nginx-tar.gz 可以在其他电脑下载好,通过ftp软件传给要安装的linux电脑。 Linux下如果要搭建nginx和php环境,需要安装三个软件包:ngi…

    2024年3月14日
    5000

发表回复

登录后才能评论



关注微信