Nginx 是 Igor Sysoev 开发的高性能、轻量级、事件驱动型 HTTP 服务器、反向代理服务器及邮件代理服务器。其核心基于异步非阻塞事件模型(epoll/kqueue),能在极低内存占用下支撑数万级并发连接,是互联网架构流量入口的核心组件。以下是其核心功能的全面深度解析,包含功能原理、核心配置、适用场景与关键特性。

一、静态资源 Web 服务

这是 Nginx 最基础的原生核心功能,作为 Web 服务器直接处理静态文件请求,性能远超传统 Apache 服务器。

核心原理

基于异步非阻塞 IO,通过内核sendfile 零拷贝技术直接传输静态文件,避免用户态与内核态的多次数据拷贝,极大提升文件传输效率,大幅降低 CPU 与 IO 开销。

核心特性

  • 支持全类型静态资源托管(HTML/CSS/JS、图片、视频、文档等)
  • 零拷贝 sendfile 机制,大文件支持 sendfile_max_chunk 防阻塞
  • 原生支持断点续传(Range 请求)、目录索引、带宽限制
  • 完善的缓存过期控制(Cache-Control/Expires)

核心配置示例 

server {
    listen 80;
    server_name static.example.com;
    root /usr/share/nginx/static;  # 静态资源根目录
    index index.html index.htm;     # 默认首页

    # 开启零拷贝,优化TCP传输
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;

    # 静态资源缓存与日志优化
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 7d;
        add_header Cache-Control "public, no-transform";
        access_log off;
    }

    # 目录索引(用于文件下载站)
    location /download/ {
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
    }
}

适用场景

官网静态页面、CDN 边缘节点、静态资源下载站、前后端分离项目前端资源托管。

二、反向代理

反向代理是 Nginx 最核心的企业级功能,也是其在架构中承担流量入口的核心能力。

核心原理

Nginx 接收客户端请求,按规则转发给后端上游(upstream)应用服务器(Tomcat/Node.js/Java/Python 等),再将后端响应结果返回给客户端。全程对客户端透明,屏蔽后端服务细节,实现请求转发与流量管控。

核心特性

  • 支持 HTTP/HTTPS/HTTP2/GRPC/WebSocket/FastCGI/uwsgi 等多协议转发
  • 完全异步非阻塞转发,不会因后端慢请求阻塞自身进程
  • 支持请求头 / 响应头的修改、重写、过滤,URL 重写与重定向
  • 长连接复用,大幅减少后端服务的 TCP 连接开销

核心配置示例

# 定义上游服务池
upstream backend_app {
    server 127.0.0.1:8080;
    server 192.168.1.100:8080;
}

server {
    listen 80;
    server_name api.example.com;

    # 基础HTTP反向代理
    location / {
        proxy_pass http://backend_app;
        # 传递客户端真实信息给后端
        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 5s;
        proxy_send_timeout 10s;
        proxy_read_timeout 30s;

        # 缓冲区优化
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
    }

    # WebSocket反向代理
    location /ws/ {
        proxy_pass http://backend_app;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 3600s;
    }
}

适用场景

微服务 API 网关、前后端分离项目接口转发、跨域解决方案、多服务统一入口、WebSocket 长连接代理。

三、负载均衡

负载均衡是反向代理的核心延伸能力,是企业级高可用架构的必备核心功能。

核心原理

当后端存在多个应用服务节点时,Nginx 按照预设的负载均衡算法,将客户端请求按规则分发到不同后端节点,实现流量分摊,提升系统并发处理能力;同时实现故障自动转移,单个节点宕机时自动切换到健康节点,保障服务高可用。

核心负载均衡算法

算法类型 核心原理 配置示例 适用场景
轮询(默认) 请求按顺序逐一分配到后端节点,均匀分发 upstream backend { server 10.0.0.1:8080; server 10.0.0.2:8080; } 后端节点配置一致、无状态服务、无会话保持需求
加权轮询 按节点权重分配请求,权重越高,分发请求越多 upstream backend { server 10.0.0.1:8080 weight=3; server 10.0.0.2:8080 weight=1; } 后端服务器配置差异大,高配机器承接更多流量
IP 哈希(ip_hash) 基于客户端 IP 哈希计算,固定分配到同一节点,实现会话保持 upstream backend { ip_hash; server 10.0.0.1:8080; server 10.0.0.2:8080; } 有会话保持需求的服务,如本地存储 session 的登录系统
最少连接数(least_conn) 请求优先分配给当前活跃连接数最少的节点,避免慢节点被压垮 upstream backend { least_conn; server 10.0.0.1:8080; server 10.0.0.2:8080; } 请求处理时长差异大,接口响应时间不均的后端服务
URL 哈希 基于请求 URL 哈希计算,固定分配到同一节点 upstream backend { hash $request_uri; server 10.0.0.1:8080; } 反向代理缓存、CDN 节点,提升缓存命中率

