phpEnv默认Nginx不支持Brotli,需手动编译含ngx_brotli模块的nginx.exe替换原文件,并在nginx.conf的http块中配置brotli on等指令,最后通过curl验证Content-Encoding: br。

phpEnv 是 Windows 下的绿色集成环境,它自带 Nginx,但默认不包含 ngx_brotli 模块,也不能通过面板开关直接启用 Brotli——所有“开启 Brotli”的选项都只是前端 UI,后端没模块就完全无效。
确认 phpEnv 当前 Nginx 是否支持 Brotli
打开 phpEnv 安装目录(如 C:\phpEnv\nginx),在命令行执行:
cd C:\phpEnv\nginx nginx.exe -V 2>&1 | findstr brotli
若无任何输出,说明未编译进模块。别信界面里勾选的“Brotli 开启”,那只是假开关。
-
nginx.exe -V输出中若含--add-module=.../ngx_brotli或ngx_http_brotli_filter_module,才算真支持 - phpEnv 的 Nginx 是预编译二进制,不提供源码或 configure 参数,无法用
--add-module增补——必须替换整个nginx.exe - Windows 下没有
ldconfig,libbrotli动态库必须放在nginx.exe同目录或系统PATH中,否则启动失败报failed to load module
手动替换 phpEnv 的 nginx.exe 并集成 ngx_brotli
你得自己编译一个带 ngx_brotli 的 Windows 版 Nginx,再替换 phpEnv 自带的二进制。流程比 Linux 更重,关键点如下:
立即学习“PHP免费学习笔记(深入)”;
Google索引API工具。用于提交URL以供Google索引。支持两种模式:“auto-index”(获取sitemap,与缓存对比差异并提交...)
- 需用 MSVC(如 Visual Studio 2019+)编译,MinGW 不稳定,容易链接失败
- 必须先编译
libbrotli的静态库(.lib),不能只放.dll——Windows Nginx 官方构建默认静态链接 -
ngx_brotli要用git submodule update --init拉取子模块,否则 configure 报no brotli library found - configure 命令末尾必须加
--with-compat,否则 phpEnv 启动脚本调用nginx.exe -t会失败(因模块 ABI 不兼容) - 编译完成后,把新生成的
nginx.exe、libbrotli.dll(如有)、以及objs/nginx.obj(调试用)一起复制到C:\phpEnv\nginx\,覆盖原文件
在 phpEnv 的 nginx.conf 中配置 Brotli
替换成功后,编辑 C:\phpEnv\nginx\conf\nginx.conf,在 http{} 块内添加:
brotli on; brotli_comp_level 6; brotli_min_length 512; brotli_types text/plain text/css text/javascript application/javascript application/json application/xml+rss text/xml image/svg+xml font/opentype;
注意几个易错点:
- 不要写
brotli_static on——phpEnv 默认没预生成.br文件,开了反而导致 404 - 别同时开
gzip on且类型重叠,否则 CPU 白耗;建议设gzip off,或仅留gzip_types text/plain;兜底极旧客户端 - phpEnv 的站点配置通常走
conf/vhost/下的独立文件,Brotli 指令必须写在顶层http{},不能只塞进某个server{}块里(否则对 PHP-FPM 返回的内容不生效) - 重启 phpEnv 的 Nginx 服务前,先运行
nginx.exe -t验证语法;若报unknown directive "brotli",说明模块没加载成功,回退检查编译步骤
验证 Brotli 是否真正生效
phpEnv 默认监听 127.0.0.1:8080(非 80 端口),且只允许本地访问。验证时必须:
- 用
curl -H "Accept-Encoding: br" -I http://127.0.0.1:8080/test.js,不是 HTTPS(phpEnv 默认无 SSL) - 确保请求的是真实存在的静态文件(如
test.js),且文件内容大于brotli_min_length(默认 512 字节) - 响应头中必须出现
Content-Encoding: br,且状态码为200;若返回Content-Encoding: gzip,说明 Brotli 模块未介入,还在走 fallback - Chrome DevTools 的 Network 标签页可能不显示
br编码——它有时隐藏协商后的编码值;以curl -I输出为准
最常被忽略的一点:phpEnv 的 Nginx 进程由 .NET 主程序托管,直接双击 nginx.exe 启动会导致端口冲突或配置不加载。一切操作必须通过 phpEnv 界面「重启 Nginx」触发,且确保任务管理器里没有残留的 nginx.exe 进程。


















