Genarrative Nginx compression policy
本配置片段由 scripts/jenkins-server-provision.sh 在安装 Nginx 站点配置时展开。
请求体大小
- 生产、开发服和容器模板都在通用
location ~ ^/api(?:/|$)内设置client_max_body_size 64m。 - 该值只用于让携带参考图 Data URL 的创作接口抵达
api-server;不要把它当作业务上传上限。Rust 路由仍通过DefaultBodyLimit和解码后字节校验限制具体接口,例如拼图参考图路由只放宽到 12 MiB 请求体,图片字节继续按业务规则拒绝。 - 若线上看到
413 Request Entity Too Large,并且 access log 里request_time=0.000 upstream_status=-,通常是 Nginx 没有加载该模板或未 reload;先执行nginx -T | grep client_max_body_size和nginx -t再检查api-server。
gzip
deploy/nginx/genarrative.conf与deploy/nginx/genarrative-dev-http.conf默认开启 gzip。- 覆盖
application/json,用于降低/api/runtime/*/gallery这类 JSON 列表接口的公网带宽占用。 - 当前推荐等级为
gzip_comp_level 5,兼顾 2C/2G 服务器 CPU 与压缩收益。
Brotli
- Brotli 只在目标服务器 Nginx 接受 brotli 指令时开启。
- Ubuntu / apt 系统的
Genarrative-Server-Provision会安装libnginx-mod-http-brotli-filter与libnginx-mod-http-brotli-static;非 apt 系统暂不自动安装,仍按下面的能力探测结果决定是否启用。 - Provision 脚本通过临时配置执行
nginx -t做能力探测;探测配置会先include /etc/nginx/modules-enabled/*.conf,避免 Ubuntu 动态模块已安装但测试配置未加载模块导致误判。可用时把模板中的# __GENARRATIVE_BROTLI_DIRECTIVES__替换为 brotli 指令,不可用时保留注释说明。 - 不要直接在静态模板里无条件写
brotli on;,否则没有 brotli 模块的服务器会nginx -t失败并回滚。 - 不要用
nginx -V | grep brotli判断 brotli 是否可用;Ubuntu apt 安装的 brotli 是动态模块,不会出现在普通编译参数里。应检查包、/etc/nginx/modules-enabled/的load_module配置,或用包含include /etc/nginx/modules-enabled/*.conf的临时配置执行nginx -t。
验证
dpkg -l 'libnginx-mod-http-brotli-*'
ls -l /etc/nginx/modules-enabled/*brotli*
nginx -T 2>/dev/null | grep -Ei 'brotli|load_module'
curl -sSI -H 'Accept-Encoding: gzip' \
http://<host>/api/runtime/puzzle/gallery \
| grep -iE 'content-encoding|vary|content-type|content-length'
curl -sSI -H 'Accept-Encoding: br' \
http://<host>/api/runtime/puzzle/gallery \
| grep -iE 'content-encoding|vary|content-type|content-length'
预期:
- gzip 可用时返回
Content-Encoding: gzip。 - br 可用时返回
Content-Encoding: br。 - 响应头应包含
Vary: Accept-Encoding。