web-dev-qa-db-ja.com

Nginxのランダムな500の内部エラーを理解する方法は?

私たちのサーバーは、ランダムなリクエストに対して500の内部エラーページをたくさん表示しています。コードは単体テストされているため、アプリが機能していることがわかります。サーバーのセットアップはNginxで、UnicornがUbuntu 10.4LTSで単一のRailsアプリを実行しています。

UnicornのログファイルまたはAirbrake(使用している別のログサービス)にログエントリがないため、リクエストがUnicornに渡される前に失敗したことがわかる限り、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;
    }
  }
}
2
Roman

Railsエラーログに何もない場合は、HTTPエラー503(利用できないバックエンド)または504(バックエンドタイムアウト)である可能性があります。正確なエラーと原因はnginxエラーログにあります。両方のエラーはUnicornはすべてのHTTPリクエストを処理できるわけではないためです。

あなたはいくつかのことをすることができます:

  • unicorn.rbのworker_processesを増やします
  • nginx.confのproxy_read_timeoutを増やします
  • 2番目のUnicornサーバーを追加し、アップストリームのUnicornに追加して、2つのサーバー間の負荷分散を行います。
1
Kristaps