在开发ref="/tag/2028/" style="color:#479099;font-weight:bold;">Ruby on Rails应用时,很多人只用内置的Puma或WEBrick服务器跑本地测试。但真要上线部署,光靠这些是扛不住真实流量的。这时候就得把Nginx拉进来,让它当个“门卫”,帮你抗住请求洪峰。
为什么需要Nginx?
Rails本身不是为高并发设计的,直接对外暴露风险大、效率低。Nginx作为高性能反向代理,能处理静态资源、负载均衡、SSL终止,还能防止一些基础的DDoS攻击。比如你家小店突然来了几百人,总不能让老板一个人招呼吧?Nginx就是那个站在门口引导客流的服务员。
基本架构怎么搭?
常见的做法是:用户访问先到Nginx,Nginx判断是图片/CSS这类静态文件就自己处理;如果是动态请求,比如登录、下单,就转发给后端的Puma集群。Puma通常以Unix Socket方式运行,比TCP更轻量。
upstream rails_app {
server unix:/var/www/myapp/shared/tmp/sockets/puma.sock;
}
server {
listen 80;
server_name example.com;
root /var/www/myapp/current/public;
location / {
proxy_pass http://rails_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~* \.(jpg|jpeg|gif|png|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
静态资源交给Nginx管
Rails的public目录里放着打包好的assets,比如application.css和logo.png。Nginx可以直接读取这些文件,不用劳烦Rails再走一遍整个请求流程。这就像快递到了小区代收点,你自己去拿就行,没必要让发货工厂再送一次。
开启Gzip压缩省带宽
网页内容越大,加载越慢。Nginx可以开启Gzip,在发送HTML、JS、CSS前先压缩。一般能减少60%以上的传输体积。手机流量紧张的时候,这点优化特别实在。
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
加个缓存更流畅
有些页面内容不常变,比如帮助中心、关于我们。可以让Nginx缓存这些响应结果,下次用户来直接返回,连后端都不用碰。就像常去的早餐摊,老板看你进门就自动开始煎蛋,不用等你说。
日志别忘了看
Nginx默认会记录access.log和error.log。线上出问题,第一件事就是查error.log。比如Puma挂了,Nginx转发失败,日志里会写得明明白白。定期看看访问日志,还能发现有没有异常爬虫或者恶意扫描。
配置改完记得重载
改了nginx.conf别直接restart,用sudo nginx -s reload平滑重载。这样现有连接不会断,用户正在加载的页面也不会突然失败。就像换轮胎时不熄火,车子还能继续挪。