Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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;
}
like image 812
Hakan Kara Avatar asked May 18 '16 11:05

Hakan Kara


2 Answers

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

like image 116
MMT Avatar answered Oct 21 '22 02:10

MMT


Your puma.rb file should look like this.

# /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

And your nginx.conf should be like this.

# 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;
}

If this doesn't help, you would like to have a look at this.

Rails + Puma + Nginx Every Bad Gateway 502

like image 24
Subhash Chandra Avatar answered Oct 21 '22 01:10

Subhash Chandra