pm2 用来守护进程,提供了管理、保护、监控、负载均衡等功能,用于管理你的node在线应用。下面是对应操作命令:
#安装说明
npm install pm2 -g
#linux 需添加软连接
ln -s node地址/bin/pm2 /user/local/bin/pm2
#启动node服务
pm2 start app.js
#查看所有pm2服务
pm2 list
#暂停
pm2 stop pm2对应的id
#暂停所有
pm2 stop all
#重启
pm2 restart pm2对应的id
#重启所有
pm2 restart all
#监控
pm2 monit
#查看日志
pm2 logs
#清空日志
pm2 flush
#关闭移除对应服务
pm2 delete pm2对应的id
pm2 delete all
#重载
pm2 reload all
#杀死进程
pm2 kill
pm2还可以通过配置process文件对应用服务做出更加明确的配置:
{
"apps": [
{
"name": "yjk-wechat-node",
"cwd": "/var/node",
"script": "app.js",
"log_date_format": "YYYY-MM-DD HH:mm Z",
"error_file": "log/error.log",
"out_file": "log/out.log",
"pid_file": "log/pid.log",
"instances": "2",
"min_uptime": "180s",
"max_restarts": 12,
"max_memory_restart": "500M",
"cron_restart": "1 0 * * *",
"watch": false,
"merge_logs": true,
"exec_interpreter": "node",
"exec_mode": "cluster",
"autorestart": true,
"vizion": true
}
]
}
说明:
- apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用
- name:应用程序名称
- cwd:应用程序所在的目录
- script:应用程序的脚本路径
- log_date_format:
- error_file:自定义应用程序的错误日志文件
- out_file:自定义应用程序日志文件
- pid_file:自定义应用程序的pid文件
- instances:负载均衡的实体个数,一般由你的服务器内核决定
- min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
- max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)
- cron_restart:定时启动,解决重启能解决的问题
- watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。
- merge_logs:
- exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs
- exec_mode:应用程序启动模式,这里设置的是cluster(集群),默认是fork
- autorestart:启用/禁用应用程序崩溃或退出时自动重启
- vizion:启用/禁用vizion特性(版本控制)
面对各种疑难杂症:
1.pm2 start 出现启动的服务eroor
先查看自己是否install
确保代码没有任何问题,那一般是开的实体太多,进程无法分配,直接 pm2 kill
nginx安装,我用的是ubuntu14,快捷安装:
apt-get update
apt-get install nginx
到/etc/nginx/下面,修改nginx.conf文件。
http {
#一些默认配置就不沾出来了
include /etc/nginx/conf.d/*.conf;
#include /etc/nginx/sites-enabled/*;注意这是屏蔽nginx的默认设置,其实你可以直接在这里做配置也行
server {
listen 80;
#node服务费配置,我本想将node服务重定向到其他目录的,但是没有成功,其实不配置这个也能用,直接访问公网的ip加端口号就行
location / {
proxy_pass http://172.19.159.149:3000; #代理地址
proxy_set_header X-Real-IP $remote_addr; #其中这个X-real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获取
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #我们先看看这里有个X-Forwarded-For变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,每次经过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址,由于他是非rfc标准,所以默认是没有的,需要强制添加,在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。也就是说在默认情况下我们使用request.getHeader("X-Forwarded-For")获取不到用户的ip,如果我们想要通过这个变量获得用户的ip
proxy_set_header Host $http_host; #这一行的作用是把原http请求的Header中的Host字段也放到转发的请求里。如果不加这一行的话,nginx转发的请求header里就不会有Host字段,而服务器是靠这个Host值来区分你请求的是哪个域名的资源的。
proxy_set_header X-Nginx-Proxy true;
proxy_redirect off;
}
#这是我的vue前端项目,做一下域名重定向,因为多个客户访问一个应用,在根据地址做个性化
location /cscvif {
root html;
proxy_pass http://172.19.159.149:8081/main;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m; #允许客户端请求的最大单文件字节数
index index.html index.htm;
}
#由于对vue项目做了域名重定向,原来的重定向就不能用了,所以对static文件单独做一个资源转发
location /yjkstatic {
proxy_pass http://172.19.159.149:8081/;
}
}
#通用vue前端项目配置
server {
listen 8081;
location / {
root /var/www/html/yjk-wechat-vuepro/dist;
try_files $uri $uri/ @router; #需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
index index.html index.htm;
}
#对应上面的@router,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件
#因此需要rewrite到index.html中,然后交给路由在处理请求资源
location @router {
rewrite ^.*$ /index.html last;
}
}
}
配置完然后启动nginx
#启动
service nginx start
#停止
service nginx stop
#重启
service nginx restart
#重载
service nginx reload
#判断nginx配置文件是否异常
nginx -t
日志处理:
PM2 模块自动轮换由 PM2 管理的进程日志。
pm2 install pm2-logrotate
3此数字是任何一次保留的轮换日志的数量,这意味着如果您保留几个日志(默认30)
pm2 set pm2-logrotate-ext:retain 3
设置每个日志的大小
pm2 set pm2-logrotate-ext:max_size 100M
引用