ruby-on-rails - Passenger & Nginx => 生产中的 502 Bad Gateway 错误

标签 ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 nginx passenger

我正在运行 Nginx 1.0.6、Passenger 3.0.9、Rails 3.1.1、Ruby 1.9。在我的生产环境中,我在 nginx_error.log 文件中看到以下间歇性警告:

2011/11/22 14:44:40 [warn] 23288#0: *474 an upstream response is buffered to a temporary file /opt/nginx/proxy_temp/2/00/0000000002 while reading upstream, client: 69.172.88.178, server: www.memverse.com, request: "GET /show_all_my_verses HTTP/1.1", upstream: "passenger:unix:/passenger_helper_server:", host: "www.memverse.com", referrer: "http://www.memverse.com/quick_add/7352"

并且不太常见的是以下导致 502 Bad Gateway 的错误:

2011/11/21 15:35:20 [error] 2118#0: *60762 upstream prematurely closed connection while reading response header from upstream, client: 74.125.44.84, server: www.memverse.com, request: "GET /blogs/feed/9 HTTP/1.1", upstream: "passenger:unix:/passenger_helper_server:", host: "www.memverse.com"

我浏览了 Passenger 和 Nginx 文档,并调整了 nginx.conf 文件中的几乎所有设置,但都无济于事。我希望至少有人能为我指明正确的方向。

下面是我的 nginx.conf:

user  root;
worker_processes  4;

error_log  logs/error.log  error; # debug | info | notice | warn | error | crit
pid        logs/nginx.pid;

events {
    worker_connections  1024; # max_clients = worker_processes * worker_connections
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;

    keepalive_timeout  65;

    # Configure Passenger
    passenger_root /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.9;
    passenger_ruby /usr/local/bin/ruby;

    passenger_log_level 1;
    passenger_debug_log_file /home/avitus/logs/passenger.log;

    rails_framework_spawner_idle_time 0;
    rails_app_spawner_idle_time 0;

    passenger_pool_idle_time 0;
    passenger_use_global_queue on;
    passenger_max_pool_size 15;

    server {
       listen 80;
       server_name www.pariday.com pariday.com;
       root /home/avitus/pariday.com/current/public;
       access_log /home/avitus/pariday.com/current/log/nginx_access.log main;
       error_log /home/avitus/pariday.com/current/log/nginx_error.log info;
       passenger_enabled on;
    }

    server {
        listen 80;
        server_name www.assetcorrelation.com assetcorrelation.com;
        root /home/avitus/assetcorrelation.com/current/public;
        access_log /home/avitus/assetcorrelation.com/current/log/nginx_access.log main;
        error_log /home/avitus/assetcorrelation.com/current/log/nginx_error.log info;
        passenger_enabled on;
    }

    server {
         listen       80;
         server_name  localhost;

         location / {
             root   html;
             index  index.html index.htm;
         }
    }
}

我已经被这个问题难住了几天了,所以非常感谢任何帮助。老实说,如果有人能解释这两个警告/错误的含义,那将会有所帮助。

最佳答案

第一个问题(“upstream response is buffered to a temporary file”)是由一些内容很多的页面引起的,通过如下增加缓冲区大小解决:

proxy_buffers 8 16k;
proxy_buffer_size 32k;
passenger_buffers 8 16k;
passenger_buffer_size 32k;

第二个问题(“从上游读取响应 header 时上游过早关闭连接”)通过增加服务器上的内存并将 Passenger 切换到保守生成模式来解决。 (它似乎与使用试图运行后台作业的旧 Ruby gem 密切相关。)

关于ruby-on-rails - Passenger & Nginx => 生产中的 502 Bad Gateway 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8235168/

相关文章:

ruby-on-rails - Heroku 问题错误 : failed to push some refs

ruby-on-rails - 安装 rack-mount + Rails 时出现 Ruby gem 错误

hash - 从 Ruby on Rails 数据库准备要在 d3.js 中绘制的数据

html - ruby on rails 数据类型 :text render in view

ruby-on-rails - Rails 应用程序在遇到重负载时不断崩溃

ruby-on-rails - 如何让我的 Ruby Gems 在多个服务器上保持相同?

ruby-on-rails - 多次渲染 - 在 rails 中双重渲染

arrays - "merge"两个数组并在Rails中迭代新数组

ruby-on-rails-3 - ruby -heroku : command not found

ruby-on-rails - rails v2.3 : Difference between session and cookies