Raghvendra Parashar
Raghvendra Parashar

Reputation: 4053

502 error nginx + ruby on rails application

Application details :
Rails 3.1.0
Ruby 1.9.2
unicorn 4.2.0
resque 1.20.0
nginx/1.0.14
redis 2.4.8

I am using active_admin gem, for all URL's getting response 200,
but only one URL giving 502 error on production.

rake routes :

admin_links GET        /admin/links(.:format)                                            {:action=>"index", :controller=>"admin/links"}

And its working on local(development).

localhost log : response code 200

    Started GET "/admin/links" for 127.0.0.1 at 2013-02-12 11:05:21 +0530
        Processing by Admin::LinksController#index as */*
        Parameters: {"link"=>{}}
    Geokit is using the domain: localhost
        AdminUser Load (0.2ms)  SELECT `admin_users`.* FROM `admin_users` WHERE `admin_users`.`id` = 3 LIMIT 1
         (0.1ms)  SELECT 1 FROM `links` LIMIT 1 OFFSET 0
         (0.1ms)  SELECT COUNT(*) FROM `links` 
         (0.2ms)  SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM `links` LIMIT 10 OFFSET 0) subquery_for_count 
        CACHE (0.0ms)  SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM `links` LIMIT 10 OFFSET 0) subquery_for_count 
        Link Load (0.6ms)  SELECT `links`.* FROM `links` ORDER BY `links`.`id` desc LIMIT 10 OFFSET 0
        Link Load (6677.2ms)  SELECT `links`.* FROM `links` 
    Rendered /usr/local/rvm/gems/ruby-1.9.2-head/gems/activeadmin-0.4.2/app/views/active_admin/resource/index.html.arb (14919.0ms)
    Completed 200 OK in 15663ms (Views: 8835.0ms | ActiveRecord: 6682.8ms | Solr: 0.0ms)

production log : 502 response

    Started GET "/admin/links" for 103.9.12.66 at 2013-02-12 05:25:37 +0000
        Processing by Admin::LinksController#index as */*
        Parameters: {"link"=>{}}

NGinx error log

2013/02/12 07:36:16 [error] 32401#0: *1948 upstream prematurely closed connection while reading response header from upstream

don't know what's happening, could some buddy help me out.

Upvotes: 3

Views: 4387

Answers (1)

Michel Feldheim
Michel Feldheim

Reputation: 18250

You have a timeout problem.

Tackling it

HTTP/1.1 502 Bad Gateway

Indicates, that nginx had a problem to talk to its configured upstream. http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#502

2013/02/12 07:36:16 [error] 32401#0: *1948 upstream prematurely closed connection while reading response header from upstream

Nginx error log tells you Nginx was actually able to connect to the configured upstream but the process closed the connection before the answer was (fully) received.

Your development environment:

Completed 200 OK in 15663ms

Apparently you need around 15 seconds to generate the response on your development machine.

In contrast to proxy_connect_timeout, this timeout will catch a server that puts you in it's connection pool but does not respond to you with anything beyond that. Be careful though not to set this too low, as your proxy server might take a longer time to respond to requests on purpose (e.g. when serving you a report page that takes some time to compute). You are able though to have a different setting per location, which enables you to have a higher proxy_read_timeout for the report page's location.

http://wiki.nginx.org/HttpProxyModule#proxy_read_timeout

On the nginx side the proxy_read_timeout is at a default of 60 seconds, so that's safe

I have no idea how ruby (on rails) works, check the error log - the timeout happens in that part of your stack

Upvotes: 1

Related Questions