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

Как обслуживать статические файлы с помощью Apache и динамического содержимого с помощью Morbo на одном сервере?

У меня есть Apache httpd на порту 80 и сервер Morbo httpd на порту 3000, обслуживающий код Perl Mojolicious. Morbo доступен только с localhost.

Теперь я хочу настроить виртуальный хост с прокси, чтобы статические файлы обслуживались Apache, а динамический контент - сервером Morbo.

Это моя конфигурация виртуального хоста:

<VirtualHost *:80>
    ServerName    mojo.myhost.com
    DocumentRoot  /opt/mojo/public
    RewriteEngine on
    RewriteCond   %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
    RewriteCond   %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
    RewriteRule   ^(.*)  http://localhost:3000$1 [NS,P,L]
    ProxyPassReverse  /  http://mojo.myhost.com
</VirtualHost>

Проблема в том, что когда я пытаюсь получить доступ http://mojo.myhost.com/ Подзапрос Apache выдается Apache, а запрос, отправленный в Morbo, http://localhost:3000/error/noindex.html и нет http://localhost:3000/.

Вот часть журнала мод-перезаписи:

[rid#2b20905c58e0/initial] (2) init rewrite engine with requested uri /
[rid#2b20905c58e0/initial] (3) applying pattern '^(.*)' to uri '/'
[rid#2b20905c58e0/initial] (4) RewriteCond: input='/opt/mojo/public/' pattern='!-f' => matched
[rid#2b20905c58e0/initial] (4) RewriteCond: input='/opt/mojo/public/' pattern='!-d' => not-matched
[rid#2b20905c58e0/initial] (1) pass through /
[rid#2b20905cb910/subreq] (2) init rewrite engine with requested uri /index.php
[rid#2b20905cb910/subreq] (1) pass through /index.php
[rid#2b20905cd920/subreq] (2) init rewrite engine with requested uri /index.html
[rid#2b20905cd920/subreq] (1) pass through /index.html
[rid#2b20905cb910/subreq] (2) init rewrite engine with requested uri /index.html.var
[rid#2b20905cb910/subreq] (1) pass through /index.html.var
[rid#2b20905cd920/subreq] (2) init rewrite engine with requested uri /index.htm
[rid#2b20905cd920/subreq] (1) pass through /index.htm
[rid#2b20905caf40/initial/redir#1] (2) init rewrite engine with requested uri /error/noindex.html
[rid#2b20905caf40/initial/redir#1] (3) applying pattern '^(.*)' to uri '/error/noindex.html'
[rid#2b20905caf40/initial/redir#1] (4) RewriteCond: input='/opt/mojo/public/error/noindex.html' pattern='!-f' => matched
[rid#2b20905caf40/initial/redir#1] (4) RewriteCond: input='/opt/mojo/public/error/noindex.html' pattern='!-d' => matched
[rid#2b20905caf40/initial/redir#1] (2) rewrite '/error/noindex.html' -> 'http://localhost:3000/error/noindex.html'
[rid#2b20905caf40/initial/redir#1] (2) forcing proxy-throughput with http://localhost:3000/error/noindex.html
[rid#2b20905caf40/initial/redir#1] (1) go-ahead with proxy request proxy:http://localhost:3000/error/noindex.html [OK]

я добавил NS флаг RewriteRule но subreq по-прежнему изменяет URL-адрес до того, как он будет передан в Morbo. Как я могу заставить Apache передать / вместо /error/noindex.html в Morbo?

Если оба RewriteCond удаляются из конфигурации виртуального хоста, тогда он работает, но статические файлы также хранятся на сервере Morbo (что мне не очень нравится).

Вот что происходит, шаг за шагом:

  1. Сервер получает запрос на /
  2. Сервер проверяет -f состояние и обнаруживает, что / не является файлом, поэтому он соответствует условию.
  3. Сервер проверяет -d состояние и обнаруживает, что / является каталог, поэтому он не соответствует условию.
  4. Поскольку он не соответствует второму условию, сервер пытается обработать его как локальный файл / каталог. Ресурс, заканчивающийся на / должен иметь индексный файл; поэтому он пытается найти все перечисленные индексные файлы.
  5. Поскольку он не может найти индексный файл, он хочет показать вам /error/noindex.html вместо.
  6. Теперь мы вернемся к проверке условий перезаписи, и на этот раз мы сопоставим оба - нет ни файла, ни каталога с именем /error/noindex.html, поэтому на этот раз выполняется запрос прокси

Решение:

Добавьте RewriteRule, которое соответствует только пустому / и пусть тот выполнит перезапись. Пример:

RewriteRule   ^/$  http://localhost:3000 [NS,P,L]
ProxyPassReverse  /  http://mojo.myhost.com

Это соответствует запросу только на /.