离线部署Node.js应用需打包服务本体及依赖、Apache反向代理配置、原生模块编译产物和进程管理脚本;关键是在外网机用相同环境执行npm ci、npm rebuild,并同步Python、构建工具链与PM2等。

在离线环境中用 Apache 部署 Node.js 应用,关键不是让 Apache 直接运行 Node.js(它不负责执行 JS),而是通过反向代理把 HTTP 请求转发给本地运行的 Node.js 服务。真正需要离线打包的,是 Node.js 服务本身及其全部依赖——包括运行时、全局工具、项目 node_modules,以及可能涉及原生模块(如 bcrypt、sqlite3)所需的 node-gyp 离线编译能力。
一、Node.js 服务本体与依赖的离线打包
这是最基础也最容易出错的一环。不能只拷 node_modules 文件夹,必须确保版本锁定和平台一致性:
- 在外网机器(A机)上,使用与内网服务器完全一致的操作系统、CPU 架构和 Node.js 版本(建议 LTS),执行 npm ci --no-save(而非 npm install),它会严格按 package-lock.json 安装,避免语义化版本偏差
- 将整个项目目录(含 package.json、package-lock.json、node_modules)压缩为 tar.gz 或 zip;若项目体积大,可先用 npm prune --production 清除非生产依赖,再打包
- 特别注意:如果项目用了 ES 模块(type: "module")或 require() 动态加载路径,需验证离线环境下路径解析是否正常,避免因 cwd 变化导致 __dirname 失效
二、Apache 反向代理配置的离线准备
Apache 本身无需额外模块下载——其核心模块(mod_proxy、mod_proxy_http)通常已随发行版预装。但你需要提前准备好可直接部署的配置片段:
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 在 A 机上写好虚拟主机配置(如 /etc/apache2/sites-available/myapp.conf),明确指定 ProxyPass 和 ProxyPassReverse 指向 Node.js 监听地址(如 http://127.0.0.1:3000)
- 确认启用指令已在离线服务器上存在:检查 a2enmod 是否可用;若不可用,直接编辑 apache2.conf 或 mods-enabled/ 下对应 .load 和 .conf 文件,手动载入 mod_proxy 和 mod_proxy_http
- 把完整配置文件 + 启用脚本(如 a2ensite myapp.conf && systemctl reload apache2 的等效手动操作说明)一并打包进离线包
三、Node.js 原生模块(native addons)的离线处理
若项目依赖 sqlite3、bcrypt、sharp 等含 C++ 扩展的包,离线部署必须解决 node-gyp 编译问题:
- 在 A 机上,用相同 Node.js 版本 + 相同操作系统 + 相同 Python 版本(如 Python 3.10),执行 npm rebuild --build-from-source,强制重新编译所有 native 模块
- 编译成功后,整个 node_modules 中已生成 .node 文件(如 node_modules/sqlite3/lib/binding/napi-v6-linux-x64/node_sqlite3.node),这些二进制文件可直接复制到内网机器对应位置
- 同步打包 A 机上的 Python 运行时、C++ 构建工具链(如 VS Build Tools 离线安装包、或 Linux 的 build-essential.deb)及 node-gyp.tgz,以备内网机器未来新增 native 依赖时复用
四、进程管理与启动脚本的离线封装
Node.js 服务需长期运行,不能靠手工 node app.js。离线环境要自带“免 npm install 的启动能力”:
- 使用 PM2 时,不要依赖全局安装:把 pm2 可执行文件(node_modules/pm2/bin/pm2)连同其依赖一起打包;或改用更轻量的 node ./node_modules/pm2/index.js start ecosystem.config.js 方式启动
- 编写 shell 或 bat 启动脚本,内置 NODE_ENV=production、--max-old-space-size=4096 等关键参数,并加入健康检查(如 curl -f http://localhost:3000/health)和自动重启逻辑
- 把启动脚本、PM2 配置(ecosystem.config.js)、日志轮转规则(logrotate 配置)全部纳入离线包,做到“解压即运行”

















