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

Как заставить работать Tomcat AJP-Connectors?

Я хочу получить доступ к Tomcat через веб-сервер Apache с помощью соединителей. Я придерживался документации: http://tomcat.apache.org/connectors-doc/generic_howto/quick.html Я только немного изменил его, чтобы он соответствовал структуре каталогов, используемой в моей Debian- (Squeeze) -System.

Поэтому я добавил в /etc/apache2/httpd.conf следующее:

# Load mod_jk module
# Update this path to match your modules location
#LoadModule    jk_module  libexec/mod_jk.so
# Declare the module for <IfModule directive> (remove this line on Apache 2.x)
#AddModule     mod_jk.c
# Where to find workers.properties
# Update this path to match your conf directory location (put workers.properties next to httpd.conf)
JkWorkersFile /etc/apache2/workers.properties
# Where to put jk shared memory
# Update this path to match your local state directory or logs directory
JkShmFile     /var/log/apache2/mod_jk.shm
# Where to put jk logs
# Update this path to match your logs directory location (put mod_jk.log next to access_log)
JkLogFile     /var/log/apache2/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel    info
# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# Send everything for context /examples to worker named worker1 (ajp13)
JkMount  /tomcat7/* worker1

Я закомментировал загрузку модуля, потому что это уже происходит после того, как я установил mod_jk через систему пакетов (libapache2-mod-jk).

Мои worker.properties выглядят так:

# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009

Tomcat 7 устанавливается прямо из архива Apache, потому что это не пакет в Squeeze. Tomcat 7 работает и доступен через собственный порт (8180, чтобы не конфликтовать с tomcat6 из системы пакетов). Насколько я понимаю, теперь я должен увидеть сайт tomcat с http: // хост / tomcat7 /. Но вместо этого я получаю 404. Что случилось?


После того, как Quanta намекнула, что нужно установить уровень журнала для отладки (спасибо), я сделал это и нашел следующее сообщение об ошибке в mod_jk.log: 'jk_map_to_storage :: mod_jk.c (3585): отсутствует карта uri для 176.9.9.55:/tomcat7 / '. Я погуглил и нашел http://old.nabble.com/mod_jk%2C-missing-uri-map-td23984359.html

Таким образом, параметры, установленные в httpd.conf, не использовались в VirtualHosts. Я добавил «JkMountCopy On» в свой VirtualHost - и сначала получил Tomcat 404 (вместо httpd 404). Проблема здесь в том, что он пытается получить доступ к тому же самому установленному URI, поэтому в моем случае / tomcat7. Вместо этого я использовал имя веб-приложения как mount, и у меня все в порядке.

Удостоверься что:

  1. вы вводите косую черту в конце http: // хост / tomcat7/не http: // хост / tomcat7.
  2. у вас есть разъем AJP 1.3 для прослушивания порта 8009 в server.xml:

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    

Если по-прежнему не работает, я предлагаю вам включить отладку и взглянуть на mod_jk.log.


РЕДАКТИРОВАТЬ:

Если вы используете:

JkMount  /tomcat7/* worker1

и доступ через http: // хост / tomcat7, Я уверен, что вы получите ошибку Apache 404.

Вы можете указать JkMount в разделе виртуального хоста, который вы хотите:

<VirtualHost *:80>
    ServerName  xx
    ServerAdmin xx

    JkMount /tomcat7 worker1
    JkMount /tomcat7/* worker1
</VirtualHost>

У меня такая же проблема. Решение - изменить JkMount /tomcat7* worker1 к JkMount /your-servlet-app* worker1. Вы можете иметь столько JkMount как ты хочешь.

Например, после добавления JkMount /manager* worker1, вы сможете получить доступ http://host/manager/html

Я понял эту проблему после того, как попробовал и AJP, и http. У меня был следующий журнал доступа в моем /var/log/tomcat7/localhost_access_log.txt

10.215.22.132 - - [04/Mar/2016:13:14:39 +0800] "GET /tomcat-demo/manager/ HTTP/1.1" 404 1009
10.215.22.132 - - [04/Mar/2016:13:26:05 +0800] "GET /tomcat-demo/manager/http/ HTTP/1.1" 404 1019
10.215.22.132 - - [04/Mar/2016:13:40:33 +0800] "GET /manager/ HTTP/1.1" 302 -
10.215.22.132 - - [04/Mar/2016:13:40:33 +0800] "GET /manager/html?org.apache.catalina.filters.CSRF_NONCE=E68B5F7E6E96D09C75A8D6854ECE9092 HTTP/1.1" 401 2474
10.215.22.132 - yz [04/Mar/2016:13:40:35 +0800] "GET /manager/html?org.apache.catalina.filters.CSRF_NONCE=E68B5F7E6E96D09C75A8D6854ECE9092 HTTP/1.1" 200 12405

Первые две строки журнала были созданы, когда я использую AJP. Последние три были созданы, когда я использую http для прямого доступа к tomcat. Таким образом, apache передает весь URL-адрес в tomcat вместо удаления префикса jkmount.

Вместо этого используйте mod_proxy_ajp или mod_proxy_http, если вы можете: http://httpd.apache.org/docs/2.2/mod/mod_proxy_ajp.html http://httpd.apache.org/docs/2.2/mod/mod_proxy_http.html