VPS 系统选择

各系统安装难易对比

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

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

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

Debian 系统下安装 Node.js

依次运行如下命令

  1. apt-get install curl
  1. curl -sL https://deb.nodesource.com/setup | bash -
  1. apt-get install -y nodejs
  1. 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 后缀,需要先解压才能看到源文件,之后可以得到

  1. my-small.cnf
  2. my-medium.cnf
  3. ...

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

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

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

  1. /etc/init.d/mysql restart

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

创建 swap 分区

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

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

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

依次执行如下命令即可

  1. cd /var
  2. touch swap.img
  3. chmod 600 swap.img
  4. dd if=/dev/zero of=/var/swap.img bs=1024k count=1000
  5. mkswap /var/swap.img
  6. swapon /var/swap.img
  7. echo "/var/swap.img none swap sw 0 0" >> /etc/fstab
  8. echo "vm.swappiness=30" >> /etc/sysctl.conf
  9. echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf
  10. 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
  1. npm install pm2 -g
创建 PM2 自启动脚本
  1. pm2 startup debian

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

使用 PM2 启动 Node.js 站点

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

  1. node app.js

现在改用

  1. pm2 start app.js --name myappname

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

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

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

随后保存

  1. pm2 save

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

查看所有 PM2 进程
  1. pm2 list

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

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

定时重启 PM2

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

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

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

之后重启 corn 以便设置生效

  1. /etc/init.d/cron restart

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

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

  1. */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 节点,输入命令

  1. date

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

  1. 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

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

  1. 玩儿转物联网IoT - 在Beagle Bone Black上运行node.js 程序

    物联网(IoT)技术方兴未艾,智能手环,智能血压计,智能眼镜甚至智能鞋垫都开始进入我们的生活,各种智能设备层出不穷,世界已经到了一个"人有多大胆,地有多大产"的时代,不玩儿点物联网 ...

  2. 在Window IIS中安装运行node.js应用—你疯了吗

    [原文发表地址]Installing and Running node.js applications within IIS on Windows - Are you mad? [原文发表时间]201 ...

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

    by zhangxinxu from http://www.zhangxinxu.com/wordpress/?p=6154 本文可全文转载,但需得到原作者书面许可,同时保留原作者和出处,摘要引流则随 ...

  4. 如何在 Android 安卓手机上运行 Node.js 应用 | 如何在安卓手机配置node开发环境

    最近在学习js,由于没法随身携带笔记本电脑,在手机翻阅<JavaScript高级程序设计>时,时常想调试一下书中的代码.于是就有了,能否在手机上配置一个js开发环境.考虑到手机上的Chro ...

  5. 总结在Visual Studio Code运行node.js项目遇到的问题

    一.cannot find module “lodash” 项目运行时出现以下错误: Error: Cannot find module 'lodash' at Function.Module._re ...

  6. CentOS 7部署Node.js+MongoDB:在VPS上从安装到Hello world

    写好代码,花钱买了VPS,看着Charges一直上涨却无从下手?记一位新手司机从购买VPS到成功访问的过程 0.购买VPS 首先,选择VPS提供商,部署一个新的服务器(Deploy New Serve ...

  7. node.js运行配置(vs code非控制台输出)

    node.js运行配置(vs code非控制台输出) node  配置 简化  vs code 是非常强大的编译器,皆因它有有各种各样好用的插件. 在没有安装code runner插件之前,想要执行n ...

  8. Edge.js:让.NET和Node.js代码比翼齐飞

    通过Edge.js项目,你可以在一个进程中同时运行Node.js和.NET代码.在本文中,我将会论述这个项目背后的动机,并描述Edge.js提供的基本机制.随后将探讨一些Edge.js应用场景,它在这 ...

  9. Ubuntu 部署 Node.js 应用

    安装Node.js环境 sudo apt-get install nodejs sudo apt-get install npm 对于不同环境依赖 的node_module可以采用以下命令来重新生成 ...

随机推荐

  1. pl/sql declare loop if

    -- 1.判断表是否存在,如果存在则drop表 -- 2.创建表 -- 3.插入1W条数据 -- 4.每1K条commit一次 declare v_table ):='STUDENT'; --表名 v ...

  2. java在window系统的一些问题

    一般的, 在windows cmd上启动 utf-8编码的java应用 会有一些字符集问题 可以修改cmd的字符集编码为utf8 , chcp 65001 java -D有空格时 区别:  VM参数是 ...

  3. docker 安装的centos7.4中无法识别文件中的中文

    在容器内执行命令: 命令: yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common 命令: localedef ...

  4. django django中的HTML控件及参数传递方法 以及 HTML form 里的数据是怎么被包成http request 的?如何在浏览器里查看到这些数据?

    https://www.jb51.net/article/136738.htm django中的HTML控件及参数传递方法 下面小编就为大家分享一篇django中的HTML控件及参数传递方法,具有很好 ...

  5. HTTP的请求头标签 If-Modified-Since

    一直以来没有留意过HTTP请求头的IMS(If-Modified-Since)标签. 最近在分析Squid的access.log日志文件时,发现了一个现象.就是即使是对同一个文件进行HTTP请求,第一 ...

  6. 可视化开发_AppInventor2似乎被抛弃了

    工具 blockly google,mixly,scratch,app inventor2 的分别 可视化编程,青雀,来自 白鹭 没源码 如果想二次开发呢,初版拖拽控件生成,后期维护的时候找程序员加功 ...

  7. GET和POST区别和用法

    很多人都分不清GET与POST的区别,以及什么时候用GET?什么时候用POST? GET和POST两种方法都是将数据送到服务器,但你该用哪一种呢? HTTP标准包含这两种方法是为了达到不同的目的.PO ...

  8. HDU 5407——CRB and Candies——————【逆元+是素数次方的数+公式】

    CRB and Candies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  9. spring各版本之间的特性增加

    一.Spring3.0以后不再提供一个大的完整的jar包,而是分成20个小的jar包: org.springframework.aop, 包含在应用中使用Spring的AOP特性时所需的类. org. ...

  10. Ubuntu 网速显示,ssh配置

    安装: sudo apt-get install python3-psutil curl git gir1.2-appindicator3-0.1git clone https://github.co ...