web-dev-qa-db-fra.com

Proxy Apache: aucun gestionnaire de protocole n'était valide

J'essaie de transférer un sous-répertoire par un autre serveur. Mon httpd.conf:

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

Le problème est qu'Apache enregistre toujours ceci:

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/

Donc, après avoir cherché sur Internet, j'ai activé ces modules:

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

(Je sais que je n'ai pas besoin de tous mais je les ai juste activés pour être sûr qu'il n'en manque pas un)

Mais cette erreur persiste et les clients obtiennent un HTTP 500.

Comment puis-je réparer cela?

161
das_j

Cela peut arriver si vous n'avez pas activé mod_proxy_http

Sudo a2enmod proxy_http

Pour que mon équilibreur de charge basé sur https fonctionne, je devais activer les éléments suivants:

Sudo a2enmod ssl
Sudo a2enmod proxy
Sudo a2enmod proxy_balancer
Sudo a2enmod proxy_http
359
Brad Parks

Pour que mon installation Apache2.4 + php5-fpm commence à fonctionner, je devais activer les modules Apache suivants:

Sudo a2enmod proxy
Sudo a2enmod proxy_fcgi

Pas besoin de proxy_http, et c'est ce qui envoie tous les fichiers .php directement à php5-fpm:

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost"
</FilesMatch>
23
right

Dans mon cas, j'avais besoin du module proxy_ajp.

a2enmod proxy proxy_http proxy_ajp 
10
kujiy

Je poste une réponse ici, car j'avais le même message d'erreur pour une raison différente.

Ce message d'erreur peut survenir, par exemple, si vous utilisez Apache httpd pour des demandes de proxy provenant d'une source sur le protocole A pour cibler sur le protocole B.

Voici l'exemple de ma situation:

AH01144: Aucun gestionnaire de protocole n'était valide pour l'URL/sockjs-node/info (schéma 'ws').

Dans le cas ci-dessus, ce qui se passait était simplement le suivant. J'avais activé mod proxy pour adresser des requêtes websocket à nodejs en fonction du chemin/sockjs-node.

Le problème est que ce noeud n'utilise pas exclusivement le chemin/sockjs-node pour les requêtes websocket. Il utilise également ce chemin pour héberger REST points d'entrée fournissant des informations sur les Websockets.

De cette manière, lorsque l'application essaierait de s'ouvrir http: // localhost: 7001/sockjs-node/info , Apache httpd tenterait de router l'appel restant du protocole HTTP vers un point de terminaison Webscoket appel. Node n'a pas accepté cela.

Cela a conduit à l'exception ci-dessus.

Soyez donc conscient que même si vous activez les bons modules, si vous essayez d'effectuer un mauvais transfert, cela se terminera par Apache httpd vous informant que le protocole que vous avez essayé d'utiliser sur le serveur cible n'est pas valide.

4
99Sono

Pour clarifier pour référence future, a2enmod, comme suggéré dans plusieurs réponses ci-dessus, est destiné à Debian/Ubuntu. Red Hat ne l'utilise pas pour activer les modules Apache, mais utilise les instructions LoadModule dans httpd.conf.

Plus ici: https://serverfault.com/questions/56394/how-do-i-enable-Apache-modules-from-the-command-line-in-redhat

La résolution/réponse correcte se trouve dans les commentaires sur le PO:

Je pense que vous avez besoin de mod_ssl et de SSLProxyEngine avec ProxyPass - Deadooshka le 29 mai 2014 à 11h35

@ Deadooshka Oui, cela fonctionne. Si vous postez ceci comme une réponse, je peux l'accepter - le 29 mai 2014 à 12:04

4
em_bo

Cela se passait pour moi dans ma configuration Apache/2.4.18 (Ubuntu). Dans mon cas, l'erreur que je voyais était la suivante:

... 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 configuration liée à ceci était:

  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/" signifiait qu'Apache ne pouvait pas gérer la requête envoyée à "ws://127.0.0.1:8090/~socket.io/"

J'avais proxy_http chargé, mais j'avais aussi besoin de proxy_wstunnel. Une fois que cela a été activé, tout était bon.

3
Michael Rush

J'ai essayé de faire fonctionner un uwsgi://, mais le manuel pensait qu'il était clair pour moi que j'avais réellement besoin de mod_proxy_uwsgi. Ce n'était pas. Voici comment vous le faites: Comment compiler mod_proxy_uwsgi ou mod_uwsgi?

0
Chris