Nginx作为Node.js前端Web Server

一个Node.js进程就可以完成负载,但是随着后期访问量的加大,一个进程、一台服务器已经不能满足我们的需要了,这时Nginx就可以发挥自己反向代理的能力。我们可以在Nginx后端添加多个服务器或启动多个进程来分担访问压力。

这样做大致有如下好处:

静态文件性能

Node.js的静态文件处理性能受制于它的单线程异步I/O模型,注定了静态文件性能不会很好。我们应该避免在生产环境下直接使用Node.js来处理静态文件。

反向代理规则

有时会存在反向代理服务器配置多样化的情况,有时我们希望配置较好的机器能够分担更多的压力,有时又因为session的关系,我们需要将同一来源IP的客户端全转发到同一个进程上,对于诸如此类的规则,使用Nginx的配置文件就可以简单实现。

扩展性

Nginx可以加入许多扩展来帮助我们处理业务,最典型的就是加入Lua语言的扩展。胶水语言Lua赋予了Nginx复杂逻辑判断的能力,并且保持了一贯的高效性。例如我们有一个API服务,对访问会进行MD5签名或对同一客户端来源有访问频率限制,这部分代码是后端业务处理前必须通过的验证,具有卡口的作用。利用Lua扩展,我们就可以高效、简单地完成这个卡口。

稳定性和转发性能

Nginx在同样的负载下,相比Node.js占用的CPU和内存资源更少。同时,高效地转发性能、便捷地转发配置也是我们选择它作为反向代理的原因之一,比如我们可以根据不同的URL请求路径转发到不同的后端机器上,也可以设定超时时间等,方便管理。

安全性

Nginx已经被各大互联网公司广泛应用,经过一些配置可以有效抵挡类似slowloris等的DoS攻击。

运维管理

如果我们目前只有一台Web服务器,同时有多个站点需要占用80端口,这时我们只需让Node.js服务监听本地的特殊端口如3000,通过Nginx的反向代理配置,就可以将多个端点域名指向一台机器了。