Nginx 基础教程
Nginx 是 多进程事件驱动模型:
- master 进程
- 读取配置文件
- 管理 worker 进程(启动、停止、重载)
- worker 进程
- 真正处理客户端请求
- 每个 worker 单线程
- 使用 “异步非阻塞 + epoll” 处理大量连接
📌 核心原则:worker_processes = CPU 核心数(auto 默认最优)
Nginx 使用 epoll(Linux)模型:
- 非阻塞 IO
- 事件循环
- 少量线程处理大量并发
这是 Nginx 性能高的根本原因。
浏览器请求经过:
listen -> server -> location -> upstream / proxy_pass -> response
监听端口、协议:
listen 80;
listen 443 ssl;
http2 on;
根据 Host 匹配虚拟主机:
server_name example.com;
根据 URL 路径匹配路由规则:
location /api/ {
proxy_pass http://backend;
}
定义后端负载均衡集群:
upstream backend {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
}
返回响应给客户端。
Nginx 经常作为反向代理:
location / {
proxy_pass http://127.0.0.1:8080;
}
- 代理请求 -> 转发到后端服务器
- 可转发所有 header / body / cookie
location /img/ {
root /data/www;
}
依赖 sendfile on; 提升本地文件读取速度。
支持多种策略:
- round_robin(默认)
- least_conn(最少连接)
- ip_hash(保持用户会话)
- weight(权重)
upstream api {
least_conn;
server 10.0.0.1;
server 10.0.0.2;
}
Nginx 可做反向代理缓存:
proxy_cache_path /cache keys_zone=mycache:50m;
proxy_cache mycache;
但你之前说了“不缓存”,那默认即可(Nginx 默认不开缓存)。
Nginx 有大量内置变量:
| 变量 | 说明 |
|---|---|
| $host | 请求的 Host 头 |
| $uri | 请求路径 |
| $request_uri | 原始URI(含参数) |
| $args | query 参数 |
| $remote_addr | 客户端IP |
| $proxy_add_x_forwarded_for | XFF链 |
示例:
proxy_set_header Host $host;
从高到低:
- = 精确匹配
- ^~ 前缀优先
- 正则:~ / ~*
- 普通前缀匹配(从最长开始)
- / 默认
示例:
location = /admin {}
location ^~ /static {}
location ~ \.php$ {}
location / {}
rewrite 用正则重写 URL:
rewrite ^/img/(.*) /pictures/$1 last;
常用于:
- 前端 history 路由
- SEO URL 调整
- 兼容旧接口
Nginx 是模块化系统:
- 核心模块(http、stream、mail)
- 第三方模块(Lua、Headers-More、Proxy-Cache-Purge…)
- 动态模块 .so
- HTTP 模块:web、proxy、负载均衡
- Stream 模块:TCP/UDP 代理
- 用于 MySQL / Redis / SMTP 代理
示例:
stream {
upstream mysql {
server 10.0.0.1:3306;
}
server {
listen 3307;
proxy_pass mysql;
}
}
新写法:
listen 443 ssl;
http2 on;
HTTP/3:
listen 443 quic reuseport;
http3 on;
一个基于事件驱动的高性能反向代理 / 静态服务器 / 负载均衡器,核心是 master/worker + epoll。