Skip to content

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 --> H

Master主要负责配置、信号和Worker生命周期,普通请求由Worker处理。Nginx不会为每个连接永久创建一个线程,而是让少量Worker把大量非阻塞socket注册到epoll等事件机制;连接可读、可写、建连完成或超时时,再推进该连接的状态机。完整过程见 进程模型、事件循环与高并发原理

目录

  1. 进程模型、事件循环与高并发原理
  2. 配置解析与请求匹配
  3. 负载均衡
  4. 限流
  5. 日志、分段耗时与生产故障取证
  6. 代理缓存、过期与一致性
  7. Nginx容器化、反向代理与生产安全

推荐学习顺序:

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连接处理配置
httpHTTP 服务公共配置
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

使用建议

  1. 静态资源和接口代理分开配置 location。
  2. 后端服务使用 upstream 管理,便于负载均衡。
  3. 生产环境开启访问日志和错误日志。
  4. 大文件上传要调整 body 大小限制和超时时间。
  5. 对登录、短信、搜索等接口可以配置限流。

配置 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/ 请求转发到两个后端实例。