nginx动静分离本质是让其直接处理静态资源(css/js/图片等),仅将.php文件或/api等动态请求交php-fpm;关键在location匹配顺序、try_files防误转、unix socket提效及静态路径精确排除。

静态与动态请求的分发路由规则,本质是让 Nginx 尽量自己处理静态资源(如 CSS、JS、图片),只把真正需要 PHP 解析的请求(如 .php 文件或特定 API 路径)交由 PHP-FPM 处理。优化的关键不是“多写规则”,而是避免误转、减少穿透、提升缓存命中率。
明确区分动静资源的匹配逻辑
Nginx 默认按 location 顺序和优先级匹配,必须确保静态资源不被 .php 规则捕获。常见错误是把 location ~ \.php$ 写在太前面,或未排除已存在的静态文件路径。
- 静态资源应由
location /或更具体的location ~* \.(js|css|png|jpg|gif|ico|woff2)$直接服务,且不包含fastcgi_pass - PHP 动态请求应严格限定后缀或路径前缀,例如:
location ~ ^/api/.*\.php$ { ... }或location ~ \.php$,但需配合try_files防止文件遍历 - 务必在 PHP location 块中加入
try_files $uri =404;,防止 Nginx 把不存在的.php文件也转发给 PHP-FPM(造成无谓解析和日志污染)
用 Unix Socket 替代 TCP 端口通信
PHP-FPM 和 Nginx 同机部署时,使用 Unix domain socket(如 /run/php/php8.1-fpm.sock)比 127.0.0.1:9000 更高效:减少网络协议栈开销、避免端口争抢、降低延迟。
- 确认 PHP-FPM 配置中
listen = /run/php/php8.1-fpm.sock,且权限为www-data:www-data - Nginx 的
fastcgi_pass必须完全一致:fastcgi_pass unix:/run/php/php8.1-fpm.sock; - 可加
fastcgi_read_timeout 60;防止长脚本阻塞连接池
动静分离进阶:按路径或域名拆分服务
单机资源充足时,可进一步将静态资源托管到独立子域名(如 static.example.com)或 CDN,彻底剥离 PHP-FPM 负担。
- 配置单独 server 块监听
static.example.com,仅启用expires、gzip、etag,禁用所有 PHP 相关指令 - 主站
www.example.com只处理动态逻辑,Nginx 不再承担静态文件 IO,专注反向代理与安全控制 - 若需同域分离,可用
location ^~ /static/指向本地目录,并设置expires 1y;和add_header Cache-Control "public, immutable";
避免隐式动态穿透的陷阱
有些框架(如 Laravel、WordPress)依赖前端控制器(index.php)统一入口,容易导致所有请求都落到 PHP-FPM,即使访问的是真实存在的静态文件。
- 解决方法:在 PHP location 前添加精确静态匹配,例如:
location ^~ /assets/ { alias /var/www/html/public/assets/; expires 1y; } - 对 WordPress,推荐使用:
location ~ \.php$ { try_files $uri =404; fastcgi_pass ...; }+ 单独location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ { expires 1y; } - 禁用
autoindex on和index index.php在非根路径下,防止目录遍历触发 PHP 解析
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











