Python 后端基础(十八):Nginx 怎么用,反向代理、静态资源、HTTPS 和负载均衡讲清楚
很多 Python 后端项目本地是直接访问 `localhost:8000`,但上线后一般不会让用户直接访问 Uvicorn 或 Gunicorn。
更常见的做法是:用户先访问 Nginx,Nginx 再把请求转发给后端服务。
【一、Nginx 是什么】
Nginx 是一个高性能 Web 服务器,也常用作反向代理。
常见用途:
- 反向代理后端 API。
- 托管静态资源。
- 配置 HTTPS。
- 做负载均衡。
- 做请求限流。
- 统一入口转发多个服务。
【二、什么是反向代理】
反向代理就是用户不直接访问后端服务,而是访问代理服务器。
用户浏览器
-> Nginx 80/443
-> 后端 FastAPI 8000
用户只知道域名,不需要知道后端服务端口。
配置示例:
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
【三、为什么不用后端服务直接暴露】
原因:
- Nginx 更适合处理公网流量。
- 可以统一配置 HTTPS。
- 可以转发多个后端服务。
- 可以处理静态文件。
- 可以做限流和负载均衡。
- 后端服务只需要监听内网端口。
这是一种更常见的生产部署方式。
【四、静态资源】
前端打包后的文件可以由 Nginx 提供。
location / {
root /var/www/frontend;
index index.html;
try_files $uri $uri/ /index.html;
}
后端只负责 API,前端静态文件交给 Nginx,效率更高。
【五、HTTPS 配置】
HTTPS 证书一般配置在 Nginx 层。
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
}
用户访问 HTTPS,Nginx 负责 TLS,后端服务可以继续使用内网 HTTP。
【六、负载均衡】
如果有多个后端实例:
upstream backend {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
server {
listen 80;
location /api/ {
proxy_pass http://backend;
}
}
Nginx 会把请求分发到不同实例,提高并发能力和可用性。
【七、常见请求头】
反向代理时常见配置:
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 $scheme;
这些头可以让后端知道原始请求的域名、用户 IP 和协议。
【八、常见坑】
- Nginx 转发路径多了或少了 `/`,导致接口 404。
- 后端只监听 `127.0.0.1`,但容器之间访问失败。
- 文件上传大小超过 Nginx 默认限制。
- 超时时间太短,AI 接口还没返回就 504。
- 没配置 HTTPS,登录 token 明文传输。
- 静态资源路径配置不对,前端刷新页面 404。
【九、面试常问】
1. Nginx 在后端部署中有什么作用?
Nginx 常作为统一入口,负责反向代理、静态资源、HTTPS、负载均衡、限流等,把公网请求转发给内部后端服务。
2. 正向代理和反向代理区别是什么?
正向代理代理客户端,比如公司代理服务器;反向代理代理服务端,比如用户访问 Nginx,Nginx 转发到后端服务。
3. 502 和 504 一般是什么问题?
502 通常是网关无法从上游服务获得有效响应,可能后端挂了或端口错了;504 通常是上游服务响应超时,比如后端处理太慢。