Serwer proxy Apache: żadna procedura obsługi protokołu nie była poprawna

192

Próbuję proxy podkatalogu do innego serwera. Mój httpd.conf:

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

Problem polega na tym, że Apache zawsze rejestruje to:

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/

Po przeszukaniu Internetu aktywowałem następujące moduły:

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

(Wiem, że nie potrzebuję ich wszystkich, ale po prostu je aktywowałem, aby mieć pewność, że ich nie brakuje)

Ale ten błąd nadal występuje, a klienci otrzymują HTTP 500.

Jak mogę to naprawić?

das_j
źródło
wygląda na to, że potrzebuje trochę obsługi HTTPS dla żądania proxy. Zamiast tego spróbuj HTTP ...
Deadooshka
9
Myślę, że trzeba mod_ssli SSLProxyEnginezeProxyPass
Deadooshka
@Deadooshka Tak, to działa. Jeśli podasz to jako odpowiedź, mogę to zaakceptować
das_j

Odpowiedzi:

422

Może się to zdarzyć, jeśli nie masz mod_proxy_httpwłączonej opcji

sudo a2enmod proxy_http

Aby uruchomić moduł równoważenia obciążenia oparty na https, musiałem włączyć następujące funkcje:

sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
Brad Parks
źródło
23
Musiałem także zrobić „sudo a2enmod proxy_wstunnel” dla mojego przypadku użycia.
JimJty,
8
Dla mnie tak było LoadModule ssl_module modules/mod_ssl.so. Musiałem także użyć SSLProxyEngine on.
Chloe
1
Musiałem także włączyćmod_slotmem_shm
SiggyF
2
Dla mnie na WAMP zainstalowałem powyższe moduły za pomocą menu i musiałem odkomentować LoadModule slotmem_shm_module modules/mod_slotmem_shm.sow httpd.conf
Flion
1
Potrzebowałem sudo a2enmod proxy_connect, czyli do tunelowania https za pomocą CONNECT
Raul Nohea Goodness
22

Aby moja instalacja Apache2.4 + php5-fpm zaczęła działać, musiałem aktywować następujące moduły Apache:

sudo a2enmod proxy
sudo a2enmod proxy_fcgi

Nie ma proxy_httptakiej potrzeby , a to wysyła wszystkie .phppliki prosto do php5-fpm:

<FilesMatch \.php$>
    SetHandler "proxy:unix:/var/run/php5-fpm.sock|fcgi://localhost"
</FilesMatch>
dobrze
źródło
Tak, w przypadku fcgi to prawda, ale miałem serwer proxy HTTP. :)
das_j
10

W moim przypadku potrzebowałem proxy_ajpmodułu.

a2enmod proxy proxy_http proxy_ajp 
kujiy
źródło
8

Działo się to dla mnie w mojej konfiguracji Apache / 2.4.18 (Ubuntu). W moim przypadku błąd, który widziałem to:

... 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.

Konfiguracja z tym związana była:

  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/” oznacza, że ​​Apache nie może obsłużyć wysyłanego żądania do „ ws://127.0.0.1:8090/~socket.io/

Miałem proxy_httpzaładowany, ale również potrzebne proxy_wstunnel. Po włączeniu wszystko było w porządku.

Michael Rush
źródło
6

Aby wyjaśnić w przyszłości, a2enmod, jak sugeruje kilka odpowiedzi powyżej, dotyczy Debiana / Ubuntu. Red Hat nie używa tego do włączania modułów Apache - zamiast tego używa instrukcji LoadModule w httpd.conf.

Więcej tutaj: /server/56394/how-do-i-enable-apache-modules-from-the-command-line-in-redhat

Rozwiązanie / poprawna odpowiedź znajduje się w komentarzach do PO:

Myślę, że potrzebujesz mod_ssl i SSLProxyEngine z ProxyPass - Deadooshka 29 maja 2014 o 11:35

@Deadooshka Tak, to działa. Jeśli podasz to jako odpowiedź, mogę to zaakceptować - das_j 29 maja 14 o 12:04

em_bo
źródło
4

Publikuję odpowiedź tutaj, ponieważ miałem ten sam komunikat o błędzie z innego powodu.

Ten komunikat o błędzie może się zdarzyć, na przykład, jeśli używasz apache httpd do żądań proxy ze źródła w protokole A do celu w protokole B.

Oto przykład mojej sytuacji:

AH01144: Żadna procedura obsługi protokołu nie była poprawna dla adresu URL / sockjs-node / info (schemat „ws”).

W powyższym przypadku było to po prostu następujące. Włączyłem mod proxy do żądań websocket proxy do nodejs na podstawie path / sockjs-node.

Problem polega na tym, że węzeł nie używa ścieżki / sockjs-node wyłącznie do żądań websocket. Używa również tej ścieżki do hostowania punktów wejścia REST, które dostarczają informacji o gniazdach sieciowych.

W ten sposób, gdy aplikacja spróbuje otworzyć http: // localhost: 7001 / sockjs-node / info , apache httpd będzie próbował skierować pozostałe połączenie z protokołu HTTP do wywołania punktu końcowego Webscoket. Węzeł tego nie zaakceptował.

Doprowadziło to do powyższego wyjątku.

Dlatego pamiętaj, że nawet jeśli włączysz odpowiednie moduły, jeśli spróbujesz wykonać nieprawidłowe przekazywanie, zakończy się to apache httpd informującym, że protokół, którego próbujesz użyć na serwerze docelowym, jest nieprawidłowy.

99Sono
źródło
Prawdopodobnie był to proxy_wstunnel. Zobacz pierwszy komentarz do zaakceptowanej odpowiedzi.
Porucznik
0

Dla mnie wszystkie wyżej wymienione odpowiedzi zostały włączone na Xampp nadal nie działa. Włączenie poniżej modułu sprawiło, że wirtualny host znów działa

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
Ali Azhar
źródło