mod_proxy retorna 503 erros mesmo após o serviço proxied ter sido restaurado

7

Eu tenho uma configuração com o Apache2 como um servidor front-end para vários aplicativos python veiculados pelo gunicorn . Minha configuração do Apache2 usando o mod_proxy se parece com isso:

<VirtualHost *:80>
    ServerName example.com
    UseCanonicalName On
    ServerAdmin webmaster@localhost

    LogLevel warn
    CustomLog /var/log/apache2/example.com/access.log combined
    ErrorLog /var/log/apache2/example.com/error.log
    ServerSignature On

    Alias /media/ /home/example/example.com/pysrc/project/media/

    ProxyPass /media/ !
    ProxyPass / http://127.0.0.1:4711/
    ProxyPassReverse / http://127.0.0.1:4711/
    ProxyPreserveHost On
    ProxyErrorOverride Off
</VirtualHost>

Geralmente, essa configuração funciona muito bem. Eu tenho um problema no entanto: Quando eu reiniciar o processo de gunicorn (leva 2-5 segundos) e há uma solicitação do Apache, essa solicitação irá falhar com um erro 503. Por enquanto, tudo bem. Mas o Apache continua retornando 503 erros, mesmo depois que o processo de gunicorn está de volta. Ele retoma a exibição de conteúdo do servidor proxy somente após uma reinicialização completa do Apache.

Existe uma maneira de contornar esse comportamento?

    
por Benjamin Wohlwend 01.05.2011 / 14:02

2 respostas

25

Adicione retry=0 às suas linhas do ProxyPass:

ProxyPass / http://127.0.0.1:4711/ retry=0

Na documentação do mod_proxy :

Connection pool worker retry timeout in seconds. If the connection pool worker to the backend server is in the error state, Apache will not forward any requests to that server until the timeout expires. This enables to shut down the backend server for maintenance, and bring it back online later. A value of 0 means always retry workers in an error state with no timeout.

    
por 07.05.2011 / 20:29
-1

Você está seguindo o método documentado para reiniciar o gunicorn?

Eu recomendaria uma abordagem simples. Se 2-5 segundos for tempo de inatividade aceitável em seu ambiente, posso sugerir que o script do serviço Apache seja reiniciado imediatamente após a reinicialização do serviço gunicorn?

Em um ambiente de produção, sugiro usar o HAProxy em vez do Apache como front-end, e você pode ter uma sorte muito melhor.

    
por 07.05.2011 / 08:46