臭名昭著aTrust隔离计划1.臭名昭著aTrust隔离计划2.VPN原理与aTrust隔离网络实践3.docker-easyconnect到底做了什么4.TUN(tunnel-隧道-虚拟网卡)模式
个人项目
personal(个人展示)GitHub Actions 自动部署个人展示项目
基于Quartz搭建的个人博客1.Quartz个人博客使用教程2.使用 rsync 增量部署 Quartz 博客3.使用 GitHub Actions 自动部署 Quartz 博客5.域名绑定6.CDN加速Obsidian、双向链接与知识图谱
旅行
行程攻略青岛三日游行程攻略
前端
NginxNginx配置与反向代理入门
Nodenpm与npx的区别
中华财险-公司项目
对外接口文档
基础数据码表对外接口(仅支持rpc调用)业务码表对外接口应用主数据对外接口
基础运营查询版本更新日志详情消息中心对外接口站内信对外接口站内信模板配置手册
权限中心权限中心对外接口文档(最新)权限中心对外接口文档前端ACL-CORE FACADE依赖版本
审计中心审计中心对外接口文档audit-center-facade版本
审批中心工作流迁审批流现状工作流迁审批流API能力替换方案老审批流接口文档审批中心接口文档审批中心业务回调FAQ
账号中心内部系统对接单点登录内部系统对接认证中心三方网页应用登录授权账号中心对外接口文档前端账号中心RPC接口文档账户变更对外广播消息文档账户中心对外接口HRMS外部员工变更广播消息文档HRMS外部员工对外接口
组织员工岗位🔥机构映射SDK接口文档员工岗位变更通知说明组织机构管营一体概念与用法组织员工对外广播消息文档组织员工岗位对外接口文档组织员工岗位对外接口文档前端组织员工岗位数据模型组织员工主数据业务场景案例organization-facade版本
hrms(大型人力资源外包管理系统)
项目架构说明HRMS Maven模块与依赖说明
项目说明0.流程中心模块0.组织模块说明1.业务线模块2.计划模块3.项目模块4.协议模块5.供应商模块6.合约域模块7.外包人员模块*核心:外包人员生命周期
项目运维外包人员项目编制差异排查与修复2.HRMS相关问题排查4.修改externalId(externalId和accountId不一致)
需求-系分
1.内部转外包0723外包人员关联历史内部账号系分新增外包人员关联历史账号内容(紧急0723上线)需求
2.工作岗位0820工作岗位0820需求工作岗位0820需求-系分
3.用工模式调整0917内部人员转外包用工系统需求2内部人员转外包用工系统需求-系分
sso(账号中心-单点登录)
项目架构说明aboss-sso项目架构入门AOP统一日志打印链路Maven多模块项目高级知识OAuth2.0
项目说明1.SSO-OAuth2.0与IDaaS登录流程2.外部账号创建流水号并发问题分析
AI
使用说明
第三方插件&技能简介Archify使用与安装指南Ponytail使用指南
CodexCodex CLI与IDE区别及使用指南Codex Hook单独配置与提交通知Codex MCP安装与使用指南Codex第三方插件安装与使用指南
Agent开发1.LLM、Token、上下文窗口与模型参数2.大模型 API、请求参数与响应结构3.Spring AI ChatClient4.Prompt、System Prompt、Prompt 模板6.结构化输出、JSON Schema7.SSE 流式响应8.会话 ID、聊天记录、Redis9.超时、重试、限流、降级10.完成可运行聊天接口
GitGit常用命令与Obsidian推送排查
Java
面试题Java基础与集合面试题
AtomicInteger原子计数与并发安全ConcurrentHashMap并发安全与计数Java线程、线程池与Future
python
基础Python基础语法
HTTPXHRMS员工详情接口调用(Python HTTPX)

一、💡 一句话理解

核心结论

截图中的内容是宝塔面板管理的一段 Nginx 站点配置,不是 Nginx 源码。它让 Nginx 对外接收请求:普通页面返回前端静态文件,/api/ 请求转发给本机 8081 端口的后端服务。

