Nginx 快速识别大量 MIME 类型的关键是合理设置 types_hash_max_size 和 types_hash_bucket_size:先统计实际使用的唯一扩展名数量(如 387 个),取最接近的 2 的幂(如 512)作为 types_hash_max_size;再通过 awk 计算最长扩展名长度,据此设 types_hash_bucket_size(如 64),二者均需在 http 块中配置,并用 nginx -t 验证。
要让 Nginx 快速识别大量 MIME 类型,关键不是堆参数,而是让哈希表结构匹配真实扩展名数量——
types_hash_max_size
设对了,查找才能稳定接近 O(1)。
统计你实际用到的唯一扩展名数量
很多配置失败,是因为直接照搬“别人说设 4096”,却没看自己到底加了多少扩展名。你需要:
收集所有生效的 types 配置:包括
、
的自定义文件、以及 http/server 块中手写的
提取全部扩展名:一行如
要拆成
、
、
三个;
、
、
算三个独立项
去重、去空行、去注释,最终得到一个纯扩展名列表(例如 387 个)
选最接近的 2 的幂作为值
Nginx 内部哈希表只接受 2 的幂作为
。选得太小会冲突溢出,太大只是预留空间,不提升性能:
≤ 128 个 → 保持默认 1024 或设 128 即可
180 个 → 选 256
380 个 → 选 512
1900 个 → 选 2048
超 3000 个 → 可设 4096,但建议先检查是否真需要这么多(比如重复 include 或冗余 vendor 类型)
同步检查 types\_hash\_bucket\_size
这个值决定单个桶能存多长的扩展名(含点号和结尾 \0)。如果最长扩展名是
(共 32 字符),而
是默认 32,那它刚好卡满,Nginx 启动可能失败:
用
查最长扩展名长度
若结果 > 32,至少设为 64;> 64 则设为 128
该值必须 ≤
,且通常设为 32、64 或 128 即可
配置与验证
在
块中添加(不要放在 server 或 location 里):
types_hash_max_size 512;types_hash_bucket_size 64;
然后执行:
:确认语法和哈希构建无报错
关注错误日志:若出现
,说明仍不满足,需调大两者之一
无需压测也能判断:只要启动成功、无 warning,就说明哈希结构已适配当前规模
/etc/nginx/mime.typesincludetypes { ... }text/html html htm shtmlhtmlhtmshtml.js.mjs.cjstypes_hash_max_size.application/vnd.api+jsontypes_hash_bucket_sizeawk '{print length($0)}' extensions.txt | sort -n | tail -1types_hash_max_sizehttpnginx -tcould not build the types_hash