Nginx 核心原理与配置面试题详解
本文整理了 23 道 Nginx 高频面试题,涵盖核心原理、反向代理、负载均衡、限流机制及配置语法。内容解释了 Nginx 高性能原因(事件驱动模型)、动静分离方案、虚拟主机配置、location 匹配优先级以及安全控制策略。通过具体代码示例展示了限流、跨域处理及 upstream 负载均衡配置方法,适合准备面试的开发者参考。

本文整理了 23 道 Nginx 高频面试题,涵盖核心原理、反向代理、负载均衡、限流机制及配置语法。内容解释了 Nginx 高性能原因(事件驱动模型)、动静分离方案、虚拟主机配置、location 匹配优先级以及安全控制策略。通过具体代码示例展示了限流、跨域处理及 upstream 负载均衡配置方法,适合准备面试的开发者参考。

✅ 覆盖:核心原理、反向代理、负载均衡、限流、动静分离、配置语法、安全控制等关键知识点
Nginx 是一个 轻量级、高性能的 HTTP 和反向代理服务器,支持高并发(官方实测支持 5 万 + 并发连接),广泛用于:
🌐 国内用户:新浪、网易、腾讯、淘宝等均大规模使用。
核心在于其 事件驱动 + 异步非阻塞 I/O 模型:
💡 类比:传统 Apache 是'一个工人服务一个客户',Nginx 是'一个经理协调多个客户'。
listen 和 server_name 匹配对应的 server 块server 中根据请求 URI 匹配 location 块server {
listen 80;
server_name localhost;
location / {
root html;
index index.html;
}
}
| 类型 | 方向 | 作用 | 示例 |
|---|---|---|---|
| 正向代理 | 客户端 → 代理 → 目标服务器 | 隐藏客户端身份 | 公司员工通过代理访问外网 |
| 反向代理 | 客户端 → Nginx → 后端服务器 | 隐藏服务器身份,负载均衡 | 用户访问 www.example.com,实际由 Nginx 转发到 Tomcat |
✅ 反向代理优点:提升安全性(不暴露后端 IP)、实现负载均衡与高可用统一入口,便于监控和限流
✅ 优点:
❌ 缺点:
📌 实践建议:前端用 Nginx 抗压,动态请求转发给 Tomcat/Node.js 等。
/usr/local/nginx)├── conf/ # 配置文件目录
│ ├── nginx.conf # 主配置文件
│ └── mime.types # 媒体类型映射
├── html/ # 默认静态资源目录
│ ├── index.html
│ └── 50x.html
├── logs/ # 日志目录
│ ├── access.log
│ └── error.log
└── sbin/nginx # 启动命令
worker_processes auto; # 工作进程数(通常 = CPU 核数)
events {
worker_connections 1024; # 每个进程最大连接数
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on; # 零拷贝传输
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html;
}
}
}
将静态文件(HTML/JS/CSS/图片)放在 root 指定目录,Nginx 直接返回,无需后端参与。
location /static/ {
root /data/www;
expires 30d; # 设置缓存
}
通过 Nginx 代理,将跨域请求转为同域:
location /api/ {
proxy_pass http://backend-server/; # 转发到真实后端
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET,POST';
}
✅ 前端请求
/api/user→ 实际访问后端http://backend/user
server {
listen 80;
server_name www.lijie.com;
root /data/www;
}
server {
listen 80;
server_name bbs.lijie.com;
root /data/bbs;
}
⚠️ 需在本地 hosts 添加解析:
192.168.x.x www.lijie.com
server {
listen 8080;
server_name localhost;
root /data/app1;
}
server {
listen 80;
server_name www.lijie.com;
location / {
proxy_pass http://127.0.0.1:8080; # 用户访问 80,实际走 8080
}
}
| 匹配符 | 含义 | 优先级 |
|---|---|---|
= | 精确匹配 | 1(最高) |
^~ | 前缀匹配(不检查正则) | 2 |
~ | 区分大小写的正则 | 3 |
~* | 不区分大小写的正则 | 4 |
/ | 通用匹配 | 7(最低) |
示例:
location = / { return 400; } # 1
location ^~ /av { root /data/av; } # 2
location ~ /media { alias /data/static; } # 3
location ~* \.(jpg|png)$ { root /img; } # 4
location / { return 403; } # 7
# 定义限流区域:1 请求/分钟
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
server {
location /seckill {
limit_req zone=one burst=5 nodelay; # 允许突发 5 个请求
proxy_pass http://backend;
}
}
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
location / {
limit_conn perip 10; # 单 IP 最多 10 连接
limit_conn perserver 100; # 整个 server 最多 100 连接
}
}
| 算法 | 特点 | 适用场景 |
|---|---|---|
| 漏桶算法 | 固定速率流出,平滑流量 | 防突发冲击 |
| 令牌桶算法 | 允许突发,令牌积累 | 高吞吐 + 突发容忍(如 Guava RateLimiter) |
⚠️ Nginx 限流默认基于 漏桶算法
为什么做?
如何配置?
# 静态资源
location ~* \.(jpg|css|js|png)$ {
root /usr/local/static;
expires 30d;
}
# 动态请求
location / {
proxy_pass http://tomcat_cluster;
}
✅ 效果:静态资源由 Nginx 直接返回,动态请求转发给后端,提升整体性能。
| 策略 | 配置 | 说明 |
|---|---|---|
| 轮询(默认) | server ip; | 依次分配,自动剔除故障节点 |
| 权重(weight) | server ip weight=8; | 权重越高,分配越多(如 2:8) |
| IP 哈希(ip_hash) | ip_hash; | 同一 IP 固定访问同一后端(解决 session 共享) |
| fair(第三方) | fair; | 按响应时间分配(需编译模块) |
| url_hash(第三方) | hash $request_uri; | 同一 URL 访问同一后端(提升缓存命中) |
示例:
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
通过超时设置自动跳过故障节点:
location / {
proxy_pass http://backend;
proxy_connect_timeout 1s; # 连接超时
proxy_send_timeout 1s; # 发送超时
proxy_read_timeout 1s; # 接收超时
}
✅ 若某后端无响应,Nginx 自动尝试下一个节点。
if ($remote_addr = 192.168.9.115) {
return 403;
}
if ($http_user_agent ~* "Chrome") {
return 500;
}
⚠️ 注意:
if在 Nginx 中慎用,尽量用map或geo替代。
| 变量 | 含义 |
|---|---|
$remote_addr | 客户端 IP |
$host | 请求 Host 头 |
$request_uri | 完整 URI(含参数) |
$uri | 不带参数的 URI |
$args / $query_string | URL 参数 |
$http_user_agent | 浏览器标识 |
$scheme | 协议(http/https) |
$server_port | 服务器端口 |
$request_method | 请求方法(GET/POST) |
示例:重定向带参数
rewrite ^/old/(.*)$ /new/$1?$args permanent;

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online