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

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

Nginx动静分离

动静分离,是指在Web服务中将动态资源、与静态资源分开处理与部署的架构思想。

比如:静态资源(如HTML、CSS、JavaScript、图片、视频等)。

无需服务器端频繁计算或访问数据库,可直接由文件系统或CDN提供。

而动态资源,(如需后端逻辑、数据库查询、用户会话等),由应用服务器或后端服务生成。

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

动静分离的主要目的是提高系统性能、降低后端负载、便于缓存和水平扩展,同时改善资源管理与运维效率。

 

Nginx动静分类原理

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

Nginx 实现动静分离,主要依赖于其强大的 Location 匹配机制。

URL 匹配:通过正则表达式匹配 URL 的后缀(如 .png, .js)或特定的目录路径(如 /static/)。

以及,高效 I/O 模型:Nginx 使用 epoll 模型和 sendfile 系统调用(零拷贝技术)。

在处理静态文件时,Nginx 可以直接将磁盘文件的数据传输到网络 socket。

而无需将数据拷贝到用户态内存,这使得它处理静态资源的速度比 Tomcat/Python 快几倍甚至几十倍。

缓存机制:Nginx 还可以设置 expires 头,通知浏览器缓存静态文件,进一步减少服务器请求。

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

动态请求转发给应用服务器:如 Tomcat、Jetty、Express、Django 等处理动态请求。

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on; # 开启零拷贝,加速静态文件传输
    keepalive_timeout  65;

    # 定义后端应用服务器集群
    upstream backend_server {
        server 127.0.0.1:8080;
    }

    server {
        listen       80;
        server_name  localhost;

        # ----------------------------------------------------
        # 规则 1:动态请求转发
        # 凡是不匹配下面静态规则的,或者特定路径的,都转发给 Tomcat
        # ----------------------------------------------------
        location / {
            proxy_pass http://backend_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # ----------------------------------------------------
        # 规则 2:静态资源分离 (按后缀匹配)
        # 凡是 .jpg, .png, .css, .js 结尾的请求,直接去本地找
        # ----------------------------------------------------
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
            root    /data/www/static;  # 静态文件实际存放的绝对路径
            expires 30d;               # 设置浏览器缓存过期时间为 30 天
        }

        # ----------------------------------------------------
        # 规则 3:静态资源分离 (按目录匹配 - 可选)
        # 凡是 /static/ 开头的请求
        # ----------------------------------------------------
        # location /static/ {
        #     root /data/www/; 
        # }
    }
}

总之,Nginx动静分离是提升Web系统性能与可扩展性的有效实践。

通过合理的路由规则、缓存策略与CDN结合,可显著降低后端负载、提高用户体验并简化运维流程。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