Nginx作为入口仅暴露80和443端口,Node.js绑定127.0.0.1私有端口(如3000),通过server_tokens off隐藏版本、upstream解耦后端地址、域名路由替代端口暴露,并限制HTTP方法与Host头,实现安全隔离。

直接用 Nginx 作为入口,把 Node.js 的真实端口(比如 3000、5000)完全屏蔽在后端,客户端只能通过域名或标准 HTTP/HTTPS 端口访问,这是最有效也最常用的方式。
只暴露 80 和 443 端口
Nginx 监听 80(HTTP)和 443(HTTPS),所有外部请求都走这两个端口。Node.js 进程绑定在 127.0.0.1 的私有端口(如 3000),不监听 0.0.0.0,这样连本机其他用户也无法直接 telnet 或 curl 访问该端口。
- 启动 Node.js 时明确指定 host: node server.js --host 127.0.0.1 --port 3000
- 检查监听状态:ss -tlnp | grep :3000,确认输出中是 127.0.0.1:3000,而非 *:3000
- 防火墙可进一步限制:Ubuntu 上用 ufw 禁掉非本地访问:sudo ufw deny 3000
配置中不泄露后端信息
Nginx 默认会在响应头里返回 Server 字段(如 Server: nginx/1.18.0),但若没关 server_tokens,还可能暴露精确版本;更关键的是,不要让 proxy_pass 地址出现在任何前端可读的配置或错误页中。
根据 package.json 中的 engines 字段自动检测 Node.js 版本需求,未安装 nvm 时自动安装并切换至对应版本。支持 Windows、macOS、Linux。适用于 Node.js 项目开发、版本切换和环境配置。
- 在 /etc/nginx/nginx.conf 的 http 块中添加:server_tokens off;
- 避免在 location 块里写死调试用的 return 或 echo 指令,尤其上线前清理所有 return 200 "debug: $upstream_addr"; 类语句
- 确保 error_page 配置指向自定义页面,而不是默认 Nginx 错误页(可能含后端地址线索)
用域名隔离代替端口暴露
多个 Node.js 应用共用一台服务器时,靠端口号区分(如 xxx.com:3000、xxx.com:5000)等于主动暴露服务结构。应全部收口到 80/443,按 server_name 或 location 路由分发。
- 为每个服务配独立 conf 文件:/etc/nginx/conf.d/api.example.com.conf、/etc/nginx/conf.d/admin.example.com.conf
- 用 upstream 定义后端集群,不把 IP:Port 写死在 server 块里,便于后续加健康检查或扩缩容
- API 路径统一收敛(如 /api/v1/),Nginx 层做 rewrite 或 proxy_pass,前端完全不知后端端口存在
禁用非必要 HTTP 方法与头字段
Node.js 默认可能接受 OPTIONS、TRACE 等方法,而 Nginx 可在代理前就拦截异常请求,减少攻击面。
- 在 location 块中限制方法:if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS)$) { return 405; }
- 清除敏感请求头:proxy_set_header X-Forwarded-For "";(如不需要透传原始 IP)
- 禁止客户端伪造 Host:if ($host !~ ^(api\.example\.com|admin\.example\.com)$) { return 444; }(444 是 Nginx 特有关闭连接状态码)

















