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

Nginx с Passenger за HAProxy вызывает ошибку 503

За последний месяц мне пришлось узнать много нового о конфигурации сервера, интеграции, AWS и т. Д. Я никогда не делал этого в такой степени.

У меня все настроено и работает хорошо для моего приложения (в основном благодаря http://github.com/wr0ngway/rubber gem и помощь от IRC-канала # rubberec2). Однако я столкнулся с загадочной (для меня) проблемой.

Стек

Я использую Nginx + Passenger за HAProxy. Пока что используется только один хост Nginx + Passenger, поэтому HAProxy пока мало что делает, но в будущем мы добавим больше серверов приложений.

Проблема

У меня возникают случайные ошибки 503, которые в определенное время суток меня раздражают (при более высокой нагрузке?). Эти ошибки возникают как для статических ресурсов, так и для маршрутизируемых URL-адресов. Я определил, что их бросает HAProxy, потому что страница и ее заголовки идентичны тому, что находится в /etc/haproxy/errors/503.http.

Я думал, что nginx не заботится о том, сколько запросов он получает, он может обрабатывать их все, поскольку у него собственная очередь, а пассажир правильно распределяет вещи. Так почему же тогда HAProxy утверждает, что не было сервера для обработки некоторых запросов?

Моя конфигурация HAProxy

global
  log 127.0.0.1 local0 warning
  maxconn 1024

defaults
  log global
  mode http
  retries 3
  balance roundrobin
  option abortonclose
  option redispatch
  option httplog
  contimeout 4000
  clitimeout 150000
  srvtimeout 30000

listen passenger_proxy x.x.x.x:x
  option forwardfor
  server web01 web01:xxxx maxconn 20 check

Примечание. IP-адреса и порты заменяются на xes.

P.S. Я плохо разбираюсь в этом, учусь на ходу.

Обновить

я использовал siege для тестирования сервера и обнаружил, что я могу воспроизвести 503-е при запуске около 58 одновременных сессий. В этом случае вероятность успеха составляет всего 54%.

Обновление 2

Я обнаружил, что вывод журнала доступа nginx "-" 400 0 "-" "-" "-" каждый раз получаю 503.

Обновление 3

Все говорят, что nginx выдает ошибку «400 Bad Request», когда файлы cookie слишком велики. Однако установка large_client_header_buffers директива не исправила это для меня.

Обновление 4

Я побежал siege на сервере, нацеливая nginx непосредственно на его порт прослушивания, и теперь nginx начал возвращать 499 ошибок с тем же шаблоном, который он использовал для возврата 503s раньше. Осада все время говорит мне, что время ожидания соединения истекло, когда это происходит. Похоже, я подхожу ближе.

Обновление 5

Я заметил, что nginx регистрировался в двух местах моей системы, и был журнал ошибок, возвращающий это сообщение каждый раз, когда siege показывал "Тайм-аут соединения":

file=ext/nginx/HelperAgent.cpp:574 time=2011-09-15 07:43:22.196 ]: Couldn't forward the HTTP response back to the HTTP client: It seems the user clicked on the 'Stop' button in his browser.

Из HAProxy руководство по настройке вам нужно увеличить maxconn параметр в объявлении вашего сервера.

Если для сервера указан параметр «maxconn», это означает, что количество одновременных подключений на нем никогда не будет больше. Кроме того, если у него есть параметр «minconn», он указывает динамическое ограничение после загрузки серверной части. В этом случае сервер всегда будет принимать по крайней мере соединения, но не более чем, и предел будет на пандусе между обоими значениями, когда у бэкэнда меньше одновременных соединений. Это позволяет ограничить нагрузку на серверы во время обычных нагрузок, но увеличить ее для важных нагрузок, не перегружая серверы во время исключительных нагрузок.

Я настоятельно рекомендую прочитать весь документ, так как есть много там есть хорошая информация.