搭建 Nginx HTTPS(Docker 方式)
·
1、docker-compose版本需要大于等于1.29
# 卸载旧版
sudo rm /usr/local/bin/docker-compose
# 下载新版(v1 最后版本是 1.29.2,但建议直接用 V2)
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋权
sudo chmod +x /usr/local/bin/docker-compose
# 验证
docker-compose --version #必须≥1.29版本
2、创建项目目录
mkdir -p /opt/compose_https/{nginx,ssl/private,ssl/certs,wwwroot}
3、创建自签名证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout ssl/nginx.key \
-out ssl/nginx.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/CN=localhost"
#自动填写信息,无交互。证书保存在 ssl/ 目录。
验证证书文件是否生成成功
ls -l /opt/compose_https/ssl/private
ls -l /opt/compose_https/ssl/certs
4、项目架构图
/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 访问效果)
5、编写 docker-compose.yml(服务编排核心)
cd /opt/compose_https/
vim docker-compose.yml
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:ro
restart: always # 容器重启策略(always 表示容器退出后自动重启,确保服务稳定)
networks:
- nginx-net # 自定义网络(隔离容器网络,增强安全性)
# 定义自定义网络(桥接模式,默认即可)
networks:
nginx-net:
driver: bridge
6、编写 Nginx 核心配置(nginx.conf)
cd /opt/compose_https/nginx/
vim nginx.conf
# 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 请求重定向到 HTTPS
server {
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;
}
}
}
7、准备测试静态页面(验证访问效果)
cd /opt/compose_https/wwwroot
vim index.html
<!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>
8、启动 Nginx 容器
cd /opt/compose_https/
# -d 表示后台启动容器( detached 模式)
docker compose up -d
启动后,执行以下命令验证容器状态:
# 查看容器是否正常运行(状态应为 Up)
docker compose ps
# 若状态异常,查看日志排查问题(关键!)
docker compose logs nginx-https
9、验证 HTTPS 访问
方式 1:本地命令行验证(服务器内部测试)
# 测试 HTTP 重定向(应返回 301 重定向到 HTTPS)
curl -I http://localhost
# 测试 HTTPS 访问(自签名证书需加 -k 忽略证书验证)
curl -k https://localhost
#### 方式 2:浏览器访问(外部机器测试)
在本地电脑浏览器输入 `https://服务器IP`(如 `https://192.168.10.160`)


更多推荐

所有评论(0)