在 Spring Boot 应用开发中,端口配置是最基础也最关键的配置之一,直接影响应用的访问方式。server.port 和 server.http.port 是两个容易混淆的端口配置项,前者是 Spring Boot 原生核心配置,后者则用于特定场景下的多端口支持(如 HTTP 与 HTTPS 共存)。本文将从核心定义、使用场景、实战配置到常见误区,全面解析这两个配置项。

一、核心概念:两个端口配置的本质区别

1.1 server.port:Spring Boot 原生核心端口

server.port 是 Spring Boot 内置的核心配置项,用于指定应用的默认服务端口,也是大多数场景下唯一需要配置的端口。

核心特性:

  • 默认值:未配置时,HTTP 服务默认使用 8080 端口(可通过 spring-boot-starter-web 自动启用);若配置了 HTTPS 证书(如 server.ssl.key-store),则该端口自动作为 HTTPS 端口
  • 作用范围:全局唯一,直接绑定应用的主要服务端口,所有未特殊配置的请求(HTTP/HTTPS)都会通过该端口接收
  • 配置方式:支持在 application.yml/application.properties 中直接配置,无需额外代码

1.2 server.http.port:HTTPS 场景下的 HTTP 备用端口

server.http.port 并非 Spring Boot 原生默认配置,而是开发者在「同时支持 HTTP 和 HTTPS」场景下自定义的配置项。

核心特性:

  • 使用前提:仅当应用已配置 HTTPS(通过 server.ssl.* 系列配置),需要额外开放 HTTP 端口(如 80 端口)用于接收 HTTP 请求,并自动重定向到 HTTPS 端口时使用
  • 核心作用:作为 HTTP 协议的监听端口,通常用于「HTTP 转 HTTPS」的跳转,而非独立提供 HTTP 服务
  • 配置方式:需手动在配置文件中定义该属性,再通过自定义配置类绑定端口并启用 HTTP 连接器

1.3 核心区别对比表

配置项本质属性默认值核心作用依赖条件
server.portSpring Boot 原生配置8080指定应用默认服务端口(HTTP/HTTPS 共用)无(spring-boot-starter-web 启用后生效)
server.http.port自定义扩展配置无HTTPS 场景下的 HTTP 备用端口(用于重定向)需配置 HTTPS 证书 + 自定义配置类

二、基础用法:单个端口配置(HTTP/HTTPS)

2.1 仅启用 HTTP 服务(默认场景)

若应用只需提供 HTTP 服务,仅需配置 server.port 即可,这是最常见的场景。

配置方式(application.yml)
server:
  port: 8081  # 指定 HTTP 服务端口为 8081(默认 8080)
配置方式(application.properties)
server.port=8081

效果:应用启动后,可通过 http://localhost:8081 访问服务,无需额外配置。

2.2 仅启用 HTTPS 服务

若应用需要通过 HTTPS 提供安全服务,需先准备 SSL 证书,再配置 server.ssl.* 系列属性,此时 server.port 自动作为 HTTPS 端口。

步骤 1:生成自签名 SSL 证书(示例)

通过 JDK 自带的 keytool 命令生成证书文件:

keytool -genkeypair -alias springboot-ssl -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore springboot-ssl.p12 -validity 3650

执行命令后按提示输入密码(如 123456)、组织信息等,生成 springboot-ssl.p12 证书文件。

步骤 2:配置 HTTPS(application.yml)
server:
  port: 443  # HTTPS 默认端口(推荐使用,无需端口号即可访问)
  ssl:
    key-store: classpath:ssl/springboot-ssl.p12  # 证书路径
    key-store-password: 123456  # 证书密码(与生成时一致)
    key-store-type: PKCS12  # 证书格式(PKCS12 是标准格式)
    key-alias: springboot-ssl  # 证书别名(与生成时一致)

效果:应用启动后,仅支持 https://localhost 访问(443 端口可省略),直接访问 http://localhost 会提示「无法访问」(无 HTTP 服务监听)。

三、进阶实战:同时启用 HTTP 和 HTTPS(HTTP 自动跳转 HTTPS)

实际生产场景中,通常需要同时支持 HTTP(80 端口)和 HTTPS(443 端口),并将所有 HTTP 请求自动重定向到 HTTPS,此时需用到 server.http.port 配置 + 配置类实现。

3.1 核心思路

  1. 配置 server.port 作为 HTTPS 端口(如 443)
  2. 自定义 server.http.port 作为 HTTP 端口(如 80)
  3. 通过 ServletWebServerFactory 配置类,同时启用 HTTP 和 HTTPS 两个连接器
  4. 实现 HTTP 请求到 HTTPS 的自动重定向

3.2 完整配置步骤

步骤 1:配置文件(application.yml)
server:
  port: 443  # HTTPS 端口(默认 443,可省略)
  http:
    port: 80  # 自定义 HTTP 端口(需配置类绑定)
  ssl:
    key-store: classpath:ssl/springboot-ssl.p12
    key-store-password: 123456
    key-store-type: PKCS12
    key-alias: springboot-ssl
步骤 2:自定义配置类(启用双端口 + 重定向)

Spring Boot 2.x 及以上版本通过 ServletWebServerFactory 配置双端口:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.apache.catalina.connector.Connector;

@Configuration
public class HttpHttpsConfig {

