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

205

J'essaye de proxy un sous-répertoire à 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 de ne pas en manquer un)

Mais cette erreur apparaît toujours et les clients obtiennent un HTTP 500.

Comment puis-je réparer cela?

das_j
la source
semble avoir besoin d'un gestionnaire HTTPS pour la demande de proxy. Essayez plutôt HTTP ...
Deadooshka
11
Je pense que vous avez besoin mod_sslet SSLProxyEngineavecProxyPass
Deadooshka
@Deadooshka Oui, cela fonctionne. Si vous postez ceci comme réponse, je peux l'accepter
das_j
duplication possible du setup mod_proxy sur le serveur http apache
Raedwald
voir aussi apple.stackexchange.com/a/401045/57019
Wolfgang Fahl

Réponses:

442

Cela peut arriver si vous n'avez pas mod_proxy_httpactivé

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
Brad Parks
la source
24
J'ai dû également faire un 'sudo a2enmod proxy_wstunnel', pour mon cas d'utilisation.
JimJty
8
Pour moi, ça l'était LoadModule ssl_module modules/mod_ssl.so. J'ai également dû utiliser SSLProxyEngine on.
Chloe
1
J'ai également dû activermod_slotmem_shm
SiggyF
2
Pour moi sur WAMP, j'ai installé les modules ci-dessus via le menu et j'ai dû décommenter LoadModule slotmem_shm_module modules/mod_slotmem_shm.sodans httpd.conf
Flion
1
J'avais besoin sudo a2enmod proxy_connect, qui consiste à tunneliser https en utilisant CONNECT
Raul Nohea Goodness
22

Pour que mon installation Apache2.4 + php5-fpm commence à fonctionner, j'avais besoin d'activer les modules Apache suivants:

sudo a2enmod proxy
sudo a2enmod proxy_fcgi

Pas besoin proxy_http, et c'est ce qui envoie tous les .phpfichiers directement vers php5-fpm:

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost"
</FilesMatch>
droite
la source
Oui, pour fcgi c'est vrai, mais j'avais un proxy HTTP. :)
das_j
10

Dans mon cas, j'avais besoin d'un proxy_ajpmodule.

a2enmod proxy proxy_http proxy_ajp 
kujiy
la source
8

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

... 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 associé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_httpchargé, mais aussi nécessaire proxy_wstunnel. Une fois que cela a été activé, tout allait bien.

Michael Rush
la source
7

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

Plus ici: /server/56394/how-do-i-enable-apache-modules-from-the-command-line-in-redhat

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

Je pense que vous avez besoin de mod_ssl et SSLProxyEngine avec ProxyPass - Deadooshka 29 mai 14 à 11:35

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

em_bo
la source
4

Je poste une réponse ici, car j'ai eu 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 renvoyer les requêtes d'une source sur le protocole A vers une cible 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é le proxy mod pour renvoyer les requêtes websocket à nodejs en fonction du chemin / sockjs-node.

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

De cette manière, lorsque l'application essaie d'ouvrir http: // localhost: 7001 / sockjs-node / info , apache httpd essaie d'acheminer le reste de l'appel du protocole HTTP vers un appel de point de terminaison Webscoket. Node n'a pas accepté cela.

Cela a conduit à l'exception ci-dessus.

Gardez donc à l'esprit que même si vous activez les bons modules, si vous essayez de faire une mauvaise transmission, 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.

99Sono
la source
C'était probablement proxy_wstunnel. Voir le premier commentaire sur la réponse acceptée.
Lerk
0

J'ai essayé de le faire uwsgi://fonctionner, mais d'une manière ou d'une autre, le manuel a pensé qu'il était clair pour moi que j'avais réellement besoin mod_proxy_uwsgi. Ce n'était pas. Voici comment procéder: Comment compiler mod_proxy_uwsgi ou mod_uwsgi?

Chris
la source
0

Pour moi, toutes les réponses mentionnées ci-dessus étaient activées sur xampp ne fonctionnant toujours pas. L'activation du module ci-dessous a permis à l'hôte virtuel de fonctionner à nouveau

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
Ali Azhar
la source
0

Dans mon cas, tous les modules ont été correctement configurés ( https://www.digitalocean.com/community/tutorials/how-to-use-apache-http-server-as-reverse-proxy-using-mod_proxy-extension est un bon démarreur) et j'ai eu la redirection de travail pour une URL de base , disons /mysite/ mais j'ai eu les erreurs pour n'importe quel enfant ULR, disons/mysite/login/

http://reverse-proxy.dns.com/mysite/a été correctement redirigé vers les serveurs distants en cas d' http://reverse-proxy.dns.com/mysite/login/échec du proxy inverse Apache2 avec le message d'erreur OP.

Le problème était le /caractère de fin dans la directive proxypass "/ mysite /". La configuration de travail pour l'URL enfant est:

<Proxy balancer://mysite_cluster>
    BalancerMember http://192.x.x.10:8080/mysite
    BalancerMember http://192.x.x.11:8080/mysite
</Proxy>
<VirtualHost *:80>
    [...]
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass "/mysite" "balancer://mysite_cluster"
    ProxyPassReverse "/mysite" "balancer://mysite_cluster"       
</VirtualHost>

Les traînées /sont vraiment délicates.

Poutrathor
la source