作者: admin

  • node.js网站发布工具模块—pm2

    网站发布一般都会借助,例如:IIS、apache

    (跟pm2类似的还有forever,《node.js网站发布器—forever》)

    在使用express框架为例,node.js中可以直接使用:

    node ./bin/www

     

    或者supervisor模块,推荐测试使用此模块

    supervisor ./bin/www

    以上的方法都可以发布网站,但是总会有意外发生或者网站超时会需要自动重启,或者充分利用服务器多核配置,这时就需要用到pm2。

    网上就会有人问了:supervisor vs pm2 vs forever哪个更好

    使用场合不完全一样。

    • supervisor 是开发环境用。
    • forever 管理多个站点,每个站访问量不大,不需要监控。
    • pm2 网站访问量比较大,需要完整的监控界面。

     

    这里我们推荐使用pm2

    一些常用方法:

    npm install pm2 -g   //安装pm2
    pm2 update           //更新pm2
    
    pm2 start ./bin/www  //启动pm2
    pm2 restart          //重启pm2
    pm2 stop             //关闭pm2
    
    pm2 list 或者 pm2 ls //查看所有进程
    pm2 describe (App name/id)  //查看某个进程详细信息
    
    pm2 delete all  //强制停止所有进程
    pm2 delete 0    //强制停止某个进程
    pm2 logs (App name/id)  //查看监听某个网站的动态日志信息,类似supervisor用来测试
    pm2 monit  //查看每个网站的CPU内存占用情况
    
    
    监听模式类似supervisor,后台文件被修改立马能看出效果
    pm2 start ./bin/www --watch   //开启监听,一旦有文件修改立马生效,不加--watch文件修改不会生效需重启
    pm2 stop --watch (App name/id) //关闭监听,输入指定的id进程

     

     

    ————————————————————————————

    更多pm2使用方法

    ————————————————————————————

    pm2 是一个带有负载均衡功能的Node应用的进程管理器.
    当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的。它非常适合IaaS结构,但不要把它用于PaaS方案(随后将开发Paas的解决方案).
    
    备注:SaaS、PaaS和IaaS是云服务模式。
     SaaS 软件即服务,例如Google的 Gmail 邮箱服务.面向应用型用户.
     PaaS 平台即服务.例如Google的GAE,面向开发型用户
     IaaS 基础架构即服务,例如亚马逊的AWS,IaaS对于不知道新推出的应用程序/网站会有多成功的创业公司来说非常有用
     请参考 云服务模式:SaaS、PaaS和IaaS,哪一种适合你?
    
    
    主要特性:
    
    内建负载均衡(使用Node cluster 集群模块)
    后台运行
    0秒停机重载,我理解大概意思是维护升级的时候不需要停机.
    具有Ubuntu和CentOS 的启动脚本
    停止不稳定的进程(避免无限循环)
    控制台检测
    提供 HTTP API
    远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )
    
    测试过Nodejs v0.11 v0.10 v0.8版本,兼容CoffeeScript,基于Linux 和MacOS.
    
    安装
    npm install -g pm2
    
    用法
    $ npm install pm2 -g # 命令行安装 pm2 
    $ pm2 start app.js -i 4 #后台运行pm2,启动4个app.js 
     # 也可以把'max' 参数传递给 start
     # 正确的进程数目依赖于Cpu的核心数目
    $ pm2 start app.js --name my-api # 命名进程
    $ pm2 list # 显示所有进程状态
    $ pm2 monit # 监视所有进程
    $ pm2 logs # 显示所有进程日志
    $ pm2 stop all # 停止所有进程
    $ pm2 restart all # 重启所有进程
    $ pm2 reload all # 0秒停机重载进程 (用于 NETWORKED 进程)
    $ pm2 stop 0 # 停止指定的进程
    $ pm2 restart 0 # 重启指定的进程
    $ pm2 startup # 产生 init 脚本 保持进程活着
    $ pm2 web # 运行健壮的 computer API endpoint (http://localhost:9615)
    $ pm2 delete 0 # 杀死指定的进程
    $ pm2 delete all # 杀死全部进程
    
    运行进程的不同方式:
    $ pm2 start app.js -i max # 根据有效CPU数目启动最大进程数目
    $ pm2 start app.js -i 3 # 启动3个进程
    $ pm2 start app.js -x #用fork模式启动 app.js 而不是使用 cluster
    $ pm2 start app.js -x -- -a 23 # 用fork模式启动 app.js 并且传递参数 (-a 23)
    $ pm2 start app.js --name serverone # 启动一个进程并把它命名为 serverone
    $ pm2 stop serverone # 停止 serverone 进程
    $ pm2 start app.json # 启动进程, 在 app.json里设置选项
    $ pm2 start app.js -i max -- -a 23 #在--之后给 app.js 传递参数
    $ pm2 start app.js -i max -e err.log -o out.log # 启动 并 生成一个配置文件
    pm2 start app.js --max_memory_restart 1024M : 当内存超过1024M时自动重启。 如果工程中有比较棘手的内
    存泄露问题,这个算是一个折中方案。
    你也可以执行用其他语言编写的app ( fork 模式):
    $ pm2 start my-bash-script.sh -x --interpreter bash
    $ pm2 start my-python-script.py -x --interpreter python
    
    0秒停机重载:
    这项功能允许你重新载入代码而不用失去请求连接。
    注意:
    仅能用于web应用
    运行于Node 0.11.x版本
    运行于 cluster 模式(默认模式)
    $ pm2 reload all
    
    CoffeeScript:
    $ pm2 start my_app.coffee #这就是全部
    
    PM2准备好为产品级服务了吗?
    只需在你的服务器上测试
    $ git clone https://github.com/Unitech/pm2.git
    $ cd pm2
    $ npm install # 或者 npm install --dev ,如果devDependencies 没有安装
    $ npm test

     

    配置文件:

    如果应用程序很多,一个个手动启动会很麻烦,把所有应用都写在一个文件一件启动所有应用会很快。

    1,创建配置文件ecosystem.config.js

    pm2 init

    2,目前一个应用实例

    module.exports = {
        apps : [{
         name: 'xinyongka',
         script: 'www',
         cwd: '/root/koa2/bin',
         max_memory_restart: '500M',// 超过多大内存自动重启,仅防止内存泄露,根据自己的业务设置
         exec_mode: 'cluster', // 开启多线程模式,用于负载均衡
         instances: 'max', // 启用多少个实例,可用于负载均衡
         autorestart: true // 程序崩溃后自动重启
        },
        {
          //第二个应用实例
        } 
      ]
    };
    

    3,启动

    pm2 start /path/to/ecosystem.config.js

    配置文件参考文章

    http://hk.javashuo.com/article/p-aunagdgo-gt.html

    https://blog.csdn.net/z591102/article/details/124005345

     

     

    官网:https://github.com/Unitech/pm2

    http://pm2.keymetrics.io/docs/usage/process-management/

    中文翻译:https://www.douban.com/note/314200231/

     

  • node.js将html字符实体编码转化成可识别的简体中文汉字

    node.js html 实体 编码 转化 汉字 中文

    如果在node.js后台输出的内容是:

      £€

    其实这些不是乱码,只是html实体编号

    了解html字符实体:可以参考 https://sdeno.com/?p=5463

    把html字符实体转化成中文可以使用如下代码(适用于node.js服务器端):

    function htmlDecode(str) { 
     // 一般可以先转换为标准 unicode 格式(有需要就添加:当返回的数据呈现太多\\\u 之类的时)
     str = unescape(str.replace(/\\u/g, "%u"));
     // 再对实体符进行转义
     // 有 x 则表示是16进制,$1 就是匹配是否有 x,$2 就是匹配出的第二个括号捕获到的内容,将 $2 以对应进制表示转换
     str = str.replace(/&#(x)?(\w+);/g, function($, $1, $2) {
     return String.fromCharCode(parseInt($2, $1? 16: 10));
     });
    
     return str;
    }

    以上代码是服务器端,如果想运用在客户端上的可以参考:《javascript实现unicode与ASCII相互转换的方法

     

    http://www.cnblogs.com/zichi/p/5135636.html

  • HTML 字符实体

    HTML 字符集

    如需正确地显示 HTML 页面,浏览器必须知道使用何种字符集。

    万维网早期使用的字符集是 ASCII。ASCII 支持 0-9 的数字,大写和小写英文字母表,以及一些特殊字符。

    完整的 ASCII 参考手册

    由于很多国家使用的字符并不属于 ASCII,现代浏览器的默认字符集是 ISO-8859-1。

    完整的 ISO-8859-1 参考手册

    如果网页使用不同于 ISO-8859-1 的字符集,就应该在 <meta> 标签进行指定。

    ISO 字符集

    ISO 字符集是国际标准组织 (ISO) 针对不同的字母表/语言定义的标准字符集。

    下面列出了世界各地使用的不同字符集:

    字符集 描述 使用范围
    ISO-8859-1 Latin alphabet part 1 北美、西欧、拉丁美洲、加勒比海、加拿大、非洲
    ISO-8859-2 Latin alphabet part 2 东欧
    ISO-8859-3 Latin alphabet part 3 SE Europe、世界语、其他杂项
    ISO-8859-4 Latin alphabet part 4 斯堪的纳维亚/波罗的海(以及其他没有包括在 ISO-8859-1 中的部分)
    ISO-8859-5 Latin/Cyrillic part 5 使用古代斯拉夫语字母表的语言,比如保加利亚语、白俄罗斯文、俄罗斯语、马其顿语
    ISO-8859-6 Latin/Arabic part 6 使用阿拉伯字母的语言
    ISO-8859-7 Latin/Greek part 7 现代希腊语,以及有希腊语衍生的数学符号
    ISO-8859-8 Latin/Hebrew part 8 使用希伯来语的语言
    ISO-8859-9 Latin 5 part 9 土耳其语
    ISO-8859-10 Latin 6 拉普兰语、日耳曼语、爱斯基摩北欧语
    ISO-8859-15 Latin 9 (aka Latin 0) 与 ISO 8859-1 类似,欧元符号和其他一些字符取代了一些较少使用的符号
    ISO-2022-JP Latin/Japanese part 1 日本语
    ISO-2022-JP-2 Latin/Japanese part 2 日本语
    ISO-2022-KR Latin/Korean part 1 韩语

    Unicode 标准

    由于上面列出的字符集都有容量限制,而且不兼容多语言环境,Unicode 联盟开发了 Unicode 标准。

    Unicode 标准涵盖了世界上的所有字符、标点和符号。

    不论是何种平台、程序或语言,Unicode 都能够进行文本数据的处理、存储和交换。

    Unicode 联盟

    Unicode 联盟开发了 Unicode 标准。他们的目标是用标准的 Unicode 转换格式 (UTF) 来取代现有的字符集。

    Unicode 标准已经获得了成功,在 XML、Java、ECMAScript (JavaScript)、LDAP、CORBA 3.0、WML 中,Unicode 已经得到了实现。在许多操作系统以及所有的现代浏览器中,Unicode 同样得到了支持。

    Unicode 联盟与领导性的标准发展组织进行合作,比如 ISO、W3C 以及 ECMA。

    Unicode 可以被不同的字符集兼容。最常用的编码方式是 UTF-8 和 UTF-16:

    UTF-8
    UTF8 中的字符可以是 1-4 个字节长。UTF-8 可以表示 Unicode 标准中的任意字符。UTF-8 向后兼容 ASCII。UTF-8 是网页和电子邮件的首选编码。
    UTF-16
    16 比特的 Unicode 转换格式是一种 Unicode 可变字符编码,能够对全部 Unicode 指令表进行编码。UTF-16 主要被用于操作系统和环境中,比如微软的 Windows 2000/XP/2003/Vista/CE 以及 Java 和 .NET 字节代码环境。

    提示:最前面的 256 个 Unicode 字符集字符对应于 256 个 ISO-8859-1 字符。

    提示:所有 HTML 4 处理器均已支持 UTF-8,而所有 XHTML 和 XML 处理器支持 UTF-8 和 UTF-16。

    http://www.w3school.com.cn/html/html_entities.asp

  • node.js支持多种数据库的ORM2操作—-sequelize.js

    在使用node.js中根据不同的数据库选择也要相应的选择不同的模块包来操作数据库,这样就要学习多种模块包的api。

    在node.js中有ORM2可以支持多种数据库,也就是说学会了ORM2的API,在切换不同数据库使用时,就没必要还要去下载与之对应的数据库模块包了。

    https://github.com/dresende/node-orm2

    ————————————————-

    还有一个类似的模块Sequelize.js

    npm install sequelize --save

     

    英文文档:

    https://sdeno.com/sequelizejs/en/v3/

  • javascript实现unicode与ASCII相互转换的方法

    html 中文 汉字 转化 实体编码

    //AsciiToUnicode("中国");
    UnicodeToAscii("测试");
    //ASCII 转换 Unicode
    
    function AsciiToUnicode(content) {
     result = '';
     for (var i=0; i<content.length; i++)
     result+='&#' + content.charCodeAt(i) + ';';
     alert("ASCII:"+content+"\nUnicode:"+result);
    }
    
    
    //Unicode 转换 ASCII
    function UnicodeToAscii(content) {
     var code = content.match(/&#(\d+);/g);
     result= '';
     for (var i=0; i<code.length; i++)
     result += String.fromCharCode(code[i].replace(/[&#;]/g, ''));
     alert("Unicode:"+content+"\nASCII:"+result);
    }

    http://www.jb51.net/article/76150.htm