48. 通过 HTTP 进行监视和 Management

如果您正在开发 Spring MVC 应用程序,则 Spring Boot Actuator 将自动配置所有启用的端点以通过 HTTP 公开。默认约定是使用端点的id作为 URL 路径。例如,health被公开为/health

48.1 访问敏感端点

默认情况下,所有敏感的 HTTP 端点都是安全的,因此只有具有ACTUATOR角色的用户才能访问它们。使用标准的HttpServletRequest.isUserInRole方法可以增强安全性。

Tip

如果您要使用与ACTUATOR不同的属性,请使用management.security.roles属性。

如果要在防火墙后面部署应用程序,则可能希望可以在不进行身份验证的情况下访问所有 Actuator 端点。您可以通过更改management.security.enabled属性来实现:

application.properties.

management.security.enabled=false

Note

默认情况下,Actuator 端点暴露在提供常规 HTTP 流量的同一端口上。如果更改management.security.enabled属性,请注意不要意外泄露敏感信息。

如果要公开部署应用程序,则可能需要添加“ Spring Security”以处理用户身份验证。添加“ Spring Security”后,默认情况下,将使用用户名user和生成的密码(在应用程序启动时在控制台上打印)使用“基本”身份验证。

Tip

应用程序启动时,将记录生成的密码。搜索“使用默认安全密码”。

您可以使用 Spring 属性来更改用户名和密码,以及更改访问端点所需的安全角色。例如,您可以在application.properties中设置以下内容:

security.user.name=admin
security.user.password=secret
management.security.roles=SUPERUSER

如果您的应用程序具有定制的安全性配置,并且您希望所有 Actuator 端点都可以不经身份验证访问,则需要在安全性配置中显式配置它。除此之外,您需要将management.security.enabled属性更改为false

如果您的自定义安全配置保护了您的 Actuator 端点,则还需要确保通过身份验证的用户具有在management.security.roles下指定的角色。

Tip

如果您没有用例向未经身份验证的用户公开基本健康信息,并且已通过自定义安全性保护了 Actuator 端点,则可以将management.security.enabled设置为false。这将通知 Spring Boot 跳过其他角色检查。

48.2 自定义 Management 端点路径

有时将所有 Management 端点分组在单个路径下很有用。例如,您的应用程序可能已经将/info用于其他用途。您可以使用management.context-path属性为您的 Management 端点设置前缀:

management.context-path=/manage

上面的application.properties示例会将端点从/{id}更改为/manage/{id}(例如/manage/info)。

Note

除非 Management 端口已配置为使用其他 HTTP 端口公开端点,否则management.context-path是相对于server.context-path的。

您还可以更改端点的“ id”(使用endpoints.{name}.id),然后更改 MVC 端点的默认资源路径。合法端点 ID 仅由字母数字字符组成(因为它们可以在很多地方公开,包括 JMX 对象名,在这些地方禁止使用特殊字符)。可以通过配置endpoints.{name}.path单独更改 MVC 路径,并且不对这些值进行验证(因此您可以在 URL 路径中使用合法的任何内容)。例如,要将/health端点的位置更改为/ping/me,可以设置endpoints.health.path=/ping/me

Note

即使端点路径是单独配置的,它仍然相对于management.context-path

Tip

如果提供自定义MvcEndpoint,请记住包括一个可设置的path属性,如果您希望代码的行为类似于标准 MVC 端点,则将其默认设置为/{id}。 (查看HealthMvcEndpoint来了解如何做.)如果您的自定义端点是Endpoint(而不是MvcEndpoint),那么 Spring Boot 将为您处理路径。

48.3 自定义 Management 服务器端口

对于基于云的部署,使用默认的 HTTP 端口公开 Management 端点是明智的选择。但是,如果您的应用程序在自己的数据中心内运行,则您可能更愿意使用其他 HTTP 端口公开端点。

management.port属性可用于更改 HTTP 端口。

management.port=8081

由于您的 Management 端口通常受防火墙保护,并且不公开,因此即使主应用程序是安全的,您也可能不需要 Management 端点上的安全性。在这种情况下,您将在 Classpath 上具有 Spring Security,并且可以像这样禁用 Management 安全性:

management.security.enabled=false

(如果您在 Classpath 上没有 Spring Security,那么就不需要以这种方式显式禁用 Management 安全性,甚至可能破坏应用程序.)

48.4 配置特定于 Management 的 SSL

当配置为使用自定义端口时,还可以使用各种management.ssl.*属性将 Management 服务器配置为其自己的 SSL。例如,这允许 Management 服务器在主应用程序使用 HTTPS 时通过 HTTP 可用:

server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:store.jks
server.ssl.key-password=secret
management.port=8080
management.ssl.enabled=false

另外,主服务器和 Management 服务器都可以使用 SSL,但具有不同的密钥库:

server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.port=8080
management.ssl.enabled=true
management.ssl.key-store=classpath:management.jks
management.ssl.key-password=secret

48.5 自定义 Management 服务器地址

您可以通过设置management.address属性来自定义 Management 端点可用的地址。如果您仅想在内部或面向操作的网络上侦听,或者仅侦听来自localhost的连接,则此功能很有用。

Note

如果端口与主服务器端口不同,则只能在其他地址上侦听。

这是一个application.properties的示例,该示例将不允许远程 Management 连接:

management.port=8081
management.address=127.0.0.1

48.6 禁用 HTTP 端点

如果您不想通过 HTTP 公开端点,则可以将 Management 端口设置为-1

management.port=-1

48.7 HTTP 运行状况端点格式和访问限制

运行状况端点公开的信息取决于是否匿名访问以及封闭的应用程序是否安全而有所不同。默认情况下,当在安全应用程序中匿名访问时,有关服务器运行状况的任何详细信息都将被隐藏,并且端点将仅指示服务器是否处于运行状态。此外,响应被缓存了一段可配置的时间,以防止端点被用于拒绝服务攻击。 endpoints.health.time-to-live属性用于配置缓存周期(以毫秒为单位)。缺省值为 1000,即一秒。

samples 摘要 HTTP 响应(匿名请求的默认值):

$ curl -i localhost:8080/health
HTTP/1.1 200
X-Application-Context: application
Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
Content-Length: 15

{"status":"UP"}

状态为“ DOWN”(请注意 503 状态代码)的示例 HTTP 响应摘要:

$ curl -i localhost:8080/health
HTTP/1.1 503
X-Application-Context: application
Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
Content-Length: 17

{"status":"DOWN"}

示例详细的 HTTP 响应:

$ curl -i localhost:8080/health
HTTP/1.1 200 OK
X-Application-Context: application
Content-Type: application/vnd.spring-boot.actuator.v1+json;charset=UTF-8
Content-Length: 221

{
  "status" : "UP",
  "diskSpace" : {
    "status" : "UP",
    "total" : 63251804160,
    "free" : 31316164608,
    "threshold" : 10485760
  },
  "db" : {
    "status" : "UP",
    "database" : "H2",
    "hello" : 1
  }
}

可以增强上述限制,从而仅允许经过身份验证的用户完全访问安全应用程序中的运行状况终结点。为此,请将endpoints.health.sensitive设置为true。这是行为的摘要(默认的sensitive标志值“ false”以粗体显示):

management.security.enabledendpoints.health.sensitiveUnauthenticated已验证(具有正确角色)
false*Full contentFull content
truefalseStatus onlyFull content
truetrueNo contentFull content