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

Apache mod_proxy: несколько виртуальных хостов отключают друг друга

У меня есть сервер Ubuntu 12.04, на котором Redmine уже установлен на автономном apache (все в / opt / redmine). Я хотел установить экземпляр Jenkins в той же системе, не изменяя слишком сильно существующую настройку. Я хочу, чтобы эти две службы были доступны под sub.domain.com/redmine и sub.domain.com/jenkins соответственно.

Я изменил Apache Redmines на прослушивание порта 8081 вместо 80, установил дополнительный apache через apt и настроил виртуальный хост, который проксирует '/ redmine' на localhost: 8081 / redmine. Пока все работало нормально. Redmine был доступен, как и раньше. Однако, когда я настроил Jenkins таким же образом, когда tomcat прослушивает порт 8080, префикс URL-адреса jenkins и новый виртуальный хост, Redmine перестает работать, т.е. я получаю 404. Когда я удаляю виртуальный хост Jenkins, Redmine работает очередной раз.

Вот два файла в / etc / apache2 / sites-available, которые я включаю / отключаю через a2ensite / a2dissite.

Redmine:

<VirtualHost *:80>
    ServerAdmin webmaster@domain.com
    ServerName sub.domain.com
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPreserveHost off
    ProxyPass /redmine http://localhost:8081/redmine
    ProxyPassReverse /redmine http://localhost:8081/redmine
</VirtualHost>

Дженкинс:

<VirtualHost *:80>
    ServerAdmin webmaster@domain.com
    ServerName sub.domain.com
    ProxyRequests Off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPreserveHost off
    ProxyPass /jenkins http://localhost:8080/jenkins
    ProxyPassReverse /jenkins http://localhost:8080/jenkins
</VirtualHost>

Я предполагаю, что проблема связана с одним или обоими этими файлами. Я скопировал их из учебника Jenkins, который предполагал только один виртуальный хост. Где бы я ни искал решения mod_proxy для нескольких хостов, я нахожу примеры, которые сопоставляют разные порты с разными доменами, то есть с разными именами серверов. Но я не этого хочу. Обязательно ли мне использовать RewriteEngine?

Вам нужно использовать один виртуальный хост для обработки обоих!

Apache сопоставляет vhosts на основе заголовка HTTP Host. Поскольку имя хоста одинаково независимо от того, обращается ли клиент к redmine или jenkins, оба должен в том же хосте.

Что происходит с вашей текущей конфигурацией, так это то, что Apache определяет, какой виртуальный хост должен соответствовать, как только он видит заголовок Host. Поскольку 'j' стоит перед 'r' в алфавитном порядке, он дает приоритет вашему файлу jenkins vhost, даже если оба совпадают.

Вы пытаетесь сопоставить на основе URI запроса и соответственно прокси.

В <Proxy> эта функция уже встроена в директиву!

Вы можете использовать что-то вроде следующего в одном виртуальном хосте для достижения своей цели:

<VirtualHost *:80>
ServerAdmin webmaster@domain.com
ServerName sub.domain.com
ProxyRequests Off

<Proxy http://sub.domain.com/jenkins>

    Order deny,allow
    Allow from all

    ProxyPreserveHost off
    ProxyPass http://localhost:8080/jenkins
    ProxyPassReverse http://localhost:8080/jenkins

</Proxy>
<Proxy http://sub.domain.com/redmine>

    Order deny,allow
    Allow from all

    ProxyPreserveHost off
    ProxyPass http://localhost:8081/redmine
    ProxyPassReverse http://localhost:8081/redmine

</Proxy>

</VirtualHost>