【问题标题】:Spring Boot Actuator port when deployed to external Tomcat container部署到外部 Tomcat 容器时的 Spring Boot Actuator 端口
【发布时间】:2015-04-21 14:50:01
【问题描述】:

我有一个部署到外部 Tomcat 容器(不使用嵌入式容器)的 Spring Boot 应用程序,并且正在尝试设置执行器。问题是application.properties 中的management.port 似乎没有被Tomcat 认可。当我使用嵌入式 Tomcat 运行 Spring Boot 时,它工作得很好。

例如,在application.properties 中设置以下内容:

management.port=9010

嵌入式容器的工作端点

  • http://localhost:9010/health

外部容器的非工作端点在端口 8080 上运行

  • http://localhost:9010/health
  • http://localhost:8080/health
  • http://localhost:9010/<appName>/health
  • http://localhost:8080/<appName>/health

我需要在 Tomcat 容器中进行特殊配置来公开 Spring Boot 执行器端点吗?

我尝试设置环境变量MANAGEMENT_PORT。大多数(几乎所有)可用文档都使用嵌入式 Tomcat,因此跟踪这个问题已被证明具有挑战性。

对此答案的第三条评论提供了一些可能的见解:https://stackoverflow.com/a/28689853/2601060,它指向一个 GitHub 文件,表明如果未设置管理端口,它将与服务器端口相同。

【问题讨论】:

  • 您发布的链接有一个答案,说明在使用嵌入式 tomcat 时,执行器使用了一个单独的实例。大概在部署到外部 tomcat 时这不起作用。可能有一种方法可以实现您想要做的事情,但它必须在您的外部 tomcat 配置中,嵌入式 tomcat 的属性将不起作用。
  • @ci_ 感谢您的回复-您知道在外部 tomcat 中配置它的任何方法吗?
  • 不幸的是没有,否则我会发布答案。我只是评论指出你在正确的方向。我们在这里为执行器使用单独的上下文路径,而不是单独的端口。

标签: tomcat spring-boot


【解决方案1】:

我们不能为外部 Tomcat 容器指定额外的端口。 原因如下:https://github.com/spring-projects/spring-boot/issues/552

唯一的方法是使用上下文路径扩展端点,例如“/management”并对其应用安全性。

【讨论】:

    【解决方案2】:

    是的,如果您的 application.properties 有属性调用 “management.port:9001”和“server.port:9000”。然后您的应用程序端点将部署在端口 9000 上,而执行器端点将部署在端口 9001 上。

    所以这取决于我们。我们可以使用相同的端口提及这两个属性,应用程序将正常工作。

    【讨论】:

      【解决方案3】:

      我在本地环境中遇到了同样的问题,

      • 我通过更换tomcat(重新安装一个新的)修复了它,
      • 也可以通过将 > \apache-tomcat-9.0.52\conf\serve.xml 中的默认端口 更改为 8082 - 然后您可以访问您的执行器链接:localhost:8082/yourwarName/actuator/health

      :) 希望有一天它对某人有所帮助..

      【讨论】:

        【解决方案4】:

        你在哪个Java版本下运行Tomcat7?

        注意这都是猜测 - 我还无法验证这一点

        如果是Java6(我猜是因为我遇到了类似的问题),我怀疑它与以下消息有关:

        信息:JSR 356 WebSocket (Java WebSocket 1.1) 支持不可用 在 Java 6 上运行时。要禁止显示此消息,请在 Java 上运行 Tomcat 7、从 $CATALINA_HOME/lib 中删除 WebSocket JAR 或添加 WebSocket JAR 到 tomcat.util.scan.DefaultJarScanner.jarsToSkip $CATALINA_BASE/conf/catalina.properties 中的属性。请注意, 已弃用的 Tomcat 7 WebSocket API 将可用。

        我只能冒险猜测,Spring Boot 使用 JSR356 告诉 Web 应用容器“除了侦听主应用程序的默认端口外,还要侦听端口 X 以获取执行器端点”。 ..这在Java6下运行不可用...我可能错了。

        如果有人可以确认/否认这种行为,我会更新这个回复。

        在将 Tomcat 设置为使用 Java8,并删除套接字 jar(tomcat7-websocket.jarwebsocket-api.jar jar)后,我得到了 following message from Spring

        o.s.b.a.a.EndpointWebMvcAutoConfiguration : 无法在不同端口上启动嵌入式管理容器(管理端点仍可通过 JMX 使用)

        与此同时,@DecipherX 的解决方法(即不要设置 management.port=9010)将通过默认端口公开您的执行器端点。

        【讨论】:

          【解决方案5】:

          如果您从配置中删除 management.server.port,则执行器将部署在外部 Tomcat 中的 servlet 上下文路径下。

          http://<--domain-->/<--servlet-context-->/actuator/health

          除非管理端口已配置为使用不同的 HTTP 端口公开端点,否则 management.endpoints.web.base-path 是相对于 server.servlet.context-path (Servlet Web 应用程序)或 spring.webflux.base -path(反应式 Web 应用程序)。如果配置了 management.server.port,则 management.endpoints.web.base-path 是相对于 management.server.base-path 的。

          【讨论】:

            猜你喜欢
            • 2016-03-28
            • 2016-12-29
            • 2016-11-26
            • 2015-02-06
            • 1970-01-01
            • 2019-08-15
            • 2014-09-04
            • 2015-03-10
            • 2018-12-05
            相关资源
            最近更新 更多