提高Node.js性能的应用技巧分享


Posted in Javascript onAugust 10, 2017

一、实现一个反向代理服务器

相比大多数应用服务器,Node.js 可以很轻松的处理大量的网络流量,但这并不是 Node.js 的设计初衷。

如果你有一个高流量的站点,提高性能的第一步是在你的 Node.js 前面放一个反向代理服务器。这可以保护你的 Node.js 服务器免于直接暴露在网络中,而且可以允许你灵活的使用多个应用服务器做负载均衡和静态文件缓存。

提高Node.js性能的应用技巧分享

使用 NGINX 在一个已经存在的服务器前做反向代理,作为 NGINX 的一个核心应用,已经被用于全世界成千上万的站点中。

下面是使用 NGINX 作为反向代理服务器的优点:

简化了权限处理和端口分配

更高效的处理静态资源

更好的处理 Node.js 崩溃情况

缓解 DoS 攻击的影响

注:这篇文章解释如何在 Ubuntu 14.04 或者 CentOS 环境中使用 NGINX 做反向代理服务器,而且使用 NGINX 在 Node.js 前做反向代理服务器是有效的。

二、缓存静态文件

随着流量的增长,以 Node 为基础的服务器开始显现压力。这时,你可能想做两件事:

使用更多的 Node.js 服务器。

在多个服务器间做负载均衡

这其实很简单,NGINX 一开始就是作为反向代理服务器来实现的,这使其很容易做缓存和负载均衡等。

Modulus 的网站有一篇有用的文章,介绍了使用 NGINX 做 Node.js 反向代理服务器的性能提升。只使用 Node.js 时,作者的网站每秒能处理 900 个请求。 使用 NGINX 作为反向代理服务器来处理静态文件后,该网站每秒可处理超过 1600 个请求,接近两倍的性能提升。

下面是该网站做上述性能提升的配置代码:

nginx

server {

listen 80;

server_name static-test-47242.onmodulus.net;

root /mnt/app;

index index.html index.htm;

location /static/ {

try_files $uri $uri/ =404;

}

location /api/ {

proxy_pass http://node-test-45750.onmodulus.net;

}

}

三、实现 Node.js 负载均衡

最终目标— Node.js 运行多个应用服务器,并在这些服务器之间均衡负载。

Node.js 实现负载均衡是比较困难的,因为 Node.js 允许浏览器端 JavaScript 和 服务器端 Node.js 通过 json 做数据交互,这就意味着同一个客户端可以反复的访问一个特定的应用服务器,而且多个应用服务器之间共享 session也是比较困难的。

NGINX 实现无状态负载均衡的方式:

Round Robin. 新的请求去列表中的下一个服务器

Least Connections. 新的请求去连接数最少的服务器

IP Hash. 根据客户端 IP 的 hash 值指定服务器

只有 IP Hash 这一种能够可靠的把客户端请求代理到同一台服务器的方式才能使 Node.js 应用服务器受益。

四、代理 WebSocket 连接

所有版本的 HTTP 都是为客户端主动请求服务器来设计的,而 WebSocket 可以实现服务器主动向客户端的消息推送。

WebSocket 协议使客户端和服务器端的稳定交互更加简单,同时也提供更小的交互延迟。当你需要一个全双工的通讯,即客户端和服务器都可以在需要时主动发起消息请求,那么使用 WebSocket 就对了。

WebSocket 协议有健全的 JavaScript 接口,因此也原生适合用 Node.js 作为应用服务器。当连接数上升,使用 NGINX 在客户端和 Node.js 服务器端做代理来缓存静态文件和负载均衡就变得非常有意义。

五、实现 SSL/TLS 和 HTTP/2

越来越多的网站使用 SSL/TLS 来保证信息交互的安全性,你也可以考虑是否要把它加入到你的网站中,但如果你决定要做,那么 NGINX 有两种方式来支持它:

你可以使用 NGINX 做 SSL/TLS 反向代理,Node.js 服务器使用解密后的请求然后返回未加密的内容给 NGINX。

使用 HTTP/2 可以抵消 SSL/TLS 带来的性能开销,NGINX 支持 HTTP/2, 所以你可以同时使用 HTTP/2 和 SSL 代理请求,而你的 Node.js 服务器不需要做任何更改。

在实现阶段你需要更新 Node.js 配置文件中的 URL, 在你的 NGINX 配置文件中使用 SPDY 或者 HTTP/2 优化连接。添加 HTTP/2 支持意味着支持 HTTP/2 的浏览器可以使用新的协议和你的应用交互,而老的浏览器继续使用 HTTP/1.x。

Javascript 相关文章推荐
JS 用6N±1法求素数 实例教程
Oct 20 Javascript
Js基础学习资料
Nov 23 Javascript
js原型链原理看图说明
Jul 07 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
Jan 02 Javascript
jquery动态加载js/css文件方法(自写小函数)
Oct 11 Javascript
7个有用的jQuery代码片段分享
May 19 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
Sep 14 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
Jul 11 Javascript
原生JS实现九宫格抽奖效果
Apr 01 Javascript
详解vue+webpack+express中间件接口使用
Jul 17 Javascript
解决jQuery使用append添加的元素事件无效的问题
Aug 30 jQuery
微信小程序实现日历功能
Nov 27 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
Aug 10 #Javascript
纯js实现页面返回顶部的动画(超简单)
Aug 10 #Javascript
基于daterangepicker日历插件使用参数注意的问题
Aug 10 #Javascript
通过示例彻底搞懂js闭包
Aug 10 #Javascript
用js屏蔽被http劫持的浮动广告实现方法
Aug 10 #Javascript
JS实现下拉菜单列表与登录注册弹窗效果
Aug 10 #Javascript
浅谈sass在vue注意的地方
Aug 10 #Javascript
You might like
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
php cookie 作用范围?不要在当前页面使用你的cookie
2009/03/24 PHP
深入理解PHP原理之异常机制
2010/08/21 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
javascript模拟命名空间
2015/04/17 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
2017/12/25 jQuery
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
Python爬虫框架Scrapy常用命令总结
2018/07/26 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
python plotly绘制直方图实例详解
2019/07/22 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
荷兰最大的儿童服装店:The Kids Republic
2019/04/13 全球购物
C语言笔试题
2014/09/04 面试题
物业公司的岗位任命书
2014/06/06 职场文书
本科应届生自荐信
2014/06/29 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
西柏坡观后感
2015/06/08 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS