如何理解Nginx中的随机500内部错误?

如何理解Nginx中的随机500内部错误?

我们的服务器针对随机请求显示大量 500 内部错误页面。我们知道应用程序正在运行,因为我们的代码经过了单元测试。服务器设置是 Nginx,Unicorn 在 Ubuntu 10.4 LTS 上运行单个 Rails 应用程序。

据我们所知,请求在传递到 Unicorn 之前就失败了,因为 Unicorn 的日志文件或我们的 Airbrake(我们正在使用的另一个日志服务)中没有日志条目,但 Nginx 的日志文件确实显示了 500 个状态条目。服务器处于正常负载下,因此没有耗尽 RAM 或其他问题。

Nginx error.log 文件实际上并没有提供任何有用的信息。没有任何条目表明文件问题或资源问题。

我该如何继续寻找这个问题?

谢谢

这是我们网站的 nginx 配置:

# This is the socket that unicorn listens to
upstream unicorn {
        server unix:/tmp/unicorn.sock;
}

server {
  listen 80;
  client_max_body_size 10m;
  server_name oursite.com;
  root /var/www/current/public;
  access_log  /var/log/nginx/access.log;
  error_page 500 502 503 504 /var/www/shared/500.html;

  if ($http_user_agent ~* (majestic12|easou|Sogou|baidu|ahrefs) ) {
    return 403;
  }

  location / {
#    auth_basic "Restricted";
#    auth_basic_user_file /var/www/shared/.htpasswd;
    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;
    proxy_max_temp_file_size 0;

    if (-f $request_filename) {
      break;
    }
    if (-f $document_root/system/maintenance.html) {
      rewrite  ^(.*)$  /system/maintenance.html last;
      break;
    }
    if (-f $request_filename/index.html) {
      rewrite (.*) $1/index.html break;
    }
    if (-f $request_filename.html) {
      rewrite (.*) $1.html break;
    }

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

答案1

如果 rails 错误日志中没有任何内容,则可能是 HTTP 错误 503(后端不可用)或 504(后端超时)。确切的错误和原因将在 nginx 错误日志中。这两个错误都是因为 unicorn 无法满足所有 HTTP 请求。

你可以做几件事:

  • 在 unicorn.rb 中增加 worker_processes
  • 在 nginx.conf 中增加 proxy_read_timeout
  • 添加第二个 Unicorn 服务器,并通过将其添加到上游 Unicorn 来实现两者之间的负载平衡

相关内容