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

503 с Varnish для HAproxy

Мы размещаем несколько приложений на разных серверах приложений. Что у нас есть

HAProxy -> Серверы приложений

Серверы приложений могут быть чем угодно, от PHP на Apache до приложения Java в Glassfish. Таким образом, мы используем haproxy для предоставления 1 IP и 1 порта в Интернет, а затем также балансируем нагрузку на различные серверы приложений, каждый проект получает два сервера приложений, и эти два уравновешиваются друг с другом.

Что мы хотим сделать сейчас, так это поместить Varnish перед HAProxy для кэширования всего трафика и вернуть его, прежде чем он попадет в HAproxy и будет перенаправлен на любой сервер приложений.

Проблема в том, что я получаю 503 от varnish до haproxy, но если я указываю varnish на один из серверов приложений напрямую, он работает отлично. У кого-нибудь есть идеи?

У меня есть аналогичная проблема, не так давно - и причиной оказался SELinux.

Если HAProxy работает на привилегированном порту (ниже 1024), но ваши серверы приложений работают на более высоких, непривилегированных портах, следующий сценарий вполне вероятен.

Конфигурация SELinux некоторых настроек (например, CentOS по умолчанию) не позволит Varnish подключаться к привилегированному порту. Если у вас есть auditd работает, вы можете проверить это в своем журнале аудита.

Например, при чистой установке CentOS 6.2 (когда мой внутренний сервер работает на порту 81):

grep varnish /var/log/audit/audit.log:

type=AVC msg=audit(1331500393.450:25): avc: denied { name_connect } for pid=1276 comm="varnishd" dest=81 scontext=unconfined_u:system_r:varnishd_t:s0 tcontext=system_u:object_r:reserved_port_t:s0 tclass=tcp_socket

Текущее состояние принудительного применения SELinux можно определить с помощью:

cat /selinux/enforce

(Куда 1 принудительно, и 0 разрешающий).

Если это кажется вашей проблемой, установите SELinux на временное разрешение и подтвердите:

echo 0 >/selinux/enforce

Если вы подтвердите, что это действительно ваша проблема, вы можете использовать audit2allow -a -w (часть пакета policycoreutils-python в CentOS), чтобы проанализировать журнал аудита и сгенерировать необходимые правила, или вы можете попробовать следующее:

setsebool -P varnishd_connect_any 1