前提:

  1. 有一个基于 Docker Compose 编排,且包含 Nginx 部署的前端服务项目。
  2. 有一个域名(证书会基于域名自动申请)。

配置流程:

  1. 修改 docker-compose.yml 文件,确保前端服务映射了 443 端口
    示例:
services: ruoyi-ui: container_name: ruoyi-ui build: context: . # Dockerfile.ui 及 nginx.conf 所在上下文路径 dockerfile: Dockerfile.ui ports: - "${FRONTEND_PORT}:80" - "443:443" # https端口 depends_on: xxx-service: condition: service_started # 后端服务及其它服务配置 xxx-service: ... 
  1. 在 Dockerfile.ui 中使用正确的基础镜像,需要支持 ACME 的 nginx 镜像,如:ghcr.io/3az7qmfd/ngacme:main:
FROM ghcr.io/3az7qmfd/ngacme:main

# 移除 Nginx 默认配置
RUN rm /etc/nginx/conf.d/default.conf

# 复制自定义的 Nginx 配置文件
COPY ./nginx.conf /etc/nginx/conf.d/default.conf

# 从构建阶段复制构建好的静态文件到 Nginx 托管目录
COPY ./dist /usr/share/nginx/html

# 暴露 Nginx 端口
EXPOSE 80

# Nginx 默认会启动,也可以指定 CMD
CMD ["nginx", "-g", "daemon off;"]
  1. 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;
}

参考连接:

  1. 以 Nginx 为反代服务端时以 Certbot 自动申请 HTTPS 证书的流程
  2. nginx-acme
    nginx-acme/README.md at main · nginx/nginx-acme · GitHub
  3. Module ngx_http_acme_module
    Module ngx_http_acme_module
  4. NGINX with ACME 模块 Docker 镜像
    Package ngacme · GitHub

📌 转载信息
转载时间:
2026/1/6 12:16:35

标签: nginx, Docker Compose, Let's Encrypt, SSL/TLS, ACME

添加新评论