Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Nginx FAQ

内容:核心概念、反向代理、负载均衡、性能优化、故障排查、配置细节、HTTPS、HTTP/2、OpenResty 等。

一、基础与核心概念

1. Nginx 的工作模型是什么?为什么性能高?

  • 基于 多进程 + 单线程 + 异步非阻塞事件驱动(epoll)
  • master 负责管理,worker 处理请求
  • 每个 worker 用异步 IO(epoll/kqueue)处理大量连接
  • 无线程切换上下文开销

Nginx 采用了 “master + worker” 模型,worker 使用 epoll 事件驱动模型处理请求,异步非阻塞,无需为每个请求创建线程,因此上下文切换少、开销小,不会被慢连接阻塞,因此吞吐量高、延迟低。

2. Nginx 常见的几种角色(用途)?

  • 反向代理:后端集群负载均衡
  • 正向代理:代理客户端访问外网
  • HTTP 服务器:用作 Web Server(静态资源)
  • 负载均衡器:Round robin / IP hash / Least connections 等
  • 缓存服务器:FastCGI cache / proxy cache
  • API 网关 / ACL 限制 / WAF

3. Nginx 支持哪些负载均衡算法?

标准算法:

  • round robin(默认)
  • weighted round robin
  • least_conn(最少连接)
  • ip_hash(粘性)
  • hash(URI 级别 hash)

扩展:

  • fair(第三方模块,按响应速度)
  • consistent hash(一致性 Hash,upstream_chash)

4. Nginx 有哪些常见模块?

  • http 模块:反向代理、负载均衡
  • stream 模块:TCP/UDP 四层代理
  • mail 模块
  • realip 模块:获取真实 IP
  • ssl 模块
  • gzip 模块
  • rewrite 模块
  • proxy / fastcgi / uwsgi 模块

二、配置与实战场景

5. Nginx 中 root 与 alias 的区别?

指令 行为
root 会拼接 location 路径
alias 不会自动拼接路径

示例:

location /img/ {
    root /data/web;
}

实际文件路径:/data/web/img/xxx.jpg

location /img/ {
    alias /data/web/images/;
}

实际文件路径:/data/web/images/xxx.jpg

6. Nginx 中 try_files 的作用?

按顺序检查文件/目录是否存在,最后 fallback 到某个 URI。

常用于 SPA(如 React/ Vue):

try_files $uri $uri/ /index.html;

7. proxy_pass 写法:带路径 vs 不带路径区别?

不带 /:

location /api/ {
    proxy_pass http://backend;
}

会保留 /api/。

带 /:

proxy_pass http://backend/;

会截断 /api/。

三、HTTPS / HTTP/2 / SSL

8. 如何启用 HTTP/2?

新版 Nginx 是:

listen 443 ssl;
http2 on;

9. Nginx 如何处理 HTTPS 终止(SSL termination)?

Nginx 解 TLS,后端使用 http:

proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

10. 如何启用 WebSocket 转发?

需要 Upgrade 头:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

四、反向代理与 X-Forwarded 系列

11. X-Forwarded-For 与 X-Real-IP 区别?

头部 含义
X-Forwarded-For 客户端 + 所有代理链路 IP
X-Real-IP 最接近 Nginx 的上一跳

常用:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

12. 什么情况下需要 proxy_redirect?

当后端返回 302/Location 时路径不对:

Location: http://127.0.0.1/

改成:

Location: https://yourdomain.com/abc/

代表性例子:Jenkins、GitLab、Keycloak。

五、负载均衡进阶

13. upstream 中 keepalive 有什么用?

保持与后端的长连接,减少 TCP 建立成本:

upstream backend {
    server 10.0.0.1;
    keepalive 32;
}

提升高并发性能。

14. upstream 服务器健康检查如何实现?

Nginx 开源版:无主动健康检查,只能通过失败尝试被动检查。

企业版 / openresty 的 lua + healthcheck 可以实现主动探测。

15. 如何实现 session sticky?

  • ip_hash
  • sticky cookie(第三方模块)
  • upstream_hash(key)

六、性能优化类

16. worker_processes 如何设置?

通常与 CPU 核心数一致:

worker_processes auto;

17. worker_connections 如何计算最大并发?

最大并发 = worker_processes * worker_connections

18. sendfile / tcp_nopush / tcp_nodelay 的作用?

  • sendfile:零拷贝发送,提高静态文件性能
  • tcp_nopush:配合 sendfile,让大包优先发送
  • tcp_nodelay:用于实时响应(如小包)

推荐生产配置:

sendfile on;
tcp_nopush on;
tcp_nodelay on;

19. proxy_buffering on/off 区别?

功能 on off
缓冲后端响应
能加速用户?
能保护后端?
WebSocket / SSE 必须 off

Jenkins 官方:proxy_buffering off;

20. gzip 压缩有哪些注意事项?

  • 不要压缩图片/video
  • 只压缩文本类:html/json/css/js
  • 避免压缩已压缩内容

七、Nginx 故障排查

21. 502 / 504 常见原因?

502(Bad Gateway)

  • 后端服务挂了
  • 后端端口无法访问
  • FastCGI 超时
  • PHP-FPM 慢 / 崩溃

504(Gateway Timeout)

  • 后端响应慢
  • proxy_read_timeout 太小

22. Nginx 配置生效但浏览器不变?

常见原因:

  • upstream 缓存
  • CDN 缓存
  • 浏览器缓存(强缓存)
  • proxy_cache 未关闭
  • 冗余 server block 优先级错误(端口/host)

23. Nginx 日志中如何定位问题?

核心调试日志:

error.log debug;
access.log combined;

debug 模式:

error_log /var/log/nginx/error.log debug;

八、OpenResty 和 Nginx lua 扩展

24. OpenResty 是什么?

基于 Nginx + LuaJIT 的高性能平台,可用于:

  • API 网关
  • 动态 WAF
  • 复杂路由
  • 动态限流
  • 缓存系统

25. Nginx + Lua 的典型使用场景?

  • 动态分流 / AB test
  • 复杂鉴权
  • token 校验
  • 自定义负载均衡策略
  • 动态 upstream

九、真题 / 深度题

26. Nginx 为何适合高并发?

  • 异步非阻塞事件驱动(epoll)
  • worker 单线程无锁竞争
  • 内存管理优秀(pool)
  • 零拷贝 sendfile
  • 多核利用率高(worker_processes auto)
  • 稳定成熟

27. Nginx 怎样处理一个 HTTP 请求?(流程)

  1. master fork 出 workers
  2. worker 接收连接
  3. event 模型(epoll)将事件加入队列
  4. http 模块解析请求
  5. 匹配 location
  6. 转发到 upstream 或返回静态文件
  7. 记录日志

每一步都可被模块 hook。