腾讯云宝塔面板部署Node.js博客全记录:从踩坑到上线
时间:2026年3月30日
技术栈:Node.js + Express + SQLite + Nginx + 宝塔面板
一、项目背景
最近完成了一个Apple风格的个人博客系统,采用Node.js + Express开发,SQLite作为数据库。项目特点包括轻量级设计,无需额外安装MySQL,支持Markdown文章编辑,完整的用户系统和评论功能,以及响应式Apple风格UI。
开发完成后,需要部署到腾讯云服务器,供外部访问。本文记录完整的部署过程和踩坑经验。
二、服务器环境准备
2.1 选购腾讯云服务器
配置建议选择2核4G内存的机型,个人博客足够使用。系统推荐CentOS 7.9,与宝塔兼容性最佳。带宽选择3到5Mbps,初期够用。系统盘50GB SSD即可。
安全组配置是关键步骤,需要开放以下端口:22端口用于SSH远程连接,来源0.0.0.0/0;80端口用于HTTP访问;443端口用于HTTPS访问;8888端口用于宝塔面板,后期可限制IP;3000端口用于Node.js调试。
2.2 安装宝塔面板
通过SSH连接服务器后执行安装命令。CentOS系统使用以下命令:
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec
安装完成后会显示面板地址和初始密码,务必保存。
三、环境配置
3.1 安装必要软件
进入宝塔面板,点击软件商店,安装Nginx 1.24作为Web服务器,安装Node.js版本管理器,然后安装Node.js 18.x LTS版本。
3.2 安装PM2进程管理器
执行以下命令安装PM2:
npm install -g pm2
PM2用于守护Node.js应用,确保崩溃后自动重启。
四、项目部署
4.1 上传项目文件
推荐使用本地压缩ZIP上传的方式。首先在本地将项目文件夹压缩为ZIP,确保包含所有文件。然后在宝塔面板中进入文件管理,上传至 /www/wwwroot/blog 目录,解压后目录结构如下:
/www/wwwroot/blog/
├── lib/
├── public/ # 静态资源(CSS/JS/图片)
├── views/ # EJS模板
├── data/ # SQLite数据库目录(需创建)
├── server.js # 入口文件
├── package.json # 依赖配置
└── .env # 环境变量
4.2 安装依赖
进入项目目录执行安装命令:
cd /www/wwwroot/blog
npm install
踩坑记录:如果安装缓慢,可以切换淘宝镜像加速:
npm config set registry https://registry.npmmirror.com
4.3 创建数据目录并设置权限
这是关键步骤,SQLite需要写入权限。执行以下命令:
mkdir -p /www/wwwroot/blog/data
chmod 755 /www/wwwroot/blog/data
chown www:www /www/wwwroot/blog/data
确保父目录也有执行权限:
chmod o+x /www /www/wwwroot /www/wwwroot/blog
踩坑记录:如果权限设置不正确,会出现 SQLITE_CANTOPEN: unable to open database file 错误。
五、Nginx反向代理配置
5.1 创建站点
在宝塔面板中进入网站管理,点击添加站点。域名填写服务器IP或你的域名,根目录设置为 /www/wwwroot/blog,PHP版本选择纯静态。
5.2 修改Nginx配置
配置文件路径为 /www/server/panel/vhost/nginx/49.232.145.120.conf,内容如下:
server {
listen 80;
server_name 49.232.145.120;
root /www/wwwroot/blog/public; # 静态文件根目录
access_log /www/wwwlogs/blog_access.log;
error_log /www/wwwlogs/blog_error.log;
# 静态文件处理(关键!)
location /css/ {
alias /www/wwwroot/blog/public/css/;
expires 30d;
}
location /js/ {
alias /www/wwwroot/blog/public/js/;
expires 30d;
}
location /images/ {
alias /www/wwwroot/blog/public/images/;
expires 30d;
}
# 反向代理到Node.js
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#error_page 404/404.html; # 宝塔标识,保留
}
踩坑记录:静态文件路径必须正确指向 public 目录,否则CSS/JS加载失败,页面只有纯文字。
六、启动应用
6.1 使用PM2启动
进入项目目录执行以下命令:
cd /www/wwwroot/blog
pm2 start server.js --name "blog"
pm2 save
pm2 startup # 设置开机自启
6.2 验证运行状态
查看应用状态:
pm2 status
查看实时日志:
pm2 logs blog
检查端口监听:
netstat -tlnp | grep 3000
七、常见问题排查
问题1:502 Bad Gateway
原因分析:Node.js应用未启动或端口不通。
解决方案:
pm2 restart blog
检查防火墙是否开放3000端口。
问题2:SQLite数据库无法打开
原因分析:data目录权限不足。
解决方案:
chown -R www:www /www/wwwroot/blog/data
chmod 755 /www/wwwroot/blog/data
问题3:CSS/JS加载404
原因分析:Nginx静态文件路径配置错误。
解决方案:确保 root 指向 public 目录,且目录内有文件。
问题4:MODULE_NOT_FOUND
原因分析:node_modules不完整。
解决方案:
rm -rf node_modules package-lock.json
npm install
八、SSL证书配置(HTTPS)
如果有域名,可以申请Let's Encrypt免费证书。首先在宝塔面板中进入网站设置,选择SSL,然后选择Let's Encrypt。验证方式可以选择DNS验证或文件验证。申请成功后,修改Nginx配置。
九、部署总结
环境准备阶段的关键操作是开放安全组端口,易错点是忘记开放3000调试端口。文件上传阶段使用ZIP压缩上传解压,易错点是遗漏public目录静态文件。依赖安装阶段执行npm install,易错点是网络慢导致安装不完整。权限设置阶段需要设置data目录755权限和www用户,易错点是SQLite无法写入。Nginx配置阶段需要正确配置静态路径和反向代理,易错点是CSS/JS加载失败。进程管理阶段使用PM2守护,易错点是应用崩溃后无法自动重启。
十、后续优化建议
数据库备份方面,建议定期备份 /www/wwwroot/blog/data/blog.db 文件。日志监控方面,配置PM2日志切割,防止磁盘占满。安全加固方面,修改默认管理员密码,限制宝塔面板访问IP。性能优化方面,启用Nginx缓存,配置CDN加速静态资源。
淡淡问候语☕️浓浓牵挂情🤝彼此常关怀🌻日日心舒畅❤️❤️愿我们每日都平安康健!喜乐绵长!