Nginx – Request timeout issue with nginx, unicorn and rails

nginxruby-on-railstimeoutunicorn

I have an application in rails and it runs unicorn in production. There are some requests that take too long to process. I have configured the server to increase the timeout, so these request work correctly. The problem is that when the request takes more than 30 seconds to respond, I get this message:

Service Unavailable

The service is temporarily unavailable. Please try again later.

In unicorn.rb I have timeout 120 configured and my nginx.conf is:

upstream unicorn_my_app {
    server unix:/tmp/my_app.socket fail_timeout=0;
}

server {
        listen 80;
        client_max_body_size 4G;
        server_name www.my_app.com;

        proxy_read_timeout 120;

        keepalive_timeout 5;

        root /home/ubuntu/my_app/current/public;

        location / {
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect off;

          if (!-f $request_filename) {
            proxy_pass http://unicorn_my_app;
            break;
          }
        }

        error_page 404 500 502 503 504 /erro/erro.html;
        location = /erro/ {
          root /home/ubuntu/my_app/current/public;
        }
}

Is there any other configuration that I forgot?

Best Answer

The configuration used is right. The problem in this case is that you are behind Rackspace Load Balance, which by default set timeout to 30 seconds. To change Rackspace Load Balance timeout value, follow this instructions. In abstract, you do two API calls:

1) Get a token:

curl -s -d \
'{
    "auth":
    {
       "RAX-KSKEY:apiKeyCredentials":
       {  
          "username": "your_api_username",  
          "apiKey": "your_api_key"}
    }  
}' \
-H 'Content-Type: application/json' \
'https://identity.api.rackspacecloud.com/v2.0/tokens' | python -m json.tool

2) Change LB timeout:

curl -s -d \ '{"loadBalancer":{
    "timeout": 120
    } }' \
-H 'X-Auth-Token: token_returned_in_last_request' \
-H 'Content-Type: application/json' \
-X PUT \ 'https://iad.loadbalancers.api.rackspacecloud.com/v1.0/<your_customer_id>/loadbalancers/<your_lb_id>'