Docker Nginx 配置 SSL 证书完整教程

作者
2026-07-12
发布日期
约 6 分钟
阅读时间

本文讲解使用 Docker Compose 部署 Nginx 反向代理并配置 SSL 证书的完整流程。

目录结构

project/
├── compose.yaml
└── nginx/
    ├── conf.d/
    │   └── default.conf
    └── certs/
        ├── fullchain.pem
        └── privkey.pem

不要把私钥通过 COPY 写入 Docker 镜像,也不要提交到 Git

Nginx 配置

nginx/conf.d/default.conf

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    return 308 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;

    server_name example.com www.example.com;

    ssl_certificate     /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        proxy_pass http://app:3000;
        proxy_http_version 1.1;

        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;
    }
}

较旧版本 Nginx 如果不支持 http2 on;,可改为:

listen 443 ssl http2;

Compose 配置

compose.yaml

services:
  nginx:
    image: nginx:1.27-alpine
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/certs:/etc/nginx/certs:ro
    depends_on:
      - app

  app:
    image: your-app-image:latest
    restart: unless-stopped
    expose:
      - "3000"

app 是 Compose 服务名,Nginx 可以通过 Docker 内置 DNS 解析它。后端不需要把 3000 端口发布到公网

启动和检查

docker compose config
docker compose up -d
docker compose exec nginx nginx -t
docker compose logs --tail=100 nginx

验证:

curl -I http://example.com
curl -I https://example.com
openssl s_client \
  -connect example.com:443 \
  -servername example.com \
  -showcerts

证书续期

更新宿主机证书后:

docker compose exec nginx nginx -t
docker compose exec nginx nginx -s reload

建议挂载整个证书目录,而不是单独挂载证书文件。Certbot 更新证书时经常会替换符号链接或 inode,单文件挂载可能导致容器仍然看到旧文件。

通用检查重点

  • 证书 SAN 包含实际域名
  • fullchain.pem 包含中间证书
  • 私钥与证书匹配
  • TCP 443 已在云安全组和系统防火墙中开放
本文到此结束