0%

2015年已过去大半,总觉得该写些什么,想想写写,时间不能白溜走。今年感觉,技术有了很大的提升,
从改进app到独立开发app[hybrid],再到新技术探索,独立承担整个平台架构开发,之间走了很多的弯路,
碰了很多的钉子,但走过大半,真的觉得学会了好多。但是越往深学,越往广学,就越发觉得自己仍旧是个小白,
这种滋味真的是不禁让人蛋疼不已,但又需要承认,无论哪个行业不都是如此嘛。
这种傻傻的努力,让我在上半年的工作中一直处于高压,高强度的码字状态,至今日,我突然觉得能力真的有了
提高,就跟射雕英雄传里的傻靖哥哥一样,还真就会了几招功夫,所以说功夫不负有心人,这句话真对的。
当然上半年碰到的壁垒,也让我吸取了一定的教训,年轻赋予我们这些菜鸟的是冲劲儿,干劲儿,但同时也是没经验,
考虑问题狭隘。这点在做大项目,新项目的时候,让我懊悔不已,但是也是让我大幅提高的试金石。
总之,路漫漫,我还需要继续努力,想的多,想不明白,那就先别想,先把手头工作做好。


贴句特别喜欢的话,作为年中勉励之词
技术和工具永远只是实现想法的手段,工具可能会被更好的工具替代,但思考本身却需要自己不断地更新完善。

原英文仓库网址,点击这里

PM2 是一个node应用下,自带服务均衡的产品级进程管理器。使得能够保证应用一直处于运行状态,并且能够不间断的重启服务,方便管理这些系统任务。
生产模式下启动一个应用是很容易的,就像这样:
$ pm2 start app.js
PM2支持在Linux(稳定) & MacOSx (稳定) & Windows (稳定)工作.

安装PM2

$ npm install pm2 -g
npm命令是在你安装node时,自带的CLI - 通过NVM安装node

更新PM2

1
2
3
4
5
# 安装最新版PM2
$ npm install pm2 -g
# 保存进程列表,退出旧的PM2,重新存储所有的进行
$ pm2 update

PM2是无缝更新。

主要功能

命令表一览

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 常用
$ npm install pm2 -g # 安装PM2
$ pm2 start app.js # 启动应用,一旦应用出故障,自动重启(Node)
$ pm2 start app.py # (Python)
$ pm2 start npm -- start #

# 集群模式 (Node.js only)
$ pm2 start app.js -i 4 # 集群模式,启动4个应用实例
# 根据网络请求进行负载平衡
$ pm2 reload all # 无间断重启
$ pm2 scale [app-name] 10 # 将集群APP进程数调到10

# 进程检测
$ pm2 list # 列出所有以PM2形式启动的应用
$ pm2 monit # 列出每个应用内存及CPU使用情况
$ pm2 show [app-name] # 列出关于应用的所有信息

# 日志管理
$ pm2 logs # 列出所有应用日志
$ pm2 logs [app-name] # 列出指定应用的日志
$ pm2 logs --json # 以JSON格式列出日志
$ pm2 flush
$ pm2 reloadLogs

# 进程状态管理
$ pm2 start app.js --name="api" # 启动应用,并命名为api
$ pm2 start app.js -- -a 34 # 启动应用,并传参 "-a 34"
$ pm2 start app.js --watch # 一单文件修改,重启应用
$ pm2 start script.sh # 启动bash脚本
$ pm2 start app.json # 启动app.json文件中声明的所有应用
$ pm2 reset [app-name] # 重置应用计数器即重启次数
$ pm2 stop all # 停止所有的应用
$ pm2 stop 0 # 停止id为0的应用
$ pm2 restart all # 重启所有应用
$ pm2 gracefulReload all # 集群模式下重启所有应用
$ pm2 delete all # 停止且删除所有应用
$ pm2 delete 0 # 停止且删除id为0的应用

