一般我们都会用一个Web Server,放在Application Server(puma, thin, unicorn)等前面。用Nginx,可以满足下面这些条件:
- 静态重定向。比如,将http全部转向到https,将某类URL重定向到其他服务器。
- Host静态文件。比如css和js,放到public下面,避免这样的request到application server。
- 也可以用来做负载均衡,支持多个Rails app。
- Puma是基于Ruby的,性能没有Nginx高。如果Puma的资源占完了,就没法接受新的request了,但是Nginx可以先把request接进来并处于wait状态,等Puma有资源再进行转发。
- 对于安装SSL证书,多个Rails app绑定到同一个IP,Nginx更善于处理这样的事情。
下图是一个Rails server通常的架构图,一般情况下,browser request会通过DNS找到对应的公网IP地址,然后在进入内网IP。通常内网IP是一个load balance,比如这里的Nginx。Nginx把静态文件的request直接处理掉,剩下的动态request就进入Puma。Puma是Rack based application server,会把http request按照一定的模式再转发给Rails的路由,再进入Controller。
其中,Rack提供许多中间件,你可以执行rake middleware
拿到所有的中间件。通过这些中间件,可以把Nginx和Rails server粘合在一起。
这些中间件都有同样的模式,即有一个call
方法,返回status code
, header
, content
。你还可以自己写一个中间件,比如写一个中间件,将所有的cookie都标记为secure true。12