VPS 运行 Node.js 的一些经验

VPS 系统选择

各系统安装难易对比

Ubuntu、Debian 较为简单,CentOS 稍麻烦,32位系统比64位更节省内存

DigitalOcean 甚至推出了 Ubuntu + Node.js 一键部署,一分钟内(官方号称 55秒)就能把环境搭好(注:通过此链接注册,账户内会得到 10刀,而最低套餐 5刀/月,即可免费使用 2个月)

注:强烈建议 Create Droplet 的时候勾选上 Enable Backups(允许自动备份),虽然这将多出 20%的套餐费用,数据无价!

Debian 系统下安装 Node.js

依次运行如下命令

apt-get install curl
curl -sL https://deb.nodesource.com/setup | bash -
apt-get install -y nodejs
apt-get install -y build-essential

via: https://github.com/joyent/node/wiki/installing-node.js-via-package-manager#debian-and-ubuntu-based-linux-distributions

各系统资源占用对比

Debian、CentOS 占用的内存较小,Ubuntu 占用内存较大

经测试,在跑了 4个 Node.js 站点的低配 DigitalOcean 中,Ubuntu 动辄收到内存到达 90% 的警报

综上,最终选择了 Debian 系统

如何降低 Node.js 站点的内存占用

减少站点数量

比如我跑了 4个站点,2个面向公众,2个私用,这 2个私有项目按功用分为了两个站点,看似组织很合理,但为了性能起见,将这 2个合为一个之后资源占用减少了四分之一左右

优化 MySQL 在小内存 VPS 上的内存占用

MySQL 默认配置会占好几十 M 内存,有时候会经常由于内存不足挂掉,需要对其优化一下

1. 使用 SQLite 代替 MySQL

SQLite 的缺点是不支持并发写入操作,对代码的逻辑影响比较大

2. 修改 MySQL 配置

其实 MySQL 安装后自带了几个配置示例,位于 /usr/share/doc/mysql-server-5.5/examples/

如果文件是 gz 后缀,需要先解压才能看到源文件,之后可以得到

my-small.cnf
my-medium.cnf
...

等文件,文件开头有注释可以查看一下,比如 my-small.cnf

# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it‘s important that the mysqld daemon
# doesn‘t use much resources.

你可以选择合适的文件替换 /etc/mysql/my.cnf,随后重启 MySQL 即可

/etc/init.d/mysql restart

目前,我自己的小项目使用的是 my-medium.cnf,在 512M 的 VPS 上占用了不到 10M 的内存,够省吧

创建 swap 分区

类似与 Windows 下的虚拟内存,当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况

尤其是运行 MySQL 数据库时,在小内存 VPS 中经常会遇到因为内存不足数据库被断开连接的情形,那么可以通过创建 swap 解决

通常情况下, VPS 安装系统时会自动创建,而 DigitalOcean 需要我们手动创建

依次执行如下命令即可

cd /var
touch swap.img
chmod 600 swap.img
dd if=/dev/zero of=/var/swap.img bs=1024k count=1000
mkswap /var/swap.img
swapon /var/swap.img
echo "/var/swap.img    none    swap    sw    0    0" >> /etc/fstab
echo "vm.swappiness=30" >> /etc/sysctl.conf
echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf
echo "Swap created and added to /etc/fstab for boot up."

via https://www.digitalocean.com/community/tutorials/how-to-configure-virtual-memory-swap-file-on-a-vps 
https://laracasts.com/discuss/channels/forge/does-forge-run-ok-on-a-digitalocean-512mb-instance

定时重启网站

重启是释放软件资源的一个行之有效的方式:P

Node.js 进程守护

运行 Node.js 站点要考虑项目异常退出,服务器重启等情况,需要一个进程守护程序,比如 PM2

安装 PM2
npm install pm2 -g
创建 PM2 自启动脚本
pm2 startup debian

这样 VPS 系统重启后 PM2 就能自动运行了,当然前提是 Node.js 站点都是 PM2 来启动的