# 启动管理
$ pm2 startup [platform] # 监听初始化系统,生成且配置PM2启动脚本
$ pm2 save # 存储当前进程列表
$ pm2 resurrect # 重新存储之前存储的进程
$ pm2 unstartup # 停用并删除启动程序

$ pm2 update # 存储进程,中止并重新存储进程
$ pm2 generate # 生成一个JSON格式样例配置文件

# 部署
$ pm2 deploy app.json prod setup #
$ pm2 deploy app.json prod #
$ pm2 deploy app.json prod revert 2 #

# 模块系统
$ pm2 module:generate [name] # 生成name名称的样例模块
$ pm2 install pm2-logrotate # 安装模块(会有一个日志系统)
$ pm2 uninstall pm2-logrotate # 模块卸载
$ pm2 publish

进程管理

一旦应用启动,你可以很方便的列出和管理

列出所有运行中的进程
$ pm2 list
直接管理你的进程

1
2
3
$ pm2 stop     <app_name|id|'all'|json_conf>
$ pm2 restart <app_name|id|'all'|json_conf>
$ pm2 delete <app_name|id|'all'|json_conf>

负载均衡和不间断重启

当应用启动时加上了-i <instance_option>选项时,集群模式便开启了。
集群模式下,应用汇自动的平衡请求,这个模式下也允许你能够依据CPU的数目灵活的提升表现。
被所有NODE主流框架和任何NODE应用支持而不需要任何code改变。

主要命令

1
2
3
4
5
6
$ pm2 start app.js -i max  # Enable load-balancer and start 'max' instances (cpu nb)

$ pm2 reload all # Zero second dowtime reload

$ pm2 scale <app_name> <instance_number> # Increase / Decrease process number

更多信息关于如何在PM2下使用集群化

日志能力

显示特定进程或者所有进程,实时,标准,真实,JSON和格式化输出

$ pm2 logs ['all'|app_name|app_id] [--json] [--format] [--raw]

例子:

1
2
3
4
5
6
7
$ pm2 logs APP-NAME       # Display APP-NAME logs
$ pm2 logs --json # JSON output
$ pm2 logs --format # Formated output

$ pm2 flush # Flush all logs
$ pm2 reloadLogs # Reload all logs

启动脚本生成

PM2能够生成并配置启动脚本,从而使PM2和你的进程能够在每次服务器重启时保持运行状态。
支持初始化系统包括:systemd (Ubuntu 16, CentOS, Arch), upstart (Ubuntu 14/12), launchd (MacOSx, Darwin), rc.d (FreeBSD).

1
2
3
4
5
6
7
8
9
# Auto detect init system + generate and setup PM2 boot at server startup
$ pm2 startup

# Manually specify the startup system
# Can be: systemd, upstart, launchd, rcd
$ pm2 startup [platform]

# Disable and remove PM2 boot at server startup
$ pm2 unstartup

在重启时保存进程列表
$ pm2 save
更多关于启动脚本

模块系统

PM2内嵌了简单而强大的模块系统,安装一个模块是很简单直接的事。
$ pm2 install <module_name>
下面是一些兼容模块 (standalone Node.js applications managed by PM2):

pm2-logrotate auto rotate logs of PM2 and applications managed
pm2-webshell expose a fully capable terminal in browsers
pm2-server-monit monitor your server health

写你自己的模块

Keymetrics监测

如果你使用PM2来管理你的NodeJS app,Keymetrics使得通过服务器去监测应用变得很容易。
谢谢,希望你喜欢PM2!

更多关于PM2的资料

更新日志

CHANGELOG

贡献者

贡献者

常见问题

以下问题为官方文档没有明确指出,但是在实际使用中却会遇到的问题,这里说明下。

为什么有时候执行pm2 list不显示appid等信息

其实这个主要看终端窗体大小,如下图

pm2 list

你会看到两次执行,出来的窗体显示信息不同,实际原因是第一次执行时候,我的终端窗体很窄,拉大后再执行命令就显示下部的样子,所以想显示完整的应用信息,需要确保终端窗体大一些。

