上一篇
于虚拟主机建 Node 服务器,先装 Node.js 运行环境,依指引配置端口与目录,上传项目文件,借 PM2 等工具启动管理,即可对外提供服务
前期准备
1 确认虚拟主机环境
| 检查项 | 说明 |
|---|---|
| 操作系统 | 优先选择Linux系统(如CentOS/Ubuntu),Windows需额外注意路径兼容性 |
| Node版本 | 确保预装Node≥v14.0(可通过node -v验证),若无则需联系服务商安装 |
| 文件传输方式 | 推荐使用FileZilla(FTP)或直接通过控制面板的文件管理器 |
| 数据库支持 | 根据需求确认是否已创建MySQL/MongoDB等数据库(本文以纯Node服务为例) |
2 本地开发环境准备
- 必装工具:VS Code + ESLint插件(规范代码)、Postman(接口测试)
- 项目结构:建议采用以下基础结构
my-app/ ├── app.js # 主入口文件 ├── package.json # 依赖管理 └── .env # 环境变量(可选)
核心部署步骤
1 上传项目文件
- 压缩打包:在本地执行
npm install→ 生成node_modules→ 打包为.zip文件 - 上传至虚拟主机:
- 通过FTP客户端上传至公共目录(如
public_html) - 注意:部分主机限制单个文件大小(建议分卷压缩)
- 通过FTP客户端上传至公共目录(如
- 目录权限设置:
- 递归赋予执行权限:
chmod -R 755 my-app/ - 确保
app.js具有可执行权限:chmod +x app.js
- 递归赋予执行权限:
2 配置Web服务器(以Apache为例)
| 配置文件路径 | 关键配置内容 |
|---|---|
.htaccess |
添加反向代理规则ProxyPass / http://localhost:3000/ |
httpd.conf |
启用mod_proxy模块LoadModule proxy_module modules/mod_proxy.so |
virtualhosts |
绑定自定义域名ServerName yourdomain.com |
3 进程管理方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| PM2 | 自动重启/负载均衡 | 占用内存较高 | 生产环境 |
| Forever | 轻量级简单易用 | 无健康检查机制 | 小型测试项目 |
| Systemd | 系统集成度高 | 配置复杂 | Linux专业运维场景 |
| Screen | 会话隔离 | 手动管理麻烦 | 临时调试 |
4 启动服务命令示例
# 方案1:使用PM2(推荐) cd /path/to/your/app pm2 start app.js --name my-node-app pm2 save # 保存进程列表 # 方案2:Forever(备选) forever start app.js
关键优化配置
1 环境变量管理
在项目根目录创建.env文件:
PORT=3000 NODE_ENV=production DATABASE_URL=mongodb://user:pass@localhost:27017/mydb
并通过dotenv包加载:require('dotenv').config()
2 安全加固措施
| 风险点 | 解决方案 |
|---|---|
| 源码泄露 | 禁止直接访问.js文件:在.htaccess中添加<FilesMatch ".js$"> Deny </FilesMatch> |
| SQL注入 | 使用ORM框架(如Sequelize)并开启参数化查询 |
| DDoS攻击 | 配置Cloudflare CDN进行流量清洗 |
| 日志监控 | 将console.log重定向至文件:console.log = require('simple-node-logger').createRollingFileStream({...}) |
3 性能调优参数
| 参数 | 推荐值 | 作用说明 |
|---|---|---|
| UV_THREADPOOL_SIZE | CPU核心数×2 | 提升加密/解密性能 |
| –max-old-space-size | 80%物理内存 | 防止内存溢出 |
| garbage collection | 分代回收策略 | 通过--expose-gc手动触发垃圾回收 |
常见问题与解答
Q1: 访问域名显示502 Bad Gateway怎么办?
A: 按顺序排查以下三点:
- 进程状态:执行
ps aux | grep node确认服务正在运行 - 防火墙规则:检查
iptables -L是否开放了应用端口(如3000) - 代理配置:查看
.htaccess中的ProxyPass路径是否正确指向本地服务
Q2: 修改代码后为何不生效?
A: 可能原因及解决方案:
| 现象 | 原因分析 | 解决方法 |
|——————–|——————————|———————————–|
| 旧版代码仍在运行 | PM2未重新加载新代码 | pm2 restart my-node-app |
| 缓存未清除 | CDN/浏览器缓存残留 | 强制刷新(Ctrl+F5)+ 清理缓存 |
| 依赖未更新 | package.json版本未同步 | npm install后重启服务 |
| 热更新失效 | WebSocket连接被防火墙拦截 | 改用轮询机制或开放相应端口 |
进阶扩展建议
- 容器化部署:使用Docker Compose编排Node+Nginx+MongoDB容器集群
- CI/CD集成:通过GitHub Actions实现代码提交自动部署
- 监控体系:接入Prometheus+Grafana监控CPU/内存使用率
- 多实例部署:利用Nginx的upstream模块实现水平扩展
通过以上步骤,可在大多数共享型虚拟主机上成功部署Node.js应用,实际部署时需根据具体主机提供商的限制进行调整,建议优先选择支持Node.js的专用
