Proxy Apache: ningún controlador de protocolo era válido

192

Estoy tratando de proxy un subdirectorio a otro servidor. Mi httpd.conf:

RewriteEngine On
ProxyPreserveHost On
RewriteRule .*subdir/ https://anotherserver/subdir/ [P]

El problema es que Apache siempre registra 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?

das_j
fuente
Parece que se necesita un controlador HTTPS para la solicitud de proxy. Pruebe HTTP en su lugar ...
Deadooshka
9
Creo que necesitas mod_ssly SSLProxyEngineconProxyPass
Deadooshka
@Deadooshka Sí, esto está funcionando. Si publica esto como respuesta, puedo aceptarlo
das_j
posible duplicado de la configuración mod_proxy en el servidor http apache
Raedwald

Respuestas:

420

Esto puede suceder si no ha mod_proxy_httphabilitado

sudo a2enmod proxy_http

Para que mi equilibrador de carga basado en https funcione, tuve que habilitar lo siguiente:

sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
Brad Parks
fuente
23
También tuve que hacer un 'sudo a2enmod proxy_wstunnel', para mi caso de uso.
JimJty
8
Para mí lo fue LoadModule ssl_module modules/mod_ssl.so. También tuve que usar SSLProxyEngine on.
Chloe
1
También tuve que habilitarlomod_slotmem_shm
SiggyF
2
Para mí en WAMP, instalé los módulos anteriores a través del menú y tuve que descomentar LoadModule slotmem_shm_module modules/mod_slotmem_shm.soen httpd.conf
Flion
1
Necesitaba sudo a2enmod proxy_connect, que es hacer un túnel https usando CONNECT
Raul Nohea Goodness
22

Para que mi instalación de 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 .phparchivos directamente a php5-fpm:

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost"
</FilesMatch>
Derecha
fuente
Sí, para fcgi esto es cierto, pero tenía un proxy HTTP. :)
das_j
10

En mi caso, necesitaba un proxy_ajpmódulo.

a2enmod proxy proxy_http proxy_ajp 
kujiy
fuente
8

Esto me estaba sucediendo en mi configuración de Apache / 2.4.18 (Ubuntu). En mi caso, el error que estaba viendo fue:

... AH01144: No protocol handler was valid for the URL /~socket.io/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

La configuración relacionada con esto fue:

  ProxyPass /~socket.io/ ws://127.0.0.1:8090/~socket.io/
  ProxyPassReverse /~socket.io/ ws://127.0.0.1:8090/~socket.io/

" No protocol handler was valid for the URL /~socket.io/" significaba que Apache no podía manejar la solicitud enviada a " ws://127.0.0.1:8090/~socket.io/"

Lo había proxy_httpcargado, pero también lo necesitaba proxy_wstunnel. Una vez que se habilitó, todo estuvo bien.

Michael Rush
fuente
6

Para aclarar para futuras referencias, a2enmod, como se sugiere en varias respuestas anteriores, es para Debian / Ubuntu. Red Hat no usa esto para habilitar los módulos de Apache; en su lugar, usa declaraciones LoadModule en httpd.conf.

Más aquí: /server/56394/how-do-i-enable-apache-modules-from-the-command-line-in-redhat

La resolución / respuesta correcta está en los comentarios sobre el OP:

Creo que necesitas mod_ssl y SSLProxyEngine con ProxyPass - Deadooshka 29 de mayo de 2014 a las 11:35

@Deadooshka Sí, esto está funcionando. Si publica esto como respuesta, puedo aceptarlo - das_j 29 de mayo de 2014 a las 12:04

em_bo
fuente
4

Estoy publicando una respuesta aquí, ya que tuve el mismo mensaje de error por una razón diferente.

Este mensaje de error puede aparecer, por ejemplo, si está usando apache httpd para proxy de una fuente en el protocolo A para apuntar 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 estaba sucediendo era simplemente lo siguiente. Había habilitado las solicitudes de proxy proxy para proxy websocket a nodejs según la ruta / sockjs-node.

El problema es que el nodo no usa la ruta / sockjs-node para las solicitudes websocket exclusivamente. También utiliza esta ruta para alojar puntos de entrada REST que entregan información sobre websockets.

De esta manera, cuando la aplicación intente abrir http: // localhost: 7001 / sockjs-node / info , apache httpd intentará enrutar la llamada de descanso del protocolo HTTP a una llamada de punto final de Webscoket. Node no aceptó esto.

Esto condujo a la excepción anterior.

Tenga en cuenta que incluso si habilita los módulos correctos, si intenta hacer un reenvío incorrecto, esto terminará con apache httpd que le informa que el protocolo que intentó usar en el servidor de destino no es válido.

99Sono
fuente
Probablemente fue proxy_wstunnel. Vea el primer comentario sobre la respuesta aceptada.
Lerk
0

Para mí, todas las respuestas mencionadas anteriormente estaban habilitadas en xampp que aún no funcionaban. La habilitación del módulo a continuación hizo que el host virtual volviera a funcionar

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
Ali Azhar
fuente