19 05 2026

undefined

1. Nginx 的基础概念

Nginx 是一个高性能 Web 服务器,也常作为反向代理、负载均衡器、TLS 终止点和统一入口网关。它通常位于客户端和后端服务之间,把连接管理、静态资源、

代理转发、日志、限流、安全头等入口层能力从业务应用中拆出来。

2. 入门阶段必须掌握什么

3. 最小可用配置

原理

1. Nginx 为什么适合做入口层

Nginx 使用 master/worker 多进程模型。master 负责读取配置、管理 worker;worker 通过事件驱动处理连接。它不为每个连接创建线程,

因此在大量并发连接下资源占用较低。

2. 请求如何进入 Nginx

一次 HTTP 请求大致经过:客户端连接监听端口,Nginx 根据端口和 Host 选择 server,再根据 URI 匹配 location,最后由静态文件模块

或代理模块生成响应。

3. reload 为什么不等于重启

nginx -s reload 会让 master 解析新配置,成功后启动新 worker,并让旧 worker 优雅退出。旧连接不会被立刻杀掉,这是 Nginx 能平滑

发布配置的基础。

1. 本地学习

用静态 HTML 验证 root/index/try_files。

故意写错配置,观察 nginx -t 输出。

查看 access log 和 error log,对照请求路径和状态码。

2. 项目落地

作为前端静态资源服务器。

为后续反向代理和 API 网关配置打基础。

建立“所有变更先检查配置再 reload”的习惯。

本篇面试题

题目 1:Nginx 是什么?常见使用场景有哪些?

考察点:基础定位、入口层职责

标准答案:Nginx 是 Web 服务器、反向代理、负载均衡器和入口网关,常用于静态资源、HTTPS 终止、API 代理、负载均衡、缓存、限流和日志。

深度扩展:它适合做通用入口能力,不适合承载复杂业务编排。

常见错误回答:只说 Nginx 用来部署前端。

面试官追问:Nginx 和应用服务器的边界是什么?

项目应用场景:前后端分离入口。


题目 2:正向代理和反向代理有什么区别?

考察点:代理方向

标准答案:正向代理代理客户端访问外部服务;反向代理代理服务端接收外部请求。Nginx 通常作为反向代理。

深度扩展:反向代理还能做 TLS、缓存、限流和负载均衡。

常见错误回答:只说一个向前一个向后。

面试官追问:企业入口为什么常用反向代理?

项目应用场景:公网请求进入内网服务。

对应知识点:反向代理。


题目 3:Nginx 常用命令有哪些?

标准答案:nginx -t 检查配置,nginx -T 输出完整配置,nginx -s reload 平滑重载,nginx -s quit 优雅退出,nginx -V 查看编译参数。

深度扩展:生产发布前应先 nginx -t,排查 include 问题用 nginx -T。

常见错误回答:修改配置后直接重启。

面试官追问:reload 和 restart 有什么区别?

项目应用场景:配置发布。

对应知识点:命令与进程模型。


核心配置知识图谱

undefined

1. server_name 与虚拟主机

server_name 根据 Host 或 TLS SNI 选择虚拟主机。多域名站点必须配置明确的默认 server,避免未知域名落到业务站点。

2. location 匹配

location 是 Nginx 路由核心。匹配优先级:精确匹配 =,最长前缀,若最长前缀不是 ^~ 再按顺序测试正则,最后使用最佳前缀。

3. root、alias 与 try_files

  • root:把 URI 拼到根目录后查找文件。
  • alias:用指定目录替换 location 前缀。

  • try_files:按顺序检查文件,不存在时内部跳转或返回状态码。

4. proxy_pass

proxy_pass 是反向代理核心。要明确路径是否改写,并传递必要代理头。

5. upstream

upstream 定义后端服务池。开源版支持轮询、权重、least_connip_hash 和被动健康检查。

原理

1. 请求处理链路

