You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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完成套接字绑定前的所有请求都会触发连接拒绝。
验证步骤

依次执行以下命令确认具体故障点:

  1. 检查Puma是否真的在监听目标套接字:
    sudo ss -xlnp | grep puma.sock
    
    正常输出应能看到PID为16043的Puma进程绑定在该套接字路径上,无输出则说明Puma处于假活状态,套接字未实际绑定。
  2. 检查套接字文件权限:
    ls -l /var/www/tuma_mizigo/shared/tmp/sockets/puma.sock
    
    正常输出的权限位应为srw-rw-rw-或至少包含www-data用户的读写权限,若权限为srwx------则为权限问题。
  3. 模拟Nginx用户测试套接字连通性:
    sudo -u www-data curl --unix-socket /var/www/tuma_mizigo/shared/tmp/sockets/puma.sock http://localhost/
    
    直接返回Connection refused即可确认上述两类问题。
修复方案

按顺序修改配置,完成后重启服务即可恢复:

  1. 修改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模式下该配置会导致套接字监听丢失
    
  2. 修改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
    
  3. 执行命令重载配置、重启服务:
    # 删除旧的失效套接字文件
    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
    
  4. 可选优化:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 12:27:08