迪莫:站在请求入口

阅读路线

先看懂“请求从哪里来”,再看 Nginx 如何分流,最后用 nginx -tcurl 和日志排错。整篇只需要抓住一条主线:页面找文件,接口找后端

二、🧭 理论:它是什么

2.1 核心概念

Nginx 可以理解为网站门口的“接待员”或“交通调度员”:

  • 接收浏览器发来的 HTTP/HTTPS 请求;
  • 根据域名和路径判断应该如何处理请求;
  • 返回前端的 HTML、CSS、JavaScript、图片等静态文件;
  • 把接口请求转发给后端程序;
  • 统一处理 SSL、重定向、缓存、访问限制和错误页面。

截图中的:

server {
    ...
}

表示一个网站的虚拟主机配置。一个 Nginx 可以通过多个 server 同时管理多个网站。

小星光:网站入口

一个好记的类比

server 像一间店铺,server_name 是店铺招牌,location 是店内的分流指示牌,后端服务则像店铺后面的仓库。

三、⚙️ 理论:它是怎么工作的

3.1 listenserver_name

listen 80;
server_name example.com;
  • listen 80:监听服务器的 80 端口,通常对应 HTTP;
  • server_name:声明这个配置处理哪些域名或 IP 的请求。

截图中配置了公网 IP 和域名,因此访问这些地址时,Nginx 会尝试匹配这个 server

3.2 rootindex

root /www/upload/upload-frontend;
index index.php index.html index.htm;
  • root:网站静态文件的根目录;
  • index:访问目录时,Nginx 默认尝试查找的首页文件。

例如访问 /,Nginx 会在 root 指定的目录中寻找 index.html 或其他配置的首页文件。

3.3 location /api/ 和反向代理

location /api/ {
    proxy_pass http://127.0.0.1:8081;
    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;
}

location /api/ 匹配以 /api/ 开头的请求。proxy_pass 表示反向代理:浏览器只访问 Nginx,Nginx 再把请求交给后端。

音速犬:请求转发

反向代理的白话版

浏览器把请求交给 Nginx,Nginx 再替浏览器去找 127.0.0.1:8081。浏览器不需要直接暴露后端端口,这就是“反向代理”。

在截图这份写法中:

浏览器请求 /api/user

Nginx 转发到 127.0.0.1:8081/api/user

127.0.0.1 表示当前服务器本机,8081 是后端程序监听的端口。

几个请求头的作用如下:

配置作用
Host $host把用户访问的域名传给后端
X-Real-IP $remote_addr把用户的原始 IP 传给后端
X-Forwarded-For $proxy_add_x_forwarded_for记录经过的代理 IP 链路
X-Forwarded-Proto $scheme告诉后端原始请求是 HTTP 还是 HTTPS

3.4 location /try_files

location / {
    try_files $uri $uri/ /index.html;
}

Nginx 会依次尝试:

  1. 查找与请求路径完全对应的文件;
  2. 查找对应的目录;
  3. 如果都不存在,就返回 index.html

这种写法常用于 Vue、React 等前端单页应用。前端路由例如 /user/list 可能不是服务器上的真实文件,但仍然需要先返回 index.html,再由前端 JavaScript 渲染页面。

板板壳:前端路由保护

为什么不能只返回 404?

因为 /user/list 可能是前端路由,不是服务器上的真实文件。try_files 把它兜底到 index.html,让前端应用有机会接管后续渲染。

3.5 include、SSL 和错误页面

截图中还出现了类似下面的配置:

