插件窝 干货文章 如何为docker中的nginx配置https

如何为docker中的nginx配置https

Nginx 证书 example SSL 926    来源:    2025-04-21

为Docker中的Nginx配置HTTPS

为Docker容器中的Nginx配置HTTPS需要以下几个步骤:

准备工作

  1. 获取SSL证书(通常包括.crt和.key文件)
    • 可以从Let's Encrypt等CA机构获取免费证书
    • 或者使用自签名证书进行测试

方法一:使用已有证书文件

1. 准备证书文件

将证书文件(如example.crtexample.key)放在项目目录中,例如:

your_project/
├── nginx/
│   ├── conf.d/
│   │   └── default.conf
│   ├── ssl/
│   │   ├── example.crt
│   │   └── example.key

2. 创建Nginx配置文件

nginx/conf.d/default.conf中添加HTTPS配置:

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/nginx/ssl/example.crt;
    ssl_certificate_key /etc/nginx/ssl/example.key;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

3. 创建Dockerfile

FROM nginx:alpine

COPY nginx/conf.d/ /etc/nginx/conf.d/
COPY nginx/ssl/ /etc/nginx/ssl/
COPY html/ /usr/share/nginx/html/

4. 构建并运行容器

docker build -t nginx-https .
docker run -d -p 80:80 -p 443:443 --name nginx-https nginx-https

方法二:使用Let's Encrypt证书(certbot)

1. 使用certbot获取证书

docker run -it --rm --name certbot \
  -v "/path/to/certs:/etc/letsencrypt" \
  -v "/path/to/webroot:/var/www/html" \
  certbot/certbot certonly --webroot -w /var/www/html -d example.com

2. 创建Nginx配置

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 其他SSL配置...
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

3. 创建Docker Compose文件

version: '3'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
      - /path/to/certs:/etc/letsencrypt
    depends_on:
      - certbot

  certbot:
    image: certbot/certbot
    volumes:
      - /path/to/certs:/etc/letsencrypt
      - /path/to/webroot:/var/www/html
    command: certonly --webroot -w /var/www/html --agree-tos --email your@email.com -d example.com --keep-until-expiring

方法三:使用自签名证书(仅测试环境)

1. 生成自签名证书

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout nginx-selfsigned.key -out nginx-selfsigned.crt

2. 配置Nginx

使用与方法一相同的配置,但使用自签名证书路径。

注意事项

  1. 生产环境不要使用自签名证书
  2. Let's Encrypt证书每90天需要续期
  3. 确保443端口在主机上可用且未被防火墙阻止
  4. 考虑使用Docker secrets管理敏感证书文件

高级配置

可以添加以下SSL优化配置:

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_dhparam /etc/nginx/dhparam.pem;  # 需要生成dhparam.pem文件

ssl_stapling on;
ssl_stapling_verify on;

希望这些方法能帮助您在Docker中为Nginx配置HTTPS。根据您的具体需求选择最适合的方案。