跑 Node.js 项目,选镜像的核心逻辑就两条:环境干净和依赖少。
别去折腾那些花里胡哨的“一键部署”模板(除非你只是用来测试),对于正经的生产或长期运行环境,我强烈建议首选 Linux 通用镜像,具体来说是 Ubuntu 20.04/22.04 LTS 或者 CentOS Stream 8/9(如果团队习惯 RedHat 系)。
下面我把为什么这么选,以及怎么配,掰开揉碎了说。
1. 为什么不建议用“应用镜像”?
腾讯云轻量服务器确实提供了一些预装环境的镜像,比如“WordPress”、“Django”、“Node.js 示例”等。
- 坑点一:权限混乱。 这些镜像通常把文件放在
/root或者某个特定用户下,权限设置可能不符合你的安全规范。 - 坑点二:版本锁定。 预装的 Node.js 版本往往比较旧,或者为了兼容性牺牲了性能。你想升级?得手动改,容易搞挂系统。
- 坑点三:黑盒操作。 你不知道它背后跑了什么服务,占了多少内存。轻量服务器本身配置就不高(比如 1核2G),跑个 Node 再跑个数据库,内存直接爆满。
所以,通用镜像 = 白板,一切由你掌控,这才是程序员该有的样子。
2. 推荐组合:Ubuntu + Docker
如果你追求稳定和现代开发体验,Ubuntu 22.04 LTS + Docker 是目前最稳妥的方案。
方案 A:纯原生安装(适合小项目、学习、简单 API)
- 选择镜像:Ubuntu 22.04 LTS。
- 基础环境搭建:
- 登录 SSH。
- 安装 NVM (Node Version Manager):这是管理 Node 版本的神器,避免用
apt install nodejs那种老版本。curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash source ~/.bashrc nvm install --lts # 自动安装最新 LTS 版本 - 安装 PM2:进程管理器,保证你的 Node 进程挂了能自动重启。
npm install -g pm2
- 部署流程:
- 上传代码(Git clone 或 rsync)。
- 安装依赖:
npm install - 启动:
pm2 start app.js - 设置开机自启:
pm2 startup&pm2 save
优点:资源占用极低,没有容器开销。
缺点:环境隔离性差,多个项目之间可能有冲突。
方案 B:Docker 化部署(推荐用于生产环境)
这是目前业界标准做法。即使你不用 Docker Compose 编排复杂服务,单用 Docker 也能解决环境一致性问题。
- 选择镜像:Ubuntu 22.04 LTS。
- 安装 Docker:
apt update apt install docker.io docker-compose-plugin systemctl enable docker systemctl start docker - 编写 Dockerfile:
FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 3000 CMD ["node", "app.js"]注意:用 Alpine 镜像体积小,安全性高。
- 构建与运行:
docker build -t my-node-app . docker run -d -p 3000:3000 --name my-app my-node-app
优点:环境绝对一致,迁移方便,不污染宿主机。
缺点:稍微多学一个工具,但值得。
3. 网络与安全配置(容易被忽略的关键)
选了镜像只是第一步,轻量服务器的防火墙和安全组才是决定你能不能访问项目的关键。
-
安全组规则:
- 默认只开放 22 (SSH)。
- 你必须手动添加一条规则:允许 TCP 端口 3000(或你的 Node 项目端口)从 0.0.0.0/0 进入。
- 重要:不要直接暴露 Node 端口给公网!前面必须加 Nginx 做反向XX。
-
Nginx 反向XX:
在 Ubuntu 上装 Nginx:apt install nginx配置
/etc/nginx/sites-available/default:server { listen 80; server_name your_domain.com; # 替换为你的域名或IP location / { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }这样,用户访问的是 80 端口,Nginx 转发给你的 Node 应用。同时你可以开启 HTTPS(配合 Let’s Encrypt 免费证书),提升安全性和 SEO。
4. 避坑指南
- 内存监控:Node.js 是单线程模型,但 V8 引擎吃内存。轻量服务器如果是 1G 内存,跑 Node 会比较吃力。建议至少 2G 起步,并开启 Swap 分区作为缓冲。
fallocate -l 1G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile echo '/swapfile none swap sw 0 0' >> /etc/fstab - 日志查看:不要用
console.log刷屏终端。使用 PM2 的日志功能,或者将日志输出到文件,定期轮转(logrotate),防止磁盘写满。 - 域名解析:记得在腾讯云控制台做好 CNAME 或 A 记录解析,否则网络访问不了。
总结
| 场景 | 推荐镜像 | 部署方式 | 理由 |
|---|---|---|---|
| 个人博客、小型 API、学习 | Ubuntu 22.04 LTS | NVM + PM2 | 简单、直接、资源占用低 |
| 商业项目、微服务、团队协作 | Ubuntu 22.04 LTS | Docker + Docker Compose | 环境隔离、可移植、易维护 |
| 不想碰 Linux 命令 | Windows Server 镜像 | IIS + Node.js | 不推荐,Windows 服务器成本高,运维麻烦,除非你有遗留的 .NET 依赖 |
最终建议:买一个 Ubuntu 22.04 LTS 的通用镜像,装上 Docker,用 Nginx 反代,这是目前国内云环境下最成熟、最稳定、也最容易找社区支持的 Node.js 部署方案。
云技术博客