19.03.2010
Иванов Аркадий
Связка Apache HTTPD + Tomcat значительно расширяет возможности и того и другого приложения. Для статических документов Apache существенно оптимальнее и мучить для этого Tomcat необязательно. Гибкие защиты Apache (.htaccess), поддержка других скриптовых языков ( cgi, perl, php... ) иногда требуются и тут уже одним Tomcat-ом не отделаешься. Также модуль Apache позволяет избавиться от порта в запросе к адресу сервера Tomcat , что делает доступ к серверу приложений гораздо стандартнее для непродвинутого юзера, да и не все провайдеры нынче пропускают в сеть http-запросы к портам, которые отличаются от стандартного 80-го.
Для того чтобы сделать связку Apache и Tomcat я обычно использую модуль mod_jk. Он обычно идёт в составе Apache.
Предположим, что у меня есть Tomcat на порту 8480 и корень его расположен в каталоге /mytomcat.
На стороне Apache надо сделать следующее:
- Установить в неё модуль mod_jk.
- В /etc/httd2/conf/workers.properties прописать:
workers.tomcat_home=/mytomcat
workers.java_home=/usr/local/jdk
ps=/
worker.list=myapp
worker.myapp.type=ajp13
worker.myapp.host=localhost
worker.myapp.port=8409
worker.myapp.lbfactor=1
- В описании виртуального хоста надо загрузить модуль mod_jk и описать хост:
LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile /etc/httpd2/conf/workers.properties
# Where to put jk logs
JkLogFile /var/log/httpd2/mod_jk_log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
#JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkOptions +ForwardKeySize +ForwardURICompat
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
<VirtualHost *:80>
ServerName mytomcat.ikir.ru
ServerAlias mytomcat.ikir.ru
DocumentRoot "/mytomcat/webapps/myapp"
JkMount /* mytomcat
</VirtualHost>
На стороне Tomcat в /mytomcat/conf/server.xml разрешить AJP коннектор:
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8409" emptySessionPath="true" enableLookups="false" protocol="AJP/1.3" redirectPort="8843" />
Ну вообщем-то и всё... Не забудьте перезапустить Tomcat и Apache. :)
Теперь можете обратиться к приложению так:
http://mytomcat.ikir.ru/myapp
Если хочется избавиться от myapp в строке запроса, то:
Следует добавить в конфигурацию Apache mod_rewrite и добавить правила перезаписи URL:
<VirtualHost *:80>
ServerName mytomcat.ikir.ru
ServerAlias mytomcat.ikir.ru
DocumentRoot "/mytomcat/webapps/myapp"
JkMount /* mytomcat
RewriteEngine on
RewriteRule /(.*)$ /myapp/%{REQUEST_URI} [PT]
</VirtualHost>
Доступ по HTTPS через Apache:
Если использовать SSL от Apache, то нет надобности конфигурировать SSL-порт на Tomcat. Apache всё и так сделает.
Не следует забывать, что данные хоста SSL-сертификата должны совпадать с именем хоста, где работает Apache.
Всё, что ранее написано для workers.properties не меняется.
Все строки, что были написаны для виртуального хоста, остаются.
Настройки server.xml Tomcat-а не меняются.
В результате в описании виртуального хоста с поддержкой SSL будет следующее:
Listen 443
<VirtualHost mytomcat.ikir.ru:443>
ServerName mytomcat.ikir.ru:443
ErrorLog "/var/log/httpd2/error_log"
TransferLog "/var/log/httpd2/access_log"
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/etc/httpd2/conf/ssl.crt/server.crt"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
CustomLog "/var/log/httpd2/ssl_request_log" "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
DocumentRoot "/mytomcat/webapps/myapp"
JkMount /* mytomcat
RewriteEngine on
RewriteRule /(.*)$ /myapp/%{REQUEST_URI} [PT]
</VirtualHost>