如何修复Nginx连接Puma套接字时的111: Connection refused错误?
解决Nginx连接Puma Socket被拒绝的问题
你的问题核心很明确:Puma已经优雅停止运行了,导致Nginx找不到可连接的后端服务,所以才会抛出「Connection refused」的错误。咱们一步步来排查修复:
1. 先确认Puma进程状态
先检查Puma是不是真的没在运行,执行这条命令:
ps aux | grep puma
如果输出里没有活跃的Puma进程,那首先得把它重启起来:
- 如果你用Capistrano部署,直接用部署脚本重启最方便:
cap production puma:restart - 要是没用Capistrano,就手动进入项目目录启动:
(cd /home/deploy/autostudy.cz/current bundle exec puma -C config/puma.rb -d-d参数是让Puma后台运行,避免占用终端)
2. 检查Socket文件的权限与存在性
有时候Puma重启后,socket文件的权限不对,Nginx没有读写权限也会连不上。先看看socket文件是否存在:
ls -l /home/deploy/autostudy.cz/shared/tmp/sockets/autostudy-puma.sock
- 如果文件存在:检查权限,确保Nginx的运行用户(一般是
www-data或nginx)能读写。可以临时设置宽权限测试:
要是测试有效,后续可以改成更安全的方式——让Puma和Nginx归属同一个用户组,再设置组读写权限。chmod 666 /home/deploy/autostudy.cz/shared/tmp/sockets/autostudy-puma.sock - 如果文件不存在:说明Puma启动失败了,得去看
puma.error.log里的详细报错,比如是不是依赖缺失、数据库连接失败、配置语法错误之类的。
3. 核对Nginx与Puma的Socket路径一致性
打开你的Nginx配置文件,找到upstream块,确认里面的socket路径和Puma配置文件(config/puma.rb)里的bind配置完全一致:
比如Nginx里应该是这样:
upstream autostudy { server unix:///home/deploy/autostudy.cz/shared/tmp/sockets/autostudy-puma.sock fail_timeout=0; }
Puma的config/puma.rb里对应的配置要一模一样:
bind "unix:///home/deploy/autostudy.cz/shared/tmp/sockets/autostudy-puma.sock"
路径哪怕差一个字符、一个斜杠都会出问题,一定要仔细核对。
4. 重启Nginx确保配置生效
不管有没有修改Nginx配置,重启一下让它刷新后端连接状态:
sudo systemctl restart nginx
要是用的是旧系统,也可以用这条命令:
sudo service nginx restart
5. 排查Puma启动失败的深层原因
如果Puma反复启动失败,重点深挖puma.error.log里的报错信息,常见坑点包括:
- 项目的
current软链接指向错误,导致Puma找不到正确的代码目录 config/database.yml里的生产环境数据库配置有误(比如密码不对、数据库未创建)- 生产环境变量缺失(比如
RAILS_ENV=production没设置,或者密钥没配置) - 项目依赖未安装完全,可以重新执行
bundle install --without development test安装生产环境依赖
要是按上面的步骤走还是解决不了,可以把Puma日志里的具体错误内容贴出来,能更精准定位问题。
内容的提问来源于stack exchange,提问作者tandem tour
相关产品推荐
相关产品推荐

