使用mod_jk将请求从apache映射到tomcat

时间:2013-11-16 16:02:59

标签: web-services apache tomcat apache2 mod-jk

所以,我知道这可能已经被问了很多,但我真的尽力而为,我无法解决这个问题。我已经尝试了两个多星期,并且关注了Apache Tomcat网站上的每一个教程都无济于事。

那么,我想要什么?我想将Java webservices部署到我的服务器。我已经运行了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访问它”

然而,它不起作用。有没有人可以在我做错的事情上启发我?现在,在尝试打开页面时,我只是显示了代码 - 所以它根本没有被处理。

提前致谢!


编辑 所以我尝试了以下内容:

  • 我已经在localhost
  • 中放置了workers.properties而不是我自己的域名
  • 我放弃了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 ......

感谢您帮助我!

1 个答案:

答案 0 :(得分:0)

好的,您的配置有几个问题:

  • 根据您的问题,我假设tomcat和apache位于同一台服务器上。因此,最好有worker.apacheworker.host=localhost。我认为因为那个
  • 而没有到达tomcat
  • 除非您使用apache对多个tomcat服务器进行负载均衡,否则请删除lbfactor。
  • 请注意,默认情况下,war的URI是war文件的名称,因此可以通过调用http://mydomain.com/myapp来访问myapp.war,而不是http://mydomain.com/webservices/myapp。仅当tomcat的webapps目录中有webservices.war文件时,/webservices/映射才有意义。映射也应该是/webservices/*
  • 出于安全原因,您应该阻止访问WEB-INF目录。将以下内容添加到mod_jk.conf:

    &lt;Location "/myapp/WEB-INF/">

    AllowOverride None

    deny from all

    &lt;/Location>

  • 没有必要进行这种映射,你也可以让tomcat服务于静态文件。如果您想保存负载,最好还是使用内容分发网络(CDN)。 Amazon CloudFront是一种廉价的替代方案。

我还会考虑用mod_proxy或mod_proxy_ajp替换mod_jk。我已成功使用第一个应用程序。配置更加简单:

ProxyPass /myapp http://localhost:8080/myapp
ProxyPassReverse /myapp http://localhost:8080/myapp