Apache + Tomcat

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 надо сделать следующее:

  1. Установить в неё модуль mod_jk.
  2. В /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

     
  3. В описании виртуального хоста надо загрузить модуль 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>