За последний месяц мне пришлось узнать много нового о конфигурации сервера, интеграции, 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 утверждает, что не было сервера для обработки некоторых запросов?
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-адреса и порты заменяются на x
es.
P.S. Я плохо разбираюсь в этом, учусь на ходу.
я использовал siege
для тестирования сервера и обнаружил, что я могу воспроизвести 503-е при запуске около 58 одновременных сессий. В этом случае вероятность успеха составляет всего 54%.
Я обнаружил, что вывод журнала доступа nginx "-" 400 0 "-" "-" "-"
каждый раз получаю 503.
Все говорят, что nginx выдает ошибку «400 Bad Request», когда файлы cookie слишком велики. Однако установка large_client_header_buffers
директива не исправила это для меня.
Я побежал siege
на сервере, нацеливая nginx непосредственно на его порт прослушивания, и теперь nginx начал возвращать 499 ошибок с тем же шаблоном, который он использовал для возврата 503s раньше. Осада все время говорит мне, что время ожидания соединения истекло, когда это происходит. Похоже, я подхожу ближе.
Я заметил, что 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», он указывает динамическое ограничение после загрузки серверной части. В этом случае сервер всегда будет принимать по крайней мере соединения, но не более чем, и предел будет на пандусе между обоими значениями, когда у бэкэнда меньше одновременных соединений. Это позволяет ограничить нагрузку на серверы во время обычных нагрузок, но увеличить ее для важных нагрузок, не перегружая серверы во время исключительных нагрузок.
Я настоятельно рекомендую прочитать весь документ, так как есть много там есть хорошая информация.