Сценарий проблемы: в большой организации у них есть несколько отделов, каждый из которых хочет разместить свой сайт на другой машине. таким образом, эти сайты доступны локально с другим локальным IP-адресом.
Когда мы сопоставляем публичное выступление, тогда мы сталкиваемся с проблемой. У нас есть два варианта: либо купить как можно больше публичных адресов, либо поставить один сервер на фронт и передать этот запрос.
Мы собираемся использовать 2-й вариант. мы помещаем веб-сервер Apache httpd перед всеми серверами отдела. так что достаточно только одного публичного IP. Все DNS-записи домена направлены на httpd-сервер Apache. Затем сервер Apache передает эти запросы соответствующему серверу Tomcat. Этот процесс полностью прозрачен с точки зрения пользователя (браузера).
Структура структуры реализации виртуального хоста |
Как веб-сервер Apache httpd взаимодействует с сервером Tomcat
Прежде чем мы подробно расскажем о том, как происходит связь между сервером httpd и tomcat
Сколько портов связывается, когда мы запускаем один кот?
- порт отключения
- порт разъема http
- Порт разъема https (необязательно)
- порт ajp
Конфигурация порта хранится в файле $ CATALINA_HOME / conf / server.xml. мы можем изменить порты, когда это необходимо.
Здесь AJP (Apache JServ Protocol) — это двоичный протокол, который может передавать входящие запросы с веб-сервера на сервер приложений, расположенный за веб-сервером.
Веб-сервер Apache httpd взаимодействует с сервером Tomcat по протоколу AJP.
Когда мы устанавливаем сервер Apache httpd, он не имеет встроенной возможности поддержки протокола ajp. поэтому нам нужен модуль mod_jk . Это добавляет поддержку ajp к серверу Apache httpd.
Шаги для реализации концепции виртуального хоста в этом сценарии:
- Установите веб-сервер Apache httpd
- Установите разъем mod_jk
- Настройте соединитель JK
- Настройте сервер Apache httpd, примените концепции виртуального хоста
Предварительное условие: мы уже установили Tomcat в разных отделах, развернули приложение и работаем нормально.
Установите веб-сервер Apache httpd
Мы можем установить веб-сервер Apache двумя способами:
- Бинарный модуль
- Из источника
Мы можем установить сервер Apache httpd из диспетчера пакетов распространения (apt-get или yum). Или мы можем скачать исходный код, а затем скомпилировать и установить.
Мы используем второй вариант. Сначала загрузите исходный код сервера httpd здесь . затем распакуйте его и установите
1
2
3
|
. /configure --prefix= /usr/local/apache -- enable -rewrite=shared -- enable -proxy=shared make sudo make install |
Здесь — опция префикса, чтобы указать, куда мы собираемся установить сервер Apache httpd. Опции –enable-rewrite и –enable-proxy для включения этих модулей в режиме совместного использования. Эти модули сейчас не нужны. но в будущем мы использовали его для перезаписи URL перед передачей на следующую цепочку серверов и поддержкой балансировки нагрузки.
Установите разъем mod_jk
Теперь сервер Apache httpd готов. нам нужно добавить поддержку ajp на сервер. скачайте модуль коннектора mod_jk отсюда , распакуйте его и установите
1
2
3
4
5
|
cd native . /configure --with-apxs= /usr/local/apache/bin/apxs make sudo make install |
Здесь опция –with-apxs указывает, где находится модуль apxs. поэтому нам нужно указать расположение сервера Apache httpd. Теперь файлы mod_jk.so создаются в каталоге модулей в установленном apache-каталоге (/ usr / local / apache / modules)
Настроить соединитель mod_jk
Этот шаг имеет 2 подэтапа:
- Создать файл worker.properties
- Загрузите и настройте модуль коннектора JK в файле apache httpd.conf.
Создать файл worker.properties
Разъем mod_jk готов. но этот разъем работает на основе файла конфигурации. поэтому нам нужно создать файл конфигурации с именем worker.properties file
Этот синтаксис файла — пара ключ = значение, здесь мы определяем рабочих. т. е. все tomcat отдела размещают IP-адрес и порт ajp для соответствующего tomcat.
Здесь формат записи выглядит так:
1
|
worker.<name>.property=<value> |
Например:
1
2
3
4
|
worker.<name>. type =ajp13 worker.<name>.port=<ajp port> worker.<name>.host=<tomcat ip addr> worker.list=<name> |
Вот:
- Ключ worker.list содержит имя всех работников, разделенных запятой
- type = здесь тип работника. мы используем версию ajp13
- port = мы указываем порт ajp (не порт http) этого сервера
- host = IP-адрес или имя хоста сервера Tomcat
workers.properties
01
02
03
04
05
06
07
08
09
10
11
12
13
|
worker.list=department1,department2,department3 worker.department1. type =ajp13 worker.department1.port=5000 worker.department1.host=192.168.5.10 worker.department2. type =ajp13 worker.department2.port=5000 worker.department2.host=192.168.6.10 worker.department3. type =ajp13 worker.department3.port=5000 worker.department3.host=192.168.7.10 |
Добавить запись в httpd.conf
Apache httpd сервер установлен. Модуль mod_jk установлен и создан файл works.properties. но эти 3 изолированы. мы собрали вместе, нам нужно настроить сервер httpd.
Найдите файл conf / httpd.conf в установленном Apache-каталоге и добавьте в него следующие записи
1
2
3
4
5
6
7
8
9
|
LoadModule jk_module modules /mod_jk .so JkWorkersFile conf /workers .properties JkLogFile logs /mod_jk .log JkLogLevel emerg JkLogStampFormat "[%a %b %d %H:%M:%S %Y] " JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories JkRequestLogFormat "%w %V %T" |
Вот:
- LoadModule — загрузить общий модуль mod_jk на httpd-сервер Apache (включить модуль mod_jk)
- JkWorkersFile — Укажите расположение файла worker.properties
- Все остальные являются системой регистрации mod_jk. Его стандартный код просто скопируйте и вставьте.
Делегировать httpd в Tomcat
Теперь мы сообщаем серверу Apache httpd, как делегировать запрос соответствующему серверу.
1
2
3
|
JkMount /department1 * department1 JkMount /department2 * department2 JkMount /department3 * department3 |
Вот:
- JkMount — укажите, если URL-адрес имеет шаблон / отдела1 *, тогда этот запрос делегировать в отдел1
- работник. этот рабочий IP-адрес и порт указаны в файле worker.properties.
Мы изменили файл / etc / hosts, как и в последнем сообщении, весь домен веб-сайта указывал на веб-сервер apache httpd.
Если мы перейдем по адресу http://www.ramki.com/department1/index.html, как сервер Apache httpd обрабатывает запрос
Его прекрасно называют правильным сервером Tomcat, и мы получили правильный ответ.
Но у нас есть 2 проблемы
1. Я не хочу, чтобы мой URL-адрес был таким http://www.ramki.com/department1/index.html
Я хочу, чтобы мой URL-адрес, как это http://www.ramki.com/index.html
Удалить отдела1 из моего URL. но строка Department1 очень важна в URL, потому что JkMount работает только на основе этой подходящей строки.
2. http://www.ramki.com/department1/index.html предназначен для первого кота, а у второго отдела есть домен http://www.krishnan.com, а затем для доступа ко второму коту мы используем URL: http: //www.krishnan .com / Department2 / index.html, но когда мы используем URL http://www.krishnan.com/department1/index.html, мы получаем доступ к первым данным tomcat
(то есть)
http://www.ramki.com/department1/index.html == http://www.krishnan.com/department1/index.html, поскольку оба эти URL-адреса имеют ключевое слово Department1 … поэтому JkMount работает на основе этих ключевых слов , В результате неверная интерпретация. Как решить эту проблему?
Виртуальный хост на сервере Apache httpd
Нам нужно добавить условный JkMount. например, домен ramki.com запрашивает пути whereare, такие как Department1, Department2, которые мы должны искать только в этом коте. не другое место. чтобы добавить это обусловлено мы добавляем записи виртуального хоста.
Добавить запись виртуального хоста в файл httpd.conf
01
02
03
04
05
06
07
08
09
10
11
12
|
Listen 80 NameVirtualHost *:80 <VirtualHost *:80> ServerName www.ramki.com JkMount /department1 * department1 < /VirtualHost > <VirtualHost *:80> ServerName www.krishnan.com JkMount /department2 * department1 < /VirtualHost > |
Вот
ServerName — доменное имя сервера
Если http://www.krishnan.com/department1/index.html URL сейчас такой. сервер соответствует имени сервера. здесь его соответствует 2-й записи виртуального хоста. Есть одна запись JkMount есть во втором виртуальном хосте. и там нет соответствующей строки Department1.
1
|
JkMount /department2 * department1 |
В результате откроется страница ошибки 404. Работает хорошо.
Теперь все работает нормально. Теперь мой URL http://www.ramki.com/department1/index.html здесь, я не хочу, чтобы путь отдела 1 в моем URL. Я хочу просто http://www.ramki.com/index.html тогда мы используем механизм mod_rewrite
01
02
03
04
05
06
07
08
09
10
|
Listen 80 NameVirtualHost *:80 <VirtualHost *:80> ServerName www.ramki.com RewriteEngine on RewriteLog logs /apache-mod_rewrite RewriteRule ^/(.*)$ /department1/ $1 [L,PT] JkMount /* <dept_name> < /VirtualHost > |
Вот:
- RewriteEngine on — включить модуль перезаписи
- RewriteRule ^ / (. *) $ / Department1 / $ 1 [L, PT] — здесь ^ / (. *) $ Соответствует любой строке, в которой записано значение $ 1, и измените URL-адрес на / отдела1 / $ 1.
т.е.
http://www.ramki.com/index.html здесь ^ / (. *) $ его совпадения index.html захватывает до $ 1 и заменяет на / отдела1 / $ 1 ==> /department1/index.html
Перезапись происходит перед передачей запроса Tomcat. поэтому мы прозрачно меняем URL для браузера. Теперь клиенту (браузеру) достаточно просто отправить http://www.ramki.com для доступа к Отделу 1 Tomcat.
Sreen Cast
Справка: виртуальный хост + сервер Apache httpd + коннектор Tomcat + mod_jk от нашего партнера по JCG Рамы Кришнана в блоге