别再手动改Nginx配置了!用Docker Compose一键部署Spring Boot应用并自动配置HTTPS/WSS证书
基于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 系统架构概览
整个系统的架构分为三个主要层次:
- 前端接入层 :由Nginx容器构成,负责处理外部HTTPS请求和WSS连接
- 应用服务层 :运行Spring Boot应用的容器
- 证书管理层 :通过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 关键配置说明
-
应用服务 :
- 使用自定义构建的Spring Boot应用镜像
- 暴露8080端口供Nginx内部访问
- 设置生产环境profile
-
Nginx服务 :
- 映射80和443端口到宿主机
- 挂载配置目录和证书目录
- 依赖应用服务和Certbot服务
-
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是否正常工作:
-
HTTPS验证 :
-
访问
https://yourdomain.com,检查浏览器地址栏的锁标志 - 使用SSL Labs测试工具验证证书配置
-
访问
-
WSS验证 :
-
使用WebSocket客户端工具连接
wss://yourdomain.com/ws - 测试消息发送和接收功能
-
使用WebSocket客户端工具连接
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"
更多推荐


所有评论(0)