rt
静态文件服务、TLS(包括 HTTP 重定向,OCSP Stapling, Cipher Suites 的优先级调整)、动态压缩、multipart 合并、还有简单的限流和黑名单自动化来(在一定限度上)防御 DDoS 还是在 Web 服务器上做会舒适一点。
Nginx 生态也不仅仅限于负载均衡嘛。就像 Rate Limit 这块就比 Rack 成熟很多,Ruby 应该是只有一个能用的 Rack 中间件。
至于隔壁 Elixir 社区里面有着不愿意用 Nginx 的风气,多半是因为 Cowboy 早就支持了 HTTP 2,而且性能也挺好。
另一个考虑是,我是不愿意让 Puma 占据 443 端口的,还有别的服务呢。所以就给 Nginx 了,Puma 让它开个 Unix Domain Socket 就行了。(除非用 iptables 搞行为艺术
有区别,例如用户网络很慢,nginx 可以保证 puma 和 nginx 之间速度很快,不至于让 puma HOLD 在那里迁就用户很慢的网络传输
(要说的是 slow client 的话,puma 从 4 开始是有处理的(两年前就是了):https://www.schneems.com/2019/06/26/puma-4-new-io-4-your-server/
(unicorn 应该是没有,因为用的是 worker,所以 unicorn 前面必须有额外的层来进行 slow client attack 防护
(虽然这并不改变 puma 前面应该有一个类似 nginx 的事实叭
现在大家都上云了,通常整个 flow 是这样的:Application Load Balancer -> Nginx -> Puma
今天我也有类似的疑问,如果有了 ALB,还需要 Nginx 吗?
看完 2 楼的回答,豁然开朗,Nginx 还是需要的。
(这不是没什么闲钱压根没用过云服务提供的类似服务才折腾 Nginx 嘛
(Nginx 也没整什么花活就全靠默认的配置
(Nodejs 上跑 SocketIO 配置自己写,Rails 的配置抄 Capistrano
(按理讲防 DDoS 挂个 CloudFlare 的免费 CDN 比较靠谱……叭?
我个人的观点,东西体量小,觉得没区别。
Nginx 内部的是 EventLoop 类似的单线程异步,分发请求的效率非常高。背后有多个 server 多个服务的时候,未必全是 rails 的时候,很有必要。
Puma 是多线程的,他自己会慢一些。
从原理感受下就知道了。其实是有区别的。Puma 有速度和用途的局限性。而且听说 Puma 是不是会存在回收时候的等待。这样 Nginx 会弥补一些 Puma 的问题。