文章列表
2 分钟阅读

Nginx 反向代理入门:静态文件、HTTPS 和 Web 服务转发

更新说明:新增 Nginx 部署基础文章。


系列:容器部署基础

第 8 / 10 篇

  1. Docker 安装与使用教程:从零部署第一个容器服务
  2. Dockerfile 入门:构建自己的应用镜像
  3. Docker Compose 使用指南:管理多容器服务
  4. Docker 数据卷与备份:数据库容器怎么保护数据
  5. Docker 网络与端口映射:容器之间怎么通信
  6. Docker 日志和排障:logs、exec、inspect、stats
  7. 用 Docker 部署一个 Python Web 项目
  8. Nginx 反向代理入门:静态文件、HTTPS 和 Web 服务转发
  9. HTTPS 和证书部署指南:Let’s Encrypt、Cloudflare、Nginx 怎么配
  10. Docker 生产环境部署注意事项:镜像、日志、数据卷和健康检查

很多 Python Web 项目上线时,前面都会放一个 Nginx。它负责接收浏览器请求,再把动态请求转发给后端服务,也可以直接处理静态文件和 HTTPS。

如果你已经看过 Python Web 项目部署指南:Gunicorn、Uvicorn、Nginx 和 Docker,这篇可以当作 Nginx 部分的展开。

反向代理解决什么问题

应用服务通常只监听本机端口,比如 127.0.0.1:8000。Nginx 监听 80 或 443,再把请求转发过去。

browser -> nginx:443 -> app:8000

这样有几个好处:

  • 统一处理 HTTPS
  • 隐藏后端真实端口
  • 静态文件不用交给 Python 进程
  • 可以设置请求大小、超时和缓存

一个最小配置

先从能稳定转发的配置开始,不要一上来就加缓存、限流和复杂 rewrite。最小配置的目标是让请求头正确传给后端,并且 Nginx 能清楚地知道要把请求交给哪个本地端口。

app.conf
server {
listen 80;
server_name app.internal;
location / {
proxy_pass http://127.0.0.1:8000;
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;
}
}

检查配置:

Terminal window
nginx -t

重新加载:

Terminal window
systemctl reload nginx

静态文件怎么放

静态文件可以让 Nginx 直接返回。

location /static/ {
alias /srv/app/static/;
access_log off;
expires 7d;
}

注意 alias 目录最后的 /。路径写错时,最常见表现是 404。

常见排查点

502 一般说明 Nginx 找不到后端服务。先看后端端口:

Terminal window
ss -lntp | grep 8000

再看 Nginx 错误日志:

Terminal window
journalctl -u nginx -n 100 --no-pager

如果是 Docker 部署,还要确认容器网络和端口映射,可以接着看 Docker 网络与端口映射:容器之间怎么通信

不要忽略请求头

X-Forwarded-Proto 会影响后端判断当前请求是不是 HTTPS。很多登录回调、跳转链接、CSRF 判断都依赖它。

如果 Django 或 FastAPI 生成的 URL 协议不对,先检查 Nginx 是否传了转发头,再检查应用是否信任这些头。

总结

Nginx 配置不需要一开始写很复杂。先让转发、静态文件和日志正常,再逐步加 HTTPS、缓存和限流。排查时先看后端端口,再看 Nginx 错误日志,通常能很快定位问题。

后续可以继续看 HTTPS 和证书部署指南:Let’s Encrypt、Cloudflare、Nginx 怎么配。如果服务已经容器化,也建议配合 Docker 生产环境部署注意事项:镜像、日志、数据卷和健康检查 一起检查。