mod_proxy - Apache Proxy: ningún manejador de protocolo era válido
reverse proxy location apache (5)
Estoy tratando de proxy de un subdirectorio a otro servidor. Mi httpd.conf:
RewriteEngine On
ProxyPreserveHost On
RewriteRule .*subdir/ https://anotherserver/subdir/ [P]
El problema es que Apache siempre está registrando esto:
AH01144: No protocol handler was valid for the URL /subdir/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule., referer: http://localhost/
Entonces, después de buscar en Internet, he activado estos módulos:
LoadModule headers_module modules/mod_headers.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule rewrite_module modules/mod_rewrite.so
(Sé que no los necesito a todos, pero los activé para asegurarme de que no me falta ninguno)
Pero este error aún aparece y los clientes obtienen un HTTP 500.
¿Cómo puedo arreglar esto?
En mi caso, necesitaba el módulo proxy_ajp
.
a2enmod proxy proxy_http proxy_ajp
Esto puede suceder si no tiene habilitado mod_proxy_http
sudo a2enmod proxy_http
Para que funcione el equilibrador de carga basado en https, tuve que habilitar lo siguiente:
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
Estoy publicando una respuesta aquí, ya que tenía el mismo mensaje de error por un motivo diferente.
Este mensaje de error puede ocurrir, por ejemplo, si está utilizando apache httpd para enviar solicitudes de un origen en el protocolo A al destino en el protocolo B.
Aquí está el ejemplo de mi situación:
AH01144: Ningún controlador de protocolo era válido para la URL / sockjs-node / info (esquema ''ws'').
En el caso anterior, lo que sucedía era simplemente lo siguiente. Había habilitado el proxy mod para proxy las solicitudes de websocket a nodejs en función de la ruta / sockjs-node.
El problema es que el nodo no usa la ruta / sockjs-node para solicitudes de websocket exclusivamente. También utiliza esta ruta para alojar puntos de entrada REST que entregan información sobre websockets.
De esta forma, cuando la aplicación intente abrir http://localhost:7001/sockjs-node/info , apache httpd intentará enrutar la llamada restante desde el protocolo HTTP a una llamada de punto final Webscoket. Nodo no aceptó esto.
Esto lleva a la excepción anterior.
Así que tenga en cuenta que incluso si habilita los módulos correctos, si intenta hacer el reenvío incorrecto, esto finalizará con apache httpd que le informa que el protocolo que intentó usar en el servidor de destino no es válido.
Para aclarar para referencia futura, a2enmod, como se sugiere en varias respuestas anteriores, es para Debian / Ubuntu. Red Hat no usa esto para habilitar los módulos de Apache, sino que usa las instrucciones de LoadModule en httpd.conf.
La resolución / respuesta correcta está en los comentarios en el PO:
Creo que necesitas mod_ssl y SSLProxyEngine con ProxyPass - Deadooshka 29 de mayo de 14 a 11:35
@Deadooshka Sí, esto está funcionando. Si publica esto como respuesta, puedo aceptarlo - das_j 29 de mayo de 14 a 12:04
Para que mi instalación Apache2.4 + php5-fpm comenzara a funcionar, necesitaba activar los siguientes módulos de Apache:
sudo a2enmod proxy
sudo a2enmod proxy_fcgi
No es necesario proxy_http
, y esto es lo que envía todos los archivos .php
directamente a php5-fpm:
<FilesMatch /.php$>
SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost"
</FilesMatch>