Apache Proxy: Жоден обробник протоколу не був дійсним


192

Я намагаюся проксі підкаталог на інший сервер. Мій httpd.conf:

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

Проблема полягає в тому, що Apache завжди реєструє це:

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/

Тому після пошуку в Інтернеті я активував ці модулі:

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

(Я знаю, що мені їх не потрібно, але я просто активував їх, щоб переконатися, що я не пропускаю)

Але ця помилка все ж з’являється, і клієнти отримують HTTP 500.

Як я можу це виправити?


Здається, для запиту проксі потрібен якийсь обробник HTTPS. Спробуйте HTTP замість цього…
Deadooshka

9
Думаю, що потрібно mod_sslі SSLProxyEngineзProxyPass
Дедоошка

@Deadooshka Так, це працює. Якщо ви опублікуєте це як відповідь, я можу прийняти це
das_j

можливий дублікат програми установки mod_proxy на сервері apache http
Raedwald

Відповіді:


422

Це може статися, якщо ви не mod_proxy_httpввімкнули

sudo a2enmod proxy_http

Щоб я працював на базі https, використовуючи балансир навантаження, мені довелося включити наступне:

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

23
Я також повинен був зробити "sudo a2enmod proxy_wstunnel", для мого випадку використання.
JimJty

8
Для мене це було LoadModule ssl_module modules/mod_ssl.so. Мені також довелося користуватися SSLProxyEngine on.
Хлоя

1
Я також повинен був увімкнутиmod_slotmem_shm
SiggyF

2
Для мене на WAMP я встановив модулі вище через меню, і мені довелося LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
скаментувати

1
Мені потрібно sudo a2enmod proxy_connect, а саме тунель https за допомогою CONNECT
Raul Nohea Goodness

22

Щоб моя установка Apache2.4 + php5-fpm почала працювати, мені потрібно було активувати наступні модулі Apache:

sudo a2enmod proxy
sudo a2enmod proxy_fcgi

Немає необхідності proxy_http, і саме це посилає всі .phpфайли прямо в php5-fpm:

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

Так, для fcgi це правда, але у мене був проксі-сервер HTTP. :)
das_j

10

У моєму випадку мені знадобився proxy_ajpмодуль.

a2enmod proxy proxy_http proxy_ajp 

8

Це сталося для мене під час мого налаштування Apache / 2.4.18 (Ubuntu). У моєму випадку помилка, яку я бачив:

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

Конфігурація, пов'язана з цим, була:

  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/" означало, що Apache не може обробити запит, який надсилається до " ws://127.0.0.1:8090/~socket.io/"

Я proxy_httpзавантажив, але теж потрібен proxy_wstunnel. Коли це було ввімкнено, все було добре.


6

Для уточнення для подальшої посилання, a2enmod, як пропонується у кількох відповідях вище, призначений для Debian / Ubuntu. Red Hat не використовує це для включення модулів Apache - замість цього використовує оператори LoadModule в httpd.conf.

Детальніше тут: /server/56394/how-do-i-enable-apache-modules-from-the-command-line-in-redhat

Резолюція / правильна відповідь - у коментарях до ОП:

Я думаю, що вам потрібні mod_ssl та SSLProxyEngine з ProxyPass - Deadooshka 29 травня 14 о 11:35

@Deadooshka Так, це працює. Якщо ви опублікуєте це як відповідь, я можу прийняти це - das_j 29 травня 1414 о 12:04


4

Я надсилаю відповідь тут, оскільки у мене було те саме повідомлення про помилку з іншої причини.

Це повідомлення про помилку може статися, наприклад, якщо ви використовуєте apache httpd для проксі-запитів від джерела протоколу A для націлювання на протокол B.

Ось приклад моєї ситуації:

AH01144: Жоден обробник протоколу не був дійсним для URL / sockjs-node / info (схема 'ws').

У вищевикладеному випадку те, що відбувалося, було просто наступним. Я увімкнув mod proxy для проксі-запитів веб-сокетів до nodejs на основі шляху / sockjs-вузла.

Проблема полягає в тому, що вузол не використовує шлях / sockjs-вузол виключно для запитів websocket. Він також використовує цей шлях для розміщення вхідних точок REST, які доставляють інформацію про веб-розетки.

Таким чином, коли програма намагатиметься відкрити http: // localhost: 7001 / sockjs-node / info , apache httpd намагатиметься перенаправити виклик відпочинку з протоколу HTTP до виклику кінцевої точки Webscoket. Вузол цього не прийняв.

Це призводить до винятку вище.

Тож майте на увазі, що навіть якщо ви включите правильні модулі, якщо ви намагаєтеся зробити неправильну переадресацію, це закінчиться тим, що apache httpd повідомить вас, що протокол, який ви намагалися використовувати на цільовому сервері, недійсний.


Ймовірно, це був proxy_wstunnel. Дивіться перший коментар до прийнятої відповіді.
Лерк


0

Для мене всі вищезгадані відповіді було включено на xampp, який все ще не працює. Увімкнення нижче модуля зробило віртуальний хост знову

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.