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 配置:包括
/etc/nginx/mime.types、include的自定义文件、以及 http/server 块中手写的types { ... } - 提取全部扩展名:一行如
text/html html htm shtml要拆成html、htm、shtml三个;.js、.mjs、.cjs算三个独立项 - 去重、去空行、去注释,最终得到一个纯扩展名列表(例如 387 个)
选最接近的 2 的幂作为值
Nginx 内部哈希表只接受 2 的幂作为 types_hash_max_size。选得太小会冲突溢出,太大只是预留空间,不提升性能:
- ≤ 128 个 → 保持默认 1024 或设 128 即可
- 180 个 → 选 256
- 380 个 → 选 512
- 1900 个 → 选 2048
- 超 3000 个 → 可设 4096,但建议先检查是否真需要这么多(比如重复 include 或冗余 vendor 类型)
同步检查 types\_hash\_bucket\_size
这个值决定单个桶能存多长的扩展名(含点号和结尾 \0)。如果最长扩展名是 .application/vnd.api+json(共 32 字符),而 types_hash_bucket_size 是默认 32,那它刚好卡满,Nginx 启动可能失败:
- 用
awk '{print length($0)}' extensions.txt | sort -n | tail -1查最长扩展名长度 - 若结果 > 32,至少设为 64;> 64 则设为 128
- 该值必须 ≤
types_hash_max_size,且通常设为 32、64 或 128 即可
配置与验证
在 http 块中添加(不要放在 server 或 location 里):
types_hash_bucket_size 64;
然后执行:
-
nginx -t:确认语法和哈希构建无报错 - 关注错误日志:若出现
could not build the types_hash,说明仍不满足,需调大两者之一 - 无需压测也能判断:只要启动成功、无 warning,就说明哈希结构已适配当前规模

















