您的位置:首页 >FastAPI配置Nginx反向代理SSL加密教程
发布于2026-03-02 阅读(0)
扫一扫,手机访问

在构建Web应用时,确保数据传输的安全性至关重要。对于FastAPI这类后端服务,直接在应用层(如使用Uvicorn的ssl_keyfile和ssl_certfile参数)配置SSL虽然可行,但通常会导致CORS问题,并且将SSL管理的复杂性引入到应用代码中。更推荐的做法是使用专业的反向代理服务器(如Nginx)来处理SSL终止。
Nginx作为反向代理有以下优势:
本教程将展示如何利用Nginx为FastAPI后端和React前端配置SSL,并通过Docker Compose进行容器化部署。
Nginx的核心作用是将外部的HTTPS请求转发到内部的HTTP服务。这需要配置upstream块定义后端服务,以及server块来监听HTTP和HTTPS端口。
upstream块定义了一组后端服务器,Nginx会将请求代理到这些服务器。为了区分前端和后端服务,我们为它们分别定义了upstream。
# nginx.conf
events {
worker_connections 1024; # 定义同时处理的最大连接数
}
http {
# 后端服务(FastAPI)
upstream back {
# 注意:这里使用服务名作为主机名,Docker Compose会自动解析
server back.mysite.ru:8000;
}
# 前端服务(ReactJS)
upstream front {
# 注意:这里使用服务名作为主机名,Docker Compose会自动解析
server mysite.ru:80;
}
# ... 其他server块配置 ...
}在Docker Compose环境中,back.mysite.ru和mysite.ru通常对应于Docker Compose文件中定义的backend和frontend服务名称,或者你为它们在DNS中配置的子域名。8000和80是这些服务在容器内部监听的端口。
server块定义了Nginx如何处理特定域名或IP地址的请求。我们需要为每个服务(后端和前端)配置HTTP(端口80)和HTTPS(端口443)的server块。
HTTP到HTTPS的重定向(可选但推荐) 为了强制所有流量通过HTTPS,可以配置一个HTTP server块来将请求重定向到HTTPS。
# 后端服务的HTTP配置 (重定向到HTTPS)
server {
listen 80;
server_name back.mysite.ru;
# 将所有HTTP请求永久重定向到HTTPS
return 301 https://$host$request_uri;
}
# 前端服务的HTTP配置 (重定向到HTTPS)
server {
listen 80;
server_name mysite.ru;
# 将所有HTTP请求永久重定向到HTTPS
return 301 https://$host$request_uri;
}HTTPS配置
HTTPS配置是核心部分,它涉及SSL证书的加载和请求的代理。
# 后端服务的HTTPS配置
server {
listen 443 ssl; # 监听443端口,启用SSL
server_name back.mysite.ru; # 对应的域名
# SSL证书路径,这些证书通常由Certbot生成
ssl_certificate /etc/letsencrypt/live/back.mysite.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/back.mysite.ru/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/back.mysite.ru/chain.pem;
location / {
proxy_pass http://back; # 将请求代理到前面定义的upstream "back"
proxy_set_header Host $host; # 转发原始Host头
proxy_set_header X-Real-IP $remote_addr; # 转发客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 转发代理链IP
proxy_set_header X-Forwarded-Proto https; # 告知后端服务原始请求协议是HTTPS
}
}
# 前端服务的HTTPS配置
server {
listen 443 ssl;
server_name mysite.ru;
ssl_certificate /etc/letsencrypt/live/mysite.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mysite.ru/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/mysite.ru/chain.pem;
location / {
proxy_pass http://front; # 代理到upstream "front"
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}完整的nginx.conf示例:
events {
worker_connections 1024;
}
http {
# 后端服务
upstream back {
server backend:8000; # 使用Docker Compose服务名
}
# 前端服务
upstream front {
server frontend:80; # 使用Docker Compose服务名
}
# 后端 HTTP -> HTTPS 重定向
server {
listen 80;
server_name back.mysite.ru;
return 301 https://$host$request_uri;
}
# 后端 HTTPS 配置
server {
listen 443 ssl;
server_name back.mysite.ru;
ssl_certificate /etc/letsencrypt/live/back.mysite.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/back.mysite.ru/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/back.mysite.ru/chain.pem;
location / {
proxy_pass http://back;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
# 前端 HTTP -> HTTPS 重定向
server {
listen 80;
server_name mysite.ru;
return 301 https://$host$request_uri;
}
# 前端 HTTPS 配置
server {
listen 443 ssl;
server_name mysite.ru;
ssl_certificate /etc/letsencrypt/live/mysite.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mysite.ru/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/mysite.ru/chain.pem;
location / {
proxy_pass http://front;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
}注意事项:
为了将Nginx与FastAPI和React应用一起部署,我们需要更新docker-compose.yml文件。
首先,创建一个简单的Nginx Dockerfile,用于构建Nginx镜像并加载自定义配置。
# ./nginx/Dockerfile FROM nginx:stable-alpine # 基于轻量级Nginx镜像 COPY nginx.conf /etc/nginx/nginx.conf # 将自定义的nginx.conf复制到容器内
在docker-compose.yml中添加Nginx服务,并确保它能访问证书文件和后端服务。
# docker-compose.yml
version: '3.7'
services:
frontend:
container_name: "frontend"
build:
context: ./frontend
stop_signal: SIGTERM
ports:
- "80:80" # 前端应用自身监听80端口
volumes:
- ./uploads:/app/uploads
networks:
- good_network
depends_on:
- backend
backend:
container_name: "backend"
build:
context: ./backend
stop_signal: SIGTERM
ports:
- "8000:8000" # 后端应用自身监听8000端口
networks:
- good_network
volumes:
- ./uploads:/app/uploads
depends_on:
- postgres
postgres:
container_name: "postgres"
image: postgres:16.0
healthcheck:
test: [ "CMD-SHELL", "pg_isready -d sugar -U postgres" ]
interval: 5s
timeout: 5s
retries: 5
start_period: 5s
restart: unless-stopped
ports:
- "5432:5432"
volumes:
- ./postgres_data:/var/lib/postgresql/data
networks:
- good_network
nginx: # 新增Nginx服务
build: ./nginx # 基于上面创建的Dockerfile构建
ports:
- "80:80" # 映射宿主机的80端口到Nginx容器的80端口
- "443:443" # 映射宿主机的443端口到Nginx容器的443端口
volumes:
# 挂载宿主机的Let's Encrypt证书目录,确保Nginx能访问证书文件
- /etc/letsencrypt:/etc/letsencrypt:ro # 只读挂载
depends_on:
- frontend # 确保前端服务启动后Nginx再启动
- backend # 确保后端服务启动后Nginx再启动
networks:
- good_network # 与其他服务在同一网络
networks:
good_network:
volumes:
postgres_data:关键点说明:
SSL证书通常通过Let's Encrypt和Certbot工具获取。在宿主机上运行Certbot,它会自动生成并放置证书文件在/etc/letsencrypt/live/your_domain/目录下。
Certbot安装与使用示例(宿主机操作):
sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx -d mysite.ru -d back.mysite.ru
如果Nginx在Docker容器中运行,或者你不想让Certbot自动修改Nginx配置,可以使用webroot或standalone模式。例如,使用webroot模式,你需要指定一个Web根目录让Certbot放置验证文件:
sudo certbot certonly --webroot -w /path/to/your/frontend/static -d mysite.ru -d back.mysite.ru
或者使用standalone模式(需要临时停止占用80/443端口的服务):
sudo certbot certonly --standalone -d mysite.ru -d back.mysite.ru
确保证书文件生成后,Nginx容器通过卷挂载能够访问到它们。
通过Nginx作为反向代理,我们成功地为FastAPI后端和React前端应用配置了SSL加密,并利用Docker Compose实现了服务的容器化部署和管理。
总结:
注意事项:
通过上述步骤,你的FastAPI和React应用将能够通过安全的HTTPS连接进行通信,为用户提供更可靠的服务。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9