高可用节点状态配置

upstream backend {
    # 3次失败后,30秒内不再分配请求
    server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 down; # 手动永久下线
    server 192.168.1.12:8080 backup; # 备用节点,主节点全故障才启用
}

适用场景

高并发业务系统流量分摊、服务集群高可用架构、微服务集群流量治理。

四、动静分离

动静分离是 Nginx 最常用的架构优化手段,基于静态资源服务与反向代理能力实现,是 Web 架构的标准最佳实践。

核心原理

将动态请求(接口、动态页面)与静态资源请求(图片、CSS、JS、视频等)完全拆分:静态资源由 Nginx 直接处理(本身处理效率极高),动态请求转发给后端应用服务器处理。充分发挥 Nginx 高并发处理静态资源的优势,大幅降低后端应用服务器的压力。

核心优势

  • 缩短响应链路:静态资源直接返回,无需经过后端应用
  • 故障隔离:动态服务故障时,静态页面仍可正常访问
  • 架构分层:静态资源可单独部署 CDN,动态服务独立扩容

核心配置示例

server {
    listen 80;
    server_name www.example.com;
    root /usr/share/nginx/frontend;
    index index.html;

    # 静态资源:Nginx直接处理
    location ~* \.(html|htm|js|css|png|jpg|jpeg|gif|ico|woff|woff2|ttf|svg)$ {
        root /usr/share/nginx/frontend;
        expires 7d;
        sendfile on;
        access_log off;
    }

    # 动态API请求:转发给后端应用
    location /api/ {
        proxy_pass http://backend_app;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 管理后台:转发给独立后端服务
    location /admin/ {
        proxy_pass http://backend_admin;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

适用场景

前后端分离项目、PHP/Java 动态网站架构、高并发门户网站、电商平台。

五、缓存加速

Nginx 提供原生的代理缓存能力,用于缓存后端服务的响应内容,减少重复回源请求,降低后端负载,提升响应速度。

核心原理

Nginx 将后端应用返回的响应内容(静态化动态页面、热点 API 接口结果等)缓存到本地磁盘 / 内存中,后续相同请求直接从缓存返回,无需转发给后端服务器,实现热点数据的加速访问。

核心特性

  • 支持自定义缓存键、缓存过期时间、缓存维度
  • 缓存命中 / 失效精细化控制,支持手动清理
  • 缓存锁机制,防止缓存击穿
  • 基于响应码的差异化缓存控制

核心配置示例

# http块全局缓存配置
http {
    proxy_cache_path /var/cache/nginx 
        levels=1:2 
        keys_zone=my_cache:100m 
        max_size=10g 
        inactive=7d 
        use_temp_path=off;

    upstream backend_app {
        server 127.0.0.1:8080;
    }

    server {
        listen 80;
        server_name cache.example.com;

        # 启用缓存
        location / {
            proxy_cache my_cache;
            proxy_cache_key $host$uri$is_args$args;
            # 差异化缓存过期时间
            proxy_cache_valid 200 304 1h;
            proxy_cache_valid 301 302 1d;
            proxy_cache_valid any 1m;
            # 缓存状态头,便于排查
            add_header X-Cache-Status $upstream_cache_status;
            # 防缓存击穿
            proxy_cache_lock on;
            proxy_cache_lock_timeout 5s;

            proxy_pass http://backend_app;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # 敏感接口关闭缓存
        location ~* /(login|pay|user|admin)/ {
            proxy_cache off;
            proxy_pass http://backend_app;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

关键缓存状态变量 $upstream_cache_status:HIT(命中)、MISS(未命中)、EXPIRED(过期)、BYPASS(绕过)。

适用场景

读多写少的业务场景、资讯网站、商品详情页、热点 API 接口缓存、减轻数据库与后端服务压力。

六、HTTPS 服务与 SSL/TLS 终端

Nginx 是目前最主流的 SSL/TLS 终端代理,是全站 HTTPS 的核心实现组件。

核心原理

Nginx 作为 SSL 终端,负责 SSL/TLS 握手、流量加密解密。客户端与 Nginx 之间为 HTTPS 加密传输,Nginx 与后端服务之间可通过内网 HTTP 明文传输,简化后端证书配置,降低后端加密解密的性能开销。

核心特性

  • 支持 TLS 1.2/1.3,禁用不安全的老旧协议
  • 支持 OCSP Stapling(OCSP 装订),提升 SSL 握手速度
  • 原生支持 HTTP/2/HTTP/3,大幅提升 HTTPS 传输性能
  • 支持 HSTS 强制 HTTPS、多域名 / 通配符证书

核心配置示例

http {
    # SSL全局安全与优化配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 114.114.114.114 valid=300s;
    resolver_timeout 5s;

    # HTTPS站点配置
    server {
        listen 443 ssl http2;
        server_name www.example.com;

        # 证书配置
        ssl_certificate /etc/nginx/ssl/www.example.com.pem;
        ssl_certificate_key /etc/nginx/ssl/www.example.com.key;

        # 安全头配置
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";

        location / {
            proxy_pass http://backend_app;
            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;
        }
    }

    # HTTP强制跳转HTTPS
    server {
        listen 80;
        server_name www.example.com;
        return 301 https://$host$request_uri;
    }
}

适用场景

企业官网、电商平台、金融系统、小程序 / APP API 接口、所有需要加密传输的 Web 服务。

七、流量控制与限流

Nginx 提供企业级限流能力,是防突发流量、恶意请求、CC/DDOS 攻击的核心防线。

核心限流能力

1. 请求频率限流(漏桶算法)

基于 ngx_http_limit_req_module 模块,限制客户端单位时间内的请求数,超出请求直接拒绝,防止 CC 攻击与接口刷量。

# http块全局配置
http {
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

    server {
        listen 80;
        server_name www.example.com;

        # 全局限流
        location / {
            limit_req zone=req_limit burst=20 nodelay;
            limit_req_status 429;
            proxy_pass http://backend_app;
        }

        # 登录接口严格限流,防暴力破解
        location /login/ {
            limit_req zone=req_limit burst=5 nodelay;
            limit_req_status 429;
            proxy_pass http://backend_app;
        }
    }
}
2. 并发连接数限流

基于 ngx_http_limit_conn_module 模块,限制单个客户端 IP 的并发连接数,防止恶意连接占用服务器资源。

http {
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

    server {
        listen 80;
        server_name download.example.com;

        # 单IP最多5个并发连接
        location /download/ {
            limit_conn conn_limit 5;
            limit_conn_status 503;
            root /usr/share/nginx/download;
        }
    }
}
3. 带宽限制

限制单个请求的传输速率,防止大文件下载耗尽服务器带宽。

location /download/ {
    root /usr/share/nginx/download;
    limit_rate_after 100m; # 100M后开始限速
    limit_rate 100k/s;     # 限速100k/s
}

适用场景

防 CC/DDOS 攻击、接口防刷、登录接口防暴力破解、下载站点带宽控制、突发流量削峰。

八、安全与访问控制

Nginx 作为流量入口,是 Web 架构的第一道安全防线,提供丰富的原生安全防护能力。

核心安全能力

1. IP 黑白名单访问控制

基于 ngx_http_access_module 模块,实现 IP 级别的访问权限管控。

location /admin/ {
    allow 192.168.1.0/24; # 允许内网网段
    allow 10.0.0.0/8;
    deny all; # 拒绝所有其他IP
    proxy_pass http://backend_admin;
}
2. HTTP Basic Auth 身份认证

基于 ngx_http_auth_basic_module 模块,实现用户名密码基础认证,保护敏感资源。

# 前置操作:htpasswd -c /etc/nginx/conf.d/.htpasswd admin 生成密码文件
location /admin/ {
    auth_basic "Admin Login";
    auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
    proxy_pass http://backend_admin;
}
3. 恶意请求拦截

通过请求特征过滤爬虫、SQL 注入、XSS 等恶意请求。

# 屏蔽恶意爬虫User-Agent
if ($http_user_agent ~* (Scrapy|Curl|HttpClient|python|wget|spider)) {
    return 403;
}

# 屏蔽非法请求方法
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
    return 405;
}

# 屏蔽SQL注入、XSS恶意参数
if ($query_string ~* (union|select|insert|delete|update|drop|alert|script|<.*>)) {
    return 403;
}

# 隐藏版本号,减少攻击面
http {
    server_tokens off;
}

适用场景

网站安全防护、恶意请求拦截、敏感资源保护、防爬虫、防 CC 攻击。

九、内容压缩与优化

Nginx 提供 gzip 与 brotli 压缩能力,减少传输文件体积,提升页面加载速度,节省带宽成本。

1. Gzip 压缩(原生支持)

对文本类文件进行压缩,压缩比可达 60%-80%,主流浏览器全支持。

http {
    gzip on;
    gzip_vary on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 6; # 1-9,6为性价比最优
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_disable "MSIE [1-6]\.";
}

2. Brotli 压缩(第三方模块)

Google 开发的新一代压缩算法,同等质量下比 gzip 小 20%-30%,需编译时添加 ngx_brotli 模块。

http {
    brotli on;
    brotli_vary on;
    brotli_min_length 1k;
    brotli_comp_level 6;
    brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

适用场景

全类型 Web 站点,尤其是移动端站点、带宽有限的场景,提升页面加载速度,降低带宽成本。

十、虚拟主机

Nginx 支持在单台服务器上部署多个站点,通过域名、端口、IP 区分不同站点,极大提升服务器利用率。

1. 基于域名的虚拟主机(最常用)

通过 HTTP 请求头的 Host 字段区分站点,同 IP 同端口部署多个域名。

# 站点1
server {
    listen 80;
    server_name www.example.com;
    root /usr/share/nginx/example1;
    index index.html;
}

# 站点2
server {
    listen 80;
    server_name www.test.com;
    root /usr/share/nginx/test;
    index index.html;
}

2. 基于端口的虚拟主机

通过不同端口区分站点,多用于测试环境、内部系统。

# 生产环境80端口
server {
    listen 80;
    server_name localhost;
    root /usr/share/nginx/prod;
}

# 测试环境8080端口
server {
    listen 8080;
    server_name localhost;
    root /usr/share/nginx/test;
}

3. 基于 IP 的虚拟主机

通过不同 IP 区分站点,服务器需配置多网卡 / 多 IP。

server {
    listen 192.168.1.10:80;
    server_name www.example.com;
    root /usr/share/nginx/example1;
}

server {
    listen 192.168.1.11:80;
    server_name www.test.com;
    root /usr/share/nginx/test;
}

适用场景

单服务器多站点部署、中小企业多站点托管、测试环境多环境隔离。

十一、健康检查

健康检查是保障服务高可用的核心能力,Nginx 提供原生被动健康检查,以及第三方模块的主动健康检查,自动剔除故障节点。

1. 原生被动健康检查(默认支持)

通过请求失败次数判断节点可用性,达到 max_fails 阈值后,在 fail_timeout 时间内自动剔除故障节点,超时后自动重试。

upstream backend {
    server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
}

2. 主动健康检查(第三方模块)

基于 nginx_upstream_check_module 模块,Nginx 主动定期向后端节点发送健康检查探针,根据响应结果判断节点状态,故障节点自动剔除,恢复后自动重新接入,比被动检查更精准。

upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    # 健康检查配置:每3秒检查1次,2次成功标记可用,3次失败标记不可用
    check interval=3000 rise=2 fall=3 timeout=2000 type=http;
    check_http_send "GET /health HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://backend;
    }

    # 健康检查状态页面
    location /status {
        check_status;
        access_log off;
        allow 192.168.1.0/24;
        deny all;
    }
}

适用场景

高可用服务集群、核心业务系统、微服务架构,实现故障节点自动摘除与恢复。

十二、日志与监控

Nginx 提供完善的日志能力与状态监控模块,是运维排查问题、监控服务运行状态的核心依据。

1. 访问日志与错误日志

记录全量客户端请求信息与服务错误信息,支持自定义日志格式,适配数据分析与问题排查需求。

http {
    # 自定义日志格式
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" '
                    '$request_time $upstream_response_time';

    # 全局日志配置
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log warn;

    server {
        listen 80;
        server_name www.example.com;
        # 站点独立日志
        access_log /var/log/nginx/example.access.log main;
        error_log /var/log/nginx/example.error.log warn;
    }
}

关键变量:$request_time(Nginx 处理请求总时长)、$upstream_response_time(后端服务响应时长),用于定位慢请求问题。

2. 运行状态监控

基于 ngx_http_stub_status_module 原生模块,提供 Nginx 核心运行指标,用于监控告警。

server {
    listen 80;
    server_name localhost;

    location /nginx_status {
        stub_status;
        access_log off;
        allow 127.0.0.1;
        allow 192.168.1.0/24;
        deny all;
    }
}

指标说明:

  • Active connections:当前活跃客户端连接数
  • accepts handled requests:总接受连接数、总处理连接数、总请求数
  • Reading/Writing/Waiting:正在读取请求的连接数、正在返回响应的连接数、空闲等待的长连接数

适用场景

运维监控、问题排查、流量分析、安全审计,可配合 Prometheus+Grafana 实现可视化监控。

十三、模块化扩展架构

Nginx 核心采用高度模块化设计,核心代码极度精简,所有功能均通过模块实现,具备极强的扩展能力:

  • 核心模块:HTTP 核心模块、事件模块、配置模块等,支撑 Nginx 基础运行
  • 标准模块:官方自带模块,如 proxy、rewrite、access、gzip 等,覆盖绝大多数基础场景
  • 第三方模块:社区开源模块,如 ngx_brotli、nginx_upstream_check_module、lua-nginx-module 等,扩展高级能力
  • 自定义模块:支持自研模块,定制化扩展 Nginx 功能

最典型的扩展生态是 OpenResty,基于 Nginx + LuaJIT 开发,通过 Lua 脚本实现 WAF、动态负载均衡、高级 API 网关等复杂能力。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