如何在Docker环境下为Nginx配置HTTPS
前言
配置HTTPS已经成为网站部署的必要步骤。本教程将详细介绍如何在Docker环境下为Nginx配置HTTPS,使用自签名证书来实现加密通信。虽然在生产环境中建议使用权威CA机构颁发的证书,但在开发测试或内网环境中,自签名证书是一个很好的选择。
前置条件
在开始之前,确保系统已经安装:
Docker(建议版本 20.10 或更高)OpenSSL(用于生成证书)
可以通过以下命令检查版本:
docker --version openssl version
一、项目结构
项目的目录结构:
project/ ├── Dockerfile ├── nginx/ │ ├── nginx.conf # Nginx主配置文件 │ ├── conf.d/ │ │ └── default.conf # 默认站点配置 │ └── ssl/ # 将要创建的SSL证书目录 │ ├── nginx.crt # 证书文件 │ └── nginx.key # 私钥文件 ├── source/ └── dist/ # 编译后的静态文件
二、生成自签名证书
2.1 创建证书目录
# 在项目根目录下执行 mkdir -p nginx/ssl cd nginx/ssl
2.2 生成SSL证书和私钥
使用OpenSSL生成自签名证书。这个过程分为几个步骤:
生成私钥:
openssl genrsa -out nginx.key 2048
生成证书签名请求(CSR):
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:域名
使用私钥签名证书:
openssl x509 -req -days 3650 \ -in nginx.csr \ -signkey nginx.key \ -out nginx.crt
2.3 设置正确的权限
chmod 600 nginx.key chmod 644 nginx.crt
三、配置Nginx
3.1 创建新的Nginx配置文件
编辑 nginx/conf.d/default.conf
:
# 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:
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镜像
# 在项目根目录下执行 docker build -t my-nginx-ssl:v1 .
4.2 运行容器
docker run -d \ --name my-nginx-ssl \ -p 80:80 \ -p 443:443 \ my-nginx-ssl:v1
4.3 验证配置
检查容器是否正常运行:
docker ps
查看容器日志:
docker logs my-nginx-ssl
测试HTTPS连接:
curl -k https://localhost
4.4 成功访问
ps:可以直接使用 https://ip+端口 如果使用域名要先在hosts文件中添加
五、常见问题解决
5.1 证书不受信任警告
在使用自签名证书时,浏览器会显示证书不受信任的警告,这是正常的。你可以:
在开发环境中,点击"高级"然后"继续前往"(具体文字根据浏览器不同可能有所差异)将证书添加到系统的受信任证书存储中在生产环境中使用受信任的CA机构颁发的证书 5.2 无法访问HTTPS
如果无法访问HTTPS站点,请检查:
端口映射是否正确:
docker port my-nginx-ssl
防火墙是否开放443端口:
# Linux系统 sudo ufw status # 如果需要开放端口 sudo ufw allow 443
证书文件权限是否正确:
# 进入容器检查 docker exec -it my-nginx-ssl bash ls -l /etc/nginx/ssl/
5.3 配置测试
在应用到生产环境之前,可以使用以下命令测试Nginx配置:
# 进入容器 docker exec -it my-nginx-ssl bash # 测试Nginx配置 nginx -t
六、安全建议
- 定期更新证书
- 使用强密码算法
- 启用HTTP/2
- 配置适当的SSL会话缓存
- 考虑启用HSTS
- 定期更新Nginx版本以修复安全漏洞
七、维护建议
证书更新
# 生成新证书 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 nginx -s reload
日志检查
# 查看访问日志 tail -f /var/log/nginx/access.log # 查看错误日志 tail -f /var/log/nginx/error.log
总结
- 生成自签名SSL证书
- 配置Nginx支持HTTPS
- 使用Docker部署HTTPS服务
- 常见问题的解决方法
- 维护操作
自签名证书适用于开发和测试环境。在生产环境中,建议使用受信任的CA机构颁发的证书。
到此这篇关于在Docker环境下为Nginx配置HTTPS的文章就介绍到这了,更多相关Docker Nginx配置HTTPS内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Docker中容器数据卷(Data Volume)和数据管理详解
本文主要给大家介绍了关于Docker中容器数据卷(Data Volume)和数据管理的相关资料,文中介绍的很详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。2017-02-02利用nexus作为私库进行代理docker,进行上传和下载镜像操作
这篇文章主要介绍了利用nexus作为私库进行代理docker,进行上传和下载镜像操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-11-11docker下迁移elasticsearch问题以及解决方案
文章描述了如何将Elasticsearch数据从一个服务器迁移到另一个服务器,包括数据挂载、版本一致性、启动命令的匹配以及可能遇到的权限和节点故障问题的解决方法2024-11-11docker搭建php+nginx+swoole+mysql+redis环境的方法
这篇文章主要介绍了docker搭建php+nginx+swoole+mysql+redis环境的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-03-03
最新评论