如何重启、关闭等多个应用

比如我们有appid为0、1两个应用,除了单个或全部方式操作外,其实pm2支持多个,操作方式如下
pm2 start 0 1,这样就会启动id为0和1两个应用,stop、restart等操作等同。

pm2应用日志有必要吗

一般而言,pm2管理的应用本身都有自己日志系统,比如我开发node应用一般会使用log4js,所以pm2没必要输出需要禁用

pm2启动后,环境变量未定义

最近web有需要调用环境变量的地方,发现当node启动时,环境变量获取OK,但pm2启动报未定义。

解决办法加参数--env production

最近在部署Web站点,用到了nginx,这里记录主要相关操作及配置。
来句概括的话,nginx是一个高性能的http与反向代理服务器,具体nginx了解请看官网维基百科,了解下,

相关命令

1
2
3
4
5
6
7
8
9
10
11
12
13
# yum方式安装nginx
$ yum -y install nginx

# 启动nginx服务
$ nginx

# 重载nginx配置
$ nginx -s reload

# 停止nginx服务
$ nginx -s stop


相关配置

gzip

Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,减小通过网络传输的数据量,提高浏览的速度。

下面贴出在nginx.conf配置文件中配置gzip的基本信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Gzip
# 开启gzip
gzip on;
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;

# gzip 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
gzip_comp_level 2;

# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;

# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";

关于前端静态资源的gzip,我们也可以采取预压缩方案,这样子,对于用户请求,能够更快的服务,提升性能,比如webpack就可以再打包前端静态资源的时候,生成gz文件。
这里贴出静态gzip配置项。

1
2
gzip_static on;

  • 反向代理
1
2
3
4
5
6
7
8
9
10
11
12
#定义一个服务器,监听80端口,配置的域名是www.1991421.cn
server{
listen 80;
# using www domain to access the main website
server_name www.1991421.cn;
access_log /var/log/nginx/www.log

location / {
root /usr/www/website_root;
}
}

HTTP强转HTTPS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name blog.alanhe.me;

return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;

ssl on;
ssl_certificate "/etc/nginx/ssl/blog.alanhe.me/fullchain.cer";
ssl_certificate_key "/etc/nginx/ssl/blog.alanhe.me/blog.alanhe.me.key";

...
}

client_max_body_size

如果报413 (Request Entity Too Large) 错误,需要注意该配置,默认1MB

  1. 按需修改,如果不想限制,改为0即可。
  2. client_max_body_size可以放在server或者location下。
1
2
3
4
5
location / {

client_max_body_size 0;

}

/usr/share/nginx/html

静态资源推荐托管位置放在这里。

referrer白名单

1
2
3
4
valid_referers none *.1991421.cn 1991421.cn;
if ($invalid_referer) {
return 403;
}

相关文章

真正意义上的专属自己的第一个站点,以后在此博文上记录自己的点滴心得,我相信自己的记性,但我更相信笔头。踏雪有痕是我的口头禅之一。
2014年7月毕业,转眼已经两年,这两年里,我自问比一般的人努力些,因为性格使然,我往往倾向于比我优异的人去比,努力了两年,能力有了显著的提高,但是往往又都会遇见的新的问题,而我总之不满足于现状,所以一直在学,一直在做,也就不自觉成了奔跑的小强,当然我知道有更多的人比我更努力,做的更好,因为世界上总有少数优秀的人,正因为他们社会才一天天,更美好。
一直以来没有养成写作的习惯,真是惭愧至极,说没时间,鬼才相信,一个人倘若真的有想为之事,总是能挤出时间的,感谢之前两年来的技术积累,今天这个看似简单的建站,实则也是之前蜗牛式的努力的一个小果子,但我希望它更是一粒种子,伴随着我的进击之路,留下那千丝万缕的想法经验,留给自己,留给本就取自于的互联网。
我一直认为,优秀是一种习惯。
**码农世界很奇妙**。