【问题标题】:NGinx sock connect Bad GatewayNGinx sock 连接坏网关
【发布时间】:2014-06-18 12:12:00
【问题描述】:

我在设置 Nginx 以与 Puma 服务器一起使用 Rails 4 应用程序时遇到问题。

问题似乎出在我的 Nginx 配置中,因为我不断收到 502 Bad Gateway 错误并且错误日志指出以下内容:

*1 connect() to unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock failed 
(2: No such file or directory) while connecting to upstream, client: XX.XXX.XX.XXX, 
server: mysitename.com, request: "GET /favicon.ico HTTP/1.1", upstream: 
"http://unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock:/favicon.ico", 
host: "mysitename.com"

这是我正在使用的 Nginx 站点配置:

upstream mysitename {
  server unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock;
}

server {
  listen 80;
  server_name mysitename.com;
  root /srv/vhosts/rumysitename/www/mysitename/public;

  location / {
    proxy_pass http://mysitename;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  location ~* ^/assets/ {
    # Per RFC2616 - 1 year maximum expiry
    expires 1y;
    add_header Cache-Control public;

    # Some browsers still send conditional-GET requests if there's a
    # Last-Modified header or an ETag header even if they haven't
    # reached the expiry date sent in the Expires header.
    add_header Last-Modified "";
    add_header ETag "";
    break;
  }
}

不用说 Puma 无法连接到那只袜子,因为它不存在:

rails s -e production -b unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock=> Booting Puma
=> Rails 4.1.0 application starting in production on http://unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Puma 2.8.2 starting...
* Min threads: 0, max threads: 16
* Environment: production
* Listening on tcp://unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock:3000
Exiting
/srv/vhosts/rumysitename/.rvm/gems/ruby-2.1.0/gems/puma-2.8.2/lib/puma/binder.rb:195:in `initialize': getaddrinfo: Name or service not known (SocketError)

我不是系统管理员,完全没有使用 Nginx 的经验,如果我遗漏了一些明显的东西,请见谅。

【问题讨论】:

  • 当您运行 puma 时,您是否要求它绑定到该套接字?像puma -b unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock 这样的东西。我之前对套接字的 http:// 前缀感到困惑,但我认为这是日志记录而不是配置中的错误。
  • @Shadwell 是的,我愿意,我包含了我正在使用的 puma start 命令,它在问题中输出

标签: ruby-on-rails nginx puma


【解决方案1】:

尝试以下步骤。

  • 停止puma 服务器。
  • 删除puma使用的.sock文件。
  • 启动puma 服务器。

【讨论】:

    【解决方案2】:

    似乎启动 rails 服务器并要求它绑定到 unix 套接字不起作用。 rails 服务器的-b 选项与puma 命令的行为不同。基本上它想绑定一个IP地址:

    rails server --help
      Usage: rails server [mongrel, thin, etc] [options]
        -p, --port=port                  Runs Rails on the specified port.
                                         Default: 3000
        -b, --binding=ip                 Binds Rails to the specified ip.
                                         Default: 0.0.0.0
    

    你可以直接运行 puma:

    puma -e production -b unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock
    

    套接字将通过像这样运行 puma 来创建。它不需要已经存在。您需要获得在指定位置创建它的权限,但如果不是这种情况,您会收到不同的错误。

    另一种方法是创建一个可以包含绑定的config/puma.rb 文件:

    config/puma.rb:

    bind 'unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock'
    

    然后运行 ​​puma 引用:

    puma -C config/puma.rb -e production
    

    您可以在配置文件中添加更多内容,而不仅仅是袜子。 puma example config file 是一个很好的起点。

    【讨论】:

    • 你说得对。甚至从未想过检查两个命令之间的差异。在我看来,他们是别名 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2017-06-23
    • 2019-10-03
    • 2020-11-12
    相关资源
    最近更新 更多