位置: 编程技术 - 正文

使用Node.js配合Nginx实现高负载网络(node.js怎么用)

编辑:rootadmin

推荐整理分享使用Node.js配合Nginx实现高负载网络(node.js怎么用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:如何配置nodejs运行环境,node.js怎么配置,node.js deno,node.js使用教程,node.js使用教程,node.js orm,node.js in action,node.js使用教程,内容如对您有帮助,希望把文章链接给更多的朋友!

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

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

网络调优

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

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

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

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

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

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

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

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

使用netstat:

或使用ss:

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

使用Node.js配合Nginx实现高负载网络(node.js怎么用)

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

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

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

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

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

按文档的建议修改后,我们的上行配置文件变成这样:

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

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

Node.js

得益于事件驱动式设计可以异步处理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核数(红线)以下的。在其它服务器上,我们也看到了同样的情况。既然总的工作量保持不变,那么上图中的性能改善只能归功于上下文切换的减少。

nodejs实现获取当前url地址及url各种参数值 //需要使用的模块httpurl当前

node.js读取文件到字符串的方法 本文实例讲述了node.js读取文件到字符串的方法。分享给大家供大家参考。具体分析如下:Node.js是一套用来编写高性能网络服务器的JavaScript工具包,一

在Node.js应用中读写Redis数据库的简单方法 在开始本文之前请确保安装好Redis和Node.js以及Node.js的Redis扩展——node_redis首先创建一个新文件夹并新建文本文件app.js文件内容如下:varredis=require("redis")

标签: node.js怎么用

本文链接地址:https://www.jiuchutong.com/biancheng/377972.html 转载请保留说明!

上一篇:把Node.js程序加入服务实现随机启动(node.js怎么样)

下一篇:nodejs实现获取当前url地址及url各种参数值(nodejs 获取命令行参数)

  • 一般纳税人申报纳税的流程
  • 个人缴纳职业年金是什么意思
  • 计入固定资产和其他资产
  • 微店企业和个人的区别
  • 办公费专票怎么做账
  • 兼职工资如何发放给个人
  • 无销项税额
  • 设备使用率怎么计算公式
  • 企业开办时间是什么意思
  • 非正常户发票管理
  • 固定资产的折旧费用计入什么科目
  • 土地违约金怎么写合同
  • 日常生活中各种仪式
  • 房产公司办公室布局
  • 金融工具包括哪些及其法律特征
  • 报关单上金额要和合同上一样吗
  • 以前年度损益调整会计分录
  • 忘了报税算偷税漏税吗
  • 简易征收一般纳税人可以收专票吗
  • 小微企业利润亏损原因
  • 陕西省水利基金的税率
  • 开具红字专票的步骤
  • 一般纳税人销售自己使用过的物品
  • 买车的增票可以分两次吗
  • 职工聚餐费可以列入职工福利费吗
  • 在windows7环境中鼠标主要的三种操作方式是
  • 会计变更
  • 七喜v8笔记本
  • gdb调试工具的使用
  • 一帆风顺的养殖土壤用什么土
  • deepin 终端命令
  • 累积带薪缺勤的例题
  • php文件在线解密
  • 工伤个人承担的费用
  • 金融业务增值税税率
  • 售后租回交易的实质是什么
  • yii2框架从入门到精通
  • 独立费用包括
  • 企业所得税计提会计分录怎么做
  • 购进运输服务取得的增值税专用发票准予抵扣进项税额吗
  • 员工报销医药费的会计分录
  • 特殊动产的一物数卖履行顺序
  • 二氧化剂的使用方法
  • 支付临时工工资,需要个税申报吗
  • 织梦森林官网
  • 织梦标签理解
  • 工会其他支出包括哪些
  • 以货换货怎么交印花税
  • 税控盘上月未清卡去税务带什么
  • sqlserver的replace
  • 民间非营利组织会计科目
  • 旧设备出口可以退税吗
  • 股权转让中土地要否缴纳增值税
  • 社保局退回来的社保怎么入账
  • 稀释股权违法吗
  • 国家退税计入什么科目
  • 税控盘全额抵扣怎么做分录
  • 应税劳务会计分录
  • 电子税务局申报比对异常
  • 减值损失和减值损失区别
  • 工会费上缴
  • 总账建账要建全部科目吗
  • 怎样银行存款,预付帐款,应收帐款余额做资金平衡表
  • mysql删除表数据怎么恢复
  • 安装win7旗舰版鼠标无法使用
  • Win7系统重装后开不了机
  • 低分辨率调高分辨率会模糊吗
  • 在对linux系统中dir
  • win10系统更改
  • javascript definitive guide
  • nodejs怎么在服务器运行
  • 安卓下的分件分享怎么弄
  • android加载gif图片
  • 《JavaScript高级程序设计》pdf链接
  • 工具类软件有哪些
  • 浙江省社保网报系统
  • 初始密码是几位数
  • 开票日期是今年但是业务是去年
  • 金税盘白盘如何换纽扣电池
  • 电子发票怎么作废
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设