Docker 实战系列(四):基于 Nginx 的 HTTPS 反向代理部署篇
本篇内容适用于你已经有一个可运行的 Web 服务(如 Flask、FastAPI、Node.js 等),并希望通过 Nginx 实现:
✅ HTTPS 加密访问
✅ 域名映射与端口隐藏
✅ 静态资源加速与负载转发
一、目标架构
我们将搭建如下服务结构:
用户浏览器 (HTTPS 443)
↓
[ Nginx 反向代理 ]
↓
Flask Web 应用(8080)
二、准备目录结构
https-proxy-demo/
├── docker-compose.yml
├── nginx/
│ ├── nginx.conf
│ ├── certs/
│ │ ├── server.crt
│ │ └── server.key
├── app/
│ ├── Dockerfile
│ ├── app.py
│ └── requirements.txt
三、生成自签名 HTTPS 证书(测试用)
你可以用正规证书(如 Let’s Encrypt),这里为了简化流程,用 OpenSSL 创建一对自签名证书:
mkdir -p nginx/certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout nginx/certs/server.key \
-out nginx/certs/server.crt \
-subj "/CN=localhost"
四、编写 Nginx 配置(nginx/nginx.conf)
events {}
http {
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
location / {
proxy_pass http://web:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
return 301 https://$host$request_uri;
}
}
五、Flask 应用代码(app/app.py)
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello via HTTPS and Nginx!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
注意:开发阶段可直接通过 Python 应用自带的服务器(如 Django 的 runserver、Flask 的 app.run())运行,但性能极差,严禁用于生产环境, uWSGI 是 Nginx 集成 Python 应用的成熟且高效的方案,尤其在生产环境中推荐使用。
六、Flask 应用 Dockerfile(app/Dockerfile)
FROM python:3.11-slim
WORKDIR /opt/app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["python", "app.py"]
requirements.txt
flask
七、编写 docker-compose.yml
version: '3.9'
services:
web:
build: ./app
expose:
- "8080"
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/certs:/etc/nginx/certs:ro
depends_on:
- web
八、一键启动
docker compose up --build
九、测试访问
访问 HTTP
打开浏览器访问:
http://localhost
自动跳转到:
https://localhost
因为我们使用的是自签名证书,浏览器会弹出安全警告,选择“继续访问”。
如果你使用正规证书,将不会有任何安全警告。
十、实战拓展建议
| 场景 | 建议 |
|---|---|
| 绑定域名 | 替换 server_name localhost 为你的域名 |
| 证书正规化 | 使用 Let’s Encrypt + Certbot 自动申请证书 |
| 多服务代理 | 使用 location /api、/admin 等路由分别代理到不同容器 |
| 静态文件加速 | 使用 location /static 提前缓存或 gzip 压缩响应 |
| 性能调优 使用 | HTTP/2、缓存控制、连接池等优化配置 |
十一、常用 Nginx + HTTPS 问题排查
| 问题 | 解决方案 |
|---|---|
| ERR_CERT_AUTHORITY_INVALID | 使用正规证书,或安装自签名根证书 |
| 502 Bad Gateway | 检查 Flask 容器是否启动,端口是否正确 |
| 403 Forbidden | 检查 Nginx 权限配置,是否读取到文件 |
| Nginx 启动失败 | 确保配置文件路径、证书路径挂载正确 |
✅ 总结
🎯 你现在已经拥有:
- 通过 HTTPS 加密访问的安全 Web 服务
- Nginx 作为高性能反向代理
- 简洁的多容器组合部署架构
这一架构是所有现代微服务架构中最常见的组成部分,未来你还可以挂接 CDN、WAF、OAuth 网关等系统。
📬 如果你喜欢这类深入浅出的技术解析,欢迎点赞 + 收藏 + 转发支持我继续创作!欢迎留言,我们下期见!
📣 更多原创内容、技术干货,欢迎关注「键上江湖」公众号,与你一键相逢!
1395

被折叠的 条评论
为什么被折叠?



