这篇文章把 Nginx 按"能用 + 说得清 + 项目能落地"的顺序讲清楚:
- 你为什么需要 Nginx
- 反向代理到底解决什么
- 常用的 upstream 负载均衡策略怎么选
- 项目里最常见的一套前后端部署配置应该怎么写
- 线上最常见的坑(WebSocket / 超时 / 缓存 / 跨域)
1. Nginx 是什么?一句话讲清
Nginx 是一个高性能 Web 服务器与反向代理服务器,擅长处理高并发连接,常用来做:
- 静态资源服务(前端打包产物)
- 反向代理(把
/api转发到后端) - 负载均衡(多个后端实例)
- 网关能力(压缩、缓存、限流、SSL 终止)
2. Nginx 在架构里放在哪
典型的前后端分离项目部署拓扑:
- 用户浏览器 -> Nginx(公网入口)
- Nginx:
/直接返回前端静态资源/api/反向代理到后端(Spring Boot)
这样做的好处:
- 前端静态资源走 Nginx,性能稳定
- 后端只处理 API,端口不直接暴露公网
- 后续扩容只需要扩后端实例,并在 Nginx upstream 里加节点
3. 为什么 Nginx 能抗高并发
面试/博客都可以用"模型 + 关键词"讲:
- 事件驱动 + 异步非阻塞:一个 worker 可以管理大量连接
- 多路复用 :Linux 下常用
epoll - master/worker 架构:master 管理 worker,worker 处理请求
- 连接与内存管理比"1 连接 1 线程"更轻量
4. 正向代理 vs 反向代理
- 正向代理:代理客户端访问外部资源(隐藏客户端)
- 反向代理:代理服务端对外提供服务(隐藏真实服务端)
对业务项目来说,最常见的就是"反向代理":
- 前端统一访问
https://your-domain.com/api/* - Nginx 把请求转发给内网后端
http://127.0.0.1:8080或后端集群
5. 一套可直接套用的项目配置(前端 + 后端)
你可以把它理解成"两个 location":
location /:返回前端(打包后的 dist)location /api/:转发到后端(upstream)
示例(思路级别,可按实际路径调整):
nginx
server {
listen 80;
server_name your-domain.com;
# 1) 前端静态资源
root /var/www/app/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# 2) 后端 API
location /api/ {
proxy_pass http://backend_upstream;
# 常用转发头
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_connect_timeout 5s;
proxy_read_timeout 60s;
}
}
upstream backend_upstream {
# 单机
server 127.0.0.1:8080;
# 多机/多实例时写多个 server
# server 10.0.0.11:8080;
# server 10.0.0.12:8080;
}
这套配置解决了最核心的两件事:
- 前端路由刷新不 404(
try_files ... /index.html) - API 统一走
/api,后端端口不暴露
6. upstream 负载均衡策略怎么选
常见策略:
- 轮询(默认):最通用
- 加权轮询:机器性能不同
- least_conn:请求耗时差异大
- ip_hash:需要会话粘性(但更推荐把会话改为 token / Redis)
选择建议:
- 无状态 REST API:轮询/加权轮询
- 耗时差异大(例如有导出任务):least_conn
- 真有粘性需求:ip_hash 或改造为无状态
7. 常见优化点(写在博客里很加分)
- 连接与进程 :
worker_processes与 CPU 核数相关worker_connections决定并发连接上限
- gzip 压缩:文本类收益大(JS/CSS/JSON)
- 缓存策略 :静态资源
expires/cache-control - 日志定位:按 location 单独记录 access_log
- TLS/HTTPS:Nginx 终止 TLS,内网到后端走 HTTP
8. WebSocket 走 Nginx 的坑(必须写)
如果你项目里用了 WebSocket(例如通知、实时状态),Nginx 必须转发 Upgrade 头:
nginx
location /ws/ {
proxy_pass http://backend_upstream;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
同时注意:
- LB 的 idle timeout(连接空闲会被断)
- 应用层心跳(ping/pong)
9. 面试 30 秒模板(可直接背)
- Nginx 是高性能 Web/反向代理服务器,事件驱动模型适合高并发连接。
- 项目里我把它放在最外层:前端静态资源由 Nginx 托管,
/api代理到 Spring Boot。 - 多实例时用 upstream 做负载均衡,常用轮询/加权/least_conn。
- 线上关注超时、缓存策略,以及 WebSocket 的 Upgrade 头转发。