新手问题 为什么需要同时使用 nginx 和 puma
如题,为什么生产环境需要两个服务器,他们都分别做了什么。
静态内容和动态内容。当然nginx也可能只起了反向代理和请求分发的作用。

静态内容就是一些资源文件,比如图片, css, js等文件,这些东西一般放在 public 目录下,即使开发的时候是放在 assets 目录下,最后部署的时候 rails 还是会把它们处理后放到 public 目录下
对于楼上回答的、楼主可以看看这个两个文件
config/environments/development.rb
和 config/environments/prodduction.rb
里面的 这个配置
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
然后呢,其实 Nginx 还有很多其他的功能。比如转发 WebSocket 。比如你有好多的 Puma 实例需要分配权重 ?
你也可以直接用 puma, nginx 的作用是:1.更高效的代理静态文件,2.负载均衡,3.多网站
首先要搞清楚 静态内容和动态内容。
nginx是web服务器,比如还有apache
但是只有nginx,无法使用rails程序,必须有东西来连接web服务器和rails程序
这个程序就是puma,也叫rack服务器,类似的还有unicorn等
只有puma好像也可以跑起来,但是它只有十几个线程,同时请求太多就不行了
nginx的连接数可以有上千个,可以同时处理更多请求
有部分功能是重叠的,但是nginx能够提供一些更强大更便利的功能,除了楼上说的一些还有比如HTTP2,基于路径的转发规则,重定向等等。
一个nginx后面可以有n个网站,nginx负责把域名转发到后端,静态文件转发到文件系统,动态的内容交给容器(puma、tomcat)自己管理,当然也可以转发给另外一个nginx或是IIS、Apache。
web服务器 和应用服务器 。具体区别自行google
理论上你可以让puma 承担所有工作, 只是说 puma 是基于 ruby 的 , 效率没有基于 nginx 的高
比如你开一个puma 进程, 进程再跑20个线程
但是很有可能你一个网站就有超过5个静态资源, 之后只要有4个访问并发, 你puma 的线程数就占完了, 新访问就没办法进来了
而nginx 首先在处理静态资源的情况下效率就比puma 高很多, 对 wait 的处理也非常好, 对于静态资源, 几千个并发随便来,
同时就算puma 资源耗完了, nginx 也可以先将连接进入wait 状态, 等待 puma 可以接受新资源了, 再进行转发
再就是一些跟网站本身没有多大联系的功能, 比如 SSL证书, 或者多个网站部署到同一个ip 等等, 要说用puma 可以不可以实现, 也可以, 但是复杂性大大增强了, 耦合性也急速的膨胀. 然而对于这种东西, nginx 处理起来驾轻就熟, 直接上配置就好了
总结下来, 就是专业的事情, 专业的工具来干. 用螺丝刀也可以钉钉子, 但是如果有锤子, 还是上锤子比较好
nginx一般充当路由角色。。