У меня есть Apache2 с настройкой php fastcgi; Я хочу вносить изменения в конфигурацию, чтобы клиент этого не заметил (чтобы не было сброшенных / неудачных запросов), поэтому я помещаю перед ним haproxy; поэтому у меня есть 2 сервера Apache2, работающих на разных IP-адресах на одном сервере, и перед ними работает балансировка нагрузки / аварийное переключение Haproxy.
У Apache и Haproxy Keepalive отключен. Когда я бегу /etc/init.d/apache2_1 restart
или apache2ctl -k graceful -f /etc/apache2_1/apache2.conf
во время пробежки
watch -n 1 lynx -dump -source http://server/test.php
(у которого есть echo rand(1,100000);
в этом)
он по-прежнему отбрасывает 1 запрос с Bad Gateway
. Как я могу предотвратить это?
В принципе, если бы я мог сказать Haproxy завершить все подключения (завершение означает просто дать им возможность работать) с server1, но отправить все новые на server2 в определенный момент времени, это сработало бы.
Также обратите внимание: мне нужен php-cgi: with mod_php все проще.
Редактировать: Я пробовал это: http://www.iterasi.net/openviewer.aspx?sqrlitid=afatecr91eadnhiil9agpg
однако текущие запросы не передаются в резервную копию, поэтому некоторые клиенты все еще получают Bad Gateway
.
Чтобы ответить на комментарий Бена:
Кажется, что cgi изящный запускает все текущие соединения: mod_php изящно работает нормально: без простоев. Haproxy видит, когда apache падает (становится желтым на экране статистики), но fastcgi просто обрезает скрипты в воздухе.
[Sat Aug 15 19:00:55 2009] [notice] mod_fcgid: process /var/www/gui/wsapi.php(13987) exit(communication error), terminated by calling exit(), return code: 0
[Sat Aug 15 19:00:55 2009] [notice] mod_fcgid: process 14012 going graceful shutdown, sending SIGTERM
[Sat Aug 15 19:00:56 2009] [notice] mod_fcgid: process /var/www/gui/index.php(13999) exit(communication error), terminated by calling exit(), return code: 0
Также многие клиенты получают:
[Sat Aug 15 19:05:42 2009] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: index.php
Еще один признак того, что в отключении нет ничего изящного.
Вы можете указать haproxy прекратить отправку подключений к серверу. Для этого вы должны указать «http-check disable-on-404» в конфигурации haproxy, и ваш веб-сервер должен возвращать 404 (и ничего больше) для проверки работоспособности haproxy. Если haproxy увидит это, он пометит сервер как «NOLB», что означает, что он исключен из балансировки нагрузки, но по-прежнему завершает свои соединения и принимает постоянные соединения, запрашивающие его. Таким образом, все новые клиенты переходят на другие серверы.
Самый простой способ сделать это - проверить наличие «живого» файла, который после удаления приведет к возврату 404 (отсюда и выбор этого кода возврата). Конечно, лучше разработать более полное серверное приложение для ответа на проверки работоспособности!