Docker环境下为Nginx配置HTTPS
配置HTTPS已经成为网站部署的必要步骤。本教程将详细介绍如何在Docker环境下为Nginx配置HTTPS,使用自签名证书来实现加密通信。虽然在生产环境中建议使用权威CA机构颁发的证书,但在开发测试或内网环境中,自签名证书是一个很好的选择。
前置条件
在开始之前,确保系统已经安装:
Docker(建议版本 20.10 或更高)OpenSSL(用于生成证书)
可以通过以下命令检查版本:
1 2 | docker --version
openssl version
|
一、项目结构
项目的目录结构:
1 2 3 4 5 6 7 8 9 10 11 | project/
├── Dockerfile
├── nginx/
│ ├── nginx.conf # Nginx主配置文件
│ ├── conf.d/
│ │ └── default.conf # 默认站点配置
│ └── ssl/ # 将要创建的SSL证书目录
│ ├── nginx.crt # 证书文件
│ └── nginx.key # 私钥文件
├── source/
└── dist/ # 编译后的静态文件
|
二、生成自签名证书
2.1 创建证书目录
1 2 3 | mkdir -p nginx /ssl
cd nginx /ssl
|
2.2 生成SSL证书和私钥
使用OpenSSL生成自签名证书。这个过程分为几个步骤:
生成私钥:
1 | openssl genrsa -out nginx.key 2048
|
生成证书签名请求(CSR):
1 2 | openssl req -new -key nginx.key -out nginx.csr \
-subj "/C=CN/ST=YourState/L=YourCity/O=YourCompany/OU=IT Department/CN=your-domain.com"
|
参数说明:
/C:国家代码(例如CN代表中国)
/ST:省/州名
/L:城市名
/O:组织名称
/OU:部门名称
/CN:域名
使用私钥签名证书:
1 2 3 4 | openssl x509 -req -days 3650 \
- in nginx.csr \
-signkey nginx.key \
-out nginx.crt
|
2.3 设置正确的权限
1 2 | chmod 600 nginx.key
chmod 644 nginx.crt
|
三、配置Nginx
3.1 创建新的Nginx配置文件
编辑 nginx/conf.d/default.conf
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | # HTTP服务器(重定向到HTTPS)
server {
listen 80;
listen [::]:80;
server_name localhost; # 在实际环境中替换为你的域名
# 将所有HTTP请求重定向到HTTPS
return 301 https://$server_name$request_uri;
}
# HTTPS服务器
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name localhost; # 在实际环境中替换为你的域名
# SSL证书配置
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
# SSL会话配置
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# SSL协议配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS配置(如果需要)
# add_header Strict-Transport-Security "max-age=63072000" always;
# 静态文件配置
location / {
root /opt/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
# 错误页面配置
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
|
3.2 修改Dockerfile
编辑项目根目录下的Dockerfile:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | FROM nginx:stable
# 复制Nginx配置文件
COPY ./nginx/nginx.conf /etc/nginx/nginx.conf
COPY ./nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
# 复制SSL证书
COPY ./nginx/ssl/nginx.crt /etc/nginx/ssl/
COPY ./nginx/ssl/nginx.key /etc/nginx/ssl/
# 复制应用文件
COPY ./source/dist /opt/dist/
# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 设置证书权限
RUN chmod 600 /etc/nginx/ssl/nginx.key \
&& chmod 644 /etc/nginx/ssl/nginx.crt
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]
|
四、构建和运行
4.1 构建Docker镜像
1 2 | docker build -t my-nginx-ssl:v1 .
|
4.2 运行容器
1 2 3 4 5 | docker run -d \
--name my-nginx-ssl \
-p 80:80 \
-p 443:443 \
my-nginx-ssl:v1
|
4.3 验证配置
检查容器是否正常运行:
查看容器日志:
测试HTTPS连接:
1 | curl -k https: //localhost
|
4.4 成功访问

ps:可以直接使用 https://ip+端口 如果使用域名要先在hosts文件中添加
五、常见问题解决
5.1 证书不受信任警告
在使用自签名证书时,浏览器会显示证书不受信任的警告,这是正常的。你可以:
在开发环境中,点击"高级"然后"继续前往"(具体文字根据浏览器不同可能有所差异)将证书添加到系统的受信任证书存储中在生产环境中使用受信任的CA机构颁发的证书 5.2 无法访问HTTPS
如果无法访问HTTPS站点,请检查:
端口映射是否正确:
防火墙是否开放443端口:
1 2 3 4 | sudo ufw status
sudo ufw allow 443
|
证书文件权限是否正确:
1 2 3 | docker exec -it my-nginx-ssl bash
ls -l /etc/nginx/ssl/
|
5.3 配置测试
在应用到生产环境之前,可以使用以下命令测试Nginx配置:
1 2 3 4 | docker exec -it my-nginx-ssl bash
nginx -t
|
六、安全建议
定期更新证书
使用强密码算法
启用HTTP/2
配置适当的SSL会话缓存
考虑启用HSTS
定期更新Nginx版本以修复安全漏洞
七、维护建议
证书更新
1 2 3 4 5 6 7 8 9 10 | openssl x509 -req -days 365 \
- in nginx.csr \
-signkey nginx.key \
-out nginx.crt.new
mv /etc/nginx/ssl/nginx .crt /etc/nginx/ssl/nginx .crt.old
mv nginx.crt.new /etc/nginx/ssl/nginx .crt
nginx -s reload
|
日志检查
1 2 3 4 | tail -f /var/log/nginx/access .log
tail -f /var/log/nginx/error .log
|
总结
生成自签名SSL证书
配置Nginx支持HTTPS
使用Docker部署HTTPS服务
常见问题的解决方法
维护操作
自签名证书适用于开发和测试环境。在生产环境中,建议使用受信任的CA机构颁发的证书。