Nginx动静分离实战:性能提升10倍关键!

Nginx是大型架构核心,下面重点详解Nginx动静分离实战@mikechen

Nginx动静分离

动静分离,就是将网站的“静态资源”与“动态请求”分开处理的架构模式。

通过 Nginx,我们让静态资源直接由 Nginx 从磁盘读取并返回,而动态请求则转发给后端的应用服务器(如 Tomcat、Spring Boot)。

Nginx动静分离实战:性能提升10倍关键!-mikechen

静态资源 (Static):图片、JS、CSS、HTML 文件、字体等。

这些文件内容固定,不需要服务器进行逻辑运算。

动态请求 (Dynamic):JSP、PHP、Python、Go 或 Java 接口。

这些请求需要 CPU 计算、查询数据库或调用其他微服务。

 

Nginx动静分类架构

Nginx 作为前置服务器,通过 location 匹配规则进行分流。

正则匹配:发现后缀是 .jpg, .js 等,直接在 Nginx 本地磁盘找文件。

静态资源直接由Nginx本地或分布式文件存储(如CDN、对象存储)返回。

反向代理:发现是接口路径,才透传给后端。

Nginx动静分离实战:性能提升10倍关键!-mikechen

如下所示:

server {
    listen       80;
    server_name  www.bat-arch.com;

    # 1. 动态请求:转发给后端应用服务器
    location /api/ {
        proxy_pass http://java_backend_pool;
        proxy_set_header Host $host;
    }

    # 2. 静态资源:正则匹配后直接读取本地目录
    location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
        root /usr/share/nginx/html/static;
        expires 30d; # 缓存 30 天
        add_header Cache-Control "public, no-transform";
    }
}

Nginx 收到请求后,根据 URL 路径 或 文件后缀 判断是静态还是动态。

静态:直接用 sendfile 零拷贝机制从磁盘读取文件,返回给客户端(不走用户态,几乎无 CPU 开销)。

动态:通过 proxy_pass 转发给后端(如 upstream 集群),后端处理完再返回。

额外加成:gzip 压缩、expires 浏览器缓存、CDN 加速,进一步放大性能。

 

Nginx动静分离性能

动静分离带来的性能提升来自多方面:

Nginx动静分离实战:性能提升10倍关键!-mikechen

首先,静态资源由Nginx直接响应,消除后端应用的上下文切换与业务处理开销;

Nginx擅长处理大量短连接和并发静态请求,支持高效的异步事件驱动模型、sendfile、gzip压缩。

其次,Nginx 的高并发处理能力和I/O优化(如零拷贝)降低了CPU和内存占用;

缓存头控制(Cache-Control、ETag、Expires)及内置缓存(proxy_cache),从而减少磁盘与网络I/O并提升响应效率。

第三,通过合理的缓存策略与CDN接入,可将大量请求在边缘节点或Nginx层拦截,显著降低源站压力。

一句话:动静分离是“花小钱办大事”的神器,几乎所有大厂(如阿里、腾讯、字节)都在用。

评论交流
    说说你的看法