Прокси-сервер 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.

Как я могу это исправить?

das_j
источник
Кажется, для прокси-запроса нужен какой-то HTTPS-обработчик. Вместо этого попробуйте HTTP ...
Deadooshka
9
Я думаю, что нужно mod_sslи SSLProxyEngineсProxyPass
Deadooshka
@Deadooshka Да, это работает. Если вы отправите это как ответ, я могу принять это
das_j
возможный дубликат установки mod_proxy на http-сервере apache
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в 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 
kujiy
источник
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

em_bo
источник
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 сообщит вам, что протокол, который вы пытались использовать на целевом сервере, недействителен.

99Sono
источник
Вероятно, это был proxy_wstunnel. Смотрите первый комментарий к принятому ответу.
Лерк
0

Для меня все вышеупомянутые ответы были включены на xampp до сих пор не работает. Включение модуля ниже заставило виртуальный хост работать снова

LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
Али Азар
источник