请求先命中监听端口,再按 Host/SNI 选择 server,然后按 URI 匹配 location,最后进入静态文件、proxy 或其他 content handler。

理解这个链路,才能解释 404、代理路径错误、API 被前端 fallback 吞掉等问题。

2. proxy_pass 尾斜杠原理

在前缀 location 中,proxy_pass http://backend/; 带 URI,会用 / 替换匹配到的 location 前缀;proxy_pass http://backend; 不带 URI,

通常保留原始 URI。团队应固定写法并测试。

3. upstream 失败处理

max_fails 和 fail_timeout 是被动健康检查,只有真实请求失败后才会临时摘除节点。主动健康检查属于 NGINX Plus 或由外部 LB/服

务发现实现。


1. 前后端分离

/assets/ 静态资源长缓存。

/api/ 代理到后端。

/ 使用 try_files 回退到 index.html。

2. 多后端服务

请求耗时相近:默认轮询。

实例能力不同:权重。

长短请求混合:least_conn。

简单会话粘滞:ip_hash,但要注意 NAT 流量倾斜。

3. 日志排查

建议日志包含 $request_id、$status、$upstream_status、$upstream_addr、$request_time、$upstream_response_time。


题目 1:location 匹配顺序是什么?

考察点:请求路由

标准答案:先精确匹配,再最长前缀;若最长前缀是 ^~ 则停止正则,否则按顺序匹配正则;最后使用最佳前缀。

深度扩展:查询字符串不参与 location 匹配。

常见错误回答:认为配置在前的一定优先。

面试官追问:/api/a.png 会不会被图片正则截获?

项目应用场景:API 与静态资源共存。

对应知识点:location。

题目 2:root 和 alias 有什么区别?

考察点:静态路径映射

标准答案:root 把 URI 拼到目录后查找;alias 用指定目录替换 location 前缀。

深度扩展:alias 在前缀 location 中要注意尾斜杠。

常见错误回答:认为两者等价。

面试官追问:为什么 alias 后 404?

项目应用场景:下载目录、上传文件访问。

对应知识点:静态资源。

题目 3:proxy_pass 尾斜杠有什么影响?

考察点:路径改写

标准答案:带 URI 的 proxy_pass 会替换 location 前缀,不带 URI 通常保留原始 URI。

深度扩展:实际行为还受 rewrite 和变量 proxy_pass 影响。

常见错误回答:没有区别。

面试官追问:/api/orders 后端收到什么路径?

项目应用场景:前端 /api/ 转后端 /。

对应知识点:反向代理。

题目 4:Nginx 负载均衡策略有哪些?

考察点:upstream

标准答案:默认轮询、权重、least_conn、ip_hash。按服务耗时、实例能力和会话需求选择。

深度扩展:开源版主要是被动健康检查。

常见错误回答:认为默认有主动健康检查。

面试官追问:长耗时接口适合什么策略?

项目应用场景:订单服务多副本。

对应知识点:upstream。

进阶篇知识图谱

undefined

知识总结

1. proxy_cache 缓存

Nginx 缓存适合公开、低频变化、可短暂陈旧的数据。不适合用户私有数据和强一致接口。

2. limit_req 限流

limit_req 基于共享内存记录 key 的请求速率,常用于登录、验证码、搜索、导出接口。

3. 真实 IP

Nginx 前有 CDN 或云 LB 时,必须只信任明确代理网段的真实 IP 头。

4. CORS 与安全头

CORS 要使用白名单,不要反射任意 Origin。安全头应使用 always 覆盖错误响应。

5. auth_request

auth_request 通过子请求调用鉴权服务。子请求返回 2xx 放行,401/403 拒绝。

6. WebSocket、SSE、gRPC、stream

原理

1. 缓存原理

keys_zone 保存缓存元数据,响应体保存在磁盘。cache key 决定不同请求是否共享缓存,因此必须覆盖所有影响响应内容的维度。

2. 限流原理

