Puma和Nginx出现502 Bad Gateway错误(Ubuntu Server 14.04)

12

我需要部署我的Rails应用程序,因此我已经按照这里的所有步骤进行了操作:https://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-puma-and-nginx-on-ubuntu-14-04

但是在教程结束时,我得到了这个错误-->“502 Bad Gateway”

编辑
现在的错误消息是-->"We're sorry, but something went wrong."
但Nginx的错误输出仍然相同,我检查了Puma的错误消息,但它们只在启动和优雅停止时记录。

位于app_directory/log下的Rails日志没有产生任何输出。
puma-manager-->我已经检查过它能正常工作
路径--->我已经检查了三遍

Nginx error.log的输出信息:

2016/05/18 14:22:21 [crit] 1099#0: *7 connect() to unix:/home/deploy   /hotel-automata/shared/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream, client: 192.168.2.105, server: localhost, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:/home/deploy/hotel-automata/shared/sockets/puma.sock:/500.html", host: "192.168.2.170"

操作系统 -> Vmware Player,桥接网络Ubuntu Server 14.0.4
Ruby版本:2.3.1
Rails版本:4.2.5.2

这是我的nginx配置内容 /etc/nginx/sites-available/default

upstream app {
# Path to Puma SOCK file, as defined previously
server unix:/home/deploy/hotel-automata/shared/sockets/puma.sock fail_timeout=0;
}

server {
listen 80;
server_name localhost;

root /home/deploy/hotel-automata/public;

try_files $uri/index.html $uri @app;

location @app {
    proxy_pass http://app;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
}

error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}

我对 Puma 没有任何了解。但是你尝试过更改 puma.sock 文件的权限吗?当我使用 uwsginginx 时,我曾经遇到过这种错误。 - manoj prashant k
请发布您的nginx配置。 - dan-klasson
@dan-klasson 我已经添加了nginx配置。 - Hakan Kara
@manojprashantk 目录中没有 puma.sock 文件。 - Hakan Kara
我可能错了,但是你能把 unix:/home/deploy/hotel-automata/shared/sockets/puma.sock 改为 unix:///home/deploy/hotel-automata/shared/sockets/puma.sock 并尝试一下吗? - manoj prashant k
请检查我的答案,链接如下: https://dev59.com/d6Lia4cB1Zd3GeqPrv14#48476580 - Hitesh Ranaut
2个回答

6

编辑:

  1. 确保套接字存在。否则它会在此处失败:

config/puma.rb中,您需要有指向您的套接字的行:

bind "unix://<path or variable for the path where the socket will be>/sockets/puma.sock"

带变量的示例:

application_path = '/home/deploy/hotel-automata/shared'

bind "unix://#{application_path}/sockets/puma.socket"
  1. 检查Socket权限

您需要确保Nginx能够访问您的Socket(具备所需的权限,例如读写权限)。

检查整个路径的权限,请尝试以下命令:

namei -m /home/deploy/hotel-automata/shared/sockets/puma.sock

或者尝试以下替代方法:

sudo -u <user> test <-r / -w > <path> && echo True

即 (i.e.)
sudo -u nginx test -w /home/deploy/hotel-automata/shared/sockets/puma.sock && echo True

Nginx需要对该socket具有读写权限。

如果它返回false,那么意味着用户没有该权限,即-w->写入。


我的套接字路径中没有空格,您是指其他的意思吗? - Hakan Kara
好的,我必须编辑我的答案,因为你提供了新的数据,请检查权限并让我知道。 - MMT
目录下没有 puma.sock 文件,它应该自动生成吗? @MichaIT - Hakan Kara
当Puma启动时,它应该创建一个套接字。这是您进行配置的地方: vi config/puma.rb # 设置套接字位置 bind "unix://#{shared_dir}/sockets/puma.sock" - MMT
请确保在 config/puma.rb 文件中有 bind "unix://<path to your socket>/sockets/puma.sock",然后重新启动您的 Puma 服务器。在评论框中指导某人非常困难。我会再次编辑答案。 - MMT

2
你的 puma.rb 文件应该长这样。
# /config/puma.rb

  app = "manabalss" # App-specific
  root = "/home/deployer/apps/#{app}"

  workers  5
  threads  1, 1 # relying on many workers for thread-unsafe apps

  rackup      DefaultRackup
  port        11592
  environment ENV['RACK_ENV'] || 'production'
  daemonize   true

  pidfile "#{root}/puma/puma.pid"
  stdout_redirect "#{root}/puma/puma.log", "#{root}/puma/puma_error.log"
  bind "unix:/tmp/puma.socket

"你的nginx.conf应该像这样。"
# config/deploy/nginx.conf

upstream puma {
  server unix:/tmp/puma.socket fail_timeout=1;
}

# This block redirects http requests to https version 
server {
  listen 37.139.0.211:80 default deferred;
  server_name www.manabalss.lv, manabalss.lv;
  return 307  https://manabalss.lv$request_uri;
}

server {
  listen                37.139.0.211:443 ssl;
  server_name           manabalss.lv;
  ssl_certificate       /etc/ssl/server.crt;
  ssl_certificate_key   /etc/ssl/server.key;
  ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers           RC4:HIGH:!aNULL:!MD5;
  ssl_session_cache     shared:SSL:15m;
  ssl_session_timeout   15m;

  root /home/deployer/apps/manabalss/current/public;

  location ^~ /assets/ {
    gzip_static on;
    gzip_vary on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @puma;
  location @puma {
    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto https;
    proxy_set_header  Host $http_host;
    proxy_redirect    off;
    proxy_pass        http://puma;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

如果这没有帮助,你可以看一下这个:

Rails + Puma + Nginx 每个坏网关 502


谢谢Subhash,我现在开始尝试。 - Hakan Kara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接