Nginx连接puma.sock报111连接拒绝错误排查(Puma正常运行)
根因定位
首先注意日志时间差:你贴出的Nginx报错时间为2022/07/13 10:24:33,而当前运行的Puma实例启动时间为当日12:10:16,该条报错本身是旧Puma进程退出、新实例未完成启动阶段的正常现象。如果当前时间点访问站点仍持续触发111连接拒绝错误,核心原因集中在三点:
- Puma配置冲突:配置中同时开启
prune_bundler、cluster多worker模式,搭配启动参数--keep-file-descriptors时,主进程在bundler环境重载阶段会短暂释放甚至丢失unix套接字监听,出现“进程在跑但套接字没绑定”的假活状态;加上配置中threads 0,16将最小线程数设为0,无请求时Puma会销毁所有工作线程,不会常驻处理套接字连接队列,新请求进入时直接返回拒绝。 - 套接字权限缺失:Puma默认生成的unix套接字文件权限为
0700,仅启动属主(当前配置为ubuntu用户)有读写权限,而Nginx worker进程默认以www-data用户运行,部分内核版本与systemd临时文件规则下,权限不足不会抛出标准13号权限错误,会被误判为111连接拒绝。 - 服务启动顺序错配:Puma服务仅配置
After=network.target,未声明与Nginx的启动顺序,服务器重启时Nginx可能先于Puma启动,在Puma完成套接字绑定前的所有请求都会触发连接拒绝。
验证步骤
依次执行以下命令确认具体故障点:
- 检查Puma是否真的在监听目标套接字:
正常输出应能看到PID为16043的Puma进程绑定在该套接字路径上,无输出则说明Puma处于假活状态,套接字未实际绑定。sudo ss -xlnp | grep puma.sock - 检查套接字文件权限:
正常输出的权限位应为ls -l /var/www/tuma_mizigo/shared/tmp/sockets/puma.socksrw-rw-rw-或至少包含www-data用户的读写权限,若权限为srwx------则为权限问题。 - 模拟Nginx用户测试套接字连通性:
直接返回Connection refused即可确认上述两类问题。sudo -u www-data curl --unix-socket /var/www/tuma_mizigo/shared/tmp/sockets/puma.sock http://localhost/
修复方案
按顺序修改配置,完成后重启服务即可恢复:
- 修改Puma主配置文件
/var/www/tuma_mizigo/shared/puma.rb,删除冲突配置,显式指定套接字权限与最小常驻线程:#!/usr/bin/env puma plugin :tmp_restart # 适配systemd notify服务类型 directory '/var/www/tuma_mizigo/current' rackup "/var/www/tuma_mizigo/current/config.ru" environment 'production' tag '' pidfile "/var/www/tuma_mizigo/shared/tmp/pids/puma.pid" state_path "/var/www/tuma_mizigo/shared/tmp/pids/puma.state" # 最小线程数设为1,保留常驻监听线程 threads 1,16 # 显式指定套接字umask为0000,允许本地所有进程访问 bind 'unix:///var/www/tuma_mizigo/shared/tmp/sockets/puma.sock?umask=0000' workers 2 # 删除prune_bundler配置及对应的on_restart回调,cluster模式下该配置会导致套接字监听丢失 - 修改Puma systemd服务配置
/etc/systemd/system/puma_tuma_mizigo_production.service,调整服务类型与启动依赖:[Unit] Description=Puma HTTP Server for tuma_mizigo (production) After=network.target Before=nginx.service # 声明Puma启动完成后再启动Nginx,避免顺序错配 [Service] Type=notify # 替换默认simple类型,避免Puma未完成初始化就被判定为启动成功 User=ubuntu WorkingDirectory=/var/www/tuma_mizigo/current # 去掉--keep-file-descriptors参数,避免与bundler加载逻辑冲突导致套接字丢失 ExecStart=/home/ubuntu/.rvm/bin/rvm default do bundle exec puma -C /var/www/tuma_mizigo/shared/puma.rb ExecReload=/bin/kill -USR1 $MAINPID StandardOutput=append:/var/www/tuma_mizigo/shared/log/puma_access.log StandardError=append:/var/www/tuma_mizigo/shared/log/puma_error.log Restart=always RestartSec=1 StartLimitIntervalSec=0 SyslogIdentifier=puma [Install] WantedBy=multi-user.target - 执行命令重载配置、重启服务:
# 删除旧的失效套接字文件 sudo rm -f /var/www/tuma_mizigo/shared/tmp/sockets/puma.sock # 重载systemd配置 sudo systemctl daemon-reload # 重启Puma服务 sudo systemctl restart puma_tuma_mizigo_production.service # 确认套接字监听正常 sudo ss -xlnp | grep puma.sock # 重载Nginx配置 sudo systemctl reload nginx - 可选优化:在Nginx upstream配置中增加长连接与重试参数,降低Puma重启瞬间的报错概率:
upstream puma_tuma_mizigo_production { server unix:/var/www/tuma_mizigo/shared/tmp/sockets/puma.sock fail_timeout=0 max_fails=1; keepalive 32; }
内容的提问来源于stack exchange,提问作者noooooob
相关产品推荐
相关产品推荐

