Nginx 核心配置与面试指南
Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,也是目前后端和运维日常工作中最常用的组件之一。本文总结了工作中最常用的 Nginx 配置场景以及面试中常被问到的核心问题。
🛠 一、 工作中常用的 Nginx 配置场景
1. 静态资源托管
前端项目(如 Vue/React 打包后的 dist 目录)最常见的部署方式。
server {
listen 80;
server_name www.example.com;
# 开启 gzip 压缩,提升加载速度
gzip on;
gzip_types text/plain application/javascript text/css application/json;
gzip_min_length 1k;
location / {
root /usr/share/nginx/html/dist; # 前端打包文件目录
index index.html index.htm;
# 单页应用 (SPA) 路由 fallback,防止刷新 404
try_files $uri $uri/ /index.html;
}
# 静态资源缓存设置
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
root /usr/share/nginx/html/dist;
expires 30d; # 缓存 30 天
add_header Cache-Control "public, no-transform";
}
}
2. 反向代理 (Reverse Proxy) 与跨域解决
将客户端的请求转发给后端的真实服务器(如 Node.js, Java, Python 服务),常用于解决前后端分离时的跨域问题。
server {
listen 80;
server_name api.example.com;
location /api/ {
# 代理到后端真实地址
proxy_pass http://127.0.0.1:3000/;
# 传递客户端真实 IP 和请求头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
3. 负载均衡 (Load Balancing)
将流量分发到多台上游服务器,提高系统的可用性和吞吐量。
# 定义上游服务器集群
upstream backend_servers {
# 默认轮询算法
server 192.168.1.10:8080 weight=3; # 权重更高,分配的请求更多
server 192.168.1.11:8080 weight=1;
server 192.168.1.12:8080 backup; # 备用节点,主节点全挂时才启用
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_servers;
}
}
4. HTTPS 配置 (SSL 证书)
将 HTTP 请求重定向到 HTTPS,并配置 SSL 证书。
# HTTP 自动重定向到 HTTPS
server {
listen 80;
server_name secure.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name secure.example.com;
# 证书文件路径
ssl_certificate /etc/nginx/ssl/secure.example.com.pem;
ssl_certificate_key /etc/nginx/ssl/secure.example.com.key;
# SSL 优化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
5. WebSocket 代理
如果后端使用了 Socket.io 或原生 WebSocket,Nginx 需要特殊配置来支持协议升级。
location /socket.io/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
# 必须设置以下两个 Header,实现 HTTP 到 WebSocket 的协议升级
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
💡 二、 Nginx 高频面试题
1. 正向代理和反向代理的区别是什么?
- 正向代理 (Forward Proxy):代理的是客户端。客户端通过代理服务器去访问外网(例如 VPN、翻墙软件)。服务器不知道真实的客户端是谁。
- 反向代理 (Reverse Proxy):代理的是服务端。客户端直接访问代理服务器,代理服务器再把请求转发给内部的真实服务器。客户端不知道真实的服务器是哪台(Nginx 最常用的场景)。
2. Nginx 为什么性能这么高?(Nginx 的架构模型)
Nginx 采用了多进程 + 异步非阻塞 I/O (epoll) 模型:
- Master-Worker 模型:一个 Master 进程负责管理配置和 Worker 进程,多个 Worker 进程负责处理实际的连接。
- 事件驱动 (epoll):一个 Worker 进程在一个线程中可以同时处理数以万计的并发连接,而不需要为每个连接创建新线程,极大地减少了内存占用和上下文切换的开销。
3. Nginx 的负载均衡策略有哪些?
Nginx 内置了多种负载均衡算法:
- 轮询 (Round Robin):默认策略,按时间顺序逐一分配。
- 权重 (Weight):给不同服务器设置不同权重,性能好的机器分配更多请求。
- IP Hash (
ip_hash):根据客户端 IP 计算 Hash 值分配服务器,常用于解决 Session 保持问题。 - 最少连接 (
least_conn):将请求分配给当前连接数最少的服务器。 - URL Hash (
hash $request_uri):根据请求的 URL 进行 Hash 分配,常用于后端是缓存服务器的场景。
4. Nginx 如何解决前端 Vue/React 刷新后 404 的问题?
单页应用 (SPA) 只有 index.html 一个真实文件,路由是前端通过 History API 模拟的。刷新时,Nginx 会去硬盘找对应的物理路径,找不到就会 404。 解决办法:在 location / 中使用 try_files 指令,将所有找不到的文件请求重定向到 index.html。
try_files $uri $uri/ /index.html;
5. Nginx 中的 location 匹配优先级是怎样的?
location 的匹配规则有严格的优先级顺序(从高到低):
=:精确匹配(优先级最高)^~:普通字符串的前缀匹配(一旦匹配成功,不再进行正则匹配)~和~*:正则表达式匹配(~区分大小写,~*不区分大小写)/:普通前缀匹配(匹配所有请求,兜底)
6. 如何限制某个 IP 的访问频率?(防刷/限流)
使用 limit_req_zone 和 limit_req 指令可以实现基于漏桶算法的限流。
# 在 http 块定义:限制每个 IP 每秒只能请求 10 次
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
location /login/ {
# 在 location 块应用:burst=20 表示允许突发 20 个请求,nodelay 表示不延迟处理
limit_req zone=mylimit burst=20 nodelay;
}
}
