求助:已启动Puma集群但Nginx无法反向代理部署的应用
看你给出的信息,Puma确实已经以cluster模式正常启动了,socket路径也和Nginx配置里的对上了,咱们一步步来排查可能的问题:
1. 检查Unix Socket的权限
Puma的socket文件/var/www/womaclub.com/shared/tmp/sockets/puma.sock是由superad+用户创建的,但Nginx通常是以www-data(Debian/Ubuntu)或者nginx(RHEL/CentOS)用户运行的。如果Nginx没有读写这个socket的权限,自然没法建立连接。
先执行命令查看socket的权限详情:
ls -l /var/www/womaclub.com/shared/tmp/sockets/puma.sock
解决办法二选一即可:
- 启动Puma时添加
--umask 0002参数,让socket文件对同组用户开放读写权限 - 把Nginx用户加入到
superad+的用户组,然后重启Nginx:usermod -aG superad+ www-data systemctl restart nginx
2. 修正Nginx的proxy_pass协议
你的upstream定义的是Unix socket,但proxy_pass用了https://puma,这是错误的!Nginx和Puma是本地通信,不需要HTTPS加密,改成http://puma就行:
location @puma { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://puma; # 这里改成http协议 }
HTTPS的终止已经在Nginx层面完成了,后端用HTTP通信完全足够,用HTTPS反而会导致连接失败。
3. 查看Nginx错误日志找具体原因
你已经配置了错误日志路径/var/www/womaclub.com/shared/log/puma_error.log,直接查看日志里的报错信息是最直接的排查方式:
tail -f /var/www/womaclub.com/shared/log/puma_error.log
日志里大概率会明确提示是权限拒绝、连接失败还是其他问题,能帮你快速定位根源。
4. 验证Nginx配置语法并重启
每次修改配置后,一定要先验证语法是否正确,再重启服务:
nginx -t systemctl restart nginx
如果语法有问题,Nginx会直接提示错误行号和具体原因,先把语法问题解决掉。
5. 检查SELinux(针对RHEL/CentOS系列系统)
如果你的服务器是CentOS或者RHEL,SELinux可能会阻止Nginx访问Puma的socket文件。可以先临时关闭SELinux测试:
setenforce 0
如果关闭后问题解决了,就添加SELinux规则来允许Nginx访问该路径:
semanage fcontext -a -t httpd_unix_stream_socket_t "/var/www/womaclub.com/shared/tmp/sockets/puma.sock" restorecon -v "/var/www/womaclub.com/shared/tmp/sockets/puma.sock"
先从这几个方向排查,应该能解决大部分问题。如果还是不行,可以把Nginx错误日志里的具体内容贴出来,咱们再进一步分析。
内容的提问来源于stack exchange,提问作者Sebastián Landínez García

