Docker 实战系列(四):基于 Nginx 的 HTTPS 反向代理部署篇

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 网关等系统。

📬 如果你喜欢这类深入浅出的技术解析,欢迎点赞 + 收藏 + 转发支持我继续创作!欢迎留言,我们下期见!
📣 更多原创内容、技术干货,欢迎关注「键上江湖」公众号,与你一键相逢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

derek2026

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值