3

应用详情:
Rails 3.1.0
Ruby 1.9.2
unicorn 4.2.0
resque 1.20.0
nginx/1.0.14
redis 2.4.8

我正在使用active_admin gem,所有 URL 都得到响应 200,
但只有一个 URL 在生产中给出 502 错误。

耙路线:

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

及其在本地(开发)方面的工作。

本地主机日志:响应代码 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)

生产日志:502 响应

    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 错误日志

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

不知道怎么回事,有大佬帮帮我。

4

1 回答 1

1

你有一个超时问题。

解决它

HTTP/1.1 502 错误网关

表示 nginx 在与其配置的上游通信时遇到问题。 http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#502

2013/02/12 07:36:16 [错误] 32401#0: *1948 上游过早关闭连接,同时从上游读取响应标头

Nginx 错误日志告诉您 Nginx 实际上能够连接到配置的上游,但进程在(完全)收到答案之前关闭了连接。

您的开发环境:

在 15663 毫秒内完成 200 OK

显然,您需要大约 15 秒才能在您的开发机器上生成响应。

与 proxy_connect_timeout 相比,此超时将捕获一个将您置于其连接池中的服务器,但除此之外不会对您做出任何响应。请注意不要将其设置得太低,因为您的代理服务器可能需要更长的时间来故意响应请求(例如,当为您提供需要一些时间来计算的报告页面时)。您可以为每个位置设置不同的设置,这使您能够为报告页面的位置设置更高的 proxy_read_timeout。

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

在 nginx 端,proxy_read_timeout 默认为 60 秒,所以这是安全的

我不知道 ruby​​ (on rails) 是如何工作的,请检查错误日志 - 超时发生在堆栈的那一部分

于 2013-12-13T10:32:04.900 回答