Empty Gif 模块是 Nginx 内置模块,用于高效返回 1×1 像素 GIF(43 字节),支持埋点追踪;需在精确匹配的 location 块中使用 empty_gif 指令,配合变量记录参数、关闭日志及 CORS 头以优化性能。
Empty Gif 模块(ngx_http_empty_gif_module)是 Nginx 内置模块,用于高效响应 1×1 像素的 GIF 请求,常用于前端埋点、行为追踪等场景。它不读取文件、不触发日志写入(可配置)、不占用磁盘 I/O,相比用静态文件返回,显著降低资源开销。
该模块默认编译进大多数最新 Nginx 构建中(可通过 nginx -V 2>&1 | grep -o with-http-empty-gif-module 确认)。只需在 server 或 location 块中启用:
location = /track.gif {empty_gif;# 可选:关闭 access log 减少写入压力access_log off;# 可选:添加 CORS 头支持跨域埋点add_header Access-Control-Allow-Origin "*";add_header Cache-Control "no-store, no-cache, must-revalidate";}注意:empty_gif 指令只能用于 location 块,且必须是精确匹配(=),不能带参数或正则。
Empty Gif 本身不解析查询参数,但可结合 Nginx 变量和日志格式,在不增加后端负担的前提下记录关键信息:
log_format 中引用 $args、$http_referer、$http_user_agent 等变量log_format track '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$args"';
access_log /var/log/nginx/track.log track;
这样,请求 /track.gif?uid=123&event=click&pid=home 会被记录完整参数,而 Nginx 仍只返回 43 字节的固定 GIF 数据。
Empty Gif 虽轻量,但配置不当可能削弱效果:
empty_gif location 中启用 gzip 或 sub_filter —— 它们不生效且可能报错auth_request 或复杂 rewrite)混用 —— 会绕过空 GIF 的优化路径rewrite 到 /track.gif,而非直接在 empty_gif 块中处理逻辑image/gif,无需手动 add_header Content-Type
发送请求并检查响应:
curl -I http://your-site.com/track.gif 应返回 200 OK、Content-Type: image/gif、Content-Length: 43
curl http://your-site.com/track.gif | wc -c 应输出 43
不复杂但容易忽略细节,合理使用能显著提升埋点服务的吞吐与稳定性。