我有一个设置,其中我的 Tomcat 实例前面是带有 mod-proxy 的 Apache 服务器。我需要在反向代理端提供静态内容,以防身份验证关闭我的应用程序会话(重型 ajax 应用程序)。
这个想法是浏览器正在请求一些静态内容,例如:
http://myreverseproxy.com/app/sc/skins/Enterprise/images/SectionHeader/opener_closed.png
Run Code Online (Sandbox Code Playgroud)
Apache 将请求转发给将提供图像的 Tomcat。我需要它由 Apache 提供服务,这可能吗?
谢谢!
我的团队编写了一个内部 BI 服务器,它在/users/daily或等链接处生成 HTML 报告/updates/questions。
服务器是用Grails编写的,它与经典的 Apache-Tomcat 设置完美配合:
ProxyPass / http://localhost:8080/ nocanon
ProxyPassReverse / http://localhost:8080/
Run Code Online (Sandbox Code Playgroud)

所以
https://example.com/users/daily
Run Code Online (Sandbox Code Playgroud)
在内部代理到
http://localhost:8080/users/daily
Run Code Online (Sandbox Code Playgroud)
并由 Tomcat servlet 提供服务。
服务器成功,我想将它部署三次,到 3 个不同的系统,由 URL 后缀 ( /dev, /stg, /prod)区分:

这意味着https://example.com/dev/users/daily将从 代理http://localhost:8080/users/daily,并将https://example.com/prod/users/daily从http://localhost:8082/users/daily.
我尝试了一些 ApacheRewriteRule和ProxyPass规则,但找不到有效的组合。
如何在具有工作内部链接的 Apache 中进行基于后缀的内部路由?
我正在尝试在 Tomcat 8.0 http://tomcat.apache.org/tomcat-8.0-doc/rewrite.html 中使用 RewriteValve
在 $CATALINA_HOME/conf/server.xml 中,我添加了
<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
Run Code Online (Sandbox Code Playgroud)
就在 Host 标签下方
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
Run Code Online (Sandbox Code Playgroud)
rewrite.config在$CATALINA_HOME/conf目录中创建了一个如下
RewriteRule ^/abc /myapp
Run Code Online (Sandbox Code Playgroud)
http:/host:port/myapp一个工作的 web 应用程序在哪里。
所以现在当我去http://host:port/abc我希望被重定向到http://host:port/myapp但我得到一个 404the requested resource is not available代替。
它看起来甚至没有读取我的 rewrite.config 文件。日志目录中的访问日志只报告了"GET /abc HTTP/1.1" 404 1000没有更多详细信息。
我错过了什么?谢谢
是否可以mod_proxy在带有 http2 协议的 Apache Tomcat 8.5 前面使用?如果是,很高兴看到示例配置。
编辑
具体做法是:是否可能,建议使用http2的客户端和服务器之间(Apache httpd),并继续与数据流ajp之间Apache httpd和Apache Tomcat?
编辑 2
此答案提供了有关该主题的一些详细信息:
不幸的是,Tomcat 对 authbind 的使用没有记录,这使得在不以 root 身份运行时将 Tomcat 9 绑定到端口 80 是一个挑战。我在 Ubuntu 16.04 上尝试了以下操作:
1) 在 server.xml 中,将 <Connector> 中的属性端口更改为 80。
2)安装authbind。
3) 将 AUTHBIND=yes 添加到 setenv.sh
4) 创建文件 /etc/authbind/byport/80 具有 777 权限和所有者 tomcat。
如果我startup.sh以 root 身份运行,它工作正常。但是,如果我以非特权用户“tomcat”的身份执行此操作,脚本将显示“Tomcat 已启动”且没有错误消息。但是浏览器显示“无法连接”。
如果我运行authbind startup.sh,结果是一样的。启动脚本中缺少错误消息使我对问题的原因一无所知。
可能的相关信息:tomcat 是从 zip 文件安装的,而不是从 repo 安装的。
关于使这项工作起作用的技巧,我还有什么其他的事情吗?这在官方文档中严重缺失。
带有 ubuntu 18.04 的 tomcat 9。tomcat服务状态:
? tomcat.service - Tomcat 9 servlet container
Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: enabled)
Active: failed (Result: signal) since Thu 2020-03-26 03:00:31 UTC; 3h 33min ago
Process: 8815 ExecStop=/opt/tomcat/latest/bin/shutdown.sh (code=exited, status=0/SUCCESS)
Process: 8858 ExecStart=/opt/tomcat/latest/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 8865 (code=killed, signal=KILL)
Run Code Online (Sandbox Code Playgroud)
catalina.out 什么也没说。系统日志说
Mar 26 03:00:31 user systemd[1]: tomcat.service: Main process exited, code=killed, status=9/KILL
Mar 26 03:00:31 user systemd[1]: tomcat.service: Failed with result 'signal'.
Mar 26 03:17:08 user systemd[1]: Reloading The Apache HTTP Server. …Run Code Online (Sandbox Code Playgroud) 我想使用 cmdlet 在 CentOS 上启动 Tomcat 服务:
systemctl start tomcat.service
Run Code Online (Sandbox Code Playgroud)
但我得到了错误
无法启动 Apache ExecStart=/opt/tomcat/bin/startup.sh(代码=退出,状态=203/EXEC)。
和通过命令的日志:
Journalctl -xe
Run Code Online (Sandbox Code Playgroud)
正在说明
Selinux 阻止 (artup.sh) 对文件 startup.sh 执行访问
鉴于我可以在 CentOS 上启动任何其他服务,我的 tomcat 服务可能有什么问题?
谢谢
我有mod_proxy将请求传递给 Tomcat 的Apache 。问题是,当我在 Tomcat 上托管的 Web 应用程序中获取与请求关联的客户端 IP 地址时,它总是返回 127.0.0.1。
是否可以让 Apache 将原始 IP 地址传递给 Tomcat?
我们正在开发一个在 tomcat 下运行的 web 应用程序,它依赖于 Java 用户首选项来存储所有类型的设置。这很好用,但我们遇到了问题,我们需要设置另一个临时网络应用程序,它允许您在设置它们之前测试设置。
问题的核心在于,由于所有 Web 应用程序都在 tomcat 用户(可配置)下运行,因此所有 Web 应用程序的 Java 用户首选项都相同。由于遗留原因,我目前无法更改我的首选项结构,所以我希望在 tomcat 配置方面有一个解决方案。
是否可以在 tomcat 中为特定的 Web 应用程序指定不同的用户凭据?
谢谢,波阿斯
我一直在学习 Puppet(就像过去 24 小时一样)并提出了以下模块来安装 Tomcat。它工作得很好,但我不禁觉得这不是执行此操作的最佳方法 - 特别是在name[1-4]零件和步骤/依赖项周围。如果“傀儡大师”:) 能看看我在做什么并提出改进建议,我将不胜感激。
class tomcat {
####
# Tomcat
# Variables
$tomcatVersionedDir="/usr/local/apache-tomcat-6.0.29"
$tomcatDir="/usr/local/tomcat"
$tomcatBinDir="${tomcatDir}/bin"
$tomcatDaemonSrcDir="${tomcatBinDir}/commons-daemon-1.0.2-native-src"
# 1) Get the package
file { "/root/tomcat6.tgz":
ensure => "file",
source => "puppet://puppet/tomcat/tomcat6.tgz",
}
# 2) Untar the package
define tomcat_expand() {
exec { "/bin/tar xzf /root/tomcat6.tgz":
cwd => "/usr/local",
creates => $tomcatVersionedDir,
}
}
tomcat_expand { name1:
require => File["/root/tomcat6.tgz"],
}
# 3) Create the symlink
file { "${tomcatDir}":
ensure => $tomcatVersionedDir,
require => …Run Code Online (Sandbox Code Playgroud) tomcat ×10
apache-2.2 ×3
mod-proxy ×3
apache-2.4 ×1
centos ×1
centos7 ×1
http2 ×1
proxy ×1
puppet ×1
redirect ×1
service ×1
tomcat6 ×1
ubuntu-18.04 ×1
users ×1