503 com Varnish para HAproxy

3

Hospedamos vários aplicativos em diferentes servidores de aplicativos. O que nós temos é

HAProxy - > Servidores de aplicativos

Os servidores de aplicativos podem ser qualquer coisa, desde o PHP no Apache até o aplicativo Java no glassfish. Então, usamos haproxy para expor 1 IP e 1 porta para a internet e, em seguida, também carregar equilibrar os vários servidores de aplicativos, cada projeto recebe dois servidores de aplicativos e esses dois ficar equilibrado uns contra os outros.

O que queremos fazer agora é colocar o Varnish na frente do HAProxy para armazenar em cache todo o tráfego e devolvê-lo, antes que ele atinja o HAproxy e seja roteado para qualquer servidor de aplicativos.

O problema é que eu recebo um 503 do verniz ao haproxy, mas se eu apontar o verniz para um dos aplicativos servidores diretamente funciona perfeitamente. Alguém tem alguma ideia?

    
por daemonza 02.05.2012 / 12:28

1 resposta

2

Eu tive um problema similar , não muito tempo atrás - e a causa acabou por ser o SELinux.

Se o HAProxy estiver sendo executado em uma porta privilegiada (abaixo de 1024), mas seus servidores de aplicativos estiverem sendo executados em portas superiores e sem privilégios, o cenário a seguir é bem plausível.

A configuração do SELinux de algumas configurações (por exemplo, um CentOS padrão) impedirá que o Varnish se conecte a uma porta privilegiada. Se você tiver auditd em execução, poderá verificar isso no seu log de auditoria.

Por exemplo, em uma instalação limpa do CentOS 6.2, (quando meu servidor de back-end estiver em execução na porta 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

O estado atual da aplicação do SELinux pode ser determinado com:

cat /selinux/enforce

(Onde 1 está aplicando e 0 é permissivo).

Se o problema acima parecer ser o seu, configure o SELinux para temporariamente permissivo e confirme:

echo 0 >/selinux/enforce

Se você confirmar que este é, de fato, o seu problema, você pode usar audit2allow -a -w (parte do pacote policycoreutils-python no CentOS) para analisar seu log de auditoria e gerar as regras necessárias, ou você pode tentar o seguinte:

setsebool -P varnishd_connect_any 1
    
por 03.05.2012 / 02:02