
На нашем сайте запущен кластер из 12 Mongrel, а в моей локальной версии для разработки — кластер из 5 Mongrel. Nginx ( version: nginx/1.22.0
) находится впереди.
Один из наших процессов создает PDF-файл, обращаясь к wkhtmltopdf, инструменту командной строки, который, в свою очередь, обращается к веб-сайту, чтобы получить страницу, которую затем преобразует в PDF-файл.
Это работает, за исключением того, что иногда запрос на страницу отправляется тому же mongrel (всегда mongrel 1), который раскошелился, и тогда у меня возникает тупиковая ситуация — первый запрос ждет завершения второго, но второй находится в очереди после первого.
Mongrel Top (delay: 0.25) Fri Sep 22 16:47:59 2023
65347 sh -c start -p 3000 & mongrel_rails start -p 3001 & mongrel_rails start -p 3002 & mongrel_rails start -p 3003 & mongrel_rails start -p 3004
65348 [3000/2/11]: handling 127.0.0.1: POST /admin/school_quotes/CMS1Y-187790-107226, 127.0.0.1: GET /
65349 [3001/0/0]: idle
65350 [3002/0/0]: idle
65351 [3003/0/0]: idle
65352 [3004/0/0]: idle
6 process(es)
В своей конфигурации nginx я пытался заставить его использовать другой mongrel, а не тот, который в данный момент занят, но безуспешно — он всегда выбирает один случайный, поэтому есть 20% шанс выбрать тот же и заблокироваться (хотя по ощущениям это больше похоже на 50%).
Соответствующий блок конфигурации nginx в настоящее время выглядит следующим образом:
upstream elrs {
# least_conn;
# random two;
# round_robin;
zone backends 128k;
server 127.0.0.1:3000 max_conns=1 max_fails=3 fail_timeout=2;
server 127.0.0.1:3001 max_conns=1 max_fails=3 fail_timeout=2;
server 127.0.0.1:3002 max_conns=1 max_fails=3 fail_timeout=2;
server 127.0.0.1:3003 max_conns=1 max_fails=3 fail_timeout=2;
server 127.0.0.1:3004 max_conns=1 max_fails=3 fail_timeout=2;
}
Я установил max_conns
1 на всех из них, думая, что это может исправить, но это не так. Я также пробовал эту least_conn
опцию, но когда я попробовал второй или третий раз, они оба снова оказались на mongrel 1.
Я попробовал round_robin
после прочтения этой статьи, но получаю сообщение об ошибке -nginx: [emerg] unknown directive "round_robin"
Буду признателен за любые советы, спасибо.