臭名昭著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加速7.Google 搜索收录排查:为什么关键词搜得到别人,却搜不到我的网站?Obsidian、双向链接与知识图谱
架构设计
分布式分布式事务RPC原理
旅行
行程攻略青岛三日游行程攻略
前端
NginxNginx配置与反向代理入门
Nodenpm与npx的区别
数据库
mysql01.MySQL基础语法与约束02.MySQL数据库类型03.MySQL多表查询04.MySQL 索引05.MySQL 事务06.MySQL 隔离级别07.MySQL MVCC08.MySQL 锁09.EXPLAIN10.慢查询与 SQL 优化
mysql面试题01.索引问题02.事务与隔离级别03.锁机制04.存储引擎与性能优化05.用户权限、字符集与备份恢复
mysql实战01.EXPLAIN实战02.测试环境菜单误删排查与恢复03.MySQL IN 详解
网络
网络安全1.无线监听网卡苹果M系列虚拟机安装Kali Linux教程3.kali怎么使用RTL8812AU4.kali基础命令
网络基础进程之间怎样通过网络传递数据
网址常用网址
中间键
esElasticsearch 入门
mq
RabbitMQRabbitMQ高级RabbitMQ基础
1. MQ 基础2. MQ 核心角色与代码对应3. MQ Consumer Group 与消费模式4. SOFAMQ 账户变更代码实践5. MQ 可靠性问题6. 消息幂等
redis缓存击穿、穿透与雪崩Redis 分布式锁Redis 缓存问题Redis 数据结构
AI
使用说明
第三方插件&技能简介Archify使用与安装指南geekgeekRun使用OfferFlow使用指南Ponytail使用指南Skills Manager使用指南
CodexCodex CLI与IDE区别及使用指南Codex Hook单独配置与提交通知Codex MCP安装与使用指南Codex第三方插件安装与使用指南
Agent开发0-学习路线1.LLM、Token、上下文窗口与模型参数2.大模型 API、请求参数与响应结构3.Spring AI ChatClient4.Prompt、System Prompt、Prompt 模板6.结构化输出、JSON Schema7.SSE 流式响应8.会话 ID、聊天记录、Redis9.超时、重试、限流、降级10.*完成可运行聊天接口11.Function Calling、Tool Calling 原理12.用 Java 方法定义 Tool13.工具参数设计和校验14.实现订单查询工具15.实现物流查询工具16.实现库存查询工具17.多个工具自动选择18.工具异常、超时、重试
diy主机
主机零件学习1.CPU2.主板3.内存4.显卡5.硬盘6.散热7.风扇8.机箱热门型号价格表
捡垃圾diy-13600kf+5060diy-14600kf+5070
English高频词汇英文基础语法简单句子音标
GitGit常用命令Sublime Merge 使用指南
Java
工具库Caffeine本地缓存Reactor教程
工作实践如何使用@Async线程池使用与排查线上服务 CPU 使用率过高排查压测下RPC接口大量失败排查记录
基础1.HashMap2.ConcurrentHashMap3.HashSet4.final5.static6.volatile7.AtomicInteger8.String动态代理反射锁与线程同步线程注解
面试题1.HashMap 存储在方法内是线程安全的吗2.ArrayList参数传递与引用重新赋值3.== 和 equals 的区别、hashcode4.重载和重写的区别5.String、StringBuffer、StringBuilder区别及使用场景6.接口和抽象类7.ArrayList 与 LinkedList 的区别和扩容机制8.HashMap 和 Hashtable 的区别及底层实现9.Object 和 Objects 的区别10.ThreadLocal的原理和使用场景11.字节码是什么及作用12.Java类加载器有哪些13.双亲委派模型14.Java异常体系15.GC是什么16.GC如何判断对象可以被回收
面试总结0.HR面试模板1.面试一2.面试二3.面试三笔试
网络与 IO(黑马程序员-纯理论)01-网络编程基础02-IO模型与零拷贝03-BIO04-NIO基础与缓冲区05-NIO通道与选择器06-AIO
juc00-目录01-进程与线程02-线程同步与通信03-并发设计模式04-Java内存模型05-CAS与原子类06-ThreadLocal07-阻塞队列08-线程池使用与原理09-任务调度10-ForkJoin与享元模式11-AQS12-ReentrantLock13-读写锁14-并发协作工具15-ConcurrentHashMap16-CopyOnWrite与同步容器17-SkipListMap18-非阻塞队列
juc(工作常见)Java并发编程三个重点拆解
jvm1. JVM运行时数据区
Spring1.Spring IoC、DI与构造方法注入CGLIB、Byte Buddy 与 Spring AOPSpring 常用注解详解Spring Bean 生命周期
Spring MVC异常处理机制
linux常用命令
mac快捷键终端常用操作
python
基础01.Python是什么,为什么要安装Python02.Python项目中.venv是什么03.Python基础语法
基础实战sql替换
HTTPXHRMS员工详情接口调用(Python HTTPX)
windowswindows激活

一、💡 一句话理解

核心结论

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

迪莫:站在请求入口

阅读路线

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

二、🧭 理论:它是什么

2.1 核心概念

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

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

截图中的:

server {
    ...
}

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

小星光:网站入口

一个好记的类比

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

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

3.1 listen 和 server_name

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

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

3.2 root 和 index

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. 核心配置指令:优先掌握 server、listen、server_name、root、index、location、try_files 和 proxy_pass。
  4. location 匹配规则:理解为什么 /api/ 处理接口,/ 处理普通页面,以及更具体的路径如何优先匹配。
  5. 配置检查与日志排错:学会使用 nginx -t、curl 和 Nginx 日志定位问题。
  6. 高级功能:最后再学习 HTTPS、SSL 证书、伪静态、缓存、压缩、负载均衡和 WebSocket。

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

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

请求需要解释的配置结果
/location /、root、try_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 🔗 继续阅读