Unicorn + Nginx Rails production error - ruby-on-rails

I'm following this tutorial to deploy a RoR app with Capistrano but I'm getting an error in my production server
[error] 28314#0: *1 connect() to unix:/tmp/unicorn.myapp.sock failed (111: Connection refused) while connecting to upstream, client: xx.xxx.xx.xx, server: , request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/unicorn.myapp.sock:/", host: "myapp.cloudapp.azure.com"
My /etc/nginx/sites-available/default
upstream app {
# Path to Unicorn SOCK file, as defined previously
server unix:/tmp/unicorn.myapp.sock fail_timeout=0;
}
server {
listen 3000;
server_name localhost;
root /home/deploy/apps/myapp/current/;
try_files $uri/index.html $uri #app;
location #app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
I changed the server to many different things, but I get the exact same error, with the same host, server, upstream.
The problem was with Unicorn, somewhere in my Capistrano deploy, it wasn't restarting Unicorn as it should.

Nginx logs indicate that this is an issue with the backend server. After your backend up is up and running. Check:
Does the socket file exist? ls -lthd /tmp/unicorn.myapp.sock
Can you make a direct HTTP connect to the socket, bypassing Nginx?
Once those tests pass, test again through Nginx.

Related

Nginx reverse proxy not working with Puma

I need some help setting up Nginx with Puma and Rails on Ubuntu server at Digital Ocean (already spend a lot time on this).
I have the follow settings:
/etc/nginx/nginx.conf (I remove some commented lines)
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
/etc/nginx/sites-available/test_server
upstream app {
server unix:/home/deploy/www/test_server/tmp/sockets/puma.sock fail_timeout=0;
}
server {
listen 80;
server_name testserver.com.br www.testserver.com.br; # fake url
root /home/deploy/www/test_server/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;
}
/var/log/nginx/access.log
I can see a lot of requests (from my local machine, from the server at D.O and lot of others IP's that I don't recognize).
/var/log/nginx/error.log
When I try to access www.testserver.com/index from my local desk
2018/06/02 12:21:25 [error] 27541#27541: *6 open() "/usr/share/nginx/html/index" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: localhost, request: "GET /index HTTP/1.1", host: "www.testserver.com.br"
Firewall
Firewall is open to Nginx HTTP/HTTP (v6)
Symbolic link in /etc/nginx/sites-enabled/test_server
lrwxrwxrwx 1 root root 39 Jun 1 16:25 /etc/nginx/sites-enabled/test_server -> /etc/nginx/sites-available/test_server
What I have until now
When I make a request to the site I got this message:
"Welcome to nginx! If you see this page, the nginx web server is successfully installed and working..."
I know Puma is working fine because I can make requests direct to the socket and it returns the correct page (Rails starts in production environment ~ all working fine).
Last considerations from my attempts
I believe that Nginx is not able to connect properly with Puma and find the right files to serve. From the error.log I can see Nginx trying to access the folder /usr/share/nginx/html/ when it should try to connect to the socket, right? Maybe permission is the problem? (I saw a lot of posts on SO with permission problems).
I don't know what else I can try.
Any additional information just ask.
Thanks in advance!
Solution
As I deleted the nginx.conf file (not on purpose) and copy from the git rep., the new file was missing the include /etc/nginx/conf.d/*.conf; and include /etc/nginx/sites-enabled/*; lines. After adding these lines inside the section Http, Nginx started serving correct.

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;
}
EDIT:
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"
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
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

Rails Nginx config can not reach root url

Here is my nginx config
server {
listen 80;
server_name localhost;
root /home/user/app/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;
}
Let's say my public ip: 111.111.111.111
When I try to enter the site 111.111.111.111/path, it works fine but when I try to enter only the root url 111.111.111.111 it gives me the "Welcome to nginx" message. I looked at the nginx log, but there is nothing about the root url.
I m also using unicorn, but I do not think there was a problem about that, I assume I ve added the necessary part of config here.
I think it might be missing the unicorn .sock file: see example nginx/unicorn/rails config here: https://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-unicorn-and-nginx-on-ubuntu-14-04
You're referencing an upstream in your proxy_pass line but it's not defined. Try adding this to the top:
upstream app {
# Path to Unicorn SOCK file
server unix:/path/to/your/app/shared/sockets/unicorn.sock fail_timeout=0;
}
I just looked at an app i did a while ago with rails, unicorn and nginx, and my entry for this was
server unix:/tmp/.sock fail_timeout=0;
It just depends how your unicorn is configured, as to where the sock file lives, so you'll need to tweak it to point to the right place.

Rails, Nginx, Puma access right error (puma.sock highlighted in pink when perform ls -l)

I am trying to deploy my rails application (Nginx + Puma) however it seems that there is some user right issues that associated with it.
The error message from "nginx.error.log" is as follows:
2015/11/12 09:07:23 [error] 1148#0: *10 connect() to
unix:///home/deploy/apps/app_name/shared/tmp/sockets/xxx-puma.sock failed
(111: Connection refused) while connecting to upstream, client: 61.6.11.121,
server: 168.63.241.117, request: "GET / HTTP/1.1",
upstream: "http://unix:///home/deploy/apps/app_name/shared/tmp/sockets/xxx-puma.sock:/",
host: "xxx"
When I enter the directory that contains the puma.sock file and perform a "ls -l" I have noticed the following:
Puma Directory
I have done the exact same settings (capistrano) on my deployment server and replicated it onto my staging server. The only difference between the both is that the puma.sock on my staging server is highlighted in pink color (I suspected it's related to user access right)
Anyone can help me on the issues? Thanks in advance.
Update (nginx.conf):
upstream puma {
server unix:///home/deploy/apps/app_name/shared/tmp/sockets/puma.sock;
}
server {
listen 80;
server_name xxx;
root /home/deploy/apps/app_name/current/public;
access_log /home/deploy/apps/app_name/current/log/nginx.access.log;
error_log /home/deploy/apps/app_name/current/log/nginx.error.log info;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
try_files $uri/index.html $uri #puma;
location #puma {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
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 10M;
keepalive_timeout 10;
}
I think you miss Procfile
Create a Procfile and add the following code in
web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}
You've specified app_name-puma.sock in upstream nginx conf and your actual socket file is named puma.sock
try changing:
upstream puma {
server unix:///home/deploy/apps/app_name/shared/tmp/sockets/app_name-puma.sock;
}
to:
upstream puma {
server unix:///home/deploy/apps/app_name/shared/tmp/sockets/puma.sock;
}

Nginx, Unicorn and Rails = 502 Bad Gateway

Im trying to setup Nginx, Unicorn and Rails application to work together.
Nginx and Nnicorn are running, I checked that using ps command.
But when trying to access my page Ive got 502 Bad Gateway
Nginx error log has line:
2015/03/18 19:53:26 [error] 14319#0: *1 connect() to
unix:/var/sockets/unicorn.mypage.sock failed (11: Resource temporarily
unavailable) while connecting to upstream
What can be the problem?
my /etc/nginx/conf.d/default.conf
upstream app {
server unix:/var/sockets/unicorn.mypage.sock fail_timeout=0;
}
server {
listen 80;
server_name mypage.com;
# Application root, as defined previously
root /home/rails/mypage/public;
location ^~ /assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
try_files $uri/index.html $uri #app;
location #app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}
/home/rails/mypage/config/unicorn.rb
working_directory "/home/rails/mypage"
pid "/home/rails/mypage/pids/unicorn.pid"
stderr_path "/home/rails/mypage/log/unicorn.log"
stdout_path "/home/rails/mypage/log/unicorn.log"
listen "/var/sockets/unicorn.mypage.sock", backlog: 1024
worker_processes 2
timeout 30
It looks like socket problem, but it is usually (111: Connection refused) when socket is down, so I think this is app problem (high load, slow execution etc).
Try decrease backlog and see logs again for details:
listen "/var/sockets/unicorn.mypage.sock", backlog: 64
:backlog => number of clients
I solved the problem.
It was because of my unicorn server started in development environment, not in production. Unicorn was trying to connect to development database, but credentials for the dev db in database.yml were missing.
After I started unicorn in production env everything connected well.

Resources