975 字
5 分钟
nginx.md
nginx原理
1. 什么是Nginx
Nginx是一款高性能的HTTP和反向代理服务器,由俄罗斯工程师Igor Sysoev开发。它以轻量级、高并发、低内存消耗著称,采用事件驱动模型处理请求,能够在单机上轻松应对数万级并发连接。Nginx不仅可以作为Web服务器直接提供静态资源服务,还广泛用于反向代理、负载均衡、缓存加速等场景,是现代Web架构中不可或缺的核心组件。
2. Nginx的核心类比
🏨 Nginx = 五星级酒店前台
把Nginx想象成一家五星级酒店的前台接待员,这个类比能帮你理解它的核心功能:
客人进门(客户端请求): 所有客人(HTTP请求)都必须经过前台(Nginx),前台不会直接提供客房服务,而是负责引导和分配。
询问需求(请求解析): 前台会询问客人的需求——是要办理入住(静态资源请求)、用餐(API请求),还是会议服务(WebSocket连接)。
分配房间(请求路由): 根据需求,前台将客人引导到对应的楼层和房间:
- 静态资源 → 直接从前台旁边的储物架拿取(本地文件)
- API请求 → 转交给客房服务员(后端应用服务器)
- 负载均衡 → 根据房间占用情况分配(轮询、权重等策略)
处理突发情况(高并发): 即使同时来了大量客人,前台也能高效处理,因为它采用”非阻塞”方式——不需要每个客人都单独占用一个前台人员。
⚖️ 核心区别:正向代理 vs 反向代理
| 代理类型 | 类比场景 | 作用对象 | 典型用途 |
|---|---|---|---|
| 正向代理 | 旅行社帮游客订机票 | 代表客户端 | 翻墙、缓存、隐藏客户端IP |
| 反向代理 | 酒店前台代表酒店 | 代表服务端 | 负载均衡、安全防护、SSL终止 |
3. 负载均衡策略
Nginx支持多种负载均衡算法,适用于不同场景:
| 算法 | 说明 | 适用场景 |
|---|---|---|
| round_robin | 默认轮询,依次分配 | 后端服务器性能相近 |
| least_conn | 分配给连接数最少的服务器 | 请求处理时间差异大 |
| ip_hash | 根据客户端IP哈希分配 | 需要会话保持 |
| weight | 按权重分配,权重越高分配越多 | 服务器性能差异大 |
配置示例:
upstream backend { server 192.168.1.10 weight=3; server 192.168.1.11 weight=2; server 192.168.1.12 backup;}
server { location /api/ { proxy_pass http://backend; }}4. Nginx配置文件结构
Nginx配置文件(nginx.conf)采用模块化结构,主要包含以下层级:
main # 全局配置(user、worker_processes、error_log)├── events # 事件驱动配置(worker_connections、use epoll)└── http # HTTP协议配置 ├── upstream # 上游服务器配置(负载均衡) └── server # 虚拟主机配置 └── location # 路径匹配与处理规则核心指令说明:
worker_processes: 工作进程数,通常设为CPU核心数worker_connections: 每个进程最大连接数proxy_pass: 反向代理到上游服务器root: 设置静态文件根目录try_files: 尝试按顺序查找文件
5. 性能优化技巧
1. 调整工作进程和连接数:
worker_processes auto;worker_connections 10240;2. 开启gzip压缩:
gzip on;gzip_types text/plain text/css application/json;gzip_min_length 1000;3. 配置缓存:
location ~* \.(jpg|png|css|js)$ { expires 7d; add_header Cache-Control "public, no-transform";}4. 启用sendfile和tcp_nopush:
sendfile on;tcp_nopush on;6. 高可用方案
主备模式(Keepalived + Nginx):
- 两台Nginx服务器,一台主服务器提供服务,一台备用
- Keepalived通过VRRP协议实现自动故障切换
- 当主服务器宕机时,备用服务器自动接管VIP
集群模式(Nginx + Consul):
- 多台Nginx组成集群,通过Consul实现服务发现
- 动态感知后端服务器状态,自动剔除故障节点
- 支持水平扩展,应对更高并发