一、什么是Nginx动静分离?¶
简单来说,动静分离就是把网站的“静态资源”和“动态资源”分开处理,让它们各自走不同的“通道”。
- 静态资源:比如图片(jpg/png)、CSS样式文件、JavaScript脚本、HTML页面(非动态渲染的)等。这些文件通常不变化,访问频率高,适合直接从Nginx快速返回。
- 动态资源:比如PHP脚本、后端接口(如Python/Java写的API)、数据库查询等。这些需要服务器计算或查询数据,处理耗时,适合交给后端服务器专门处理。
Nginx作为高性能Web服务器,天生擅长处理静态资源。动静分离的核心是让Nginx专注“静态资源的快速响应”,动态资源则通过反向代理交给后端(如PHP-FPM、Node.js),从而提升网站加载速度和稳定性。
二、为什么需要动静分离?¶
- 用户体验更好:静态资源由Nginx直接返回,无需经过后端计算,页面加载时间大幅缩短。比如一个网页有10张图片,静态资源分开加载会更快,用户等待时间减少。
- 减轻后端压力:动态资源(如PHP解析、数据库查询)通常更耗CPU/内存。动静分离后,后端只处理动态请求,服务器负载降低,稳定性更高。
- 扩展性更强:静态资源可轻松迁移到CDN(内容分发网络),用户就近获取资源;动态资源也可通过负载均衡,由多台后端服务器分担压力。
三、Nginx如何实现动静分离?¶
核心原理:通过Nginx的location指令匹配不同请求类型,分别处理静态和动态资源。
1. 静态资源处理¶
用location匹配静态资源的常见后缀(如.jpg、.js、.css等),通过root指令指定静态文件路径,Nginx直接返回文件。
2. 动态资源处理¶
用location匹配动态请求(如.php、/api等),通过proxy_pass或fastcgi_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),让网站更高效稳定。