Я хотел бы запустить Apache и Tomcat на сервере RHEL 5, где Apache будет обрабатывать приложения Ruby on Rails (через mod_rails/Passenger), а Tomcat — приложения Java.
Под Apache каждое приложение Rails будет иметь URL и vhost. URL уже настроены на нашем DNS-сервере, чтобы указывать на машину.
В Tomcat каждое Java-приложение имеет URL-адрес следующего вида: ourserver.ourcompany.com/app1
, ourserver.ourcompany.com/app2
, и т. д.
Сервер уже запущен и работает с Tomcat 6, работающим на порту 80 и обслуживающим несколько приложений Java. Я хочу добавить Apache и перенастроить. Я знаком с тем, как настроить единственный сервер Apache для размещения приложений RoR с помощью Passenger. Я просто не знаю, как заставить Apache и Tomcat работать вместе таким образом.
Я нашел различные ресурсы и обсуждения с помощью Google (например,Вот этот) но они, как правило, немного схематичны и неполны или не совсем соответствуют тому, что я пытаюсь сделать. Тот, на который я дал ссылку, кажется, для случая, если вы хотите отправлять все запросы в Tomcat, а не только определенные, и Apache должен обрабатывать остальные.
Может ли кто-нибудь предложить пример конфигурации для server.xml
и httpd.conf
или указать мне на какие-то более подробные ресурсы?
решение1
Вам не нужно вносить никаких изменений в , server.xml
за исключением того, чтобы вернуть Tomcat к портам по умолчанию, чтобы Apache мог обрабатывать порт 80. Основная часть работы будет выполняться через файлы конфигурации Apache. Я обычно оставляю их вне httpd.conf
и вместо этого вставляю их в более мелкие фрагменты конфигурации в <ServerRoot>/conf.d/
подкаталоге.
Учитывая ваш пример ourserver.ourcompany.com/app1
&, ourserver.ourcompany.com/app2
я бы предположил конфигурацию примерно следующего вида:
<VirtualHost *:80>
ServerName ourserver.ourcompany.com
ErrorLog ...
CustomLog ...
[other VHost configurations]
ProxyPass /app1 ajp://tomcat_hostname:8009/app1
ProxyPassReverse /app1 ajp://tomcat_hostname:8009/app1
ProxyPass /app2 ajp://tomcat_hostname:8009/app2
ProxyPassReverse /app2 ajp://tomcat_hostname:8009/app2
</VirtualHost>
Если у вас есть несколько серверов Tomcat, объединенных в кластер, то вам, возможно, стоит рассмотреть настройку mod_balancer и перемещение его ajp://
вmod_balancer BalancerMember
и замените balancer://
URL-адресом, который ссылается на конфигурацию балансировщика.
решение2
Лично мне mod_proxy_ajp не нравится; при запуске Tomcat под Apache я сразу перехожу к установке mod_jk (модуль от Tomcat coders) для обеспечения соединения AJP. Вы можете настроить mod_jk 5 способами в Sunday для производительности ваших приложений (потоки, тайм-ауты, стуки и т. д.).
- Убедитесь, что httpd-devel установлен
- Распакуйте настоящий JDK в какой-нибудь каталог, например /usr/local/jdk1.6.0_18/
возьмите исходный код "tomcat-connectors" с tomcat.apache.org и скомпилируйте его
cd tomcat-connectors-1.2.28-src/native
./configure --with-apxs=/usr/sbin/apxs --with-java=/usr/local/jdk1.6.0_18 --enable-prefork
делать
cp apache-2.0/mod_jk.so /usr/local/lib/
Теперь вам нужно подключить его к конфигурации Apache в общем смысле, а затем к каждому виртуальному хосту по мере необходимости. В общей конфигурации вы добавляете что-то вроде:
LoadModule jk_module /usr/local/lib/mod_jk.so
JkWorkersFile /usr/local/tomcat/conf/workers.properties
JkShmFile /var/log/httpd/mod_jk.shm
JkLogFile /var/log/httpd/mod_jk.log
JkLogLevel error
Вам нужно будет создать базовый файл worker.properties, вот документация:http://tomcat.apache.org/connectors-doc/reference/workers.htmlСамый простой вариант может выглядеть так:
workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/local/jdk1.6.0_18
ps=/
worker.list=ajp13
worker.maintain=60
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=ajp13
Это будет использовать конфигурацию порта 8009 по умолчанию из server.xml - здесь есть миллион ручек, которые вы можете крутить здесь для бесконечной настройки производительности. Затем в каждом виртуальном хосте вы "монтируете" нужные вам приложения:
<VirtualHost *:80>
ServerName foo.bar.com
...other options ...
JkMount /app1/* ajp13
<Location "/app1/WEB-INF/">
deny from all
</Location>
JkMount /app2/* ajp13
<Location "/app2/WEB-INF/">
deny from all
</Location>
</VirtualHost>
Как вы видите внизу, не забудьте немного о безопасности и запретите любой доступ к папке WEB-INF — большинство веб-приложений имеют свой DSN базы данных с паролем web.xml при развертывании в качестве варбола.