У меня проблема с настройкой Apache и Tomcat. Моя цель - получить возможность обращаться к tui.org/servlet, когда tui.org - мой виртуальный хост, настроенный на локальном компьютере, а /servlet/ - это url-pattern, который определен в web.xml. Но вместо сервлета я получаю 404 Not Found by Tomcat, но я могу обратиться к моему серверу с помощью tui.org/tui.org/servlet - он работает. Структура файлов на моем сервере следующая:
Root: /var/www/tui.org
-------->/WEB-INF/classes/a
-------->/WEB-INF/classes/a/MainServlet.class
-------->/WEB-INF/web.xml
-------->/index.html
Как я могу добиться такого поведения?
web.xml:
<servlet-mapping>
<servlet-name>mainServlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
Мой server.xml:
<?xml version = "1.0" encoding = "UTF-8"?>
<Server port = "8005" shutdown = "SHUTDOWN">
<Listener className = "org.apache.catalina.startup.VersionLoggerListener" />
<Listener className = "org.apache.catalina.core.AprLifecycleListener" SSLEngine = "on" />
<Listener className = "org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className = "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className = "org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name = "UserDatabase" auth = "Container"
type = "org.apache.catalina.UserDatabase"
description = "User database that can be updated and saved"
factory = "org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname = "conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name = "Catalina">
<Connector port = "8080" protocol = "HTTP/1.1"
connectionTimeout = "20000"
redirectPort = "8443" />
<Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" />
<Engine name = "Catalina" defaultHost = "localhost">
<Realm className = "org.apache.catalina.realm.LockOutRealm">
<Realm className = "org.apache.catalina.realm.UserDatabaseRealm"
resourceName = "UserDatabase"/>
</Realm>
<Host name = "localhost" appBase = "/var/www/"
unpackWARs = "true" autoDeploy = "true">
<Valve className = "org.apache.catalina.valves.AccessLogValve" directory = "logs"
prefix = "localhost_access_log" suffix = ".txt"
pattern = "%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
Конфигурация tui.org (tui.org.conf в / etc / apache2 / sites-available:
<VirtualHost *:80>
ServerName tui.org
DocumentRoot /var/www/tui.org
<Directory /var/www/tui.org>
AllowOverride All
Require all granted
</Directory>
JkMount /servlet* ajp13_worker
</VirtualHost>
Я использую Apache2, tomcat9 и Ubuntu 18.04.
Заранее спасибо!
P.S. Извините за мой английский.




Здесь есть несколько проблем:
DocumentRoot /var/www/tui.org для Apache и <Host appBase = "/var/www/"> для Tomcat.
HostappBase, всегда развертывается под этим именем (если иное не указано в файле context.xml). Единственным другим исключением из этого правила является каталог с именем ROOT - в этом случае он развертывается без имени, таким образом опуская tui.org, который следует за именем вашего сервера.
Один из способов решить вашу самую большую проблему - опустить директиву DocumentRoot в Apache и использовать все из Tomcat: JkMount * ajp13_worker.
Для решения проблемы с обращением по tui.org/servlet мне пришлось добавить в <Context> директиву server.xml:
<Context path = "" docBase = "/var/www/tui.org/"/>
и замените appBase с /var/www/ на /var/www/tui.org/.
А для решения проблемы с доступом к WEB-INF (спасибо @OlafKock) мне пришлось добавить рядом с tui.org.conf:
<Directory /var/www/tui.org>
AllowOverride All
Deny from all
</Directory>
Но я хочу обрабатывать статические файлы (например, html / css / gif / etc) с помощью apache и servlets / jsp с помощью tomcat. Он (
JkMount * ajp13_worker) не позволяет этого делать. Apache может запретить всем доступ дляWEB-INF.webapps- ошибка - я вставил старые файлы конфигурации. Вопрос решили. Сейчас отправляю ответ.