Proxy reverso do Apache: nenhum manipulador de protocolo

20

Estou tentando configurar um proxy reverso com o apache, mas estou recebendo um No protocol handler was valid for the URLerro que não entendo.

Esta é a configuração relevante do apache:

ProxyRequests Off
ProxyPreserveHost On

<Proxy *>
       Order deny,allow
       Allow from all
</Proxy>

ProxyPass        /gonvaled/examples/jsonrpc/output/services/ http://localhost:8000/services/
ProxyPassReverse /gonvaled/examples/jsonrpc/output/services/ http://localhost:8000/services/

Os pedidos estão atingindo o apache como:

POST /gonvaled/examples/jsonrpc/output/services/EchoService.py HTTP/1.1

E eles devem ser encaminhados para o meu serviço interno, localizado em:

0.0.0.0:8000/services/EchoService.py

Estes são os logs:

==> /var/log/apache2/error.log <==
[Wed Jun 20 02:05:20 2012] [debug] proxy_util.c(1506): [client 127.0.0.1] proxy: http: found worker http://localhost:8000/services/ for http://localhost:8000/services/EchoService.py, referer: http://localhost/gonvaled/examples/jsonrpc/output/JSONRPCExample.safari.cache.html
[Wed Jun 20 02:05:20 2012] [debug] mod_proxy.c(998): Running scheme http handler (attempt 0)
[Wed Jun 20 02:05:20 2012] [warn] proxy: No protocol handler was valid for the URL /gonvaled/examples/jsonrpc/output/services/EchoService.py. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
[Wed Jun 20 02:05:20 2012] [debug] mod_deflate.c(615): [client 127.0.0.1] Zlib: Compressed 614 to 373 : URL /gonvaled/examples/jsonrpc/output/services/EchoService.py, referer: http://localhost/gonvaled/examples/jsonrpc/output/JSONRPCExample.safari.cache.html

==> /var/log/apache2/access.log <==
127.0.0.1 - - [20/Jun/2012:02:05:20 +0200] "POST /gonvaled/examples/jsonrpc/output/services/EchoService.py HTTP/1.1" 500 598 "http://localhost/gonvaled/examples/jsonrpc/output/JSONRPCExample.safari.cache.html" "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19"
dangonfast
fonte

Respostas:

26

Eu encontrei o problema O proxy_httpmódulo também precisa ser ativado no Apache (eu tinha apenas proxy_htmle proxy)

dangonfast
fonte
23

Para mim, no apache httpd 2.4, isso aconteceu porque estava faltando a barra final:

Não funcionou:

    <Proxy balancer://mycluster>
        BalancerMember http://192.168.111.7
        BalancerMember http://192.168.111.80
    </Proxy>
    ProxyPass / balancer://mycluster
    ProxyPassReverse / balancer://mycluster

Trabalhou!

    <Proxy balancer://mycluster>
        BalancerMember http://192.168.111.7
        BalancerMember http://192.168.111.80
    </Proxy>
    ProxyPass / balancer://mycluster/
    ProxyPassReverse / balancer://mycluster/

(adicionado /no final)

Nicholas DiPiazza
fonte
Para mim, o apache 2.2.15, <kbd> / </kbd> no final funciona. VALEU!
me ajudou no Apache / 2.4.10 (Debian). Isso precisa ser documentado! A mensagem de erro é extremamente obtusa
DeveloperChris
2

Para quem procura respostas, outra possibilidade é o nome do serviço de URL para o back-end também estar ausente. Com o LogLevel Debug e mod_proxy e mod_proxy_fcgi, eu estava vendo o seguinte:

[debug] proxy: fgci: found worker fgci://127.0.0.1:9000/var/www/html/.../index.php [debug] mod_proxy.c(1026): Running scheme fgci handler (attempt 0) [debug] mod_proxy_fcgi.c(800): [client ...] AH01076: url: fgci://127.0.0.1:9000/var/www/html/.../index.php proxyname: (null) proxyport: 0 [debug] mod_proxy_fcgi.c(805): [client ...] AH01077: declining URL fgci://127.0.0.1:9000/var/www/html/.../index.php [warn] proxy: No protocol handler was valid for the URL /.../index.php. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

Felizmente, o código para mod_proxy_fastcgi (estou usando um backport para Apache 2.2 no RHEL6) está disponível em https://github.com/ceph/mod-proxy-fcgi/blob/master/mod_proxy_fcgi.c#L805 , que é este pedaço de código:

if (strncasecmp(url, "fcgi:", 5) != 0) {
    ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01077) "declining URL %s", url);
    return DECLINED;
}

Se você olhar atentamente para os logs - eu só notei isso ao olhar para o código que emite a mensagem - você verá que o que deveria ser fcgi://...está incorreto comofgci://...

Então, quando você vê declining URL, significa:

  • Você não possui um manipulador carregado que aceite o serviço (por exemplo, fcgi :) ou
  • você digitou incorretamente o nome do serviço.
Cameron Kerr
fonte
11
Eu votei por causa da parte "Quando você vê esse erro significa ..." desta resposta. Eu sinto que isso deve levar a maioria dos pesquisadores na direção certa.
Threeve 8/08