Puma and Nginx 502 Bad Gateway error (Ubuntu Server 14.04)

Hakan Kara picture Hakan Kara · May 18, 2016 · Viewed 9.7k times · Source

I need to deploy my rails application,So I have followed all step from here, https://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-puma-and-nginx-on-ubuntu-14-04

But end of the tutorial, I get this error --> "502 Bad Gateway"

EDIT
The error message now --> "We're sorry, but something went wrong."
But Nginx error output is the same, I check puma error messages but they just log when it start and when it stop gracefully.

Rails logs which is under app_directory/log does not produce any output.
puma-manager --> I checked it works correctly
paths ---> I have checked three times

Nginx error.log output message:

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"

OS -> Vmware Player, Bridged Network Ubuntu Server 14.0.4
Ruby Version: 2.3.1
Rails Version: 4.2.5.2

This is my nginx config contents of /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;
}

Answer

MMT picture MMT · May 18, 2016

EDIT:

  1. Make user that the socket exist. Otherwise it's failing on this point:

in config/puma.rb you need to have line pointing to your socket:

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

example with variable:

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

bind "unix://#{application_path}/sockets/puma.socket"
  1. Check permissions on the socket

You will need to make sure that Nginx is able to access your socket (have the required rights i.e. RW)

The check the permissions on the whole path try this:

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

Alternatively try this:

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 will require RW access to that socket.

If it doesn't return true then it means that the user has NOT got that permission i.e. -w -> write