Назад | Перейти на главную страницу

«Нет обработчика протокола, действительного для URL» с httpd mod_proxy_balancer

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

Я пробовал использовать конфигурацию, похожую на Резервное место для директивы Apache ProxyPass? чтобы начать работу, и это довольно просто, но я получаю ошибку в заголовке.

Вот моя (очищенная) конфигурация прокси:

DocumentRoot /var/www/www.example.com/htdocs

ProxyRequests Off
ProxyPreserveHost On

ProxyPass "/site/" "balancer://cms"
ProxyPassReverse "/site/" "balancer://cms"
ProxyPassReverse "/site/" "http://ip-10-1-1-229.ec2.internal/site/"

<Proxy "balancer://cms">
    #BalancerMember "http://ip-10-1-1-229.ec2.internal/site/" loadfactor=1
    # For localhost services, a backup of the CMS's site
    BalancerMember "http://127.0.0.1/site-backup/www.example.com/site/" loadfactor=10 status=+H
</Proxy>

<Directory "/var/www/www.example.com/htdocs/site-backup">
  Order allow,deny
  Allow from all

  Options Indexes FollowSymlinks
  DirectoryIndex index.html
</Directory>

(Здесь я закомментировал элемент балансировки, который идет в реальную систему CMS - эта часть работает нормально - так что я могу протестировать локальную статическую копию.)

Есть index.html файл в /var/www/www.example.com/site-backup/www.example.com/ и он загружается, когда я пытаюсь ударить http://www.example.com/site/, но никакие другие ресурсы страницы (CSS, изображения и т. д.) не загружаются. У них есть URL-адреса на странице, например:

У меня есть файл, foo.png по этому адресу:

/var/www/www.example.com/htdocs/site-backup/www.example.com/site/sites/default/files/foo.png

Но когда это изображение загружается браузером, я получаю 500 Internal Server Error ответ, и я вижу это в журнале ошибок httpd:

[прокси: предупреждение] [pid 3182: tid 2838395712] [клиент 71.127.40.115:38208] AH01144: для URL /site/site/sites/default/files/foo.png не действовал обработчик протокола. Если вы используете DSO-версию mod_proxy, убедитесь, что подмодули прокси включены в конфигурацию с помощью LoadModule., Referer: http://test.example.com/site/

Я заметил, что URL-адрес, указанный в сообщении об ошибке, имеет дополнительный /site/ в URL-адресе, поэтому я решил, что он удваивается, потому что я пытаюсь обслужить пространство URL-адресов, включая /site/ из каталога, содержащего /site/ и wget вероятно, сейчас не идеален, поэтому я создал символическую ссылку из /var/www/www.example.com/site-backups/www.example.com/site/site/sites -> /var/www.www.example.com/site-backups/www.example.com/site/sites. Это должно было исправить любую глупость из-за путаницы в URL.

Но это, похоже, ничего не исправило; mod_proxy все еще жалуется на протокол. mod_proxy_http определенно включен, поскольку нормальный ProxyPass директива для CMS работает должным образом (если она включена).

Я уверен, что это довольно простая вещь, которую мне не хватает, но я не могу этого понять. Любая помощь будет принята с благодарностью.

фейспалм

Оказалось, что на моем ProxyPass директива:

ProxyPass "/site/" "balancer://cms"

должно было:

ProxyPass "/site/" "balancer://cms/"

(Обратите внимание на косую черту перед закрывающей кавычкой.)

Это буквально все исправило.

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

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

a2enmod proxy proxy_http proxy_ajp 

То же, что и kujiy, мне пришлось добавить mod_ajp.

Я использую apache4.

В моем журнале были следующие сообщения:

No protocol handler was valid for the URL /jira. 
If you are using a DSO version of mod_proxy, 
make sure the proxy submodules are included in 
the configuration using LoadModule 

поэтому я добавил (я имею в виду раскомментированный) следующую строку в свой httpd.conf:

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so 

сохранены, и перезапущен сервер Apache.