上一篇
在虚拟主机搭建node服务器
- 虚拟主机
- 2025-08-14
- 4
于虚拟主机建 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的专用