nginx
Nginx 是高性能 Web 服务器和反向代理服务器,常用于静态资源托管、反向代理、负载均衡、HTTPS 终止、限流和网关入口。
为什么需要 Nginx
后端应用可以自己监听端口并返回 HTTP 响应,但生产环境通常不会让业务服务直接暴露给用户。原因是业务服务更关注业务逻辑,而入口层还需要处理静态资源、HTTPS、反向代理、负载均衡、限流、日志、超时和安全头。
Nginx 解决的是“入口流量治理”问题:
| 没有 Nginx 时 | 使用 Nginx 后 |
|---|---|
| 用户直接访问后端端口 | 后端服务隐藏在内网 |
| 每个应用都自己处理 HTTPS | 统一在 Nginx 终止 TLS |
| 静态资源占用后端线程 | 静态资源由 Nginx 高效返回 |
| 多实例负载要应用自己做 | upstream 统一负载均衡 |
| 限流、日志、超时分散 | 入口层集中配置 |
如果系统规模很小,本地开发可以不使用 Nginx;但只要涉及域名、HTTPS、多个后端实例、前后端分离或统一入口,Nginx 就很常见。
工作原理总图
mermaid
flowchart TD
A["Master读取配置、打开监听端口并管理Worker"] --> B["Worker进入事件循环"]
C["客户端连接到监听端口"] --> B
B --> D{"请求类型"}
D -- "静态资源" --> E["读取本地文件"]
D -- "反向代理" --> F["转发到 upstream 后端"]
D -- "限流或访问控制" --> G["按规则放行或拒绝"]
E --> H["返回响应"]
F --> H
G --> HMaster主要负责配置、信号和Worker生命周期,普通请求由Worker处理。Nginx不会为每个连接永久创建一个线程,而是让少量Worker把大量非阻塞socket注册到epoll等事件机制;连接可读、可写、建连完成或超时时,再推进该连接的状态机。完整过程见 进程模型、事件循环与高并发原理。
目录
推荐学习顺序:
mermaid
flowchart TD
A["Master、Worker与epoll"] --> B["配置作用域与请求匹配"]
B --> C["静态资源与反向代理"]
C --> D["upstream负载均衡"]
D --> E["限流、超时和降级"]
E --> F["TLS、日志、容量与生产排障"]反向代理流程
mermaid
flowchart TD
A[客户端] --> B[Nginx]
B --> C[后端服务 A]
B --> D[后端服务 B]
B --> E[后端服务 C]常见配置块
| 配置块 | 作用 |
|---|---|
| main | 全局配置,例如 worker 进程数 |
| events | 连接处理配置 |
| http | HTTP 服务公共配置 |
| server | 一个虚拟主机 |
| location | 路径匹配和转发规则 |
| upstream | 后端服务列表 |
请求匹配流程
mermaid
flowchart TD
A[请求进入 Nginx] --> B[匹配 server_name]
B --> C[匹配 location]
C --> D{静态资源还是代理?}
D -->|静态资源| E[读取本地文件]
D -->|反向代理| F[转发到 upstream]
E --> G[返回响应]
F --> G使用建议
- 静态资源和接口代理分开配置 location。
- 后端服务使用 upstream 管理,便于负载均衡。
- 生产环境开启访问日志和错误日志。
- 大文件上传要调整 body 大小限制和超时时间。
- 对登录、短信、搜索等接口可以配置限流。
配置 Demo:静态资源 + API 反向代理
nginx
upstream user_api {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name example.com;
access_log /var/log/nginx/example.access.log;
error_log /var/log/nginx/example.error.log;
location / {
root /data/www/dist;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://user_api/;
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_connect_timeout 3s;
proxy_read_timeout 30s;
}
}这个配置把前端静态文件交给 Nginx 托管,把 /api/ 请求转发到两个后端实例。
