4.3 KiB
id, title, type, domain, stack, tags, level, related, week
| id | title | type | domain | stack | tags | level | related | week | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| devops.nginx.interview | Nginx 面试题 | interview | devops |
|
|
basic |
|
|
Nginx 面试题
基础
【基础】正向代理和反向代理的区别?
参考答案:正向代理代表客户端访问外部服务器,服务器看到的是代理(例如公司上网代理);反向代理代表服务器接收客户端请求,客户端看到的是代理,不知道后端有哪些服务器。Nginx 常用作反向代理,做负载均衡、TLS 终止、静态资源、限流。
【基础】Nginx 的负载均衡策略有哪些?
参考答案:轮询(默认)、加权轮询(weight)、最少连接(least_conn)、IP 哈希(ip_hash,同一客户端固定到同一后端)、通用哈希(hash $key,可配合一致性哈希)。通过 max_fails、fail_timeout 做被动健康检查。
【基础】location 的匹配优先级是怎样的?
参考答案:先看 = 精确匹配;再找最长前缀匹配,如果它带 ^~ 就直接使用;否则按顺序匹配正则(~、~*),第一个匹配的生效;没有正则匹配就用最长前缀匹配。
【基础】前端单页应用部署到 Nginx 后刷新页面 404,为什么?
参考答案:前端路由(history 模式)的路径在服务器上没有对应文件。用 try_files $uri $uri/ /index.html; 让找不到的路径都返回 index.html,交给前端路由处理。
进阶
【进阶】502 和 504 有什么区别?分别怎么排查?
参考答案:502 Bad Gateway 是 Nginx 连接后端失败或后端返回了无效响应——后端没启动、端口错、进程崩溃、连接被拒绝,看 Nginx 错误日志里的 connect() failed 等信息。504 Gateway Timeout 是后端在超时时间内没有响应——后端处理慢(慢查询、调用外部服务卡住),或者 proxy_read_timeout 设置太短(例如大模型长回答)。
【进阶】代理 SSE 和 WebSocket 分别要注意什么?
参考答案:SSE 要关闭代理缓冲(proxy_buffering off 或后端返回 X-Accel-Buffering: no),否则流式内容被攒成一大段;读超时要放宽或者后端发心跳。WebSocket 需要 proxy_http_version 1.1 并传递 Upgrade 和 Connection 头完成协议升级,读超时也要调大。
【进阶】Nginx 怎么限流?
参考答案:limit_req_zone 定义按某个 key(如 $binary_remote_addr)的请求速率,基于漏桶算法;limit_req 应用到 location,burst 允许排队的突发量,nodelay 让突发请求不排队立即处理;超出返回 limit_req_status(默认 503,常改为 429)。limit_conn 限制并发连接数。前面还有负载均衡时要用 real_ip 模块取真实客户端 IP。
场景题
【场景题】AI 问答的流式输出经过 Nginx 后变成一次性返回,怎么解决?
参考答案:Nginx 默认对代理响应做缓冲。给流式接口单独 location,设置 proxy_buffering off、proxy_cache off,HTTP/1.1 长连接,proxy_read_timeout 调大;后端响应头加 X-Accel-Buffering: no;确认 gzip 没有压缩 text/event-stream;如果前面还有 CDN 或云负载均衡,也要确认它们支持流式。详见AI 应用网关场景。
【场景题】要让 10% 的用户先用新版本,Nginx 怎么做?
参考答案:用 split_clients 根据用户标识(如用户 ID Cookie 或 IP)哈希出 10% 映射到新版本 upstream;或者 upstream 中用 weight 按比例分配;指定用户体验用 map $cookie_xxx。注意同一用户要稳定落在同一版本(按用户标识哈希,而不是随机)、新旧版本接口兼容、能一键回滚。
【场景题】怎么做到发版时用户无感知(不中断请求)?
参考答案:后端多实例滚动发布:先把一台实例从 upstream 摘除(或标记 down)并 reload Nginx,等它处理完存量请求后升级,再加回去,逐台进行;后端程序要支持优雅退出。Nginx 自身修改配置用 nginx -s reload,旧 worker 处理完已有连接再退出,不会中断请求。