I am working on a migration from nginx + passenger to nginx + unicorn and I have reached a point where I am a bit stuck.
When I attempt to view my test server, I get nothing but a 404 page. I am sure that I have something off in my vhost config but I just do not see what the issue is.
Any help with this is greatly appreciated.
This is the current version of my vhost file
upstream unicorn-staging {
server unix:/data/appname/staging/current/tmp/sockets/unicorn-staging.sock fail_timeout=0;
}
server {
listen 80 deferred;
listen 443;
ssl on;
root /data/appname/staging/current/public;
server_name foo;
access_log /data/appname/staging/current/log/unicorn-staging-access.log;
error_log /data/appname/staging/current/log/unicorn-staging-error.log;
client_max_body_size 4G;
ssl_certificate /data/appname/staging/shared/certs/appname.crt;
ssl_certificate_key /data/appname/staging/shared/certs/appname.key;
location / {
proxy_pass http://unicorn-staging;
proxy_redirect off;
proxy_set_header Host $host;
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; # for SSL, add this
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
index index.html index.htm;
}
location ~ \.(jpg|png|mp3|ogg)$ {
valid_referers server_names;
if ($invalid_referer) {
return 403;
}
}
location ~ \.(jpg|png|mp3|ogg|js|css|html|gif)$ {
gzip_static on;
expires max;
add_header Cache-Control public;
}
location ~ ^/(images|javascripts|stylesheets|assets)/ {
root /data/appname/staging/current/public; # for asset pipeline and other static files
expires max;
break;
}
# redirect server error pages to the stat
error_page 500 502 503 504 /50x.html;
}
Best Answer
Your unicorn configuration is most likely not setup correctly.
This happens on my server when nginx is running, but unicorn is not. The reason is that nginx tries to pass the request to the socket, but unicorn is not there to receive it.
By default, unicorn listens on port 8080 only. You can change your unicorn settings to listen on a different port, or a socket.
If you are using a unicorn configuration file (
config/unicorn.rb
), then inside that file, you should have something like (note you will have to change the socket path):For debug purposes, I make it listen to a port as well.
To start unicorn on your production web server, a command similar to the following needs to be run:
This uses the unicorn configuration file. See http://unicorn.bogomips.org/Unicorn/Configurator.html for an example configuration file.
If you do not use a unicorn config file, a command line switch is required in the format:
For example:
Note that I am using a relative path, because the
pwd
I use is the rails root directory.