前提:
- 有一个基于 Docker Compose 编排,且包含 Nginx 部署的前端服务项目。
- 有一个域名(证书会基于域名自动申请)。
配置流程:
- 修改 docker-compose.yml 文件,确保前端服务映射了 443 端口。
示例:
services: ruoyi-ui: container_name: ruoyi-ui build: context: . dockerfile: Dockerfile.ui ports: - "${FRONTEND_PORT}:80" - "443:443" depends_on: xxx-service: condition: service_started xxx-service: ...
- 在 Dockerfile.ui 中使用正确的基础镜像,需要支持 ACME 的 nginx 镜像,如:ghcr.io/3az7qmfd/ngacme:main:
FROM ghcr.io/3az7qmfd/ngacme:main
RUN rm /etc/nginx/conf.d/default.conf
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
COPY ./dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
- nginx.conf 配置自动获取证书
# DNS 解析器(用于访问 ACME 服务器,推荐用可靠的如 Cloudflare 或 Google)
# 没有可用的 IPv6 出口时,可设置禁用ipv6:ipv6=off
resolver 8.8.8.8 1.1.1.1 ipv6=off valid=30s;
# ACME issuer 配置(这里用 Let's Encrypt 生产环境示例)
acme_issuer letsencrypt {
uri https://acme-v02.api.letsencrypt.org/directory;
contact xxx@qq.com; # <----- 你的邮箱,用于通知
state_path /var/cache/nginx/acme-letsencrypt; # 持久化存储路径,确保目录存在并可写
accept_terms_of_service;
}
# 共享内存区(存储证书和挑战数据)
acme_shared_zone zone=ngx_acme_shared:1M;
server {
listen 80;
server_name xxx.com; # 你的实际域名,证书会基于此自动申请
# 可选:显式允许挑战路径
# location /.well-known/acme-challenge/ { }
location / {
return 301 https://$server_name$request_uri; # 重定向所有普通请求到 HTTPS
}
}
server {
listen 443 ssl; http2 on;
server_name xxx.com; # 你的实际域名,证书会基于此自动申请
# ACME 自动管理证书
acme_certificate letsencrypt; # 使用上面定义的 issuer
ssl_certificate $acme_certificate;
ssl_certificate_key $acme_certificate_key;
# 避免每次请求解析证书
ssl_certificate_cache max=2;
# 静态资源根目录(与原配置相同)
root /usr/share/nginx/html;
index index.html index.htm;
# 处理前端 SPA 路由
location / {
try_files $uri $uri/ /index.html;
}
# API 请求反向代理
location /api/ {
proxy_set_header Host $http_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;
proxy_pass http://xxx-service:8080/; # <---- 你的后端服务
}
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# 其他 SSL 优化(可选推荐)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}
参考连接:
- 以 Nginx 为反代服务端时以 Certbot 自动申请 HTTPS 证书的流程
- nginx-acme
nginx-acme/README.md at main · nginx/nginx-acme · GitHub - Module ngx_http_acme_module
Module ngx_http_acme_module - NGINX with ACME 模块 Docker 镜像
Package ngacme · GitHub
📌 转载信息
转载时间:
2026/1/6 12:16:35