Proxy Apache: nessun gestore di protocollo era valido


192

Sto cercando di delegare una sottodirectory a un altro server. Il mio httpd.conf:

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

Il problema è che Apache registra sempre questo:

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/

Quindi, dopo aver cercato su Internet, ho attivato questi moduli:

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

(So ​​che non mi servono tutti, ma li ho appena attivati ​​per essere sicuro di non averne perso uno)

Ma questo errore appare ancora e i client ottengono un HTTP 500.

Come posso risolvere questo problema?


sembra che abbia bisogno di un gestore HTTPS per la richiesta proxy. Prova invece HTTP ...
Deadooshka,

9
Penso che tu abbia bisogno mod_ssle SSLProxyEngineconProxyPass
Deadooshka del

@Deadooshka Sì, funziona. Se lo
pubblichi

possibile duplicato del programma di installazione mod_proxy sul server http di Apache
Raedwald,

Risposte:


422

Questo può succedere se non hai mod_proxy_httpabilitato

sudo a2enmod proxy_http

Per far funzionare il mio bilanciamento del carico basato su https, ho dovuto abilitare quanto segue:

sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http

23
Ho dovuto anche fare un 'sudo a2enmod proxy_wstunnel', per il mio caso d'uso.
JimJty,

8
Per me lo è stato LoadModule ssl_module modules/mod_ssl.so. Ho anche dovuto usare SSLProxyEngine on.
Chloe,

1
Ho anche dovuto abilitaremod_slotmem_shm
SiggyF il

2
Per me su WAMP, ho installato i moduli sopra tramite il menu e ho dovuto decommentare LoadModule slotmem_shm_module modules/mod_slotmem_shm.soin httpd.conf
Flion il

1
Avevo bisogno sudo a2enmod proxy_connectdi tunneling di https usando CONNECT
Raul Nohea Goodness il

22

Perché la mia installazione di Apache2.4 + php5-fpm inizi a funzionare, ho dovuto attivare i seguenti moduli Apache:

sudo a2enmod proxy
sudo a2enmod proxy_fcgi

Non è necessario proxy_http, e questo è ciò che invia tutti i .phpfile direttamente a php5-fpm:

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

Sì, per fcgi questo è vero, ma avevo un proxy HTTP. :)
das_j,

10

Nel mio caso, avevo bisogno del proxy_ajpmodulo.

a2enmod proxy proxy_http proxy_ajp 

8

Questo stava accadendo per me nella mia configurazione di Apache / 2.4.18 (Ubuntu). Nel mio caso, l'errore che stavo vedendo era:

... 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 configurazione relativa a questo era:

  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/" significa che Apache non è in grado di gestire la richiesta inviata a " ws://127.0.0.1:8090/~socket.io/"

Avevo proxy_httpcaricato, ma anche necessario proxy_wstunnel. Una volta abilitato, tutto andava bene.


6

Per chiarire come riferimento futuro, a2enmod, come suggerito in diverse risposte sopra, è per Debian / Ubuntu. Red Hat non lo utilizza per abilitare i moduli Apache, ma utilizza le istruzioni LoadModule in httpd.conf.

Maggiori informazioni qui: /server/56394/how-do-i-enable-apache-modules-from-the-command-line-in-redhat

La risoluzione / risposta corretta è nei commenti sul PO:

Penso che tu abbia bisogno di mod_ssl e SSLProxyEngine con ProxyPass - Deadooshka, 29 maggio 14 alle 11:35

@Deadooshka Sì, funziona. Se lo pubblichi come risposta, posso accettarlo - das_j, 29 maggio 14 alle 12:04


4

Sto postando una risposta qui, poiché ho avuto lo stesso messaggio di errore per un motivo diverso.

Questo messaggio di errore può verificarsi, ad esempio, se si utilizza apache httpd per inoltrare richieste da un'origine sul protocollo A per indirizzare il protocollo B.

Ecco l'esempio della mia situazione:

AH01144: Nessun gestore di protocollo era valido per l'URL / sockjs-node / info (schema 'ws').

Nel caso sopra, ciò che stava accadendo era semplicemente il seguente. Avevo abilitato il proxy mod per inoltrare le richieste websocket a nodejs in base al percorso / nodo sockjs.

Il problema è che il nodo non utilizza il percorso / nodo sockjs esclusivamente per le richieste di websocket. Utilizza anche questo percorso per l'hosting dei punti di ingresso REST che forniscono informazioni sui socket Web.

In questo modo, quando l'applicazione tenta di aprire http: // localhost: 7001 / sockjs-node / info , apache httpd tenta di indirizzare la chiamata di riposo dal protocollo HTTP a una chiamata endpoint Webscoket. Node non ha accettato questo.

Ciò ha portato all'eccezione sopra.

Quindi tieni presente che anche se abiliti i moduli giusti, se provi a fare l'inoltro sbagliato, questo si concluderà con apache httpd che ti informa che il protocollo che hai provato a usare sul server di destinazione non è valido.


Probabilmente era proxy_wstunnel. Vedi il primo commento sulla risposta accettata.
Lerk,


0

Per me tutte le risposte di cui sopra sono state abilitate su xampp ancora non funzionante. L'abilitazione del modulo sottostante ha fatto di nuovo funzionare l'host virtuale

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.