include /www/server/panel/vhost/nginx/well-known/example.conf;
include /www/server/panel/vhost/nginx/extension/example/*.conf;
 
error_page 404 /404.html;
  • include:把其他文件中的 Nginx 配置加载进来,宝塔通常用它管理 SSL 校验、安全规则和扩展配置;
  • error_page 404 /404.html:访问资源不存在时,返回自定义 404 页面;
  • # 注释的配置不会生效,例如截图中的 #error_page 502 /502.html;

四、🚀 实践:可以拿来干什么

这份配置实际完成了以下分工:

请求类型Nginx 的处理方式
//about返回前端页面
/js/app.js返回静态 JavaScript 文件
/api/user转发到后端 8081 端口
不存在的前端路由尝试返回 index.html
不存在的资源返回 /404.html

整体链路可以理解为:

4.1 推荐学习顺序

不要一开始就背完整的宝塔配置。建议按照“请求是怎么来的 → Nginx 如何分流 → 出问题如何排查”的顺序学习:

  1. HTTP 基础:先理解域名、IP、端口、URL、请求与响应、请求头、响应头,以及 200、404、502 等状态码。
  2. 网站请求链路:理解浏览器访问 80 端口后,Nginx 如何决定返回前端文件,或把接口交给后端。
  3. 核心配置指令:优先掌握 serverlistenserver_namerootindexlocationtry_filesproxy_pass
  4. location 匹配规则:理解为什么 /api/ 处理接口,/ 处理普通页面,以及更具体的路径如何优先匹配。
  5. 配置检查与日志排错:学会使用 nginx -tcurl 和 Nginx 日志定位问题。
  6. 高级功能:最后再学习 HTTPS、SSL 证书、伪静态、缓存、压缩、负载均衡和 WebSocket。

4.2 针对当前配置的第一个练习

先只练习解释下面两个请求,不必马上研究所有 include 和正则表达式:

请求需要解释的配置结果
/location /roottry_files返回前端首页或静态文件
/api/userlocation /api/proxy_pass转发到 127.0.0.1:8081/api/user

能够讲清这两个请求,就已经掌握了这份配置最核心的工作原理。之后再分别学习 SSL 验证、敏感文件保护、静态资源缓存和访问日志。

五、🔍 最小例子

下面是一份与截图思路相同、但去掉宝塔专属路径的最小配置。它要解决的问题是:同一个域名同时提供前端页面和后端接口。

server {
    listen 80;
    server_name example.com;
 
    root /var/www/frontend;
    index index.html;
 
    location /api/ {
        proxy_pass http://127.0.0.1:8081;
        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;
    }
 
    location / {
        try_files $uri $uri/ /index.html;
    }
}

输入:

  • 访问 http://example.com/
  • 访问 http://example.com/api/user

处理过程:

  • 第一个请求从 /var/www/frontend 读取前端文件;
  • 第二个请求被转发到 127.0.0.1:8081

配置修改后,通常先检查语法,再重载 Nginx:

nginx -t
nginx -s reload

nginx -t 用来检查配置语法,避免配置错误导致 Nginx 无法重载。

六、⚠️ 边界与常见误区

  • listen 80 只表示当前配置监听 HTTP;HTTPS 通常还需要证书和 443 端口配置。
  • proxy_pass 只负责转发,请确保后端程序确实运行在 127.0.0.1:8081
  • root 指向的目录必须真实存在,并且 Nginx 进程有读取权限。
  • try_files ... /index.html 适合前端单页应用,但不适合所有后端项目。
  • 宝塔自动生成的 include 配置不要随意删除,其中可能包含 SSL 校验、安全规则或扩展配置。
  • 当前截图中的 proxy_pass http://127.0.0.1:8081; 会保留原始 /api/ 路径。如果后端只接收 /user 而不接收 /api/user,就需要重新设计路径转发规则。
  • 修改 Nginx 配置后,必须执行配置检查;语法错误会导致重载失败。
  • 截图包含公网 IP 和域名,发布笔记或截图时应先确认是否允许公开。

七、📌 总结

  • server:一个网站的配置块。
  • listen:监听端口。
  • server_name:匹配域名或 IP。
  • root:前端静态文件目录。
  • location:按请求路径分流。
  • proxy_pass:把接口请求转发给后端。
  • try_files:支持前端单页应用路由。
  • 学习顺序:HTTP 基础 → 请求链路 → 核心指令 → location → 排错 → 高级功能。

记忆句:Nginx 负责站在最前面接收请求,再决定是返回文件,还是把请求转交给后端。

圣羽翼王:继续探索

7.1 🔗 继续阅读