Nginx + Node.js 部署中隐藏版本信息需三层协同:一、Nginx 层在 http 块设 server_tokens off 并验证错误页;二、Node.js 层禁用 Express/Koa 默认 Server/X-Powered-By 头,配合 proxy_hide_header 清除上游头;三、自定义静态错误页并禁用 PHP 等无关服务暴露。

在 Nginx + Node.js 的混合部署中,隐藏服务版本信息是基础但关键的安全加固动作。Node.js 本身不直接暴露 Server 头,但 Nginx 作为反向代理,默认会在响应头和错误页中泄露 Server: nginx/1.26.3 这类信息,攻击者可据此匹配已知漏洞。加固重点不是“彻底删除 Server 字段”,而是**阻断版本号暴露路径,并消除多层堆栈的指纹线索**。
一、Nginx 层:关闭 server_tokens 并验证作用域
这是最核心且必须完成的一步:
- 编辑主配置文件(如
/etc/nginx/nginx.conf),将server_tokens off;放在http { }块顶层,不能写在server或location内; - 检查所有被
include的子配置(如sites-enabled/*.conf),确保没有意外出现server_tokens on;覆盖主配置; - 执行
nginx -t测试语法,再用systemctl reload nginx平滑重载(避免中断 Node.js 正在处理的请求); - 验证时需两路并行:
–curl -I http://your-domain.com查看Server响应头是否变为Server: nginx;
–curl http://your-domain.com/xxx(访问不存在路径)检查 HTML 错误页源码里是否还有nginx/或版本数字。
二、Node.js 层:关闭 Express/Koa 默认 Server 头
若 Node.js 使用 Express,它默认会添加 X-Powered-By: Express;Koa 默认设 Server: koa。这些同样构成服务指纹:
- Express 项目中,在初始化 app 后添加:
app.disable('x-powered-by');
或更彻底地移除所有 Server 相关头:app.use((req, res, next) => { res.removeHeader('X-Powered-By'); next(); }); - Koa 项目中,禁用默认 Server 头:
app.proxy = true; // 若 Nginx 已设 X-Forwarded-For,建议开启app.use(async (ctx, next) => { ctx.respond = false; await next(); if (ctx.res.getHeader('Server') === 'koa') { ctx.res.removeHeader('Server'); } }); - 无论框架,都建议在 Nginx 的
location块中显式清除上游传递的 Server 头:proxy_hide_header Server;proxy_hide_header X-Powered-By;
三、配套清理:PHP、错误页与响应头一致性
即使只跑 Node.js,若服务器共存 PHP(如管理后台)、或使用默认错误页,仍可能泄露信息:
- 确认系统未启用 PHP-FPM 且无
.php路由;若启用,务必在php.ini中设expose_php = Off; - Nginx 错误页(404/500)默认含
nginx/字样,建议自定义静态错误页:error_page 404 /404.html;
将/usr/share/nginx/html/404.html替换为无任何服务标识的纯 HTML 页面; - 如需进一步模糊,可安装
headers-more-nginx-module后添加:more_set_headers "Server: WebService";
注意:该模块需编译进 Nginx,非默认内置,生产环境启用前请充分测试兼容性。
整个过程不依赖重启服务,也不修改底层源码,所有操作均可快速回滚。只要 Nginx 配置正确、Node.js 框架头清理到位、错误页脱离默认模板,就能有效切断绝大多数自动化扫描器的版本识别链。


















