phpEnv 不提供 Nginx 缓存配置功能,所有缓存需手动编辑配置文件:静态资源用 expires 和 add_header 启用浏览器缓存,动态页面需配置 proxy_cache_path 和 proxy_cache 实现反向代理缓存,并确保权限、响应头及 PHP 行为不冲突。

phpEnv 本身不提供 Nginx 缓存配置能力,所有缓存必须手动写进 Nginx 配置文件里 —— 它只是个环境管理工具,不是 Web 服务器配置面板。
为什么 phpEnv 的 Nginx 配置里看不到 cache 相关指令
phpEnv 默认生成的 Nginx 配置(比如 /usr/local/phpenv/nginx/conf/vhost/xxx.conf)只包含基础的 PHP-FPM 转发和 root 路径设置,完全没启用 proxy_cache_path 或 expires。它默认不碰缓存逻辑,也不生成 keys_zone 这类必需项。
常见误操作是以为点几下 phpEnv 界面就能开缓存,结果 curl -I 查看响应头,Cache-Control 和 Expires 依然为空。
- phpEnv 不会自动创建缓存目录(如
/var/cache/nginx),也无权限校验 - 它不修改
http{}块,而proxy_cache_path必须放在那里 - 所有 location 级缓存控制(如
expires 1y)都得你手写进去
给静态资源加浏览器缓存(CSS/JS/PNG 等)
这是最直接、见效最快的加速方式,不需要反向代理缓存,只改 location 块即可。
在你的站点配置文件(例如 /usr/local/phpenv/nginx/conf/vhost/your-site.conf)中,找到或新增类似这段:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|woff2|ttf)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
注意几个关键点:
-
expires 1y会同时输出Expires和Cache-Control: max-age=31536000,比只写add_header更可靠 -
immutable告诉现代浏览器:这个资源一旦缓存,路径不变就不会变内容,可跳过协商缓存(ETag/Last-Modified) - 务必把这条规则放在
location ~ \.php$之前,否则 PHP 文件可能被误匹配 - 如果用了版本号(如
app.a1b2c3.js),immutable才真正生效;没版本号时慎用
启用 Nginx 反向代理缓存(适合动静混合或后端 PHP 渲染页)
如果你的 PHP 页面实际由后端动态生成(比如 WordPress 首页、商品列表),想缓存 HTML 输出,就必须走 proxy_cache 路线 —— 这和浏览器缓存是两层事。
分两步操作:
第一步,在 http{} 块(通常是 /usr/local/phpenv/nginx/conf/nginx.conf 顶部)添加:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=php_cache:50m inactive=1h max_size=500m use_temp_path=off;
第二步,在你的 server 或 location 块里启用:
location / {
proxy_pass http://127.0.0.1:9000; # 指向 PHP-FPM 的 fastcgi_pass 不适用,这里要走 HTTP 回源
proxy_cache php_cache;
proxy_cache_valid 200 301 302 10m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
add_header X-Cache-Status $upstream_cache_status;
}
⚠️ 关键提醒:
-
proxy_pass后面必须是 HTTP 地址(如http://127.0.0.1:8000),不能是fastcgi://—— phpEnv 默认没配独立 PHP-FPM HTTP 服务,你得自己用php -S或额外起一个监听端口的 PHP 服务 - 绝大多数 phpEnv 用户其实不需要这层,直接用浏览器缓存 + OPcache 就够了;强行上
proxy_cache反而容易缓存登录态、购物车等敏感内容 -
X-Cache-Status响应头是调试唯一依据,没它你根本不知道命没命中
容易被忽略的三个硬性前提
无论选哪种缓存,以下三点不满足,配置再对也白搭:
- Nginx 进程必须对缓存路径有读写权限:
chown -R www:www /var/cache/nginx(phpEnv 默认用户一般是www) - 确保没其他配置覆盖了你的
add_header,比如全局fastcgi_hide_header或第三方模块清空了响应头 - PHP 脚本自身不能输出
Cache-Control: no-store或session_start()带来的 Set-Cookie,它们会直接让浏览器拒绝缓存
最后强调一句:phpEnv 不是宝塔,它不封装缓存开关。所有缓存效果,最终都取决于你手写的那几行 Nginx 配置是否生效、是否被覆盖、是否与 PHP 行为冲突。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











