如何在Apache服务器部署Node.js Express生产应用?附构建与上传疑问
嘿,刚从Angular的构建流程转过来问Node.js部署,太懂这种懵圈的感觉了!我来给你捋清楚Node.js生产环境部署的正确姿势,一步步来:
Node.js 生产环境部署全指南
先搞懂核心区别:Node.js vs Angular
Angular是前端框架,npm run build:prod会把代码打包成纯静态文件(HTML/CSS/JS),直接扔给服务器就能跑;但Node.js是后端运行时,它本身是要运行代码的,不是打包成静态文件那么简单,所以部署逻辑完全不一样。
第一步:准备要上传的文件(绝对别传整个开发文件夹!)
你需要过滤掉开发无关的内容,只传生产必需的:
- 编译后的代码:如果你的项目用了TypeScript、Babel这类需要编译的工具,先在本地/CI环境执行编译命令(比如
tsc),生成的dist或build文件夹才是要部署的核心代码。 package.json:里面要包含生产环境的启动脚本(比如"start": "node dist/index.js"),以及所有生产依赖的声明。- 生产环境配置:比如
.env.production(别传开发用的.env,里面可能有敏感信息)、静态资源(如果有的话,比如上传的图片、前端静态文件)。 - 可选但不推荐直接传:
node_modules。更稳妥的做法是在服务器上执行npm install --production,只安装生产依赖,避免本地和服务器系统架构不同导致的依赖兼容问题。
第二步:部署到Apache服务器的具体操作
Apache本身没法直接运行Node.js,得靠反向代理把请求转发给Node进程:
- 服务器先装好Node.js:版本尽量和本地开发一致,避免版本兼容坑。
- 上传刚才准备好的文件到服务器的某个目录(比如
/var/www/your-node-app)。 - 安装生产依赖:进入目录执行
npm install --production。 - 启动Node应用:别直接用
node dist/index.js,生产环境一定要用进程管理器(比如PM2,后面讲),先让应用跑在某个端口(比如3000)。 - 配置Apache反向代理:
编辑Apache的虚拟主机配置文件(比如/etc/apache2/sites-available/your-app.conf),添加以下内容:
然后启用代理模块:<VirtualHost *:80> ServerName your-domain.com # 把所有请求转发到Node应用的端口 ProxyPass / http://localhost:3000/ ProxyPassReverse / http://localhost:3000/ # 启用代理模块后才能生效 ProxyPreserveHost On </VirtualHost>sudo a2enmod proxy proxy_http,重启Apache:sudo systemctl restart apache2。
第三步:生产环境必用的进程管理器(PM2)
直接运行node命令的话,进程崩溃就会导致服务中断,PM2是Node.js生产环境的标配:
- 服务器上安装PM2:
sudo npm install pm2 -g - 启动应用:
pm2 start dist/index.js --name "your-app-name" - 常用操作:
- 看日志:
pm2 logs your-app-name - 重启应用:
pm2 restart your-app-name - 设置开机自启:
pm2 startup(跟着提示执行命令就行)
- 看日志:
额外注意事项
- 敏感信息别硬编码:数据库密码、API密钥这些用环境变量或者
.env.production管理,别写在代码里。 - 端口安全:如果用反向代理,服务器只需要开放80/443端口;如果直接暴露Node端口,要在防火墙里放行对应的端口。
- 版本控制部署:更高效的方式是用Git,服务器上拉取仓库的生产分支,然后执行
npm install --production、pm2 restart,更新代码更方便。
内容的提问来源于stack exchange,提问作者Hữu Linh