使用 PM2 启动 Node.js 站点

进入站点根目录,原先的启动命令是

node app.js

现在改用

pm2 start app.js --name myappname

myappname 改为你想要的名称即可,加上 --name 参数的原因是如果有多个 Node.js 站点,并且它们各自的启动文件都是 app.js,那么在进程中很难辨别各个站点

还有更多用法,比如以生产模式启动 Ghost

NODE_ENV=production pm2 start index.js --name ghost

随后保存

pm2 save

按同样的方式把所有站点都添加进来,这样 PM2 启动时就能自动启动所有站点了

查看所有 PM2 进程
pm2 list

这样就能看到所有站点的运行状态了,比如内存占用、重启次数等等

┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬──────────────┬──────────┐
│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │       memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼──────────────┼──────────┤
│ app      │ 1  │ fork │ 5853 │ online │        99 │ 6h     │ 103.625 MB   │ disabled │
│ rss      │ 3  │ fork │ 5857 │ online │        26 │ 6h     │  95.340 MB   │ disabled │
│ ghost    │ 4  │ fork │ 5861 │ online │        23 │ 6h     │  92.555 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴──────────────┴──────────┘

定时重启 PM2

系统内置定时执行任务的功能,编辑 etc/crontab 文件,在文件末尾添加

00 11 * * * root /usr/bin/pm2 restart all

注:最后一定要加个空行,否则最后一行设置可能不执行

之后重启 corn 以便设置生效

/etc/init.d/cron restart

这样就设置好了每天凌晨三点自动重启 PM2,来达到重启所有站点的目的

可使用每分钟执行来测试命令是否能正常执行

*/1 * * * * root /usr/bin/pm2 restart all
时间格式介绍

00 11 * * * 这种时间格式详见http://zh.wikipedia.org/wiki/Cron#.E6.97.B6.E9.97.B4.E8.AE.BE.E7.BD.AE

你可能会问了,凌晨三点不是应写为 00 3 * * * 吗?为什么写为 11 呢?

我们的服务器 DigitalOcean 身处美国 San Francisco 节点,输入命令

date

可以看到输出的是 UTC 时间,详见http://zh.wikipedia.org/wiki/%E5%8D%8F%E8%B0%83%E4%B8%96%E7%95%8C%E6%97%B6

Thu Jan  1 10:42:06 UTC 2015

我们所在的北京时区是 UTC+8,而美国时区位于 UTC-8 ~ UTC-5,当 UTC 0点时,北京时间为 0 + 8 = 8点,而 UTC-8 时区为 -(24 - 8) = -16(前一天16点)

其中 UTC-8 又称作太平洋时间,如果你是 Apple 开发者,苹果发给你的放假邮件里就是使用的太平洋时间,你消化不了的话只要记住咱们比苹果快 16小时就够了

我的站点主要面向美国用户,这里设置的是 UTC-8 的凌晨三点,所以是 11,考虑 UTC-5 是凌晨六点,满足需求了,如果你是面向国内用户的凌晨三点,则是 19

时间: 2024-09-26 14:42:48

VPS 运行 Node.js 的一些经验的相关文章

运行node.js报错:Cannot find module &#39;../build/Release/bson&#39;] code: &#39;MODULE_NOT_FOUND&#39; } js-bson

具体报错内容: { [Error: Cannot find module '../build/Release/bson'] code: 'MODULE_NOT_FOUND' } js-bson: Failed to load c++ bson extension, using pure JS version   第一步: 找到 module mongodb ..node_modules\mongodb\node_modules\bson\ext\index.js 并改变bson引用的路径 bso

使用electron构建跨平台Node.js桌面应用经验分享

by zhangxinxu from http://www.zhangxinxu.com/wordpress/?p=6154 本文可全文转载,但需得到原作者书面许可,同时保留原作者和出处,摘要引流则随意. 最近,把团队内经常使用的一个基于Node.js制作的小工具给做成了可视化操作的桌面软件,使用的是electron,这里简单分享一下使用electron的一些经验和心得. 一.如何使用electron把基本的开发环境给跑起来? 我是这么处理的,electron官方提供了一个名为"electron

