当前位置: 首页 > news >正文

Docker(四)—— 使用 Docker 搭建 Nginx 并实现 HTTPS 访问

文章目录

  • 前言
  • 一、环境准备
    • 1.1 关闭防火墙和 SELinux
    • 1.2 安装 Docker 和 Docker Compose
    • 1.3 创建项目目录
    • 1.4 创建自签名证书(HTTPS 核心依赖)
    • 1.5 项目架构图
  • 二、核心配置文件编写
    • 2.1 编写 docker-compose.yml(服务编排核心)
    • 2.2 编写 Nginx 核心配置(nginx.conf)
    • 2.3 准备测试静态页面(验证访问效果)
  • 三、启动服务并验证 HTTPS 访问
    • 3.1 启动 Nginx 容器
    • 3.2 验证 HTTPS 访问
      • 方式 1:本地命令行验证(服务器内部测试)
      • 方式 2:浏览器访问(外部机器测试)
  • 总结

前言

在当前的 Web 服务部署中,HTTPS 已成为保障数据传输安全的标配,而 Docker 凭借其轻量、可移植的特性,极大简化了服务的部署与运维流程。

本文将以 CentOS 7.9 系统为基础,详细讲解如何通过 Docker 搭建 Nginx 服务并配置 HTTPS 访问,从环境初始化到服务验证,每一步均提供完整的命令与配置示例,同时兼顾测试环境的便捷性与生产环境的安全性,适合刚接触 Docker 与 Nginx 的开发者或运维人员参考学习。


一、环境准备

1.1 关闭防火墙和 SELinux

# 关闭防火墙(临时生效,重启后失效)
systemctl stop firewalld
# 禁止防火墙开机自启(永久生效)
systemctl disable firewalld# 临时关闭 SELinux(无需重启,立即生效)
setenforce 0
# 永久关闭 SELinux(需重启服务器生效,修改配置文件)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

验证关闭效果:

  • 防火墙:systemctl status firewalld 显示 inactive (dead)
  • SELinux:getenforce 显示 Permissive(临时关闭)或重启后显示 Disabled(永久关闭)

1.2 安装 Docker 和 Docker Compose

具体步骤参考:

  • Docker(一)—— Docker入门到精通:从基础概念到容器管理
  • Docker(三)—— Docker Compose 编排与 Harbor 私有仓库实战指南

验证安装:执行 docker -vdocker compose version(CentOS 7 需确保 Docker Compose 版本 ≥ 1.29,若用 docker-compose 命令需确认已安装),能正常输出版本信息即安装成功。

1.3 创建项目目录

为了让项目结构更清晰(便于后续维护配置、证书、静态资源),先创建统一的工程目录:

# -p 确保父目录不存在时自动创建,ssl 目录用于存放 HTTPS 证书
mkdir -p /opt/compose_https/{nginx,ssl/private,ssl/certs,wwwroot}

1.4 创建自签名证书(HTTPS 核心依赖)

HTTPS 访问需要证书(生产环境推荐从 Let’s Encrypt 等权威机构申请免费证书,测试环境可用自签名证书)。这里用 OpenSSL 生成自签名证书,CentOS 7.9 默认已安装 OpenSSL,执行以下命令:

# 1. 生成 RSA 私钥(2048位,无加密,避免每次启动 Nginx 输入密码)
# key 文件是服务器端私钥,需妥善保管,不可泄露
openssl genpkey -algorithm RSA -out /opt/compose_https/ssl/private/nginx-selfsigned.key -pkeyopt rsa_keygen_bits:2048# 2. 生成证书请求文件(CSR)
# 执行后会提示输入信息(如国家、组织、域名等),其中「Common Name」需与访问域名一致(测试可填服务器 IP)
openssl req -new -key /opt/compose_https/ssl/private/nginx-selfsigned.key -out /opt/compose_https/ssl/certs/nginx-selfsigned.csr
# 在执行过程中需填写以下信息(示例):
- Country Name(国家代码):CN
- State or Province Name(省/州):Beijing
- Locality Name(城市):Beijing
- Organization Name(组织名称):MyCompany Ltd
- Organizational Unit Name: (部门名):IT Department(可留空)
- Common Name(域名):example.com
- Email Address(邮箱):admin@example.com# 3. 生成自签名证书(CRT),有效期设为 365 天
openssl x509 -req -days 365 -in /opt/compose_https/ssl/certs/nginx-selfsigned.csr -signkey /opt/compose_https/ssl/private/nginx-selfsigned.key -out /opt/compose_https/ssl/certs/nginx-selfsigned.crt# 4. 验证证书文件是否生成成功
ls -l /opt/compose_https/ssl/private
ls -l /opt/compose_https/ssl/certs
# 正常会输出 nginx-selfsigned.key(private目录)和 nginx-selfsigned.csr、nginx-selfsigned.crt(certs目录)

关键说明:自签名证书不被浏览器默认信任,访问时会提示「不安全」,测试环境可忽略并强制信任;生产环境必须用权威机构签发的证书(如 Let’s Encrypt 可通过 Certbot 自动申请和续期)。

在这里插入图片描述

1.5 项目架构图

本次 Docker 部署 Nginx + HTTPS 的项目结构如下(清晰区分配置、证书、静态资源目录,便于后期维护):

/opt/compose_https/          # 工程根目录
├── docker-compose.yml       # Docker Compose 核心编排文件(定义服务、端口、挂载等)
├── nginx/                   # Nginx 服务相关目录
│   └── nginx.conf           # Nginx 核心配置文件(HTTPS 配置、反向代理、静态资源映射等)
├── ssl/                     # HTTPS 证书目录
│   ├── private/             # 存放私钥(安全敏感文件)
│   │   └── nginx-selfsigned.key  # 服务器私钥(不可泄露)
│   └── certs/               # 存放证书文件
│       ├── nginx-selfsigned.csr  # 证书请求文件(生成证书时用,可删除)
│       └── nginx-selfsigned.crt  # 自签名证书(或权威机构证书)
└── wwwroot/                 # Nginx 静态资源目录(挂载到容器内,修改本地文件即可生效)└── index.html           # 测试用静态页面(验证 HTTPS 访问效果)

二、核心配置文件编写

2.1 编写 docker-compose.yml(服务编排核心)

/opt/compose_https/ 目录下创建 docker-compose.yml 文件,用于定义 Nginx 容器的启动参数(端口、挂载、重启策略等):

version: '3'  # Compose 版本,需与 Docker 版本兼容(CentOS 7.9 推荐 3.8 及以下)services:nginx-https:  # 服务名(自定义,便于后续操作)image: nginx:latest  # 使用官方最新版 Nginx 镜像ports:- "80:80"    # 映射 HTTP 端口(80 是 HTTP 默认端口,用于重定向到 HTTPS)- "443:443"  # 映射 HTTPS 端口(443 是 HTTPS 默认端口,核心访问端口)volumes:# 挂载 Nginx 配置文件(本地配置修改后,容器内实时生效,无需重启镜像)- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro# 挂载静态资源目录(本地 wwwroot 目录映射到容器内 Nginx 默认静态目录)- ./wwwroot:/usr/share/nginx/html:rw# 挂载 HTTPS 证书(ro 表示只读,防止容器内误修改证书)- ./ssl/certs:/etc/nginx/ssl/certs:ro- ./ssl/private:/etc/nginx/ssl/private:rorestart: always  # 容器重启策略(always 表示容器退出后自动重启,确保服务稳定)networks:- nginx-net  # 自定义网络(隔离容器网络,增强安全性)# 定义自定义网络(桥接模式,默认即可)
networks:nginx-net:driver: bridge

配置说明:

  • volumes 挂载逻辑:本地路径:容器内路径:权限ro(read-only)只读,rw(read-write)可读写;
  • 选用 nginx:latest 镜像,确保使用官方最新稳定版本;
  • restart: always 确保服务器重启或容器意外退出后,Nginx 服务能自动恢复。