limit_req 使用类似漏桶的模型按平均速率处理请求,burst 表示突发队列容量,nodelay 表示突发额度内不延迟,超过后拒绝。

3. CORS 原理

CORS 是浏览器安全策略。Nginx 只是返回响应头,真正决定前端 JS 能否读取响应的是浏览器。

4. 长连接原理

WebSocket 的 Upgrade 和 Connection 是逐跳头,代理不会自动透传;SSE 是普通 HTTP 长响应,若开启 buffering 可能导致客户端收不到实时数据。


公共数据接口:使用 proxy_cache,并输出 X-Cache-Status。

登录和验证码:按真实 IP、账号或 API key 限流。

管理后台:访问控制、Basic Auth 或 auth_request。

前后端分离 API:CORS 白名单和安全头统一配置。

实时服务:WebSocket/SSE 单独 location 和 timeout。

非 HTTP 协议:使用 stream 四层代理。

本篇面试题

题目 1:Nginx 缓存如何避免用户数据串号?

考察点:缓存安全

标准答案:私有接口默认不缓存;带 Authorization/Cookie 的请求绕过缓存;cache key 包含所有影响响应的维度;公开接口白名单缓存。

深度扩展:多层缓存要统一 key 和 TTL 策略。

常见错误回答:所有 GET 请求都缓存。

面试官追问:用户 A 看到用户 B 数据怎么排查?

项目应用场景:商品目录、用户资料。

对应知识点:proxy_cache。

题目 2:limit_req 的 burst 和 nodelay 怎么理解?

考察点:限流算法

标准答案:burst 是允许突发的队列容量;不加 nodelay 会延迟处理,加 nodelay 后突发额度内不延迟,超过才拒绝。

深度扩展:上线前可 dry run 观察误伤。

常见错误回答:burst 是每秒额外允许数量。

面试官追问:CDN 后限流 key 怎么选?

项目应用场景:登录、验证码。

对应知识点:limit_req。

题目 3:如何防止客户端伪造真实 IP?

考察点:真实 IP 和安全信任

标准答案:只对可信 CDN/LB 网段配置 set_real_ip_from,再从指定 header 取真实 IP;不要信任任意客户端传入的 X-Forwarded-For。

深度扩展:多层代理可使用 real_ip_recursive on。

常见错误回答:直接取 X-Forwarded-For 第一个 IP。

面试官追问:如何记录原始代理 IP?

项目应用场景:审计、限流、风控。

对应知识点:realip。

题目 4:WebSocket 为什么要特殊配置?

考察点:协议升级

标准答案:WebSocket 依赖 HTTP/1.1 Upgrade,Upgrade 和 Connection 是逐跳头,需要显式透传;同时长连接要设置更长 timeout。

深度扩展:SSE 不需要 Upgrade,但通常关闭 buffering。

常见错误回答:普通 proxy_pass 就够了。

面试官追问:SSE 为什么要关 buffering?

项目应用场景:聊天、通知、流式接口。

对应知识点:WebSocket、SSE。

undefined

知识总结

1. master/worker 模型

master 负责配置解析、端口绑定、worker 管理和信号处理。worker 负责处理连接和请求。该模型让 Nginx 能平滑 reload,并减少 worker

间共享状态。

2. 事件驱动模型

worker 使用 epoll/kqueue 等事件机制处理大量连接,不为每个连接创建线程。请求只有在 socket 可读、可写、超时等事件发生时才被处理。

3. HTTP 请求阶段

HTTP 请求会经过读取请求、server 匹配、location 匹配、rewrite、access、content、filter、log 等阶段。不同模块在不同阶段注册 handler。

4. upstream 状态机

upstream 不是简单转发,而是包含节点选择、连接、发送请求、读取响应头、读取响应体、buffer、重试、日志等步骤。

5. 内存池和共享内存

请求生命周期内的对象通常从内存池分配,请求结束整体释放。限流、缓存元数据等跨 worker 状态使用共享内存。

