Назад | Перейти на главную страницу

Как понять 500 случайных внутренних ошибок в Nginx?

Наш сервер показывает множество страниц с 500 внутренними ошибками для случайных запросов. Мы знаем, что приложение работает, потому что наш код прошел модульное тестирование. Настройка сервера - это Nginx с Unicorn, на котором запущено одно приложение Rails на Ubuntu 10.4 LTS.

Насколько мы можем сказать, запросы терпят неудачу до того, как они будут переданы Unicorn, потому что нет записей журнала в файле журнала Unicorn или в нашем Airbrake (другой сервис ведения журнала, который мы используем), но файл журнала Nginx показывает 500 записей статуса. Сервер находится под нормальной нагрузкой, поэтому ему не хватает оперативной памяти или чего-то еще.

Файл error.log Nginx на самом деле не дает нам ничего полезного. Нет записей, которые предполагают проблемы с файлами или ресурсами.

Как мне продолжить поиск проблемы?

Спасибо

Вот наша конфигурация 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;
    }
  }
}

Если у вас ничего нет в журналах ошибок rails, вероятно, это ошибка HTTP 503 (недоступный бэкэнд) или 504 (тайм-аут бэкэнда). Точная ошибка и причина будут в журнале ошибок nginx. Обе ошибки вызваны тем, что единорог не может обслуживать все HTTP-запросы.

Вы можете сделать несколько вещей:

  • увеличить worker_processes в unicorn.rb
  • увеличить proxy_read_timeout в nginx.conf
  • добавить второй сервер-единорог и баланс нагрузки между двумя, добавив его в восходящий единорог