Nginx 面试题
2026/1/15大约 3 分钟
Nginx 面试题
基础概念
1. Nginx 的优势是什么?
- 高并发:基于事件驱动,单机支持数万并发
- 低内存:10000 个非活跃连接仅需 2.5MB 内存
- 高可靠:master-worker 架构,worker 异常自动重启
- 热部署:支持不停机更新配置和升级
- 模块化:功能模块化,易于扩展
2. Nginx 和 Apache 的区别?
| 特性 | Nginx | Apache |
|---|---|---|
| 架构 | 事件驱动、异步非阻塞 | 进程/线程驱动 |
| 并发 | 高(数万) | 较低(数千) |
| 内存 | 低 | 较高 |
| 静态资源 | 优秀 | 一般 |
| 动态内容 | 需要反向代理 | 原生支持 |
| 配置 | 简洁 | 灵活但复杂 |
3. Nginx 的进程模型?
┌─────────────────────────────────────────┐
│ Master Process │
│ - 读取配置 │
│ - 管理 Worker │
│ - 接收信号 │
└─────────────────────────────────────────┘
│
┌────┴────┬────────┬────────┐
▼ ▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐
│Worker │ │Worker │ │Worker │ │Worker │
│Process│ │Process│ │Process│ │Process│
└───────┘ └───────┘ └───────┘ └───────┘- Master:管理进程,负责读取配置、管理 Worker
- Worker:工作进程,处理实际请求
4. location 匹配优先级?
= > ^~ > ~ / ~* > 普通前缀 > /=精确匹配^~前缀匹配(优先于正则)~正则匹配(区分大小写)~*正则匹配(不区分大小写)- 普通前缀匹配
/默认匹配
反向代理
5. 正向代理和反向代理的区别?
| 类型 | 代理对象 | 用途 |
|---|---|---|
| 正向代理 | 客户端 | 翻墙、缓存、匿名 |
| 反向代理 | 服务端 | 负载均衡、安全、缓存 |
6. Nginx 负载均衡策略有哪些?
| 策略 | 说明 | 适用场景 |
|---|---|---|
| 轮询 | 默认,依次分发 | 服务器性能相近 |
| 加权轮询 | 按权重分发 | 服务器性能不同 |
| ip_hash | 按 IP 哈希 | 需要会话保持 |
| least_conn | 最少连接 | 请求处理时间差异大 |
| url_hash | 按 URL 哈希 | 缓存服务器 |
7. 如何实现会话保持?
# 方式1:ip_hash
upstream backend {
ip_hash;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
}
# 方式2:sticky cookie(商业版)
upstream backend {
sticky cookie srv_id expires=1h;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
}
# 方式3:使用 Redis 共享 Session性能优化
8. 如何优化 Nginx 性能?
worker 配置
- worker_processes 设为 CPU 核心数
- worker_connections 根据内存调整
启用 sendfile
- 零拷贝传输静态文件
开启 gzip
- 压缩文本类型响应
配置缓存
- 静态资源设置 expires
- 启用 proxy_cache
keepalive
- 复用 TCP 连接
9. 如何配置限流?
# 请求速率限制
limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
# 连接数限制
limit_conn_zone $binary_remote_addr zone=conn:10m;
server {
location /api/ {
limit_req zone=req burst=20 nodelay;
limit_conn conn 10;
}
}10. 如何配置缓存?
# 代理缓存
proxy_cache_path /var/cache/nginx levels=1:2
keys_zone=cache:10m max_size=10g inactive=60m;
location / {
proxy_cache cache;
proxy_cache_valid 200 10m;
proxy_cache_key $scheme$host$request_uri;
add_header X-Cache-Status $upstream_cache_status;
}安全配置
11. 如何防止 DDoS 攻击?
# 限制请求速率
limit_req_zone $binary_remote_addr zone=ddos:10m rate=5r/s;
# 限制连接数
limit_conn_zone $binary_remote_addr zone=conn:10m;
# 限制请求体大小
client_max_body_size 10m;
# 超时设置
client_body_timeout 10s;
client_header_timeout 10s;12. 如何配置 HTTPS?
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=31536000" always;
}实战问题
13. 如何实现灰度发布?
# 基于 Cookie
map $cookie_version $backend {
default backend_v1;
"v2" backend_v2;
}
# 基于权重
split_clients "${remote_addr}" $variant {
10% backend_v2;
* backend_v1;
}14. 如何排查 502 错误?
- 检查后端服务是否正常
- 查看 Nginx error.log
- 检查 upstream 配置
- 调整超时时间
- 检查连接数限制
15. 如何实现跨域?
location /api/ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'Content-Type, Authorization';
if ($request_method = 'OPTIONS') {
return 204;
}
proxy_pass http://backend;
}