Node.js生产环境最佳实践

  Node.js在生产产品环境有几个最佳实践,这些方式措施很容易被忽视或错误使用,本文就这几个方式进行详细阐述:

使用Node.js集群

Node.js是自然是要单线程,并且有1.5GB内存的限制,因此无法自动充分利用多CPU核优势,但是好消息是Cluster模块可以让你将Node.js分成多个子流程运行,它们和父流程之间使用IPC进行通讯,主流程控制工作子流程,所有进来的连接会以一种round robin方式被分布多个工作子流程上。

集群模块能够提高你的应用性能,让你实现零当机,必须记住的是,工作子流程数量不是被CPU核数限制的。

 

不要在Web服务器里执行重型任务

Node/Express服务器是无法胜任CPU密集型任务,在传统典型的Web应用,你会发送大量Email给用户,尽管你可以在Node.js这个Web服务器中执行,它会显著降低服务器的性能,将这些重型任务切分为微小服务,部署到不同的Node节点服务器上是一个好办法,更远来说,你可以使用一个消息队列如RabbitMQ进行这些微小服务之间的通讯联系。

关键是保证Node.js的事件处理线程不被堵塞,能够非堵塞异步处理I/O,需要花长时间完成的任务交由其他节点服务器或单独流程进行处理。

 

使用流程管理器

有很多流程管理器,但是Node.js初次使用者很少在产品环节使用流程管理器,推荐使用pm2,它是一个强大的流程管理器,使用起来很方便:

pm2 start app.js -i 2

上面命令中i指定了以集群方式工作子流程运行个数,最好的是你能一个接一个刷新工作流程,这样你的应用在部署期间不会发生任何当机情况,下面命令可实现刷新:

pm2 reload app

如果使用pm2,可使用Keymetrics监视Node.js的服务。

 

使用反向代理

很多人将Node应用端口放置在80,也实现静态文件的传送,这不是好主意,应该使用Nginx等代理放在Node.js之前,Node使用3000等端口。

 

监视

意外经常发生,除非你检查日志,你不会发现意外问题。你应该使用一个流程管理器,当发生处理异常时,将会重新加载时流程。使用一个监控服务,流程被杀死和重新启动时自动通过电子邮件/短信提醒你。

 

移除console.log语句

console.log会消耗CPU时间和浪费资源,最好办法是使用debug模块,通过控制环境变量DEBUG进行控制台输出控制。

 

不能在Node流程维持全局状态

有时开发者会存储会话id,socket连接等等在内存中,必须避免,否则引起引用扩展问题,需要增加更多服务器,你的应用服务器应该处理Web流量,而不是维持任何内存中状态。

 

使用SSL

在你的Node.js之前使用nginx之类反向代理,在其上安装SSL,最好不用在Node流程中从文件读取SSL的key然后使用。

 

保障基本安全

安全总是重要的,进行 basic security checks检查,使用NSP发现你项目中脆弱点。不要使用过期版本。

 

使用VPN

总是在一个私有网络中部署你的应用程序,以便只有信任的客户端可以与服务器进行通信。特别是在经常部署的时候,人们忘记了这个简单的事情,后来又面临了很多问题。如果Nginx是反向代理,保证Nginx只能连接你的Node端口,应该和其他部分隔离。

 

Node.js教程