apache 不直接运行 node.js,而是作为反向代理或静态服务器配合其使用;“一键打包发布”需分离构建与部署:前端静态产物上传至 documentroot,后端代码更新后由 pm2 管理重启,混合项目则双轨并行同步。

Apache 本身不直接运行 Node.js 应用,它通常作为反向代理或静态资源服务器配合 Node.js 使用。所以“Apache 中部署 Node.js”实际是指:Node.js 应用独立运行(如用 pm2),Apache 负责反向代理请求、托管静态文件、处理 HTTPS 和路径转发。在此架构下实现“一键打包与发布”,关键在于分离构建与部署职责——本地或 CI 环境完成打包,再把产物(如 dist/)同步到 Apache 的 DocumentRoot,或把服务端代码更新后重启 Node 进程。
下面分三类典型场景说明如何配合自动化脚本落地:
一、纯静态前端(Vue/React/UniApp H5)+ Apache 托管
适合不需要服务端逻辑的 H5 项目,打包产物是 HTML/CSS/JS 文件,直接由 Apache 提供访问。
- 构建产物(如
dist/)需上传至 Apache 的网站根目录(如/var/www/html/myapp) - 自动化脚本只需完成:本地
npm run build→ 压缩 → 通过 SSH/SCP 上传 → 解压覆盖 → 可选刷新 Apache 缓存(如sudo systemctl reload apache2)
示例核心步骤(Node.js 脚本片段):
const { exec } = require('child_process');
const { Client } = require('ssh2');
const compressing = require('compressing');
// 1. 本地打包
exec('npm run build', (err) => {
if (err) throw err;
// 2. 压缩 dist/
compressing.zip.compressDir('dist/', 'dist.zip').then(() => {
// 3. 上传并远程解压
const conn = new Client();
conn.on('ready', () => {
conn.exec('mkdir -p /var/www/html/myapp && rm -rf /var/www/html/myapp/*', (err, stream) => {
stream.on('close', () => {
conn.sftp((err, sftp) => {
sftp.fastPut('dist.zip', '/tmp/dist.zip', () => {
conn.exec('cd /tmp && unzip -o dist.zip -d /tmp/unzip && cp -r /tmp/unzip/dist/* /var/www/html/myapp/', () => {
conn.end();
});
});
});
});
});
}).connect({ host: 'your-server-ip', username: 'user', password: 'pass' });
});
});
✅ 优势:无需重启 Apache,零停机;适合频繁测试迭代
⚠️ 注意:确保 Apache 已启用mod_rewrite并配置好AllowOverride All,支持前端路由(如 Vue Router history 模式)
二、Node.js 后端服务 + Apache 反向代理
适用于 Express/Koa 等服务端应用,Apache 不托管代码,只做网关(HTTPS 终结、域名/路径分发)。
- Node.js 进程由
pm2管理(常驻后台、自动重启、日志收集) - 自动化脚本重点在:拉取最新代码 → 安装依赖 → 构建(如有 TS/Babel)→ 重启 pm2 进程
典型流程(Shell 脚本,可存为 deploy.sh 放服务器):
#!/bin/bash APP_DIR="/opt/my-node-app" cd $APP_DIR # 拉最新代码(假设用 Git) git pull origin main # 安装生产依赖(跳过 devDeps) npm ci --only=production # 重启服务(pm2 会自动重载) pm2 reload ecosystem.config.js --env production
配合本地一键触发(如用 Node 调用 SSH):
const { Client } = require('ssh2');
new Client().on('ready', c => {
c.exec('cd /opt/my-node-app && bash deploy.sh', (err, stream) => {
stream.on('data', console.log);
});
}).connect({ host: 'x.x.x.x', username: 'deploy', privateKey: require('fs').readFileSync('~/.ssh/id_rsa') });
✅ 优势:服务平滑重启(
pm2 reload支持零中断);Apache 配置一次长期稳定
⚠️ 注意:Apache 的ProxyPass需指向 Node.js 监听端口(如http://127.0.0.1:3000),且开启mod_proxy和mod_proxy_http
三、混合型(前端静态 + 后端 API)共站部署
常见于管理后台:https://admin.example.com/ → Apache 托管前端,/api/* → 代理到 Node 服务。
此时自动化需双轨并行:
- 前端产物同步到 Apache DocumentRoot(同第一类)
- 后端代码更新并重启 Node 进程(同第二类)
可用一个脚本统一协调:
# deploy-all.sh echo "✅ 正在更新前端..." rsync -avz --delete ./dist/ user@server:/var/www/html/admin/ echo "✅ 正在更新后端..." ssh user@server "cd /opt/admin-api && git pull && npm ci --only=production && pm2 reload app"
本地执行:bash deploy-all.sh
✅ 优势:前后端版本强一致,避免接口路径错配
⚠️ 注意:Apache 的<location></location>块必须正确配置ProxyPass,且后端响应头允许跨域(若前端非同域)或直接走代理免跨域
不复杂但容易忽略











