Прокси-сервер Apache: обработчик протокола недействителен


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

@Deadooshka Да, это работает. Если вы отправите это как ответ, я могу принять это
das_j

Ответы:


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в httpd.conf
Flion

1
Мне нужно sudo a2enmod proxy_connect, что для туннелирования https с помощью CONNECT
Рауль 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 мая '14 в 12:04


4

Я отправляю ответ здесь, так как у меня было то же самое сообщение об ошибке по другой причине.

Это сообщение об ошибке может появиться, например, если вы используете apache httpd для прокси-запросов от источника по протоколу A к цели по протоколу B.

Вот пример моей ситуации:

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

В случае выше, то, что происходило, было просто следующим. Я включил мод-прокси для прокси-запросов websocket к nodejs на основе path / sockjs-node.

Проблема в том, что узел не использует путь / sockjs-узел исключительно для запросов веб-сокетов. Он также использует этот путь для размещения точек входа 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.