Nginx 高频面试题(含答案)

一、基础概念题(必问)

1. Nginx 是什么?核心应用场景?

  • Nginx 是高性能、轻量级的 HTTP Web 服务器、反向代理服务器、邮件代理服务器
  • 核心场景:
    1. 静态资源 Web 服务(HTML/CSS/JS/ 图片)
    2. 反向代理、负载均衡
    3. 动静分离
    4. HTTPS 部署、限流、缓存、防盗链
    5. 高并发网关层

2. Nginx 相比 Apache 优势?

  1. 高并发:异步非阻塞事件驱动(epoll),单机支持万级并发
  2. 轻量:内存占用低、配置简洁
  3. 高性能:静态资源处理极快
  4. 热部署 :支持 reload 不中断服务
  5. 模块化设计、扩展性强

3. Nginx 进程模型(master-worker)?

  • master 进程(主进程):读取验证配置、管理 worker 进程、接收信号(reload/stop)、平滑重启
  • worker 进程(工作进程):实际处理网络请求、事件循环、响应客户端
  • 优点:稳定(一个 worker 挂了不影响整体)、利用多核 CPU、平滑升级

4. 为什么 Nginx 用多进程而非多线程?

  1. 避免线程切换开销、锁竞争
  2. 进程独立,稳定性更高
  3. 充分利用多核,事件驱动模型效率更高
  4. 平滑重启 / 热部署更安全

二、核心配置 & 语法(高频)

5. Nginx 配置文件结构?

分为 4 块:

  1. 全局块:worker_processes、error_log 等
  2. events 块:连接配置(worker_connections、use epoll)
  3. http 块 :全局 HTTP 配置(gzip、include、upstream)
    • 可包含多个 server 块
  4. server 块 :虚拟主机(listen、server_name、root)
    • 包含多个 location 块:匹配 URI 做路由

6. location 匹配规则与优先级(面试必考)

匹配类型(优先级从高到低):

  1. 精准匹配 =:完全相等优先最高
  2. ^~ 前缀匹配:匹配到即停止正则检查
  3. 正则匹配~区分大小写 / ~ 不区分*
  4. 普通前缀匹配 /xxx
  5. 通用匹配 /

示例:

bash 复制代码
location = /index { ... } # 最高
location ^~ /static { ... } # 次之
location ~ \.(jpg|png)$ { ... } # 正则
location / { ... } # 兜底

7. try_files 作用?

按顺序检查文件 / 目录,不存在则转发或返回 404,常用于 SPA(Vue/React)路由。

bash 复制代码
location / {
    try_files $uri $uri/ /index.html;
}

8. rewrite 与 return 区别?

  • return:直接返回状态码 / URL,停止后续处理,性能高
  • rewrite:URL 重写,可继续匹配其他 location,支持正则重写

三、反向代理 & 负载均衡(核心)

9. 正向代理 vs 反向代理?

  • 正向代理:代理客户端,访问外部服务(如翻墙),服务端不知道真实客户端
  • 反向代理:代理服务端,客户端不知道真实后端,统一入口、负载、安全

10. Nginx 负载均衡策略(必背)

  1. 轮询(默认):请求均匀分发
  2. weight 加权轮询:权重越高,分配越多
  3. ip_hash:按客户端 IP 哈希,固定访问一台(解决 Session 问题)
  4. least_conn:最少连接数优先
  5. fair(第三方):按后端响应时间分配
  6. url_hash:按 URL 哈希,缓存命中率高

11. upstream 配置示例(加权 + 健康检查)

bash 复制代码
upstream backend {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=2;
    server 192.168.1.12:8080 backup; # 备用
    server 192.168.1.13:8080 down; # 下线
}

location / {
    proxy_pass http://backend;
}

12. ip_hash 缺点?

  • 后端节点上下线,哈希结果会变,大量 Session 迁移
  • 无法按负载动态调整
  • 适合有状态服务,不适合微服务无状态架构

四、动静分离 & 缓存

13. 什么是动静分离?

  • 静态资源(图片、JS、CSS)由 Nginx 直接返回
  • 动态请求(接口)转发给 Tomcat/Java 服务
  • 提升访问速度、减轻后端压力

14. Nginx 如何做缓存?

使用 proxy_cache 缓存后端响应:

bash 复制代码
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache_zone:10m inactive=1d;

location /api {
    proxy_cache cache_zone;
    proxy_cache_key $host$uri$is_args$args;
    proxy_cache_valid 200 304 1h;
}

五、限流 & 安全(高频)

15. Nginx 两种限流方式?

  1. 连接限流 limit_conn:限制同一 IP 并发连接数
  2. 请求限流 limit_req:限制单位时间请求数(漏桶算法)

示例(请求限流):

bash 复制代码
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

location /api {
    limit_req zone=req_limit burst=5 nodelay;
}
  • burst:突发队列
  • nodelay:突发请求不延迟直接处理

16. 如何实现防盗链?

通过 valid_referers 校验来源:

bash 复制代码
location ~* \.(jpg|png|gif)$ {
    valid_referers none blocked server_names *.xxx.com;
    if ($invalid_referer) {
        return 403;
    }
}

