linux创建了svn之后,在客户端新建了个项目文件夹,然后创建文件提交到svn之后,去linux上搜索不到该文件,百度上说linux的存储机制有关,需要在你想要存放的地方,checkout出你需要的文件,然后每次客户端提交的时候,同步更新下。
linux svn 安装
yum install subversion
配置
将文件创建在home下
cd /home
mkdir svn
svnadmin create /home/svn
ls svn
当前会显示如下文件:
conf db format hooks locks README.txt
其中,conf文件夹是存放配置文件的,需要配置一下
cd svn/conf
ls
显示如下信息
authz passwd svnserve.conf
说明:
authz 是权限控制文件
passwd 是帐号密码文件
svnserve.conf 是SVN服务配置文件
配置账号密码
[root@localhost conf]# vi passwd
[users]
test1=123456
test2=123456
配置权限
[root@localhost conf]# vi authz
[/]
liuxianan=rw
test1=r
test2=r
*=
配置svnserve.conf
[root@localhost conf]# vi svnserve.conf
打开下面的5个注释
anon-access = read #匿名用户可读
auth-access = write #授权用户可写
password-db = passwd #使用哪个文件作为账号文件
authz-db = authz #使用哪个文件作为权限文件
realm = /home/svn # 认证空间名,版本库所在目录
启动和停止
[root@localhost conf]# svnserve -d -r /home/svn(启动)
[root@localhost conf]#killall svnserve(停止)
上述启动命令中,-d表示守护进程, -r 表示在后台执行。停止还可以采用杀死进程的方式:
客户端连接
这里使用TortoiseSVN,输入地址svn://你的IP 即可,不出意外输入用户名和密码就能连接成功了。
默认端口3690,如果你修改了端口,那么要记得加上端口号。
相关连接:
pm2常用命令
$ pm2 start app.js # 启动app.js应用程序
$ pm2 start app.js -i 4 # cluster mode 模式启动4个app.js的应用实例
# 4个应用程序会自动进行负载均衡
$ pm2 start app.js --name="api" # 启动应用程序并命名为 "api"
$ pm2 start app.js --watch # 当文件变化时自动重启应用
$ pm2 start script.sh # 启动 bash 脚本
$ pm2 list # 列表 PM2 启动的所有的应用程序
$ pm2 monit # 显示每个应用程序的CPU和内存占用情况
$ pm2 show [app-name] # 显示应用程序的所有信息
$ pm2 logs # 显示所有应用程序的日志
$ pm2 logs [app-name] # 显示指定应用程序的日志
pm2 flush
$ pm2 stop all # 停止所有的应用程序
$ pm2 stop 0 # 停止 id为 0的指定应用程序
$ pm2 restart all # 重启所有应用
$ pm2 reload all # 重启 cluster mode下的所有应用
$ pm2 gracefulReload all # Graceful reload all apps in cluster mode
$ pm2 delete all # 关闭并删除所有应用
$ pm2 delete 0 # 删除指定应用 id 0
$ pm2 scale api 10 # 把名字叫api的应用扩展到10个实例
$ pm2 reset [app-name] # 重置重启数量
$ pm2 startup # 创建开机自启动命令
$ pm2 save # 保存当前应用列表
$ pm2 resurrect # 重新加载保存的应用列表
$ pm2 update # Save processes, kill PM2 and restore processes
$ pm2 generate # Generate a sample json configuration file
pm2 start app.js --node-args="--max-old-space-size=1024"
svn自动更新设置
客户端提交的代码每次都要到指定目录更新一下才可以,比较麻烦,可以设置自动更新
进入svn钩子目录 hooks
cd /home/svn/hooks/
cp post-commit.tmpl post-commit (复制这份模板文件,因为svn将要执行的是post-commit文件)
vi post-commit
将文件最后几行注释掉
REPOS="$1"
REV=“REPOS” “$REV” /path/to/mailer.conf
然后加上自己将要执行的同步的命令
#!/bin/sh
export LANG=zh_CN.UTF-8 #(这句话比较重要,如果客户端跟服务器编码不一样会出现同步失败)
SVN_PATH=/usr/bin/svn #代表你的svn服务文件地址 如果是通过yum安装的话,或者已经注册了svn服务,此处不需要更改
WEB_PATH=/home/www/btserve #你的web目录(将要同步过去的web项目路径)
LOG_PATH=/tmp/svn_update.log #同步日志
echo `whoami`,$REPOS,$REV >> $LOG_PATH
$SVN_PATH update --username admin --password 123456 $WEB_PATH --no-auth-cache >> $LOG_PATH
wq!保存退出,此时已经完成更新命令
另外执行设置post-commit文件可以执行权限
chmod a+x post-commit (或者chmod 755 post-commit)
提交了几次测试了下,能正常更新了,只是每次提交之后,pm2管理的node服务每次也需要重启下
借鉴地址:
之前没仔细看文档,pm2支持自动重启,svn提交代码之后,客户端访问即时生效
pm2 start ./bin/www --watch ( 当文件变化时自动重启应用)
使用morgan写入日志
express默认导入了morgan,直接使用即可
var logger = require('morgan');
var accessLog = fs.createWriteStream('./logs/access.log', {flags : 'a'});
app.use(logger('dev')); //打印到控制台
app.use(logger('combined', {stream : accessLog})); //写入到log日志
会自动把请求的日志都打印到指定的文件中 初期可以不对日志进行分割 日志分割就创建当天的文件 写入即可
使用pm2查看日志记录
pm2自带了日志收集功能 通过
pm2 list # 找到要查看的项目
pm2 describe 0 # 查看详情
找到目录存放的位置就可以查看日志记录和错误日志了
我的目录在这个位置
/root/.pm2/logs/www-error.log www-out.log
通过tail -f 实时查看日志记录
在客户端新建人员之后返回列表 总是报错 网络连接失败 接口请求不到 而单独请求接口则不会出现任何问题,pm2 logs也一直出现重启报错现象 报错bin/www不是一个module
原因是因为前面使用morgan写入日志,用pm2启动项目,添加了–watch,这样每次调接口都会向项目中添加数据,而pm2检测到文件改动,就会执行restart重启命令,在重启的时候第二个接口又请求进来了,所以这时候就会出现请求接口失败的现象,解决方法是pm2 --watch的时候忽略掉这个日志文件 pm2 启动使用如下命令:
pm2 start npm --watch -- run start
pm2 start npm --watch --name btserver -- run start // 使用别名
pm2 start npm --watch --ignore-watch="logs" -- run start 忽略日志
通过配置文件启动项目,在项目中实现
1.将以下PM2配置文件于package.json放到一个根目录下
2.在package.json 的scripts里添加 “pm2”: "pm2 start pm2.json"这一段代码这样我们就可以使用 npm run pm2来启动我们的Node项目
配置文件详情:
{
"apps": {
"name": "wuwu", // 项目名
"script": "./bin/www", // 执行文件
"cwd": "./", // 根目录
"args": "", // 传递给脚本的参数
"interpreter": "", // 指定的脚本解释器
"interpreter_args": "", // 传递给解释器的参数
"watch": true, // 是否监听文件变动然后重启
"ignore_watch": [ // 不用监听的文件
"node_modules",
"logs"
],
"exec_mode": "cluster_mode", // 应用启动模式,支持fork和cluster模式
"instances": 4, // 应用启动实例个数,仅在cluster模式有效 默认为fork;或者 max
"max_memory_restart": 8, // 最大内存限制数,超出自动重启
"error_file": "./logs/app-err.log", // 错误日志文件
"out_file": "./logs/app-out.log", // 正常日志文件
"merge_logs": true, // 设置追加日志而不是新建日志
"log_date_format": "YYYY-MM-DD HH:mm:ss", // 指定日志文件的时间格式
"min_uptime": "60s", // 应用运行少于时间被认为是异常启动
"max_restarts": 30, // 最大异常重启次数,即小于min_uptime运行时间重启次数;
"autorestart": true, // 默认为true, 发生异常的情况下自动重启
"cron_restart": "", // crontab时间格式重启应用,目前只支持cluster模式;
"restart_delay": "60s" // 异常重启情况下,延时重启时间
"env": {
"NODE_ENV": "production", // 环境参数,当前指定为生产环境 process.env.NODE_ENV
"REMOTE_ADDR": "爱上大声地" // process.env.REMOTE_ADDR
},
"env_dev": {
"NODE_ENV": "development", // 环境参数,当前指定为开发环境 pm2 start app.js --env_dev
"REMOTE_ADDR": ""
},
"env_test": { // 环境参数,当前指定为测试环境 pm2 start app.js --env_test
"NODE_ENV": "test",
"REMOTE_ADDR": ""
}
}
}