一、什么是Nginx动静分离?

简单来说,动静分离就是把网站的“静态资源”和“动态资源”分开处理,让它们各自走不同的“通道”。

  • 静态资源:比如图片(jpg/png)、CSS样式文件、JavaScript脚本、HTML页面(非动态渲染的)等。这些文件通常不变化,访问频率高,适合直接从Nginx快速返回。
  • 动态资源:比如PHP脚本、后端接口(如Python/Java写的API)、数据库查询等。这些需要服务器计算或查询数据,处理耗时,适合交给后端服务器专门处理。

Nginx作为高性能Web服务器,天生擅长处理静态资源。动静分离的核心是让Nginx专注“静态资源的快速响应”,动态资源则通过反向代理交给后端(如PHP-FPM、Node.js),从而提升网站加载速度和稳定性。

二、为什么需要动静分离?

  1. 用户体验更好:静态资源由Nginx直接返回,无需经过后端计算,页面加载时间大幅缩短。比如一个网页有10张图片,静态资源分开加载会更快,用户等待时间减少。
  2. 减轻后端压力:动态资源(如PHP解析、数据库查询)通常更耗CPU/内存。动静分离后,后端只处理动态请求,服务器负载降低,稳定性更高。
  3. 扩展性更强:静态资源可轻松迁移到CDN(内容分发网络),用户就近获取资源;动态资源也可通过负载均衡,由多台后端服务器分担压力。

三、Nginx如何实现动静分离?

核心原理:通过Nginx的location指令匹配不同请求类型,分别处理静态和动态资源。

1. 静态资源处理

location匹配静态资源的常见后缀(如.jpg.js.css等),通过root指令指定静态文件路径,Nginx直接返回文件。

2. 动态资源处理

location匹配动态请求(如.php/api等),通过proxy_passfastcgi_pass将请求转发给后端服务器(如PHP-FPM、Node.js)。

四、实战配置步骤(以PHP网站为例)

假设你的网站结构:
- 静态资源(图片、CSS、JS)放在 /usr/share/nginx/html/static 目录下;
- 动态资源(PHP文件)放在 /usr/share/nginx/html 目录下,需由PHP-FPM(默认监听 127.0.0.1:9000)处理。

1. 修改Nginx配置文件

找到Nginx的站点配置文件(如Ubuntu下的 /etc/nginx/sites-available/default),在server块中添加以下内容:

server {
    listen 80;
    server_name yourdomain.com;  # 替换为你的域名或IP

    # 1. 处理静态资源(匹配常见后缀)
    location ~* \.(jpg|jpeg|png|gif|js|css|html|htm|ico)$ {
        root /usr/share/nginx/html/static;  # 静态资源路径
        expires 7d;  # 缓存静态资源7天(浏览器7天内不重复请求)
        add_header Cache-Control "public, max-age=604800";  # 明确缓存策略
        index index.html;  # 默认首页
    }

    # 2. 处理动态资源(PHP请求)
    location ~ \.php$ {
        root /usr/share/nginx/html;  # PHP文件根目录
        fastcgi_pass 127.0.0.1:9000;  # 转发给PHP-FPM
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;  # 加载FastCGI参数
    }

    # 3. 其他请求(如根目录首页)
    location / {
        root /usr/share/nginx/html;
        index index.html index.php;
    }
}

2. 验证配置并重启Nginx

  • 检查配置语法
  sudo nginx -t  # 提示“test is successful”说明配置无误
  • 重启Nginx
  sudo systemctl restart nginx  # Ubuntu/Debian
  # 或
  sudo service nginx restart  # CentOS

3. 测试动静分离是否生效

  • 静态资源测试:在 /usr/share/nginx/html/static 下放一张图片 test.jpg,访问 http://yourdomain.com/static/test.jpg,若能显示图片则成功。
  • 动态资源测试:在 /usr/share/nginx/html 下放 test.php(内容 <?php phpinfo(); ?>),访问 http://yourdomain.com/test.php,若显示PHP配置信息则成功。

五、总结

Nginx动静分离的核心是用location区分静态和动态请求,让Nginx处理静态资源,后端处理动态请求。关键步骤:
1. 用~*匹配静态资源后缀(如\.(jpg|js|css)$);
2. 用root指定静态文件路径;
3. 用fastcgi_pass转发动态请求给后端(如PHP-FPM)。

配置完成后,网站加载速度会明显提升,服务器压力降低。后续可进一步优化(如Gzip压缩、静态资源CDN),让网站更高效稳定。

小夜