基于Docker Compose的Spring Boot全自动HTTPS/WSS部署方案

在当今云原生技术快速发展的背景下,传统的手动配置Nginx和证书管理方式已经无法满足现代DevOps对效率和可靠性的要求。本文将介绍如何利用Docker Compose实现Spring Boot应用的一键式部署,并自动完成Nginx反向代理、HTTPS证书配置以及WebSocket安全连接(WSS)的全套解决方案。

1. 环境准备与架构设计

1.1 技术栈选择

我们的自动化部署方案将基于以下核心技术组件:

  • Docker Compose :作为容器编排工具,管理多个服务间的依赖关系和网络配置
  • Nginx :作为反向代理服务器,处理HTTPS/WSS请求并转发到后端应用
  • Spring Boot :作为核心应用框架,提供业务逻辑和WebSocket支持
  • Certbot :用于自动获取和续期Let's Encrypt免费SSL证书

1.2 系统架构概览

整个系统的架构分为三个主要层次:

  1. 前端接入层 :由Nginx容器构成,负责处理外部HTTPS请求和WSS连接
  2. 应用服务层 :运行Spring Boot应用的容器
  3. 证书管理层 :通过Certbot自动获取和管理SSL证书
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d
      - ./certbot/www:/var/www/certbot
      - ./certbot/conf:/etc/letsencrypt
    depends_on:
      - app
      - certbot

2. Docker Compose编排配置

2.1 基础服务定义

首先创建一个 docker-compose.yml 文件,定义我们的核心服务:

version: '3.8'

services:
  app:
    build: .
    image: springboot-app
    container_name: springboot-app
    restart: unless-stopped
    environment:
      - SPRING_PROFILES_ACTIVE=prod
    expose:
      - "8080"

  nginx:
    image: nginx:1.21-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    depends_on:
      - app
    restart: unless-stopped

  certbot:
    image: certbot/certbot
    volumes:
      - ./certbot/conf:/etc/letsencrypt
      - ./certbot/www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

2.2 关键配置说明

  1. 应用服务

    • 使用自定义构建的Spring Boot应用镜像
    • 暴露8080端口供Nginx内部访问
    • 设置生产环境profile
  2. Nginx服务

    • 映射80和443端口到宿主机
    • 挂载配置目录和证书目录
    • 依赖应用服务和Certbot服务
  3. Certbot服务

    • 配置自动续期证书的脚本
    • 每12小时检查一次证书是否需要续期

3. Nginx高级配置

3.1 HTTPS反向代理配置

创建 nginx/conf/app.conf 文件,配置HTTPS反向代理:

server {
    listen 80;
    server_name yourdomain.com;
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    
    location / {
        proxy_pass http://app:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

3.2 WSS支持配置

在同一个配置文件中添加WebSocket支持:

server {
    # ... 其他配置保持不变 ...

    location /ws {
        proxy_pass http://app:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }
}

4. 证书自动化管理

4.1 初始证书获取

创建一个初始化脚本来获取首次证书:

#!/bin/bash
docker-compose run --rm certbot certonly --webroot --webroot-path /var/www/certbot -d yourdomain.com

4.2 证书自动续期

Docker Compose中已经配置了Certbot服务自动续期,但我们需要确保Nginx在证书更新后重新加载配置:

#!/bin/bash
docker-compose exec nginx nginx -s reload

可以将此命令添加到crontab中,每天执行一次:

0 0 * * * /path/to/reload-nginx.sh > /dev/null 2>&1

5. Spring Boot应用适配

5.1 WebSocket安全配置

在Spring Boot应用中,确保WebSocket端点支持WSS:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setAllowedOrigins("*")
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

5.2 安全头部配置

添加必要的安全头部,确保通过HTTPS访问:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .headers()
                .httpStrictTransportSecurity()
                .includeSubDomains(true)
                .maxAgeInSeconds(31536000);
    }
}

6. 部署与验证

6.1 一键部署流程

完整的部署流程只需几个简单命令:

# 构建应用镜像
docker-compose build

# 启动所有服务
docker-compose up -d

# 获取初始证书(首次部署需要)
./init-cert.sh

6.2 系统验证

验证HTTPS和WSS是否正常工作:

  1. HTTPS验证

    • 访问 https://yourdomain.com ,检查浏览器地址栏的锁标志
    • 使用SSL Labs测试工具验证证书配置
  2. WSS验证

    • 使用WebSocket客户端工具连接 wss://yourdomain.com/ws
    • 测试消息发送和接收功能

7. 高级优化与扩展

7.1 性能调优

Nginx针对WebSocket的优化配置:

proxy_buffers 8 32k;
proxy_buffer_size 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

7.2 多环境支持

通过环境变量区分不同环境的配置:

services:
  app:
    environment:
      - SPRING_PROFILES_ACTIVE=${ENV:-prod}

然后在 .env 文件中定义环境变量:

ENV=prod
DOMAIN=yourdomain.com

7.3 监控与日志

添加Prometheus和Grafana进行监控:

services:
  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"

更多推荐