Nginx 知识体系 · 上篇:基础与核心
第一章 基础概念1.1 Nginx 是什么Nginxengine-x是一款高性能HTTP/反向代理/负载均衡服务器由 Igor Sysoev 于 2004 年发布专为解决C10K 问题单机万级并发而设计。核心特征高并发、低内存~2.5KB/连接、事件驱动、模块化、热部署、跨平台。1.2 核心功能功能说明典型场景Web Server高效提供静态资源HTML/CSS/JS/图片静态站点托管Reverse Proxy隐藏后端服务统一入口API 转发Load Balancer将请求按策略分发到多台后端水平扩展GatewayAPI 路由、认证鉴权、限流微服务网关正向代理 vs 反向代理正向代理代理客户端如 VPN客户端知道代理存在反向代理代理服务端如 Nginx客户端不知道后端存在1.3 工作模型Master / Worker 多进程架构Master 进程管理者 ├── 读取/验证配置、绑定端口、管理 Worker ├── 不处理客户端请求 │ ├── Worker #1 ── 处理请求竞争 accept 连接 ├── Worker #2 ── 处理请求 ├── Worker #3 ── 处理请求 └── Worker #4 ── 处理请求worker_processes auto; # 推荐设为 CPU 核心数 worker_cpu_affinity auto; # 绑定 Worker 到 CPU事件驱动模型epoll传统模型1连接 1线程资源消耗大。Nginx单 Worker 通过epoll/kqueue事件循环处理数千连接异步非阻塞。机制最大连接数效率平台select1024O(n)全平台poll无限制O(n)Linuxepoll无限制O(1)Linux 2.6kqueue无限制O(1)FreeBSD/macOSevents { use epoll; worker_connections 65535; multi_accept on; }第二章 安装与环境2.1 Linux 安装# Ubuntu / Debiansudoaptupdatesudoaptinstall-ynginx# CentOS / RHELsudoyuminstall-yepel-releasesudoyuminstall-ynginx# 源码编译安装自定义模块wgethttp://nginx.org/download/nginx-1.24.0.tar.gztar-zxvfnginx-1.24.0.tar.gzcdnginx-1.24.0 ./configure--prefix/usr/local/nginx\--with-http_ssl_module\--with-http_v2_module\--with-http_gzip_static_modulemakesudomakeinstall2.2 Windows / Mac 安装# macOSbrewinstallnginx# Windows下载官方 zip 解压后运行 nginx.exe2.3 目录结构/etc/nginx/ # 主配置目录 ├── nginx.conf # 主配置文件 ├── conf.d/ # 自定义配置推荐 │ └── default.conf ├── sites-available/ # 可用站点Debian系 ├── sites-enabled/ # 已启用站点软链接 ├── mime.types # MIME 类型映射 └── fastcgi_params # FastCGI 参数 /var/log/nginx/ # 日志目录 ├── access.log └── error.log /usr/share/nginx/html/ # 默认静态资源目录2.4 常用命令nginx-t# 测试配置语法nginx-T# 测试并输出完整配置nginx-sreload# 平滑重载配置不断开连接nginx-sstop# 快速停止nginx-squit# 优雅退出处理完当前请求nginx-V# 查看编译参数和版本systemctl start nginx# 启动systemctlenablenginx# 开机自启⚠️ 修改配置后务必先nginx -t验证语法再nginx -s reload。第三章 配置体系3.1 配置文件总体结构# ─── main 全局块 ─── user nginx; # 运行用户 worker_processes auto; # Worker 进程数 error_log /var/log/nginx/error.log; # 错误日志 pid /run/nginx.pid; # PID 文件 # ─── events 块 ─── events { worker_connections 1024; # 单 Worker 最大连接数 use epoll; } # ─── http 块 ─── http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # ─── server 块虚拟主机─── server { listen 80; server_name example.com; # ─── location 块路由匹配─── location / { root /var/www/html; index index.html; } } }层级关系main → events / http → server → location3.2 server 块虚拟主机一个 Nginx 可以运行多个网站每个server块定义一个虚拟主机# 基于域名的虚拟主机 server { listen 80; server_name www.site-a.com; root /var/www/site-a; } server { listen 80; server_name www.site-b.com; root /var/www/site-b; } # 基于端口的虚拟主机 server { listen 8081; root /var/www/app1; }匹配优先级精确匹配 → 左通配符*.example.com→ 右通配符mail.*→ 正则 →default_server3.3 location 块详见第四章。3.4 配置拆分include# 主配置文件引入子配置 http { include /etc/nginx/conf.d/*.conf; # 引入所有 .conf include /etc/nginx/sites-enabled/*; # 引入已启用站点 }最佳实践每个站点独立一个配置文件放在conf.d/目录下。第四章 路由与匹配规则4.1 location 匹配类型修饰符含义示例精确匹配location /login { }/前缀匹配location /api/ { }^~前缀匹配优先级高匹配后不再正则location ^~ /static/ { }~正则匹配区分大小写location ~ \.php$ { }~*正则匹配不区分大小写location ~* .(jpg4.2 匹配优先级从高到低1. 精确匹配 → 命中立即停止 2. ^~ 前缀匹配 → 命中不再正则 3. ~ / ~* 正则匹配 → 按配置顺序第一个命中即停止 4. / 普通前缀匹配 → 选最长匹配完整示例server { # 1️⃣ 精确匹配只匹配 / location / { return 200 exact root; } # 2️⃣ 优先前缀/static/ 开头的不再走正则 location ^~ /static/ { root /var/www; } # 3️⃣ 正则匹配.php 结尾 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; } # 4️⃣ 不区分大小写正则图片文件 location ~* \.(jpg|jpeg|png|gif|ico)$ { expires 30d; } # 5️⃣ 通用前缀兜底 location / { proxy_pass http://backend; } }4.3 URI 处理规则# proxy_pass 带不带尾部斜杠的区别重要 # 请求 /api/user → 转发到 http://backend/api/user location /api/ { proxy_pass http://backend; # 不带 URI 部分 } # 请求 /api/user → 转发到 http://backend/user去掉 /api 前缀 location /api/ { proxy_pass http://backend/; # 带尾部斜杠 }⚠️经典坑proxy_pass后面带不带/行为完全不同带/会替换匹配的 location 前缀。第五章 核心功能模块5.1 静态资源服务server { listen 80; server_name static.example.com; root /var/www/static; # 目录浏览可选 location /files/ { autoindex on; autoindex_exact_size off; # 显示人类可读大小 autoindex_localtime on; } # 静态资源缓存 location ~* \.(css|js|jpg|png|gif|ico|woff2)$ { expires 30d; add_header Cache-Control public, immutable; access_log off; # 静态资源不记日志 } # 404 回退SPA 应用必须 location / { try_files $uri $uri/ /index.html; } }5.2 反向代理server { listen 80; server_name api.example.com; location / { proxy_pass http://127.0.0.1:8080; # ── 必须设置的 Header ── 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; # ── 超时配置 ── proxy_connect_timeout 10s; # 连接后端超时 proxy_read_timeout 60s; # 等待后端响应超时 proxy_send_timeout 30s; # 发送到后端超时 # ── 缓冲区 ── proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 8 16k; } }5.3 负载均衡# 定义后端集群 upstream backend { # 算法选择四选一 # 默认轮询依次分配 # least_conn; # 最少连接 # ip_hash; # IP 哈希会话保持 # hash $request_uri consistent; # 一致性哈希 server 10.0.0.1:8080 weight5; # 权重 server 10.0.0.2:8080 weight3; server 10.0.0.3:8080 weight2 max_fails3 fail_timeout30s; server 10.0.0.4:8080 backup; # 备份节点 server 10.0.0.5:8080 down; # 标记下线 } server { listen 80; location / { proxy_pass http://backend; proxy_next_upstream error timeout http_502 http_503; # 失败重试 } }四种算法对比算法特点适用场景轮询默认均匀分配后端性能一致weight按权重分配后端性能不一致ip_hash同 IP 固定后端需要会话保持least_conn分给连接最少的请求处理时间差异大5.4 HTTPS 配置server { listen 443 ssl http2; server_name www.example.com; # ── 证书配置 ── ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; # ── SSL 安全参数 ── 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; ssl_session_timeout 10m; # HSTS强制 HTTPS add_header Strict-Transport-Security max-age31536000; includeSubDomains always; } # HTTP → HTTPS 强制跳转 server { listen 80; server_name www.example.com; return 301 https://$host$request_uri; }Let’s Encrypt 免费证书申请# 安装 certbotsudoaptinstallcertbot python3-certbot-nginx# 自动申请并配置sudocertbot--nginx-dwww.example.com# 自动续期sudocertbot renew --dry-run5.5 URL 重写# rewrite 语法rewrite regex replacement [flag]; # flag: last | break | redirect(302) | permanent(301) server { # 旧路径永久重定向 rewrite ^/old-page$ /new-page permanent; # 去掉 .html 后缀 rewrite ^(.*)\.html$ $1 permanent; # 强制带 www if ($host example.com) { rewrite ^(.*)$ https://www.example.com$1 permanent; } # return 更简洁推荐用于简单跳转 location /github { return 302 https://github.com/your-repo; } }第六章 高级功能6.1 限流limit_reqhttp { # 定义限流区域每个 IP 每秒 10 个请求 limit_req_zone $binary_remote_addr zoneapi_limit:10m rate10r/s; server { location /api/ { # burst20允许突发 20 个排队 # nodelay突发请求不延迟处理 limit_req zoneapi_limit burst20 nodelay; limit_req_status 429; # 超限返回 429 } } }6.2 并发连接限制limit_connhttp { limit_conn_zone $binary_remote_addr zoneconn_limit:10m; server { location /download/ { limit_conn conn_limit 5; # 每 IP 最多 5 个并发连接 limit_rate 500k; # 每连接限速 500KB/s } } }6.3 IP 访问控制# 黑名单模式 location /admin/ { deny 192.168.1.100; # 拒绝特定 IP deny 10.0.0.0/8; # 拒绝网段 allow all; # 其他放行 } # 白名单模式推荐用于管理后台 location /admin/ { allow 192.168.1.0/24; # 只允许内网 allow 10.0.0.50; deny all; # 拒绝其他 }6.4 防盗链location ~* \.(jpg|png|gif|mp4)$ { valid_referers none blocked server_names *.example.com; if ($invalid_referer) { return 403; # 或返回防盗链提示图 # rewrite ^/ /images/hotlink-denied.png break; } }6.5 跨域配置CORSlocation /api/ { # 允许的源生产环境指定具体域名 add_header Access-Control-Allow-Origin $http_origin always; add_header Access-Control-Allow-Methods GET, POST, PUT, DELETE, OPTIONS always; add_header Access-Control-Allow-Headers Authorization, Content-Type, X-Requested-With always; add_header Access-Control-Allow-Credentials true always; add_header Access-Control-Max-Age 3600 always; # 预检请求快速返回 if ($request_method OPTIONS) { return 204; } proxy_pass http://backend; }6.6 WebSocket 支持location /ws/ { proxy_pass http://websocket_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; proxy_read_timeout 3600s; # WebSocket 长连接超时 }6.7 文件上传限制http { client_max_body_size 50m; # 全局上传大小限制 server { location /upload/ { client_max_body_size 200m; # 上传接口单独放大 client_body_timeout 120s; proxy_pass http://upload_backend; } } }第七章 日志与监控7.1 access_loghttp { # 日志格式定义 log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $request_time $upstream_response_time; # JSON 格式便于 ELK 采集 log_format json_log escapejson {time:$time_iso8601, ip:$remote_addr, method:$request_method, uri:$request_uri, status:$status, size:$body_bytes_sent, referer:$http_referer, ua:$http_user_agent, rt:$request_time, upstream_rt:$upstream_response_time}; access_log /var/log/nginx/access.log main; server { # 按站点分开日志 access_log /var/log/nginx/site-a.access.log json_log; # 静态资源不记日志 location ~* \.(css|js|ico)$ { access_log off; } } }7.2 error_log# 级别debug | info | notice | warn | error | crit | alert | emerg error_log /var/log/nginx/error.log warn; # 调试特定 IP 的请求 events { debug_connection 192.168.1.100; }7.3 日志切割# logrotate 配置 /etc/logrotate.d/nginx/var/log/nginx/*.log{daily rotate30missingok compress delaycompress notifempty sharedscripts postrotate[-f/run/nginx.pid]kill-USR1$(cat/run/nginx.pid)endscript}7.4 监控方案# 开启 stub_status 模块基础监控 location /nginx_status { stub_status on; allow 127.0.0.1; deny all; } # 输出示例 # Active connections: 291 # server accepts handled requests # 16630948 16630948 31070465 # Reading: 6 Writing: 179 Waiting: 106Prometheus Grafana 方案使用nginx-prometheus-exporter采集 stub_status 指标接入 Grafana 仪表盘。第八章 性能优化8.1 Worker 优化worker_processes auto; # CPU 核心数 worker_cpu_affinity auto; # CPU 亲和性绑定 worker_rlimit_nofile 65535; # 文件描述符上限 worker_priority -10; # 提高进程优先级8.2 连接优化events { worker_connections 65535; multi_accept on; use epoll; }8.3 keepalivehttp { keepalive_timeout 65; # 客户端 keep-alive keepalive_requests 1000; # 单连接最大请求数 upstream backend { server 10.0.0.1:8080; keepalive 32; # 到后端的连接池大小 } server { location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ; # 必须清空才能复用 } } }8.4 gzip 压缩http { gzip on; gzip_vary on; gzip_min_length 1k; # 小于 1KB 不压缩 gzip_comp_level 4; # 压缩级别1-94为平衡点 gzip_types text/plain text/css text/javascript application/json application/javascript application/xml image/svgxml; gzip_proxied any; gzip_disable MSIE [1-6]\.; # 预压缩推荐配合构建工具 gzip_static on; # 优先使用 .gz 预压缩文件 }8.5 静态缓存# open_file_cache缓存文件元信息fd/size/mtime open_file_cache max10000 inactive60s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;8.6 sendfile / tcp 优化http { sendfile on; # 零拷贝传输文件 tcp_nopush on; # 数据包合并配合 sendfile tcp_nodelay on; # 小包立即发送keep-alive时 }性能优化检查清单优化项配置效果Worker 数量auto匹配 CPU 核心连接上限65535支撑高并发keepalive开启减少 TCP 握手gziplevel4减少 60-80% 传输量sendfileon零拷贝CPU 占用降低open_file_cache开启减少磁盘 I/O