Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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;
  # redirect server error pages to the stat
  error_page  500 502 503 504  /50x.html;
share|improve this question
Is there anything relevant in /data/appname/staging/current/log/unicorn-staging-error.log? – Alex Aug 22 '12 at 18:24
This is what I am seeing in my unicorn-staging-error.log file – rottmanj Aug 22 '12 at 18:51
What version of nginx are you using? – Alex Aug 22 '12 at 18:55
I am running nginx: nginx version: nginx/1.0.5 – rottmanj Aug 22 '12 at 18:57
what is in unicorn-staging-error.log; ? – Andrei Mikhaltsov Dec 19 '12 at 15:22

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):

listen File.expand_path("tmp/sockets/unicorn.sock", RAILS_ROOT)

For debug purposes, I make it listen to a port as well.

listen File.expand_path("tmp/sockets/unicorn.sock", RAILS_ROOT)
listen 3000, :tcp_nopush => true

To start unicorn on your production web server, a command similar to the following needs to be run:

bundle exec unicorn -E production -c config/unicorn.rb

This uses the unicorn configuration file. See for an example configuration file.

If you do not use a unicorn config file, a command line switch is required in the format:

-l, --listen ADDRESS

For example:

bundle exec unicorn -l tmp/sockets/unicorn.sock

Note that I am using a relative path, because the pwd I use is the rails root directory.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.