【问题标题】:Ubuntu Nginx, Rails, and ThinUbuntu Nginx、Rails 和 Thin
【发布时间】:2012-09-29 21:11:33
【问题描述】:

我按照这个article 拥有一个Ubuntu Nginx、Rails 和Thin 服务器,但是当访问主页时我得到500 Internal Server Error 和以下错误日志:

2012/09/29 18:43:14 [alert] 15917#0: *1013 socket() failed (24: Too many open files) while connecting to upstream, client: 50.57.229.222, server: 50.57.229.222, request: "GET / HTTP/1.0", upstream: "http://50.57.229.222:80/", host: "50.57.229.222"

知道这里发生了什么吗?

/etc/nginx/sites-enabled/gitwatcher.com 在这里:

upstream gitwatcher {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
    server 127.0.0.1:3002;
}
server {
    listen   80;
    server_name  50.57.229.222;

    access_log /var/www/gitwatcher/log/access.log;
    error_log  /var/www/gitwatcher/log/error.log;
    root       /var/www/gitwatcher;
    index      index.html;

    location / {
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header  Host $http_host;
        proxy_redirect    off;
        try_files /system/maintenance.html $uri $uri/index.html $uri.html @ruby;
    }

    location @ruby {
        proxy_pass http://50.57.229.222;
    }
}

【问题讨论】:

标签: ruby-on-rails ruby proxy nginx thin


【解决方案1】:

我认为您的 nginx 配置中有一个循环。这部分说要监听 80 端口:

server {
    listen   80;
    server_name  50.57.229.222;
    [...]

但是稍后,您说将请求转发到相同的端口和 IP 地址:

location @ruby {
    proxy_pass http://50.57.229.222;
}

所以 Nginx 决定将请求转发给自己。然后它决定将新请求转发给它自己。以此类推,直到您使用了所有内核的文件描述符。

很可能,您的瘦服务器在不同的端口上运行。您需要在配置的后半部分的 URL 中使用该端口。

【讨论】:

  • 听起来不错,无论如何删除最后一个“位置@ruby”并不能解决问题。关于瘦,是的,有 3 个服务器正在运行,它们定义在 /etc/nginx/sites-enabled/gitwatcher.com 的顶部(参见 main Qeastion)
  • 实际上删除最后一个位置得到一个不同的错误:2012/09/30 08:36:48 [错误] 23253#0: *3 找不到命名位置“@ruby”,客户端:93.34。 165.230,服务器:50.57.229.222,请求:“GET /favicon.ico HTTP/1.1”,主机:“50.57.229.222”
  • 我认为,当有人看到这个错误时,实际上是他们的配置中的一个循环导致了这个错误。
【解决方案2】:

谢谢大家的回答,

无论如何,通过这篇文章解决了一个错误的 nginx conf:http://articles.slicehost.com/2009/3/13/ubuntu-intrepid-nginx-rails-and-thin

【讨论】:

    【解决方案3】:

    这里的提示在错误信息中:

    1013 socket() failed (24: Too many open files) while connecting to upstream
    

    这可能意味着您遇到了 ulimit 问题(这在低流量水平时很奇怪,但很有可能,具体取决于应用正在执行的操作)。

    ulimit -n 通常会显示您对打开文件句柄的限制。我认为这在 OS X 上相当低,在许多 Linux 风格的系统上通常是 1024。您可以在 Linux 机器上使用 ulimit -n 8192(或类似名称)临时增加它,但这不会在会话之间持续存在。

    要永久解决它,您需要增加 ulimit。谷歌“too many open files ulimit”和你的操作系统以获取更多信息;每个操作系统的过程略有不同。

    Redhat-ish 系统

    编辑/etc/security/limits.conf。在底部添加如下内容:

    * 8192 8192
    

    这将为所有用户同时设置 8192 个打开文件句柄的软和硬 ulimit。您需要重新启动才能使其生效,但您可以发出 ulimit -n 8192 立即为该会话的该用户应用该限制。

    操作系统

    有关如何在 OS X 平台上增加文件限制的详细说明,请参阅 this answer

    【讨论】:

    • 错误信息有什么变化吗?您使用哪种方法来更改 ulimit? ulimit -n 给你什么?
    猜你喜欢
    • 2015-11-26
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2012-08-04
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多