Nginx 完全指南:核心用途、配置文件详解与动态配置实践
Nginx 是当今最流行的 Web 服务器和反向代理服务器之一。无论你是前端开发、后端工程师还是运维人员,掌握 Nginx 都是必备技能。本文将从 Nginx 能做什么 、nginx.conf 的核心配置 ,以及 你是否配置过"异变"(动态配置/热加载) 三个维度,结合流程图和实战案例,带你全面了解 Nginx 的日常使用与进阶技巧。
一、Nginx 是什么?能用来做什么?
Nginx(engine x)是一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3 邮件代理服务器。由俄罗斯程序员 Igor Sysoev 开发,以高并发、低内存消耗著称。
1.1 核心用途一览
| 功能分类 | 具体用途 | 典型场景 |
|---|---|---|
| Web 服务器 | 托管静态资源(HTML/CSS/JS/图片) | 静态网站、前端项目部署 |
| 反向代理 | 将客户端请求转发给后端服务器 | 隐藏真实服务器、负载均衡 |
| 负载均衡 | 分发流量到多个后端实例 | 高可用集群、水平扩展 |
| API 网关 | 路由、限流、鉴权、日志记录 | 微服务架构入口 |
| SSL 终结 | 处理 HTTPS 证书,卸载 SSL 加密开销 | 统一管理证书、提升后端性能 |
| 缓存加速 | 缓存后端响应,减轻上游压力 | 静态资源缓存、CDN 边缘节点 |
| 重写与重定向 | URL 重写、跳转 | 伪静态、域名迁移 |
| 限流与安全 | 限制请求频率、IP 黑白名单 | 防 CC 攻击、防爬虫 |
1.2 Nginx 请求处理流程
HTTP 请求
静态文件
动态请求
缓存命中
限流/过滤
客户端
Nginx
直接返回
反向代理至后端
后端实例1
后端实例2
缓存
安全模块
二、nginx.conf 配置文件结构详解
Nginx 的主配置文件通常是 /etc/nginx/nginx.conf(Linux)或安装目录下的 conf/nginx.conf。它采用层级嵌套的块结构。
2.1 整体结构图
main 全局块
events 块
http 块
server 块(虚拟主机)
location 块(路径匹配)
upstream 块(后端服务器组)
2.2 一个典型的 nginx.conf 示例
nginx
# 1. 全局块
user nginx;
worker_processes auto; # 自动匹配CPU核心数
pid /var/run/nginx.pid;
error_log /var/log/nginx/error.log warn;
# 2. events块
events {
worker_connections 1024; # 每个worker最大连接数
use epoll; # Linux高性能事件模型
}
# 3. http块
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
# 上游服务器组(负载均衡)
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 {
listen 80;
server_name www.example.com;
# 静态资源 location
location /static/ {
root /var/www/html;
expires 30d;
}
# 反向代理 location
location /api/ {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 重定向示例
location /old {
rewrite ^/old/(.*)$ /new/$1 permanent;
}
# 限流配置
location /login {
limit_req zone=login_limit burst=5 nodelay;
proxy_pass http://backend;
}
}
# 第二个虚拟主机(HTTPS)
server {
listen 443 ssl;
server_name secure.example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://backend;
}
}
}
2.3 常用配置项说明
| 配置块/指令 | 作用 | 使用频率 |
|---|---|---|
worker_processes |
工作进程数 | 高 |
worker_connections |
每个进程最大连接数 | 高 |
upstream |
定义后端服务器池及负载均衡策略 | 高 |
server |
定义一个虚拟主机(一个域名/IP) | 高 |
listen |
监听的端口及协议 | 高 |
server_name |
域名匹配 | 高 |
location |
URL 路径匹配与处理规则 | 高 |
proxy_pass |
将请求转发给后端 | 高 |
root / alias |
静态文件根目录 | 中 |
rewrite |
URL 重写 | 中 |
limit_req / limit_conn |
限流、限制连接 | 中 |
access_log / error_log |
日志 | 高 |
三、你"异变配置过吗"?------ 动态配置与热加载
用户问的"异变配置",推测是指 "亦变" (即动态变更配置)或 "热加载" 。Nginx 以热加载能力著称:修改配置后,可以在不中断服务的情况下重新加载配置。
3.1 热加载原理
Worker 进程 Master 进程 Admin Worker 进程 Master 进程 Admin alt [语法错误] [语法正确] nginx -s reload 检查新配置文件语法 报错,继续用旧配置 启动新 Worker 进程(使用新配置) 新 Worker 启动成功 通知旧 Worker 优雅关闭(处理完当前请求后退出) 旧 Worker 退出
执行命令:
bash
nginx -t # 测试配置文件语法
nginx -s reload # 平滑重载
3.2 动态模块 vs 静态编译
Nginx 1.9.11 开始支持动态模块 (如 --with-http_v2_module 可以动态加载),无需重新编译整个 Nginx。例如:
bash
# 动态加载模块
load_module modules/ngx_http_brotli_filter_module.so;
但大多数核心功能仍需要重新编译或使用 OpenResty 等扩展版本。
3.3 常见的"异变"场景
| 场景 | 是否热加载生效 | 备注 |
|---|---|---|
修改 proxy_pass 地址 |
是 | 直接生效 |
修改 upstream 中的服务器列表 |
是 | 注意长连接可能会继续用旧后端 |
修改 worker_processes |
否 | 需要重启 Nginx 主进程 |
添加新 server 或 location |
是 | 热加载后即生效 |
| 更换 SSL 证书路径 | 是 | 但需确保新证书文件存在 |
修改 listen 端口 |
否 | 需要完全重启 |
我的实践 :在生产环境中,我经常利用
nginx -s reload动态调整后端服务器权重、增加限流规则、修改重定向策略,这些操作都是"无中断"的,极大提高了运维效率。
四、实战:配置一个前后端分离项目的 Nginx
假设前端 Vue 打包后放在 /dist,后端 API 运行在 localhost:8080。
nginx
server {
listen 80;
server_name myapp.com;
# 前端静态文件
location / {
root /var/www/myapp/dist;
try_files $uri $uri/ /index.html; # SPA 路由支持
expires 7d;
}
# API 反向代理
location /api/ {
proxy_pass http://localhost:8080/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
# 可选:限流
limit_req zone=api_limit burst=20;
}
# 健康检查接口
location /health {
access_log off;
return 200 "OK";
}
}
五、总结与面试回答模板
面试官:"你了解 Nginx 吗?主要用它做什么?一般配置哪些内容?有没有配置过动态变更?"
参考回答 :
"我日常使用 Nginx 作为静态文件服务器 、反向代理 和负载均衡器 。常见的配置包括:
worker_processes设置 CPU 核心数、upstream定义后端服务池、server定义虚拟主机、location做 URI 路由、proxy_pass转发请求、limit_req限流以及 SSL 证书配置。我经常利用
nginx -s reload实现热加载,比如动态调整负载均衡的权重、修改重定向规则、增加 IP 黑白名单,这些操作都不需要重启服务。另外,我也配置过动态模块 (如
ngx_http_brotli_filter_module),用于动态压缩响应,提升前端性能。对于配置文件的管理,我会使用include指令拆分多个配置文件,方便维护。"