环境说明
我是docker安装的nginx,映射目录要注意一下 才可以签发证书
安装步骤和命令 注意顺序
1.安装 Certbot 客户端
sudo yum install epel-release
sudo yum install certbot
# 如果你是 CentOS 8/Stream,可能需要安装 python3-certbot
# sudo yum install certbot python3-certbot
2.手动生成证书
我们将使用 webroot
模式来生成证书,这意味着 Certbot 会在你的网站根目录下放置临时文件进行验证。
为验证文件创建临时目录: 在宿主机上创建一个用于 Certbot 验证的临时目录。这个目录需要能被宿主机上的 Certbot 访问,并且能够通过 Nginx 的 80 端口对外提供服务。
sudo mkdir -p /var/www/certbot
修改 Nginx 容器配置(重要!): 为了让 Certbot 能够验证你的域名,你需要确保 Nginx 容器的 80 端口被正确映射到宿主机,并且 Nginx 能够服务 Certbot 放置的验证文件。
示例
nginx.conf
(Nginx 容器内的配置): 在 Nginx 的 HTTP server block 中添加一个专门用于 Certbot 验证的location
块。server { listen 80; listen [::]:80; server_name yourdomain.com www.yourdomain.com; # 替换成你的域名 # Certbot 验证路径 location /.well-known/acme-challenge/ { root /var/www/certbot; # 注意:这个路径是 Nginx 容器内部的路径 } # 其他网站内容 location / { root /usr/share/nginx/html; # 你的网站实际文件路径 index index.html index.htm; try_files $uri $uri/ =404; } }
示例
docker-compose.yml
(或docker run
命令): 你需要将宿主机上刚才创建的/var/www/certbot
目录挂载到 Nginx 容器内部的/var/www/certbot
路径。yml文件version: '3.8' services: nginx: image: nginx:latest container_name: my-nginx ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro # 挂载你的 Nginx 配置 - /var/www/certbot:/var/www/certbot:ro # 挂载 Certbot 验证目录 - ./html:/usr/share/nginx/html:ro # 你的网站内容 # 将来我们会把证书挂载到这里 # - /etc/letsencrypt:/etc/letsencrypt:ro restart: unless-stopped
证书文件通常位于
/etc/letsencrypt/live/yourdomain.com/
目录下。配置 Nginx 使用 HTTPS 证书
现在你已经有了证书文件,可以修改 Nginx 容器的配置来启用 HTTPS。
1).修改docker-compose.yml
(或docker run
),挂载证书目录: 你需要将宿主机上的 Certbot 证书目录挂载到 Nginx 容器内部,以便 Nginx 能够访问它们。
version: '3.8' services: nginx: image: nginx:latest container_name: my-nginx ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - /var/www/certbot:/var/www/certbot:ro # 保留这个用于续期 - ./html:/usr/share/nginx/html:ro - /etc/letsencrypt:/etc/letsencrypt:ro # **新增:挂载 Certbot 证书目录** restart: unless-stopped
注意:我们挂载了整个
/etc/letsencrypt
目录,这样 Nginx 就可以访问live
目录下的证书
2).修改 Nginx 容器内的nginx.conf
: 在你的 Nginx 配置文件中,添加或修改 HTTPS server block。
server { listen 80; listen [::]:80; server_name yourdomain.com www.yourdomain.com; # HTTP 重定向到 HTTPS (推荐) return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name yourdomain.com www.yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # Nginx 容器内的路径 ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # Nginx 容器内的路径 # 推荐的 SSL 配置 (根据你的 Nginx 版本和需求可能有所不同) ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers off; ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256"; # OCSP Stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; # Google DNS,可以替换为你偏好的 DNS 解析器 resolver_timeout 5s; root /usr/share/nginx/html; # 你的网站实际文件路径 index index.html index.htm; location / { try_files $uri $uri/ =404; } # 保护 Certbot 验证目录,使其不会被 Nginx 容器的服务流量影响 location /.well-known/acme-challenge/ { root /var/www/certbot; # 保持此配置以备续期 allow all; } }
重新启动 Nginx 容器
docker-compose restart 或者 docker restart 容器id验证 HTTPS 配置
现在,打开你的浏览器,访问https://yourdomain.com
。你应该能看到一个安全的小锁图标,并且所有 HTTP 请求都自动重定向到了 HTTPS。