【问题标题】:How to route traffic from Nginx ingress to an application Tomcat server如何将流量从 Nginx 入口路由到应用程序 Tomcat 服务器
【发布时间】:2020-01-08 12:53:49
【问题描述】:

我有一个带有 (kubernetes) Nginx Ingress 控制器的 Kubernetes 集群,该控制器具有以下入口规则:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-rules
#  namespace: default

### Virtual hosts ###
spec:

  rules:

  - host: dashboard.example.com
    http:
      paths:
        - path: /
          backend:
            serviceName: test
            servicePort: 443

test 应用程序由 Tomcat 服务器提供服务。

Tomcat 的server.xml 是:

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
        URIEncoding="UTF-8"
               redirectPort="443" />

    <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
        sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation"
        scheme="https" secure="true" URIEncoding="UTF-8"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/odvsdva.p12"
        certificateKeystorePassword="sdvsdvsdvsd"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>

    <Connector port="8009" protocol="AJP/1.3" redirectPort="443" />

    <Engine name="Catalina" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>

    </Engine>
  </Service>
</Server>

当我在浏览器dashboard.example.com 中打开Ingress 中的路径为/ 时,我得到了Tomcat 标准状态页面(如果你看到这个,你已经成功安装了Tomcat。恭喜!) .

现在,如果我转到dasboard.example.com/test,我可以打开我的应用程序。

但是,我想通过导航到 dashboard.example.com/ 打开应用程序。

所以,我尝试将Ingress 中的路径从/ 更改为/test。但后来我在浏览器中得到This site can’t be reached

我没有设置 Tomcat,我对此知之甚少。我希望我在上面提供了足够的详细信息。

编辑

我的 k8s 集群位于一个 Ubuntu vagrant VM 中。

root@vagrant:/home/vagrant# kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.4", GitCommit:"67d2fcf276fcd9cf743ad4be9a9ef5828adc082f", GitTreeState:"clean", BuildDate:"2019-09-18T14:51:13Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.7", GitCommit:"6c143d35bb11d74970e7bc0b6c45b6bfdffc0bd4", GitTreeState:"clean", BuildDate:"2019-12-11T12:34:17Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}

【问题讨论】:

  • 你能提供一些关于你的环境的信息吗? Kubernetes 版本,On-Prem 还是本地?

标签: tomcat nginx kubernetes


【解决方案1】:

将 Ingress 中的路径保留为 /

在部署之前从 tomcat 中删除开箱即用的 ROOT/ 目录并将您的 war 文件重命名为 ROOT.war

【讨论】:

    【解决方案2】:

    我相信您正在寻找的是nginx.ingress.kubernetes.io/rewrite-target,但为了插入一个路径组件,而不是像他们的示例中那样删除它:

    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /test$1
    spec:
      rules:    
      - host: dashboard.example.com
        http:
          paths:
            - path: '(/.*)'
    

    【讨论】:

    • 我收到此错误:Ingress.extensions "ingress-rules" 无效:spec.rules[0].http.paths[0].path: 无效值:"(/.*)" : 必须是绝对路径
    • 然后尝试将捕获组移动到/ 的右侧,如他们在示例中所示:- path: /(.*),然后将斜杠复制到rewrite-target: /test/$1
    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 2020-12-23
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2015-07-26
    相关资源
    最近更新 更多