Nginx 从入门到项目部署(反向代理 / 负载均衡 / 静态资源)

这篇文章把 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 头转发。
相关推荐
东北甜妹2 小时前
LVS故障排查
运维
银河麒麟操作系统2 小时前
服务器通用(全架构)【服务器存储系统原理与运维实践解析】技术文章
运维·服务器·架构
returnthem2 小时前
Docker基本命令
linux·运维·服务器
05大叔2 小时前
Docker
运维·docker·容器
恒创科技HK2 小时前
海外服务器回国线路对比,带宽选择指南
运维·服务器
China_Yanhy2 小时前
运维日记 - 猛男的AI拓荒录:Fabric (GitHub: danielmiessler/fabric) —— 让 AI 回归 Unix 哲学的终端神器
运维·人工智能·fabric
wbs_scy2 小时前
Linux 基础 IO 初步解析:从 C 库函数到系统调用,理解文件操作本质
linux·运维·服务器
袁煦丞 cpolar内网穿透实验室2 小时前
Portainer可视化玩转 Docker 全流程。cpolar 内网穿透实验室第 737 个成功挑战
运维·docker·容器·远程工作·内网穿透·cpolar
广州服务器托管2 小时前
WIN11中将控制面板固定到开始菜单的方法
运维·开发语言·windows·计算机网络·可信计算技术