Search code examples
ruby-on-railsnginxpuma

Nginx proxy for Puma: Ignoring my config, not serving from socket


I'm trying to follow this article: https://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-puma-and-nginx-on-ubuntu-14-04

with a fresh Amazon Linux EC2 instance. I'm using the out-of-the-box /etc/nginx/nginx.conf file, and added my config file to /etc/nginx/sites-default/default

Puma seems to be running fine:

/home/ec2-user/flviewer/shared/log/puma_error.log: [8006] * Listening on unix:///home/ec2user/flviewer/shared/sockets/tmp/puma.sock

But this shows up in /var/log/nginx/error.log:

2016/12/12 05:33:00 [error] 11018#0: *1 open() "/usr/share/nginx/html/flviewer" failed (2: No such file or directory), client: 173.73.119.219, server: localhost, request: "GET /flviewer HTTP/1.1", host: "54.86.222.53"

Why the heck is it looking in '/usr/share/nginx/html/flviewer' when it should be looking at the socket i opened?

here is my config as dumped by 'nginx -T':

# configuration file /etc/nginx/sites-available/default:
upstream app {
  # Path to Puma SOCK file, as defined previously
  server unix:/home/ec2-user/flviewer/shared/tmp/sockets/puma.sock fail_timeout=0;
}

server {
  listen 80;
  server_name localhost;

  root /home/ec2-user/flviewer/current/public;

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

  location @app {
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_redirect off;
    #proxy_http_version 1.1;
    proxy_set_header Connection '';
    proxy_pass http://app;
    #autoindex on;
  }

   location ~ ^/(assets|fonts|system)/|favicon.ico|robots.txt {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
   }

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

Solution

  • Nothing worked. I stripped /etc/nginx.conf down to just this, and am up and running. I had to throw away all of the boilerplate that was in nginx.conf. This works:

    config file:

    # Run nginx as a normal console program, not as a daemon
    daemon off;
    user ec2-user;
    
    # Log errors to stdout
    error_log /dev/stdout info;
    
    events {} # Boilerplate
    
    http {
    
      # Print the access log to stdout
      access_log /dev/stdout;
    
      # Tell nginx that there's an external server called @app living at our socket
      upstream app {
        server unix:/home/ec2-user/flv/shared/tmp/sockets/puma.sock fail_timeout=0;
      }
    
      server {
    
        # Accept connections on localhost:2048
        listen 80;
        server_name localhost;
    
        # Application root
        root /home/ec2-user/flv/shared/public;
    
        # If a path doesn't exist on disk, forward the request to @app
        try_files $uri/index.html $uri @app;
    
        # Set some configuration options on requests forwarded to @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;
        }
    
       location ~ ^/(assets|fonts|system)/|favicon.ico|robots.txt {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
      }
    
      error_page 500 502 503 504 /500.html;
      client_max_body_size 4G;
      keepalive_timeout 10;
    
      }
    }