ccache通过缓存编译结果实现nginx重复编译加速,核心是使make调用ccache gcc而非裸gcc;需在./configure前设置cc="ccache gcc"或直接传参,再用ccache -s验证命中率。

在Nginx源码编译中引入 ccache,核心目标是让重复编译(比如改完一行代码再重编)跳过实际编译步骤,直接复用上次的中间产物。它不改变Nginx本身的构建逻辑,而是“透明加速”Clang或GCC调用过程——只要编译命令和输入完全一致,ccache就返回缓存结果,省去预处理、编译、汇编全流程。
确认编译器链路支持ccache
Nginx默认用GCC,而ccache对GCC/Clang兼容性很好。关键是要让./configure生成的Makefile真正调用的是ccache gcc,而不是裸gcc:
- 安装ccache后,确保它在PATH中:
which ccache应该有输出 - 配置环境变量,把ccache“伪装”成编译器:
export CC="ccache gcc"export CXX="ccache g++"
(如果用Clang工具链,则换成ccache clang和ccache clang++) - 这一步必须在执行
./configure前完成,否则生成的Makefile不会走ccache路径
在configure阶段显式注入ccache
更稳妥的做法是把ccache直接写进configure参数,避免依赖shell环境变量被覆盖:
- 运行configure时指定编译器路径:
./configure --prefix=/usr/local/nginx \<br> --with-http_ssl_module \<br> --with-pcre \<br> CC="ccache gcc" \<br> CXX="ccache g++"
- 这样生成的Makefile里所有
$(CC)都会展开为ccache gcc,Ninja或make调用时自动命中缓存 - 注意:不要写成
CC=/usr/bin/ccache,那会缺失后续的gcc参数;必须是CC="ccache gcc"这种组合形式
验证缓存是否生效
编译完成后别急着改代码,先看ccache统计信息:
- 执行
ccache -s,关注几项关键指标:
cache hit (direct):直连命中数(最快路径)
cache hit (preprocessed):预处理后命中(稍慢但仍是缓存)
cache miss:未命中,说明没走缓存或缓存被清空 - 首次编译一定是miss;第二次
make clean && make(或仅改一个.c文件后make),如果hit数明显上升,说明已生效 - 常见失效原因:修改了头文件、加了新
-D宏定义、切换了--with-xxx-module开关——这些都会导致哈希值变化,触发重新编译
配合Nginx开发习惯做轻量重建
ccache只解决“单文件编译快”,但Nginx默认make仍可能重建大量无关目标。可进一步收紧范围:
- 不运行
make全量,改完src/http/ngx_http_core_module.c后,直接编译对应目标:make src/http/ngx_http_core_module.o - 搭配
ccache -M 10G限制缓存大小,防止磁盘爆满(默认不限制) - 开发调试阶段可加
--with-cc-opt="-O0 -g"关闭优化、开启调试符号,提升ccache复用率(优化等级变化也会导致缓存失效)











