Apache Proxy: обработчик протокола недопустим

103

Я пытаюсь проксировать подкаталог на другой сервер. Мой 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.

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

  • 0
    Кажется, для запроса прокси нужен какой-то HTTPS-обработчик. Вместо этого попробуйте HTTP ...
  • 9
    Я думаю, что вам нужны mod_ssl и SSLProxyEngine с ProxyPass
Показать ещё 2 комментария
Теги:
httpd.conf
apache2.4
apache-modules

5 ответов

213
Лучший ответ

Это может произойти, если у вас нет mod_proxy_http enabled

sudo a2enmod proxy_http

Для меня, чтобы мой байт-менеджер на основе https работал, мне пришлось включить следующее:

sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
  • 13
    Мне также пришлось сделать sudo a2enmod proxy_wstunnel, для моего случая использования.
  • 8
    Для меня это был LoadModule ssl_module modules/mod_ssl.so . Я также должен был использовать SSLProxyEngine on .
Показать ещё 6 комментариев
11

Мне не хватает кармы, чтобы комментировать... Для установки 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>
  • 0
    Да, для fcgi это правда, но у меня был HTTP-прокси. :)
4

Чтобы уточнить для справки в будущем, a2enmod, как предлагается в нескольких ответах выше, для Debian/Ubuntu. Red Hat не использует это для включения модулей Apache, вместо этого он использует команды LoadModule в httpd.conf.

Подробнее здесь: https://serverfault.com/questions/56394/how-do-i-enable-apache-modules-from-the-command-line-in-redhat

Разрешение/правильный ответ содержится в комментариях к OP:

Мне кажется, вам нужны mod_ssl и SSLProxyEngine с ProxyPass - Deadooshka 29 мая 14 в 11:35

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

3

В моем случае мне понадобился модуль proxy_ajp.

a2enmod proxy proxy_http proxy_ajp 
0

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

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

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

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

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

Проблема заключается в том, что node не использует путь /sockjs - node исключительно для запросов websocket. Он также использует этот путь для размещения точек входа REST, которые предоставляют информацию о веб-сайтах.

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

Это приведет к исключению выше.

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

  • 2
    Не могли бы вы поделиться своим решением?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню