【发布时间】:2021-05-10 13:15:43
【问题描述】:
我正在 kubernetes 集群上测试我们的应用程序。所以我们有 Nginx 控制器来处理 SSL 终止并将 HTTP 流量传递到 Apache 服务器。 Apache服务器处理静态内容,转发所有与tomcat相关的JSP。
由于某种原因,webapp 在进行 SSL 终止时在第一次尝试时不起作用(虽然网站工作正常),但如果我重新加载页面并尝试再次使用该应用程序,那么在第二次尝试期间一切正常(意味着它不会在第一次尝试时加载某些自动功能,并且可以通过清除缓存并登录来重现)。
我与开发人员交谈,他们提到这可能是 cookie 问题。
当前设置不工作:
Nginx controller (SSL termination) -> Apache (HTTP port 80 ) -> Tomcat (HTTP port 8080).
正常工作的设置:
Nginx controller (SSL passthrough) -> Apache (HTTPS port 443) -> Tomcat (HTTPS port 8080).
我无法在两者之间摆脱 Apache,应用程序确实需要它。
需要哪些设置才能完成这项工作?我已经厌倦了以下内容:
- 在 apache 上禁用端口 443
- 禁用 8443 端口并将所有重定向到端口 8443 并仅侦听 8080
- 修改 web.xml 以在 tomcat 服务器上将
http-only设置为 true 并将安全位设置为 true。
<session-config> <session-timeout>60</session-timeout> <cookie-config> <http-only>true</http-only> <secure>true</secure> </cookie-config> </session-config>
还有什么需要做的吗?我花了一天的时间试图解决这个问题,但还没有弄清楚。
Server.xml 只包含这些启用的行,其余的被注释掉或默认:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" />
<Connector port="8009" maxThreads="2000"
enableLookups="false" redirectPort="80" protocol="AJP/1.3"/>
<Engine name="Catalina" defaultHost="localhost" jvmRoute="server001">
# Removed cluster config since they're all default
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/usr/local/tomcat/webapps/ROOT.war" debug="0" distributable="true">
</Context>
http.conf - 因为 SSL 被禁用,所以只有默认值。所以没有虚拟主机。唯一添加到 http.conf 的是
JkMount /* ajp13
Worker.properties 如下。
# - An ajp13 worker that connects to localhost:8009
worker.list=ajp13
#------ DEFAULT ajp13 WORKER DEFINITION ------------------------------
# Defining a worker named ajp13 and of type ajp13
worker.ajp13.port=8009
worker.ajp13.host=$(TOMCAT_SERVER)
worker.ajp13.type=ajp13
worker.ajp13.reply_timeout=15000
worker.ajp13.lbfactor=1
#worker.ajp13.cachesize
worker.loadbalancer.balanced_workers=ajp13
webapp 需要通过 websocket 与 Java TCP 服务器通信,所以我们有一个用 nodejs 编写的 webSocket 服务器。它只是将流量从 websocket 转发到 Java 服务器 TCP 连接。
但它有自己的 SSL 证书设置。由于默认情况下 GCP 上的 Nginx 控制器不处理 TCP 服务的 ssl 终止,因此我已将 NodeJS 后端服务配置为直接在端口 1234 上接受 SSL 流量。该服务在 tomcat 服务器上运行。不知道这是否会造成冲突,因为它们都连接到同一个域名。
【问题讨论】:
-
就像在您的previous question 中一样,如果没有部分配置文件,就很难猜出哪里出了问题。请edit您的问题并添加您的
server.xml。来自 Apache2 的<VirtualServer>和来自 NGINX 的server块也可能有用。如果在连接时有Set-Cookie:标头,还要检查curl -i。 -
您好,您的评论解决了上一个问题。我想向您更新详细信息。但基本上我将 nginx 控制器 cookie 设置为 JSESSION,这与 tomcat 的 JSESSION 冲突。我不得不使用 nginx 控制器禁用 cookie 设置。这解决了会话问题,但这是一个不同的问题
-
我将更新该问题的答案,然后根据要求在此处添加必要的配置
-
更新了细节。如果您还需要什么,请告诉我
-
也许您的 浏览器 中有一些陈旧的 cookie。如果您打开浏览器,清除 cookie 并加载应用程序,第一次尝试是否有效?