eclipse 上运行node.js express出现的问题解决

本人从昨天一直到现在都在搞node.js  成功安装express node.js supervisor  但在eclipse中建立node express工程出现了很多问题,网上查看了好多资料,头大,各种拼凑终于搞出来了 1:建立express 工程选择jade一直建立不成功, 不知道为什么  但是只要不选jade模板就直接可以建立 2:直接选择建立node工程,不管那个express了,建了之后里面只有空文件夹,不用管他, 3:利用cmd命令行将node工程转化成express工程,语句如下

使用Node.js + MongoDB 构建restful API

很多天前已经翻译了一大半了,今天收收尾~ RESTful API With Node.js + MongoDB Translated By 林凌灵 翻译目的:练练手,同时了解别人的思维方式 原文地址:RESTful API With Node.js + MongoDB 12 Sep 2013 我是一名移动应用开发者,我需要某种后端服务用来频繁地处理用户数据到数据库中.当然,我可以使用后端即服务类的网站(Parse, Backendless, 等等-),(译者:国内比较出名的有Bmob).但自己解

Node.js 概述

JavaScript 标准参考教程(alpha) 草稿二:Node.js Node.js 概述 GitHub TOP Node.js 概述 来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 目录 简介 安装与更新 版本管理工具nvm 基本用法 REPL环境 异步操作 全局对象和全局变量 模块化结构 概述 核心模块 自定义模块 异常处理 try-catch结构 回调函数 EventEmitter接口的error事件 uncaughtException事件 unhandled

使用Chrome DevTools直接调试Node.js与JavaScript(并行)

Good News: 现在我们可以用浏览器调试node.js了!!! 前提 Node.js 6.3+, 这个可上Node.js官网自行下载: Chrome 55+. 如果您本地的chrome升级到最新版后还是<55, 可以从此处下载:Chrome Canary,亲测可行. 配置 就目前来说,在浏览器端并行调试JavaScript与Node.js还属于新特性,新体验.为了能够正常使用,你还需要做如下配置: 输入url:chrome://flags/#enable-devtools-experime

Node.js的线程和进程

http://www.admin10000.com/document/4196.html 前言 很多Node.js初学者都会有这样的疑惑,Node.js到底是单线程的还是多线程的?通过本章的学习,能够让读者较为清晰的理解Node.js对于单/多线程的关系和支持情况.同时本章还将列举一些让Node.js的web服务器线程阻塞的例子,最后会提供Node.js碰到这类cpu密集型问题的解决方案. 在学习本章之前,读者需要对Node.js有一个初步的认识,熟悉Node.js基本语法.cluster模块.

在 Chrome 开发者工具中调试 node.js

命令行工具 devtool ,它可以在 Chrome 的开发者工具中运行 Node.js 程序. 下面的记录显示了在一个 HTTP 服务器中设置断点的情况. 该工具基于 Electron 将 Node.js 和 Chromium 的功能融合在了一起.它的目的在于为调试.分析和开发 Node.js 应用程序提供一个简单的界面. 你可以使用 npm 来安装它: npm install -g devtool 在某种程度上,我们可以用它来作为 node shell 命令的替代品.例如,我们可以这样打开一

node.js(七) 子进程 child_process模块

众所周知node.js是基于单线程模型架构,这样的设计可以带来高效的CPU利用率,但是无法却利用多个核心的CPU,为了解决这个问题,node.js提供了child_process模块,通过多进程来实现对多核CPU的利用. child_process模块提供了四个创建子进程的函数,分别是spawn,exec,execFile和fork. 1.spawn函数的简单用法 spawn函数用给定的命令发布一个子进程,只能运行指定的程序,参数需要在列表中给出.如下示例: var child_process