我想使用连接器通过 Apache-webserver 访问 Tomcat。我遵循文档:http://tomcat.apache.org/connectors-doc/generic_howto/quick.html 我只是对它做了一些修改,以匹配我的 Debian-(Squeeze)系统上使用的目录结构。
因此我将以下内容添加到 /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
我注释掉了模块的加载,因为在通过包系统(libapache2-mod-jk)安装 mod_jk 之后,这已经发生了。
我的workers.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 发生冲突)访问。据我所知,我现在应该可以看到带有http://主机/tomcat7/。但我得到的却是 404。出了什么问题?
在 quanta 提示将日志级别设置为调试(谢谢)后,我照做了,并在 mod_jk.log 中发现了以下错误消息:“jk_map_to_storage::mod_jk.c (3585): missing uri map for 176.9.9.55:/tomcat7/”。我在 google 上搜索后发现http://old.nabble.com/mod_jk-missing-uri-map-td23984359.html
因此,httpd.conf 中设置的选项未在 VirtualHosts 中使用。我向 VirtualHost 添加了“JkMountCopy On” - 并首先获得 Tomcat 404(而不是 httpd 404)。问题在于,他试图访问完全相同的挂载 URI,因此在我的情况下是 /tomcat7。我改用 webapp 的名称作为挂载,对我来说一切都很好。
答案1
确保:
- 你输入了一个斜杠http://主机/tomcat7/, 不是 http://主机/tomcat7。
您有一个 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>
答案2
我也遇到了同样的问题。解决方法是改为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 前缀。
答案3
如果可以,请使用 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