【发布时间】:2013-11-16 16:02:58
【问题描述】:
所以,我知道这可能已经被问了很多,但我真的尽力了,但我无法解决这个问题。我已经尝试了两个多星期,并按照 Apache Tomcat 网站上的每个教程进行操作,但无济于事。
那么,我想要什么?我想将 Java 网络服务部署到我的服务器。我已经运行了 Apache httpd 和 tomcat。所以当我得到我的 web 服务后,我会构建并清理它,然后将 .war 文件复制到我的 tomcat tomcat_home\webapps 文件夹中。
我已经安装了 mod_jk 模块并将其加载到 Apache httpd(实际上是 apache2)中,然后我有了这些设置:
Apache 配置 (/etc/apache2/apache2.conf):
# Tomcat
LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
# jk_mod properties
JkWorkersFile /var/lib/tomcat7/conf/workers.properties
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel error
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# map requests to these folders to the tomcat worker
JkMount /webservices/* apacheworker
JkUnMount /*.html apacheworker
JkUnMount /*.jpg apacheworker
JkUnMount /*.gif apacheworker
这可能有效,因为 apache 服务重新启动时没有问题(当我还没有创建日志文件时,apache 不再启动)。
这是我的workers.properties 文件(/var/lib/tomcat7/conf/workers.properties):
# the list of workers
worker.list=apacheworker
# define the workers properties
worker.apacheworker.type=ajp13
worker.apacheworker.host=MYDOMAIN.COM
worker.apacheworker.port=8009
worker.apacheworker.lbfactor=1
worker.apacheworker.connection_pool_timeout=600
worker.apacheworker.socket_keepalive=1
如果我是对的,JkMount 指令是我的 apache 文件夹中的相对路径。我也尝试将其作为绝对路径,但这也不起作用。
所以我的/var/www/webservices 没有实际目录,但我确实有一个指向我的/var/lib/tomcat7/webapps 目录的符号链接(具有该确切路径)。这样,当我将.war-文件复制到我的webapps-目录中时,它会被tomcat(有效)自动压缩,并且应该可以从我的地址“MYDOMAIN.COM/webservices/MYNEWAPP”访问。
但是,它不起作用。有没有人可以启发我我到底做错了什么?现在,当我试图打开页面时,我得到的代码只是显示出来 - 所以它根本没有被处理。
提前致谢!
编辑所以我尝试了以下方法:
- 我已经在
workers.properties中放置了localhost而不是我自己的域 - 我放弃了
lbfactor
这就是我的workers.properties 文件现在的样子:
# the list of workers
worker.list=apacheworker
# define the workers properties
worker.apacheworker.type=ajp13
worker.apacheworker.host=localhost
worker.apacheworker.port=8009
worker.apacheworker.connection_pool_timeout=600
worker.apacheworker.socket_keepalive=1
此外,我还更改了我的/etc/apache2/apache2.conf(我不使用单独的mod_jk.conf),以阻止对我的 WEB-INF 目录的访问并删除不必要的映射:
# Tomcat
LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
# jk_mod properties
JkWorkersFile /var/lib/tomcat7/conf/workers.properties
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel error
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# map requests to these folders to the tomcat worker
JkMount /webservices/* apacheworker
<Location "/Hello_World/WEB-INF">
AllowOverride None
deny from all
</Location>
所有这些都没有帮助(也重新启动了 apache 和 tomcat 服务器)。我仍然可以从我的 .jsp 文件中看到源代码:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>
我想我失去你的地方:
"Notice that by default the URI for your war is the name of the war file, so that
myapp.war will be accessed by calling http://mydomain.com/myapp, not
http://mydomain.com/webservices/myapp. The /webservices/ mapping is relevant only if
you have a webservices.war file in the tomcat's webapps directory. "
所以,我的网络服务器 (apache httpd) 为我的 /var/www/ 目录中的所有内容提供服务。在那个目录中,我有一个名为webservices 的符号链接,它直接指向我的tomcat_home\webapps 文件夹。所以,打电话给ls -la 会给我这个:
lrwxrwxrwx 1 root root 24 Nov 16 16:48 webservices -> /var/lib/tomcat7/webapps
在那个webapps 文件夹中,我有我的实际.war 文件,包括Hello_World。
所以我不知道如何通过输入“http://mydomain.com/Hello_World”来访问这些文件 - 这只是给了我一个 404...
感谢您帮助我!
【问题讨论】:
-
您的链接导致 URI 不同。图像将被 apache 引用为 /webservices/myapp/img/a.jpg,而 tomcat 将引用为 /myapp/img/a.jpg
-
啊啊啊……该死的,我早该想到的。谢谢!但我必须同意 ProxyPass 容易得多,所以我现在就继续这样做。
-
你的 JkMount 路径不是 apache 路径而是 tomcat 路径。它应该这样定义:
JkMount /Hello_World apacheworker。您需要在 tomcat 上为每个 webapp 定义单独的 JkMounts。您可以使用 uriworkermap.properties 文件在一个文件中包含该虚拟主机的所有 JkMounts。
标签: web-services apache tomcat apache2 mod-jk