原理

1. Nginx 为什么高性能

高性能来自组合:事件驱动、非阻塞 IO、少量 worker、少锁、sendfile、内存池、模块化、连接复用。只说 epoll 是不完整的。

2. reload 为什么平滑

master 解析新配置成功后启动新 worker,然后通知旧 worker 优雅退出。旧 worker 不再接收新连接,但会处理完已有连接。因此 reload 

后短时间看到旧 worker 是正常现象。

3. 502、504、499 的底层来源

502:upstream 连接失败、连接重置、响应头非法等。

504:upstream 超时。

499:客户端提前关闭连接。

这些状态码要结合 upstream 状态变量和 error log 判断。

4. buffer 的取舍

开启 proxy buffering 时,Nginx 尽快从 upstream 读取响应,缓存在内存或临时文件,再发给客户端。它能保护后端连接,

但不适合 SSE、低延迟 流式输出等场景。

5. 模块化的意义

Nginx 核心负责进程、事件、配置和框架;HTTP 模块、stream 模块、filter 模块负责具体能力。理解模块阶段,才能解释 

rewrite、limit_req、auth_request、proxy、gzip 的执行顺序。


1. 故障排查

用 $upstream_addr、$upstream_status、$request_time、$upstream_response_time 还原 upstream 状态机。

2. 性能分析

从事件循环、连接数、文件描述符、buffer、磁盘 IO、TLS 握手、upstream 响应时间分层定位瓶颈。

3. 源码阅读路线

配置解析和 master/worker 启动。

事件模块和连接处理。

HTTP core 的 server/location 和 phase。

静态文件模块。

proxy/upstream 模块。

filter 链和日志阶段。

shared memory 和 slab。

本篇面试题

题目 1:为什么 Nginx 性能高?

考察点:事件模型、进程模型

标准答案:Nginx 使用 master/worker 多进程模型,worker 基于事件驱动和非阻塞 IO 处理大量连接,并结合 sendfile、连接复用、内存池和模块化减少开销。

深度扩展:高性能不只是 epoll,还包括少锁、少上下文切换和生命周期清晰的内存管理。

常见错误回答:因为用了多线程。

面试官追问:worker 数怎么设置?连接上限怎么算?

项目应用场景:高并发入口。

对应知识点:事件模型。

题目 2:Nginx reload 为什么不中断服务?

考察点:master/worker

标准答案:master 加载新配置并启动新 worker,旧 worker 停止接收新连接但继续处理已有连接,完成后退出。

深度扩展:长连接会让旧 worker 存活较久。

常见错误回答:reload 就是重启。

面试官追问:新配置语法错误会怎样?

项目应用场景:生产配置发布。

对应知识点:reload。

题目 3:Nginx HTTP 请求处理阶段有哪些?

考察点:模块化和源码理解

标准答案:读取请求、选择 server、匹配 location,然后进入 rewrite、access、content、filter、log 等阶段,不同模块在不同阶段注册 handler。

深度扩展:理解 phase 才能解释 auth_request、limit_req、proxy、gzip 的执行位置。

常见错误回答:只说 location 后直接 proxy。

面试官追问:access 阶段为什么能提前拒绝请求?

项目应用场景:复杂鉴权和限流排查。

对应知识点:请求阶段。

题目 4:Nginx 内存池有什么作用?

考察点:内存管理

标准答案:Nginx 按请求或连接生命周期使用内存池分配内存,请求结束整体释放,减少频繁 malloc/free 和碎片管理成本。

深度扩展:跨请求共享状态不能放请求内存池,要用共享内存等机制。

常见错误回答:内存池就是缓存。

面试官追问:共享内存和请求内存池有什么区别?

项目应用场景:模块开发、性能分析。

对应知识点:内存池。

架构篇知识图谱

undefined

知识总结

1. 部署形态

2. 高可用设计