2.2 编写 Nginx 核心配置(nginx.conf)

/opt/compose_https/nginx/ 目录下创建 nginx.conf 文件,核心配置 HTTP 重定向到 HTTPSHTTPS 服务端参数

# Nginx 全局配置( worker 进程数建议设为服务器 CPU 核心数,用 auto 自动适配)
worker_processes auto;
error_log /var/log/nginx/error.log warn;  # 错误日志路径
pid /var/run/nginx.pid;                  # 进程 PID 文件events {worker_connections 1024;  # 每个 worker 进程最大连接数(根据服务器性能调整)
}# HTTP 服务配置(仅用于将 HTTP 请求重定向到 HTTPS)
http {include       /etc/nginx/mime.types;  # 引入 MIME 类型映射(支持不同文件格式)default_type  application/octet-stream;# 日志格式定义(记录访问日志,便于排查问题)log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;  # 访问日志路径sendfile        on;  # 开启高效文件传输模式(减少 IO 开销)keepalive_timeout  65;  # 客户端连接超时时间(秒)# HTTP 服务端(80 端口):所有 HTTP 请求重定向到 HTTPSserver {listen       80;server_name  localhost;  # 测试用 localhost,生产环境替换为实际域名(如 example.com)# 核心重定向规则:301 永久重定向到 HTTPS 地址return 301 https://$host$request_uri;}# HTTPS 服务端(443 端口):核心服务配置server {listen       443 ssl;  # 监听 443 端口并启用 SSL(HTTPS)server_name  localhost;  # 同上,生产环境替换为实际域名# 配置 HTTPS 证书路径(容器内路径,对应本地挂载的证书)ssl_certificate     /etc/nginx/ssl/certs/nginx-selfsigned.crt;ssl_certificate_key /etc/nginx/ssl/private/nginx-selfsigned.key;# 配置 SSL 协议和加密套件(禁用不安全的协议,如 SSLv2、SSLv3)ssl_protocols TLSv1.2 TLSv1.3;  # 仅支持 TLS 1.2/1.3(安全性更高)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";ssl_prefer_server_ciphers on;  # 优先使用服务端定义的加密套件# 静态资源映射(对应本地挂载的 wwwroot 目录)location / {root   /usr/share/nginx/html;  # 静态资源根目录(容器内路径)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;}}
}

关键配置说明:

  • ssl_protocols TLSv1.2 TLSv1.3:禁用老旧的 SSL 协议(存在安全漏洞),仅保留 TLS 1.2/1.3;
  • return 301 https://$host$request_uri:强制将所有 HTTP 请求重定向到 HTTPS,实现「全站 HTTPS」;
  • 若需配置反向代理(如代理后端 Tomcat/Node.js 服务),可在 location / 中添加 proxy_pass http://后端服务IP:端口;(需确保后端服务与 Nginx 容器在同一网络)。

2.3 准备测试静态页面(验证访问效果)