    // 读取自定义的 HTTP 端口(server.http.port)
    @Value("${server.http.port:80}")
    private int httpPort;

    // 读取 HTTPS 端口(server.port)
    @Value("${server.port:443}")
    private int httpsPort;

    /**
     * 配置 Servlet 容器工厂,同时启用 HTTP 和 HTTPS 连接器
     */
    @Bean
    public ServletWebServerFactory servletWebServerFactory() {
        // 使用 Tomcat 容器(Spring Boot 默认)
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(org.apache.catalina.Context context) {
                // 配置 HTTP 到 HTTPS 的重定向规则
                org.apache.catalina.valves.rewrite.RewriteValve valve = new org.apache.catalina.valves.rewrite.RewriteValve();
                valve.setConfiguration("RewriteCond %{SERVER_PORT} = " + httpPort + "\nRewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]");
                context.getPipeline().addValve(valve);
            }
        };

        // 添加 HTTP 连接器(监听 server.http.port 端口)
        factory.addAdditionalTomcatConnectors(createHttpConnector());
        return factory;
    }

    /**
     * 创建 HTTP 连接器
     */
    private Connector createHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");  // 协议类型
        connector.setPort(httpPort);  // HTTP 端口
        connector.setSecure(false);  // 非安全连接
        // 将 HTTP 请求转发到 HTTPS 端口(关键配置)
        connector.setRedirectPort(httpsPort);
        return connector;
    }
}

3.3 效果验证

  1. 启动应用后,系统同时监听 80 端口(HTTP)和 443 端口(HTTPS)
  2. 访问 http://localhost(80 端口),会自动重定向到 https://localhost(301 永久重定向)
  3. 直接访问 https://localhost 可正常使用 HTTPS 服务

3.4 非 Tomcat 容器适配(可选)

若应用使用 Jetty 或 Undertow 容器(而非默认的 Tomcat),需调整配置类:

Undertow 容器配置示例:

@Bean
public ServletWebServerFactory servletWebServerFactory() {
    UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
    // 配置 HTTPS 端口(默认已通过 server.port 绑定)
    // 添加 HTTP 监听
    factory.addBuilderCustomizers(builder -> {
        builder.addHttpListener(httpPort, "0.0.0.0")  // 监听 HTTP 端口
               .setRedirectPort(httpsPort);  // 重定向到 HTTPS 端口
    });
    return factory;
}

四、常见误区与注意事项

4.1 误区 1:单独配置 server.http.port 即可启用 HTTP 服务

错误认知:以为配置 server.http.port=80 后,应用会自动监听 80 端口提供 HTTP 服务。

正确结论:server.http.port 是自定义配置项,Spring Boot 不直接识别,必须通过配置类绑定并添加连接器,否则配置无效。

4.2 误区 2:启用 HTTPS 后,server.port 仍支持 HTTP 访问

错误认知:配置 HTTPS 后,server.port 同时支持 HTTP 和 HTTPS。

正确结论:配置 server.ssl.* 后,server.port 仅作为 HTTPS 端口,HTTP 服务默认关闭,需手动配置 HTTP 连接器才能支持。

4.3 注意事项 1:端口冲突问题

  • 确保 server.port 和 server.http.port 不重复(如不能同时设为 8080)
  • 避免使用系统保留端口(如 1-1023 端口,Linux/Mac 下需 root 权限才能使用 80/443 端口)

4.4 注意事项 2:生产环境的安全配置

  • 禁止使用自签名证书(仅用于开发测试),生产环境需使用 CA 机构颁发的正式 SSL 证书
  • 建议禁用 HTTP 服务的直接访问,仅保留「HTTP 转 HTTPS」的重定向功能
  • 配置 SSL 协议版本限制,提升安全性:
server:
  ssl:
    enabled-protocols: TLSv1.2,TLSv1.3  # 仅启用安全的 TLS 版本

4.5 注意事项 3:Spring Boot 版本差异

  • Spring Boot 2.x 及以上:使用 ServletWebServerFactory 配置双端口
  • Spring Boot 1.x:使用 EmbeddedServletContainerCustomizer 配置(已过时,建议升级版本)

五、总结与最佳实践

5.1 核心总结

  • server.port:Spring Boot 原生端口配置,默认启用 HTTP 服务,配置 SSL 后转为 HTTPS 端口
  • server.http.port:自定义扩展配置,仅用于 HTTPS 场景下的 HTTP 备用端口,需通过配置类绑定启用
  • 双端口场景:核心是「启用双连接器 + 重定向」,本质是通过容器配置实现多端口监听

5.2 最佳实践

  1. 开发环境:仅配置 server.port=8080,无需 HTTPS,简化开发流程
  2. 测试环境:使用自签名证书配置 HTTPS,同时启用 HTTP 重定向(server.http.port=8081),模拟生产环境
  3. 生产环境:
    • 配置 server.port=443(HTTPS 默认端口)和 server.http.port=80(HTTP 重定向)
    • 使用 CA 正式证书,禁用不安全的 TLS 版本
    • 通过防火墙限制端口访问,仅开放 80 和 443 端口

通过本文的解析,相信开发者能清晰区分 server.port 和 server.http.port 的用法,并根据实际场景灵活配置端口策略,兼顾服务的可用性与安全性。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