生产入口不应只有一台 Nginx。常见方案是云 LB 或硬件 LB 前置多个 Nginx 主动主动;传统环境也可使用 keepalived + VIP 主备。

3. 性能优化

优化要先观测再调参。常见指标包括 RPS、P95/P99、错误率、连接数、CPU、内存、磁盘 IO、TLS 握手、upstream 响应时间。

4. 配置治理

配置必须进入 Git,变更走评审,发布前执行 nginx -t,必要时 nginx -T 输出最终配置,发布后观察错误率和延迟,并保留回滚方案。


1. 多层代理链路

真实生产链路可能是:用户 -> DNS/CDN -> 云 LB -> Nginx -> API Gateway/Ingress -> 应用。每一层都有超时、header、真实 IP、日志和健康检查,故障排查必须逐层还原。

2. 高可用不是多部署一台

高可用包括流量切换、健康检查、配置一致性、证书一致性、日志集中、容量冗余、演练和回滚。只部署两台但没有切换和治理,不算完整 HA。

3. 性能优化是系统问题

Nginx 性能瓶颈可能在 worker、文件描述符、TLS、磁盘、网络、upstream、应用、数据库。不能只调 Nginx 指令,要看全链路指标。


1. 企业入口架构

2. 配置发布流程

开发分支修改配置。

Code Review。

CI 执行 nginx -t 和关键 curl 用例。

灰度 reload 一台 Nginx。

观察日志和指标。

全量发布或回滚。

3. 性能优化配置起点

4. 架构边界

本篇面试题

题目 1:如何设计高可用 Nginx 入口?

考察点:高可用和配置治理

标准答案:使用云 LB/硬件 LB 前置多个 Nginx 主动主动,或 keepalived+VIP 主备;配套健康检查、配置同步、证书同步、日志集中、容量冗余、灰度发布和回滚。

深度扩展:多地域还要考虑 DNS/GSLB/CDN 和故障域隔离。

常见错误回答:部署两台机器就是高可用。

面试官追问:配置发布失败如何回滚?

项目应用场景:企业公网入口。

对应知识点:高可用。

题目 2:如何做 Nginx 性能优化?

考察点:性能方法论

标准答案:先看指标和日志,区分瓶颈在客户端、Nginx、网络、TLS、磁盘、upstream 还是应用;再针对 worker、连接、keepalive、buffer、sendfile、gzip、缓存和 TLS 调优。

深度扩展:每次只改少量变量,并用压测和线上指标验证。

常见错误回答:直接调大 worker_connections。

面试官追问:反向代理场景连接数为什么要打折?

项目应用场景:入口网关压测。

对应知识点:性能优化。

题目 3:Nginx、API Gateway、Ingress、Service Mesh 如何分工?

考察点:架构边界

标准答案:Nginx 适合入口代理和站点能力;API Gateway 适合 API 生命周期治理;Ingress 适合 K8s 服务暴露;Service Mesh 适合服务间东西向流量治理。

深度扩展:它们可以组合,但要避免职责重叠。

常见错误回答:认为四者完全替代。

面试官追问:已有 Nginx 还要不要 API Gateway?

项目应用场景:微服务平台入口。

对应知识点:架构边界。

题目 4:Nginx 配置发布如何避免事故?

考察点:工程治理

标准答案:配置进 Git,评审,CI 执行 nginx -t 和行为用例,灰度 reload,观察指标,保留回滚配置,禁止手工热修不回写。

深度扩展:nginx -T 可保存最终配置快照用于审计。

常见错误回答:上线前手工检查一下。

面试官追问:配置语法正确但业务 404 怎么办?

项目应用场景:网关配置平台。

对应知识点:配置治理。

面试篇知识图谱

undefined

知识总结

面试题不应按“背题”准备,而应按 Nginx 能力栈准备:基础定位、核心配置、进阶模块、底层原理、生产案例、架构设计、故障排查。每道题都要能回答定义、