/opt/compose_https/wwwroot/ 目录下创建 index.html 文件,用于测试 HTTPS 访问是否生效:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>Docker Nginx HTTPS 测试</title><style>body {text-align: center;margin-top: 100px;font-family: "Microsoft YaHei";}h1 {color: #2c3e50;}.https-tag {color: #27ae60;font-size: 24px;font-weight: bold;}</style>
</head>
<body><h1>恭喜!Docker Nginx HTTPS 部署成功</h1><div class="https-tag">✓ 已启用 HTTPS 加密访问</div><p>服务器环境:CentOS 7.9 + Docker + Nginx</p>
</body>
</html>

三、启动服务并验证 HTTPS 访问

3.1 启动 Nginx 容器

进入工程根目录,通过 Docker Compose 启动服务:

cd /opt/compose_https/
# -d 表示后台启动容器( detached 模式)
docker compose up -d

启动后,执行以下命令验证容器状态:

# 查看容器是否正常运行(状态应为 Up)
docker compose ps# 若状态异常,查看日志排查问题(关键!)
docker compose logs nginx-https

在这里插入图片描述

常见启动失败原因:

  • 端口被占用:执行 netstat -tuln | grep 80netstat -tuln | grep 443,杀死占用端口的进程;
  • 配置文件错误:nginx.conf 语法错误,可通过 docker run --rm -v $(pwd)/nginx/nginx.conf:/etc/nginx/nginx.conf nginx:latest nginx -t 验证配置语法。

3.2 验证 HTTPS 访问

方式 1:本地命令行验证(服务器内部测试)

通过 curl 命令测试 HTTPS 连接和重定向是否生效:

# 测试 HTTP 重定向(应返回 301 重定向到 HTTPS)
curl -I http://localhost# 测试 HTTPS 访问(自签名证书需加 -k 忽略证书验证)
curl -k https://localhost
  • curl -I http://localhost 返回 Location: https://localhost/,说明 HTTP 重定向正常;
  • curl -k https://localhost 能输出 index.html 的 HTML 内容,说明 HTTPS 服务正常。

在这里插入图片描述
在这里插入图片描述

方式 2:浏览器访问(外部机器测试)

在本地电脑浏览器输入 https://服务器IP(如 https://192.168.10.14):

  • 首次访问会提示「您的连接不是私密连接」(因自签名证书不被信任),点击「高级」→「继续访问」(测试环境忽略);
  • 若能看到 index.html 中的「Docker Nginx HTTPS 部署成功」页面,且浏览器地址栏显示「小锁」图标(可能带感叹号,自签名证书正常),则说明 HTTPS 访问成功。

在这里插入图片描述


总结

本文通过 Docker Compose 实现了 Nginx 的快速部署,并基于自签名证书配置了 HTTPS 访问,核心步骤可概括为:

  1. 环境准备(关闭防火墙/SELinux、Docker 环境安装、目录创建);
  2. 证书生成(自签名或权威证书);
  3. 配置编写(Compose 编排、Nginx 核心配置);
  4. 服务启动与验证(浏览器/命令行测试)。

本方案具有「部署快、可移植性强、维护成本低」的特点,适合测试环境快速搭建或生产环境基础 HTTPS 服务部署。

http://www.dtcms.com/a/449382.html

相关文章:

  • 浏览器中的隐藏IDE: Elements (元素) 面板
  • 【JVM】实战篇(一)
  • 住房城市建设部门户网站一件代发48个货源网站
  • 宣武深圳网站建设公司下关网站建设
  • 电商的网站有几个如何做高校的网站版面设计
  • 蚁群算法解决TSP问题
  • 数据库丢失但没备份过?救星:二进制日志
  • 【C++实战(74)】深入C++安全编程:密码学实战之旅
  • inbound 概念及题目
  • UNet改进(43):SaFA-MS-UNet如何提升图像分割精度?
  • 网站建设中的智能元素凡科建站代理商登录
  • Elasticsearch 之分页查询
  • apache hop 不能处理clickhouse 数组格式怎么办?
  • 网站建设 网站设计php语言网站开发公司北京
  • 代码审计
  • 制作网站需要钱吗天津网址
  • cursor使用之没有正常的编辑器中的运行箭头
  • 建设网站优化创意网站建设价格多少
  • soular入门到实战(3) - 如何实现TikLab工具链统一登录认证
  • Python图形界面——海龟绘图
  • 《强化学习数学原理》学习笔记9——值迭代算法
  • 网站建设 统一标准体系什么是网络销售
  • 网站开发语言有哪几种临沂专业网站制作
  • 花店网站建设方案网站木马文件删除
  • Bash 的基本语法总结
  • 网站怎么进行优化网站开发 英文文章
  • 自动驾驶决策规划算法(开幕式)
  • 从零起步学习Redis || 第八章:过期删除策略与内存淘汰策略详解及实战使用(LRU和LFU算法详解)
  • 自动驾驶中的传感器技术65——Navigation(2)
  • 知识体系_scala_利用scala和spark构建数据应用