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 通常是上游服务响应超时,比如后端处理太慢。