Apache inverso proxy: sin controlador de protocolo

18

Estoy tratando de configurar un proxy inverso con apache, pero estoy recibiendo un No protocol handler was valid for the URL error, que no entiendo.

Esta es la configuración relevante de 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/

Las solicitudes están llegando a apache como:

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

Y deben ser enviados a mi servicio interno, ubicado en:

0.0.0.0:8000/services/EchoService.py

Estos son los registros:

==> /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
fuente

Respuestas:

26

Encontré el problema. los proxy_http El módulo debe activarse también en Apache (solo tenía proxy_html y proxy )

dangonfast
fuente
23

Para mi, en apache httpd 2.4, esto sucedió porque me faltaba la barra al final:

No funcionó:

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

¡Trabajó!

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

(adicional / al final)

Nicholas DiPiazza
fuente
Para mí, apache 2.2.15, & lt; kbd & gt; / & lt; / kbd & gt; Al final trabaja. ¡GRACIAS!
me ayudó en Apache / 2.4.10 (Debian). Esto necesita ser documentado! El mensaje de error es extremadamente obtuso.
DeveloperChris
2

Para aquellos que vienen en busca de respuestas, otra posibilidad es que también falta el nombre del servicio de URL al backend. Con LogLevel Debug, y mod_proxy y mod_proxy_fcgi, estaba viendo lo siguiente:

[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.

Afortunadamente, el código para mod_proxy_fastcgi (estoy usando un backport para Apache 2.2 en RHEL6) está disponible en https://github.com/ceph/mod-proxy-fcgi/blob/master/mod_proxy_fcgi.c#L805 , que es esta pieza 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;
}

Si observa detenidamente los registros (solo lo noté cuando miraba el código que emite el mensaje) verá que debería haber fcgi://... está mal escrito como fgci://...

Así que cuando veas declining URL significa cualquiera

  • No tiene un controlador cargado que acepte el servicio (por ejemplo, fcgi :), o
  • Has escrito mal el nombre del servicio.
Cameron Kerr
fuente
Upvote debido a la parte de esta respuesta "Cuando ves este error significa ...". Siento que esto debería llevar a la mayoría de los buscadores en la dirección correcta.
threeve