17. Nginx 配置 HTTPS 步骤?

  1. 申请 SSL 证书(crt/key)
  2. 监听 443 端口,配置 ssl_certificate/ssl_certificate_key
  3. 开启 ssl、配置协议与加密套件
  4. 80 端口重定向到 443

六、性能优化(高级面试)

18. Nginx 常用优化配置?

  1. worker_processes auto:与 CPU 核心数一致
  2. worker_connections 10240:单进程最大连接数
  3. use epoll:事件模型
  4. keepalive_timeout 65:长连接超时
  5. open_file_cache:文件描述符缓存
  6. gzip on:压缩文本资源
  7. 关闭 access_log 或开启缓冲

19. 什么是惊群问题?Nginx 如何解决?

  • 惊群:多 worker 同时等待同一个连接,只有一个抢到,浪费资源
  • Nginx 解决方案:互斥锁 accept_mutex,同一时间只有一个 worker 接收新连接

七、高可用 & 部署

20. Nginx 如何实现高可用?

使用 Keepalived + Nginx

  • 主备 Nginx 节点,虚拟 IP(VIP)漂移
  • 主节点挂掉,VIP 自动切到备机
  • 结合脚本检测 Nginx 存活,自动触发切换

21. Nginx 平滑重启 / 重载命令?

  • 重载配置(不中断服务):nginx -s reload
  • 快速停止:nginx -s stop
  • 优雅停止(处理完请求):nginx -s quit
  • 检查配置:nginx -t

八、故障排查(场景题必考)

22. 502 Bad Gateway 原因?

  1. 后端服务(Tomcat)宕机 / 无响应
  2. 后端超时、队列满、拒绝连接
  3. upstream 配置错误
  4. 后端进程卡死、线程池耗尽

23. 504 Gateway Timeout 原因?

  • Nginx 等待后端响应超时
  • 后端业务逻辑慢、DB 慢查询、死锁
  • proxy_read_timeout 时间过短

24. 403 Forbidden 原因?

  1. 目录 / 文件权限不足
  2. 禁止目录浏览(autoindex off)
  3. IP 黑名单、防盗链拦截
  4. 配置错误无首页文件

25. 404 Not Found 原因?

  1. 文件不存在
  2. location 匹配错误
  3. root/alias 路径错误
  4. 后端接口不存在

九、高频综合面试题

26. Nginx 处理一个 HTTP 请求完整流程?

  1. 建立 TCP 连接(三次握手)
  2. master 接收连接,转给 worker
  3. 解析请求行、请求头
  4. 匹配 server_name → 匹配 location
  5. 执行 rewrite、try_files、权限校验
  6. 静态资源直接返回 / 动态请求 proxy_pass 转发
  7. 接收后端响应,返回客户端
  8. 关闭 / 保持长连接

27. alias 和 root 区别?

  • root:路径拼接 = root + location
  • alias:精确替换路径,不拼接 location
bash 复制代码
location /img/ {
    root /data; # 实际路径 /data/img/xxx.jpg
}
location /img/ {
    alias /data/static/; # 实际路径 /data/static/xxx.jpg
}

28. Nginx 为什么能支撑高并发?

  1. 异步非阻塞 + epoll 事件驱动
  2. 多进程利用多核
  3. 内存池设计,减少内存碎片
  4. 零拷贝(sendfile)高效输出静态文件
  5. 无锁设计,请求独立处理

十、简短速记版(面试前 10 分钟背)

  1. 进程:master 管理,worker 干活
  2. location 优先级:= > ^~ > 正则 > 普通 > /
  3. 负载策略:轮询、weight、ip_hash、least_conn
  4. 限流:limit_req(漏桶)、limit_conn
  5. 502 = 后端挂 / 拒绝;504 = 后端超时;403 = 权限 / 防盗链
  6. 优化:worker_processes、epoll、长连接、gzip、缓存
  7. 高可用:Keepalived + VIP
相关推荐
吕司2 小时前
Linux系统安装MySQL
linux·运维·服务器
犀思云2 小时前
构建全球化多云网格:FusionWAN NaaS 在高可用基础设施中的工程实践
运维·网络·人工智能·系统架构·机器人
无名的小白3 小时前
openclaw使用nginx反代部署过程 与disconnected (1008): pairing required解决
java·前端·nginx
yuankoudaodaokou3 小时前
革新自动化产线调试,扫描生成点云精准引导机器人路径
运维·python·机器人·自动化
wengad3 小时前
podman搭建nginx服务
运维·nginx·podman
阡陌..3 小时前
Linux下的vi和vim使用方法
linux·运维·vim
hweiyu003 小时前
Linux 命令:diff
linux·运维·服务器
进击切图仔3 小时前
基于 linux 20.04 构建 ros1 noetic 开发环境 -离线版本
linux·运维·服务器
晚风吹长发3 小时前
初步了解Linux中的线程同步问题及线程安全和死锁与生产消费者模型
linux·运维·服务器·开发语言·数据结构·安全