如何在Docker环境下为Nginx配置HTTPS

 更新时间:2024年11月18日 14:40:53   作者:lzz的编码时刻  
如何在Docker环境下为Nginx配置HTTPS,使用自签名证书实现加密通信,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!
如果你想靠AI翻身,你先需要一个靠谱的工具!

前言

配置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 验证配置

检查容器是否正常运行:

查看容器日志:

1
docker logs my-nginx-ssl

测试HTTPS连接:

1
curl -k https://localhost

4.4 成功访问

ps:可以直接使用 https://ip+端口 如果使用域名要先在hosts文件中添加

五、常见问题解决

5.1 证书不受信任警告

在使用自签名证书时,浏览器会显示证书不受信任的警告,这是正常的。你可以:

在开发环境中,点击"高级"然后"继续前往"(具体文字根据浏览器不同可能有所差异)将证书添加到系统的受信任证书存储中在生产环境中使用受信任的CA机构颁发的证书 5.2 无法访问HTTPS

如果无法访问HTTPS站点,请检查:

端口映射是否正确:

1
docker port my-nginx-ssl

防火墙是否开放443端口:

1
2
3
4
# Linux系统
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配置
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
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机构颁发的证书。

到此这篇关于在Docker环境下为Nginx配置HTTPS的文章就介绍到这了,更多相关Docker Nginx配置HTTPS内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/weixin_45970964/article/details/143705972

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • Docker容器镜像加载及底层基本原理深入解析

    Docker容器镜像加载及底层基本原理深入解析

    这篇文章主要为大家介绍了Docker容器镜像加载及底层基本原理深入分析,让大家能够有更深入的理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Docker自动部署Apache Tomcat的方法

    Docker自动部署Apache Tomcat的方法

    这篇文章主要介绍了Docker自动部署Apache Tomcat的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • centos搭建部署docker环境的详细步骤

    centos搭建部署docker环境的详细步骤

    Docker 将程序与程序的运行环境打包在一起,从而避免了复杂的环境配置,下面这篇文章主要给大家介绍了关于centos搭建部署docker环境的详细步骤,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 手把手带大家通过Docker部署前后端分离项目(亲测可用)

    手把手带大家通过Docker部署前后端分离项目(亲测可用)

    近年来前后端分离已经成为中大型软件项目开发的最佳实践,下面这篇文章主要给大家介绍了关于通过Docker部署前后端分离项目的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 清理或删除docker无用镜像的操作方法

    清理或删除docker无用镜像的操作方法

    这篇文章主要介绍了清理或删除docker无用镜像的操作方法,清除docker无用镜像首先查看docker占用的资源,只删除那些未被使用的资源,文中给大家补充介绍了docker 批量删除无用的容器或镜像的方法,感兴趣的朋友一起看看吧
    2023-01-01
  • Docker配置阿里云镜像加速pull的实现

    Docker配置阿里云镜像加速pull的实现

    这篇文章主要介绍了Docker配置阿里云镜像加速pull的实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • IDEA集成Docker实现一键部署全过程

    IDEA集成Docker实现一键部署全过程

    本文详细介绍了如何在IntelliJ IDEA中集成Docker并实现一键部署代码的步骤,包括安装Docker、配置服务器、IDEA配置、添加Dockerfile、运行配置以及一键部署
    2024-11-11
  • docker+Nginx部署前端项目的详细过程记录

    docker+Nginx部署前端项目的详细过程记录

    docker的出现解决了我们很多问题,让我们避免陷入各种依赖安装的痛苦中,下面这篇文章主要给大家介绍了关于docker+Nginx部署前端项目的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-10-10
  • Linux下Docker及portainer相关配置方法

    Linux下Docker及portainer相关配置方法

    本文以CentOS 7为例,安装docker CE版本,docker有两种版本,社区版本CE和企业版本EE,通过实例代码给大家介绍了Linux下Docker及portainer相关配置方法,感兴趣的朋友跟随小编一起看看吧
    2019-06-06
  • 如何使用Docker恢复Mysql8备份的Data数据

    如何使用Docker恢复Mysql8备份的Data数据

    这篇文章主要介绍了使用Docker恢复Mysql8备份的Data数据,下面小编给大家讲解下操作方法,对Docker恢复Mysql数据备份相关知识感兴趣的朋友跟随小编一起看看吧
    2022-11-11

最新评论