gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:03:01 29 4
gpt4 key购买 nike

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

那么,我想要什么?我想将 Java Web 服务部署到我的服务器。我已经运行了 Apache httpd 和 tomcat。因此,当我获得我的网络服务时,我会构建并清理它,然后将 .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/的符号链接(symbolic link)(具有确切的路径) lib/tomcat7/webapps 目录。这样,当我将一个 .war 文件复制到我的 webapps 目录时,它会被 tomcat 自动压缩(有效)并且应该可以从我的地址访问它“MYDOMAIN.COM/webservices/MYNEWAPP”。

但是,它不起作用。有没有人可以启发我我做错了什么?现在,当我尝试打开页面时,我得到的代码只是出现了 - 所以它根本没有被处理。

提前致谢!


EDIT 所以我尝试了以下操作:

  • 我已经在 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 的符号链接(symbolic link),它直接指向我的 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...

谢谢你帮助我!

最佳答案

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

  • 根据您的问题,我假设 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:

    AllowOverride 无

    全部拒绝

    </Location>

  • 没有真正需要做这个映射,你可以让 tomcat 也为静态文件提供服务。如果您想节省负载,最好还是使用内容分发网络 (CDN)。 Amazon CloudFront 是一个廉价的替代品。

我还会考虑用 mod_proxy 或 mod_proxy_ajp 替换 mod_jk。我已经成功地将第一个用于多个应用程序。这样配置就简单多了:

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

关于web-services - 使用 mod_jk 将请求从 apache 映射到 tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20020535/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com