源码编译nginx时开启安全加固的核心是在configure阶段添加关键参数并修改源码:必须添加--with-compat、--user=nginx --group=nginx、--with-ld-opt="-wl,-z,relro -wl,-z,now -pie"和--with-cc-opt="-o2 -g -fstack-protector-strong -d_fortify_source=2 -wformat -werror=format-security",同时修改src/core/nginx.h中nginx_version和nginx_ver定义以彻底隐藏版本与服务标识。

源码编译 Nginx 时开启安全加固,核心是**在 configure 阶段加入关键参数**,并配合源码级修改,从底层减少攻击面。这不是后期配置能替代的,属于“防患于未然”的一步。
必须添加的编译参数
这些参数不增加功能,但显著提升运行时安全性:
- --with-compat:启用动态模块兼容性,为后续加载 ModSecurity、ngx_waf 等 WAF 模块打基础(否则无法以 .so 方式热插拔)
- --user=nginx --group=nginx:强制以非 root 用户身份运行 worker 进程,避免提权风险(需提前创建 nginx 用户和组)
- --with-ld-opt="-Wl,-z,relro -Wl,-z,now -pie":启用链接器安全特性(RELRO + FULL RELRO + PIE),防御 GOT/PLT 覆盖和内存布局劫持
- --with-cc-opt="-O2 -g -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security":开启栈保护、缓冲区溢出检测、格式化字符串防护等编译期加固
推荐同步做的源码级隐藏(彻底去标识)
仅靠 server_tokens off 只能隐藏响应头,错误页仍可能泄露版本。真正隐藏需改源码:
- 编辑
src/core/nginx.h,将#define NGINX_VERSION "1.22.0"改为空字符串或伪装值(如"1.0.0") - 同时修改
#define NGINX_VER "nginx/" NGINX_VERSION为"WebServer/" NGINX_VERSION或直接写死"WebServer" - 重新 configure → make → make install,新二进制文件将不再在任何地方暴露真实版本与服务名
配套系统级加固建议
编译只是起点,还需配合系统设置才能形成闭环:
- 确保 nginx 用户无登录 shell(
/sbin/nologin)、无家目录、不属 wheel 组 - 用
chown root:root /usr/local/nginx/sbin/nginx并设chmod 755,禁止 worker 进程修改自身二进制 - 启动前检查 SELinux/AppArmor 策略是否允许 nginx 访问所需路径(尤其日志、临时目录)











