0%

FastAPI自学教程(79) - HTTPS部署指南

1.基础配置方法

1
2
3
4
5
6
7
8
9
10
11
import ssl
from fastapi import FastAPI
import uvicorn

app = FastAPI()

ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain("cert.pem", keyfile="key.pem")

if __name__ == "__main__":
uvicorn.run("main:app", ssl=ssl_context)
  • 使用OpenSSL生成自签名证书(开发测试):
    1
    openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
  • 通过ssl.SSLContext加载证书文件,生产环境建议使用Let’s Encrypt证书
  • 流程图展示HTTPS请求处理:
    graph LR
      A[客户端] --> B[TLS握手]
      B --> C{证书验证}
      C -->|通过| D[加密通信]
      C -->|失败| E[连接终止]

2.HTTPS核心原理

2.1 TLS终止代理

1
2
3
4
5
6
7
8
9
10
11
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;

location / {
proxy_pass http://localhost:8000;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
  • Nginx负责SSL/TLS加解密,转发HTTP请求到FastAPI应用
  • 必须设置X-Forwarded-Proto头让应用识别原始协议

2.2 证书管理机制

证书类型 有效期 适用场景
自签名证书 自定义 开发测试环境
Let’s Encrypt 90天 生产环境(自动续期)
商业CA证书 1-2年 企业级应用

3.生产环境建议

  1. 部署架构优化

    1
    gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
    • 使用Gunicorn管理Uvicorn worker进程提升并发能力
  2. 安全增强配置

    1
    2
    add_header Strict-Transport-Security "max-age=31536000" always;
    return 301 https://$host$request_uri;

    强制HTTP跳转HTTPS并启用HSTS

  3. 容器化部署

    • Nginx容器需通过宿主机IP访问FastAPI服务(非127.0.0.1)
    • 使用Docker Compose编排证书卷挂载
  4. 监控与维护

    • 配置Certbot自动续期Let’s Encrypt证书
    • 监控证书有效期(Alertmanager+Prometheus)

4.注意事项

  • 开发环境与生产环境的证书管理需隔离,禁止自签名证书上线
  • 启用HTTPS后需同步更新API文档中的端点协议
  • WebSocket协议需使用wss://前缀建立安全连接

测试命令示例:

1
2
3
4
5
# 开发环境启动
uvicorn main:app --ssl-certfile cert.pem --ssl-keyfile key.pem

# 生产环境证书续期
certbot renew --quiet --post-hook "systemctl reload nginx"