机制、场景、风险、项目应用和排查方法。

原理

高质量回答的结构:

先给结论。

解释底层机制。

说明适用场景。

指出常见坑。

结合项目经验。

说明如何验证或排查。

应用

面试前按题型复盘。

技术分享时把题目转成案例。

团队培训时用追问检查理解深度。

项目复盘时把故障整理成场景题。

面试题库

题目 1:Nginx 是什么?

考察点:基础定位

标准答案:Nginx 是 Web 服务器、反向代理、负载均衡器和入口网关。

深度扩展:它适合做入口层通用能力,不适合复杂业务编排。

常见错误回答:只说部署前端。

面试官追问:Nginx 和应用服务器边界是什么?

项目应用场景:前后端分离入口。

对应知识点:入门篇。

题目 2:location 匹配顺序是什么?

考察点:请求路由

标准答案:精确匹配、最长前缀、正则、最佳前缀;^~ 命中后跳过正则。

深度扩展:查询字符串不参与匹配。

常见错误回答:配置顺序优先。

面试官追问:API 被静态正则截获怎么办?

项目应用场景:动静分离。

对应知识点:核心篇。

题目 3:Nginx 负载均衡策略有哪些?

考察点:upstream

标准答案:轮询、权重、least_conn、ip_hash;按请求耗时、实例能力和会话需求选择。

深度扩展:开源版主要是被动健康检查。

常见错误回答:默认主动健康检查。

面试官追问:长连接场景怎么选?

项目应用场景:多副本服务。

对应知识点:核心篇。

题目 4:如何设计 Nginx 缓存?

考察点:缓存安全

标准答案:只缓存公开响应,设计包含所有响应维度的 cache key,设置 TTL、cache lock、stale 和绕过规则。

深度扩展:强一致和私有接口不适合 Nginx 缓存。

常见错误回答:所有 GET 都缓存。

面试官追问:用户数据串号怎么排查?

项目应用场景:商品目录、公告。

对应知识点:进阶篇。

题目 5:为什么 Nginx 性能高?

考察点:事件模型

标准答案:master/worker、事件驱动、非阻塞 IO、少锁、sendfile、内存池、连接复用和模块化。

深度扩展:不能只说 epoll。

常见错误回答:因为多线程。

面试官追问:连接上限怎么算?

项目应用场景:高并发网关。

对应知识点:原理篇。

题目 6:502、504、499 如何排查?

考察点:故障诊断

标准答案:502 多见于 upstream 连接失败或响应非法;504 是 upstream 超时;499 是客户端提前关闭。结合 $upstream_addr、$upstream_status、$request_time、$upstream_response_time 和 error log 判断。

深度扩展:499 不一定是 Nginx 错。

常见错误回答:统一说后端挂了。

面试官追问:只有某台 upstream 502 怎么定位?

项目应用场景:线上 API 故障。

对应知识点:核心篇、原理篇。

题目 7:如何设计高可用 Nginx 入口?

考察点:架构设计

标准答案:云 LB 或硬件 LB 前置多个 Nginx,配套健康检查、配置同步、证书管理、日志集中、容量冗余、灰度发布和回滚。

深度扩展:多地域还要考虑 DNS/GSLB/CDN。

常见错误回答:部署两台机器即可。

面试官追问:配置发布失败如何回滚?

项目应用场景:企业公网入口。

对应知识点:架构篇。

题目 8:Nginx、API Gateway、Ingress、Service Mesh 如何分工?

考察点:技术选型

标准答案:Nginx 做入口代理和站点能力;API Gateway 做 API 治理;Ingress 做 K8s 服务暴露;Service Mesh 做服务间治理。

深度扩展:它们可以组合,但要避免职责重叠。

常见错误回答:认为完全替代。

面试官追问:已有 Nginx 还要不要 API Gateway?

延伸阅读
  1. 感受到的温柔
  2. 堆排序
发表评论