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

apache httpd URL перенаправления на основе имени сервера

У меня в работе есть система Jira и Confluence. Оба работают на одних и тех же серверах. Фактические URL-адреса для доступа к Jira и Confluence:

http://foauslxapp05:8080/jira
http;//foauslxapp05:8090/confluence

или с полным именем хоста:

http://foauslxapp05.foservices.corp:8080/jira
http://foauslxapp05.foservices.corp:8090/confluence

Чтобы все упростить, я установил правило прокси, позволяющее пользователям делать это:

http://foauslxapp05/jira  <-- Accessing Jira
http://foauslxapp06/wiki  <-- Accessing Confluence

Наши специалисты создали пару псевдонимов серверов для foauslxapp05, так что:

http://jira/jira     <-- Accessing Jira
http://jira.foservices.corp/jira  <-- Accessing Jira
http://wiki/wiki     <-- Accessing Confluence
http://wiki.foservices.corp/wiki  <-- Accessing Confluence

Что мне действительно хотелось бы сделать, так это перейти к следующему шагу:

http://jira    <-- Accessing Jira
http://jira.foservices.corp  <-- Accessing Jira
http://wiki    <-- Accessing Confluence
http://wiki.foservices.copr  <-- Accessing Confluence

Проблема, конечно, в том, что имена DNS Джира и вики являются просто псевдонимами DNS для foauslxapp05. Мне нужно определить URL-адрес, который ввел пользователь (т.е. какой хост запросил пользователь), а затем на основе этого URL-адреса мне нужно перенаправить пользователя в правильное приложение.

Я даже не совсем уверен, на что мне следует смотреть: это VirtualHost? mod_rewrite? mod_proxy? Или это что-то совсем другое. Я не могу представить, чтобы что-то подобное было слишком сложно сделать. К сожалению, я не слишком хорошо знаком с Apache httpd.

Вы можете сделать это, используя переменную ServerAlias ​​в конфигурации вашего виртуального хоста, этот элемент конфигурации может поддерживать список имен / псевдонимов серверов:

http://httpd.apache.org/docs/2.0/vhosts/name-based.html

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

Но прежде чем начать, я хотел бы сказать: как Crowd вписывается в эту картину (Crowd является частью SSO, которая довольно хорошо объединяет Jira и Confluence). В нашем развертывании у нас есть jira.example.com/jira, jira.example.com/confluence, и то же самое для / толпы, / servicedesk и всего, что будет дальше. Вы можете подумать, как будет развиваться ваше решение (я не говоря, что ваше решение плохое или даже хуже нашего, но об этом нужно помнить).

Хорошо, к конфигурации. Вам необходимо сообщить Apache, что вы используете виртуальный хостинг на основе имен по HTTP и HTTPS.

# Look in /etc/httpd/conf/httpd.conf
NameVirtualHost *:443
NameVirtualHost *:80

Предположительно, у вас установлен mod_ssl и mod_proxy_ajp для обратного прокси-сервера обратно к сервлетам tomcat, предоставляющим вам Jira / Confluence и т. Д.

Надеюсь, вы знакомы с настройкой mod_ssl, поэтому у вас есть сертификаты и т. Д. У меня нет опыта работы с SNI (и если вы все еще используете RHEL5, это не вариант, но вы не сказали, какую версию RHEL вы используете), поэтому я предполагаю, что у вас есть сертификат SAN с такими именами, как:

  • jira.example.com (или, скорее, jira.foservices.corp, но в дальнейшем я буду использовать example.com)
  • confluence.example.com
  • crow.example.com (вы не сказали, используете ли вы это ...)

Если вы используете RHEL5 или RHEL6, вам нужно service httpd stop; отредактируйте / etc / sysconfig / httpd и включите рабочий MPM (раскомментируйте строку HTTPD), что даст вам лучшую масштабируемость; затем service httpd start. RHEL7 использует httpd 2.4 по умолчанию и, как мне кажется, имеет более новый MPM событий, который был бы лучше, чем любой из предыдущих.

Отредактируйте /etc/httpd/conf/httpd.conf и закомментируйте любые модули (LoadModule ...), которые не нужны. Если вы не знаете, делайте по несколько за раз и используйте apachectl configtest вам нужно протестировать свою конфигурацию, так как конфигурация по умолчанию потребует их несколько.

Пока вы там, я бы рекомендовал включить KeepAlives; очень хороший прирост производительности.

Я собираюсь поместить все эти виртуальные хосты в /etc/httpd/conf.d/sites.conf. Я надеюсь, вы оцените очевидное дублирование, но разделение каждого имени / услуги на разные разделы VirtualHost добавляет большую ясность.

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

<VirtualHost *:80>
    ServerName jira.example.com
</VirtualHost>

<VirtualHost *:443>
    ServerName jira.example.com
</VirtualHost>

<VirtualHost *:80>
    ServerName confluence.example.com
</VirtualHost>

<VirtualHost *:443>
    ServerName confluence.example.com
</VirtualHost>

Хорошо, это довольно высокий уровень; Давайте подробнее рассмотрим виртуальные хосты jira. Во-первых, я определяю виртуальный хост для доступа по HTTP, который просто перенаправляет на HTTPS.

<VirtualHost *:80>
    ServerName jira.example.com

    ErrorLog ...
    CustomLog ...

    Redirect 301 / https://jira.example.com/
</VirtualHost>

На сайте HTTPS все действия:

<VirtualHost *:443>
    ServerName jira.example.com

    SSLEngine On
    SSLProtocol all -SSLv2 -SSLv3

    # The following could be tigher...
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

    # If using a SAN certificate, the following would be the same for crowd
    SSLCertificateFile /etc/pki/tls/certs/jira_etc.pem
    SSLCertificateKeyFile /etc/pki/tls/private/jira_etc.key
    SSLCertificateChainFile /etc/pki/tls/certs/jira_etc.pems

    ErrorLog ... # don't forget log rotation
    CustomLog ...

    # Enough boilerplate, down to Jira specifics. Check which ports are
    # used for each or jira/confluence etc. The command (as root or as 
    # the account running the apps) may be helpful. You want the AJP port;
    # not the HTTP port.
    #
    #    'lsof -Pni | grep LISTEN | grep java'

    # Speed boost
    AddOutputFilterByType DEFLATE text/html text/plain text/xml

    ProxyPass          / ajp://127.0.0.1:8009/jira
    ProxyPassReverse   / ajp://127.0.0.1:8009/jira
</VirtualHost>

СОВЕТ. Одна вещь, о которой стоит подумать: что вы хотите, если люди пойдут, скажем, http: //foauslxapp05.foservices.corp/ (сайт по умолчанию) или напрямую на IP-адрес сервера? Я предлагаю вам ответить либо 404 (не найдено), либо 403 (запрещено). Вот фрагмент, который вы можете использовать в качестве домашнего задания. Использовать httpd -S чтобы получить очень полезную сводку о том, какие сайты определены в вашей текущей конфигурации (не running-config, а файлы конфигурации, как они есть в настоящее время), и обратите внимание, что порядок имеет значение (еще одна причина, по которой я поместил все это в conf.d / sites. conf, а не conf.d / jira.conf и conf.d / confluence.conf и т. д.

<VirtualHost _default_:80>
    RewriteEngine On
    RewriteRule ^ - [R=404,L]
</VirtualHost>

Я предлагаю вам сделать то же самое для https-сайта по умолчанию в conf.d / ssl.conf

Надеюсь, вы нашли этот пост полезным и информативным.

Ура, Кэмерон