简体   繁体   中英

Unable to serve multiple rails applications with Nginx + Unicorn

I know this is a very common issue, but I've been struggling days with a strange one this time:

I want to serve two Rails 4 apps on the same VPS (ubuntu 14.04). I followed this guide for one app with success. My app1 is working fine. But not app2.

The error is this one (/var/log/nginx/error.log):

directory index of "/srv/app1/public/app2/" is forbidden

General nginx.conf

    # Run nginx as www-data.
    user www-data;
    # One worker process per CPU core is a good guideline.
    worker_processes 1;
    # The pidfile location.
    pid /var/run/nginx.pid;

    # For a single core server, 1024 is a good starting point. Use `ulimit -n` to
    # determine if your server can handle more.
    events {
        worker_connections 1024;
    }



    http {


        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay off;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        server_tokens off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";
        gzip_http_version 1.1;
        gzip_proxied any;
        gzip_min_length 500;
        gzip_types text/plain text/xml text/css
            text/comma-separated-values text/javascript
            application/x-javascript application/atom+xml;

        ##
        # Unicorn Rails
        ##

        # The socket here must match the socket path that you set up in unicorn.rb.

        upstream unicorn_app2 {
            server unix:/srv/app2/tmp/unicorn.app2.sock fail_timeout=0;
        }

        upstream unicorn_app1 {
            server unix:/srv/app1/tmp/unicorn.app1.sock fail_timeout=0;
        }


        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    }

sites-available/app1

    server {
        listen 80;
        server_name _
                      public.ip.of.vps; # Replace this with your site's domain.
        keepalive_timeout 300;
        client_max_body_size 4G;

        root /srv/app1/public; # Set this to the public folder location of your Rails application.

        location /app1 {
            try_files $uri @unicorn_app1;
        }

        location @unicorn_app1 {
                  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                  proxy_set_header Host $http_host;
                  proxy_set_header X-Forwarded_Proto $scheme;
                  proxy_redirect off;
                  # This passes requests to unicorn, as defined in /etc/nginx/nginx.conf
                  proxy_pass http://unicorn_app1;
                  proxy_read_timeout 300s;
                  proxy_send_timeout 300s;
                  auth_basic "Restricted";                                #For Basic Auth
                  auth_basic_user_file /etc/nginx/.htpasswd;  #For Basic Auth
        }

        location ~ ^/assets/ {
                  #gzip_static on; # to serve pre-gzipped version
                  expires max;
                  add_header Cache-Control public;
        }


        # You can override error pages by redirecting the requests to a file in your
        # application's public folder, if you so desire:
        error_page 500 502 503 504 /500.html;
        location = /500.html {
                  root /srv/app1/public;
        }
    }

sites-available/app2

    server {
        listen 80;
        server_name __
                      public.ip.of.vps; # Replace this with your site's domain.
            keepalive_timeout 300;
        client_max_body_size 4G;

        root /srv/app2/public; # Set this to the public folder location of your Rails application.

        location /app2 {
            try_files $uri @unicorn_app2;
        }

        location @unicorn_app2 {
                  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                  proxy_set_header Host $http_host;
                  proxy_set_header X-Forwarded_Proto $scheme;
                  proxy_redirect off;
                  # This passes requests to unicorn, as defined in /etc/nginx/nginx.conf
                  proxy_pass http://unicorn_app2;
                  proxy_read_timeout 300s;
                  proxy_send_timeout 300s;
                  auth_basic "Restricted";                                #For Basic Auth
                  auth_basic_user_file /etc/nginx/.htpasswd;  #For Basic Auth
        }

        location ~ ^/assets/ {
                  #gzip_static on; # to serve pre-gzipped version
                  expires max;
                  add_header Cache-Control public;
        }


        # You can override error pages by redirecting the requests to a file in your
        # application's public folder, if you so desire:
        error_page 500 502 503 504 /500.html;
        location = /500.html {
                  root /srv/app2/public;
        }
    }

Why is that nginx is looking for app2 in the public folder of app1?

The problem is that your 2 nginx server blocks are listening to the same domain name.

Move the location blocks /app2 and unicorn_app2 into site-available/app1

And delete site-available/app2

This answer shows an example.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM