Skip to content

优雅的配置永久SSL

字数: 0 字 时长: 0 分钟

acem.sh

1panel

Encrypt免费证书

这里使用 Let’s Encrypt 提供的免费 SSL 证书,并通过 Certbot 工具自动获取和安装。以下是具体步骤:

由于 Certbot 无法直接与 Docker 部署的 Nginx 交互,你可以使用 Certbot 的 standalone 模式,这需要暂时停止占用 80 端口的 Nginx 容器。

在获取证书之前,停止 Nginx 容器以释放 80 端口:

Bash
docker-compose down

使用以下命令获取证书:

Bash
sudo certbot certonly --standalone -d leocoder.cn -d picture.leocoder.cn
  • certonly:仅获取证书,不自动配置。

  • --standalone:Certbot 启动一个临时的 web 服务来完成验证。

  • -d:指定域名。

获取成功后,证书将存储在 /etc/letsencrypt/live/ 目录中。

然后将证书复制到 Nginx 可访问的目录

Certbot 生成的证书通常位于 /etc/letsencrypt/live/yourdomain.com/ 目录下。您需要将这些证书文件复制到 Nginx 配置目录 /etc/ssl/certs/ 和 /etc/ssl/private/:

Bash
sudo cp /etc/letsencrypt/live/leocoder.cn/fullchain.pem /etc/ssl/certs/leocoder.cn.crt
sudo cp /etc/letsencrypt/live/leocoder.cn/privkey.pem /etc/ssl/private/leocoder.cn.key

首先,您需要确保目标目录存在。你可以通过以下命令创建所需的目录:

Bash
sudo mkdir -p /etc/ssl/private
sudo mkdir -p /etc/ssl/certs

修改nginx.conf 文件

Bash
events {
    worker_connections 1024;  # 最大连接数
}

http {
    include /etc/nginx/mime.types;  # 载入文件类型
    default_type application/octet-stream;  # 默认文件类型

    sendfile on;  # 启用文件发送
    keepalive_timeout 65;  # 设置保持连接时间
    # 主域名网站
    server {
        listen 80;
        server_name leocoder.cn;
        return 301 https://$host$request_uri;  # 强制 HTTP 重定向到 HTTPS
    }

    server {
        listen 443 ssl;
        server_name leocoder.cn;

        ssl_certificate /etc/ssl/certs/leocoder.cn.crt;
        ssl_certificate_key /etc/ssl/private/leocoder.cn.key;

        root /usr/share/nginx/blog;
        index index.html;

        location / {
            try_files $uri $uri/ /index.html;
        }
    }

    # 二级域名网站
    server {
        listen 80;
        server_name picture.leocoder.cn;
        return 301 https://$host$request_uri;  # 强制 HTTP 重定向到 HTTPS
    }

    server {
        listen 443 ssl;
        server_name picture.leocoder.cn;

        ssl_certificate /etc/ssl/certs/leocoder.cn.crt;
        ssl_certificate_key /etc/ssl/private/leocoder.cn.key;

        # 前端服务
        location / {
            root /usr/share/nginx/picture/frontend;
            index index.html;
            try_files $uri $uri/ /index.html;
        }

        # 后端服务代理
        location /api/ {
            proxy_pass http://picture-backend:18888/api/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}
                                                                                                                                                                           63,1          Bot

修改 docker-compose 文件

Bash
version: '3.9'
services:
  nginx:
    image: nginx:latest
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /opt/software/data/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /opt/software/data/blog/dist:/usr/share/nginx/blog
      - /opt/software/data/picture/frontend/dist:/usr/share/nginx/picture/frontend
      - /etc/letsencrypt/live/leocoder.cn/fullchain.pem:/etc/ssl/certs/leocoder.cn.crt:ro
      - /etc/letsencrypt/live/leocoder.cn/privkey.pem:/etc/ssl/private/leocoder.cn.key:ro
    networks:
      - proxy_network
    restart: always

  picture-backend:
    image: openjdk:17
    container_name: picture-backend
    volumes:
      - /opt/software/data/picture/backend:/app
    working_dir: /app
    command: ["java", "-jar", "lg-picture-backend-1.0-SNAPSHOT.jar", "--server.port=18888"]
    networks:
      - proxy_network
    restart: always

networks:
  proxy_network:
    driver: bridge

完成上述步骤后,重新部署服务

Bash
docker-compose up -d

可以看到,此时就是安全的连接了,大功告成!

配置自动续期

Let’s Encrypt 的证书有效期为 90 天,因此需要配置自动续期。

编辑定时任务:

Bash
sudo crontab -e

添加以下行,每月自动续期并重启 Nginx:

Bash
0 0 1 * * certbot renew --quiet
本站访客数 人次 本站总访问量