邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

thinkphp的nginx重写兼容配置
 if (!-e $request_filename) {
 rewrite ^/index.php(.*)$ /index.php?s=$1 last;
 rewrite ^(.*)$ /index.php?s=$1 last;
 break;
 }
mongodb复制集学习笔记
conf.conf 如下

bind_ip=192.168.1.100
 port = 28001

 logpath=/usr/local/mongodb/logs/28001
 logappend=true
 dbpath=/usr/local/mongodb/datas/28001
 replSet=imooc

 fork = true

查看当前复制集状态
rs.status()
或者
use admin;
db.adminCommand({replSetGetStatus:1})

查看当前复制集配置文件
rs.conf()

show log rs  #查看当前mongodb的日志

rs.stepDown(50) ## 把当前主节点50秒内降级为从节点

rs.isMaster()  # 查看节点信息

/usr/local/mongodb/bin/mongo 10.51.105.19:28001/admin
//建立配置
config={_id:"imooc",members:[{_id:0,host:"10.51.105.19:28001"}, {_id:1,host:"10.51.105.19:28002"},{_id:2,host:"10.51.105.19:28003"}]}
//配置仲裁节点
config.members[2]={"_id":2,"host":"10.51.105.19:28003","arbiterOnly":true}
//使配置文件生效,初始化
rs.initiate(config)  ### rs.reconfig(config) 重新加载配置文件

测试同步
主节点上
use study
imooc:PRIMARY> db.test.insert({"name":"xd"})
子节点上
imooc:SECONDARY> rs.slaveOk(1)
imooc:SECONDARY> use study
imooc:SECONDARY> db.test.find()

复制集配置文件参数

_id: 整数0
host:字符串 “127.0.0.1:27017“
arbiterOnly: 布尔值 true
priority:整数 0|1   该节点的优先级,如果设置为0,则永远不会升级为主节点
hidden:布尔值 true|false 或者 1|0 ,如果设置为false, 优先级 要设置为0,隐藏节点
votes:整数  0|1  具有投票
slaveDelay 整数 slaveDelay 3600  延迟节点 延迟多少秒进行复制
buildIndexes 布尔值  true|false 或者 1|0  主节点建立索引,子节点是否同步,如果设为false, 优先级 应设置为0

关于oplog
Oplog大小及意义
默认大小
     64位操作系统linux,windows为当前分区可用空间的5%,体积不会超过50G

imooc:PRIMARY> use local
imooc:PRIMARY> db.oplog.rs.status()
imooc:PRIMARY> db.oplog.rs.find().sort({$natural:-1}).limit(1).pretty()  //查看最近的一条数据,pretty()格式化输出

单节点启动复制后,如果要增加机器
rs.add({_id:1,host:" 10.51.105.19:28002"})

调整oplog大小
imooc:PRIMARY>rs.freeze(100)
imooc:PRIMARY>rs.stepDown(100)
然后退出kill掉这个进程,注释掉配置文件的  replSet=imooc,重新启动

>use local
>show table ## 可以看到    oplog.rs
> db.oplog.rs.find().sort({$natural:-1}).limit(1)
>db.temp.save( db.oplog.rs.find().sort({$natural:-1}).limit(1).next())
>db.oplog.rs.drop()
>db.createCollection("oplog.rs",{capped:true,size:1024 * 1024 * 1024 * 3})
>db.oplog.rs.save(db.temp.findOne())

步骤总结
1.将成员以单机模式启动
2.将oplog最新的一条记录保存到临时表中   db.temp.save( db.oplog.rs.find().sort({$natural:-1}).limit(1).next())

3.删除原来的oplog.rs集合
4.以创建封顶表的形式创建oplog.rs , db.createCollection("oplog.rs",{capped:true,size:1024 * 1024 * 1024 * 3})

5.将之前保存的原oplog中的最新操作插入到新的oplog.rs集合中   db.oplog.rs.save(db.temp.findOne())

6.将单节点模式的节点返回到复制集中

复制集状态查看
rs.status()  复制集状态查询
rs.printReplicationInfo() 查看oplog状态
rs.printSlaveReplicationInfo() 查看复制延迟
db.serverStatus() 查看状态详情

mongodb 监控工具
1.mongostat
     mongostat 常用选项
          --host      主机名,或者 主机名:端口

          --port     端口
         --username 用户(验证)
          --password 密码(验证)
          --authenticationDatabase 从哪个数据库进行验证
          --discover 发现集群其他节点
     重点关注字段
     getmore 大量的排序操作在进行
     faults 需要的数据不在内存中
     locked db 锁比例最高的库
     index miss 索引未命中
     qr|qw读写产生队列,供求失衡
2.mongotop 监控当前集合读写统计信息
           --host     主机名,或者 主机名:端口
          --port     端口
         --username 用户(验证)
          --password 密码(验证)
          --authenticationDatabase 从哪个数据库进行验证

安全篇
     开启认证
          auth 单点  auth=true
          keyfile  集群之前认证

    集群认证

          keyfile文件的生成(内容base64编码集[a-zA-Z+/],长度1000字节,权限chmod 600 keyFile)
          openssl rand -base64 102  > .keyFile
          调整权限
          chmod 600  .keyFile
          开启认证需要在配置文件中增加
          setParameter=enableLocalhostAuthBypass=1  ## 本地例外,mongo localhost:28001
           keyFile=/usr/local/mongodb/.keyFile


     创建用户(创建第一个用户role要为root,db为admin)
          db.createUser(
          {
               user:'action',#字符串
               pwd:'123',#字符串
               roles:[{role:'root',db:'admin'}] #数组+对象,
          })
          创建用户后,然后登录客户端
          use admin
          db.auth('admin','123')

      删除用户
          db.dropUser(<username>)  ###删除某个用户
          db.dropAllUsers() ###删除当前库的所有用户

     权限
          built-in roles
                 读写
                    read  readWrite
                  管理员
                    dbAdmin dbOwner userAdmin  clusterAdmin clusterManager clusterMonitor hostManager
                  备份
                    backup  restore
                   全局
                    readAnyDatabase readWriteAnyDatabase userAdminAnyDatabase dbAdminAnyDatabase
                    超级用户
                    root
             自定义角色
                   use admin
                    db.createRole(
                    {
                         role:<role_name>,
                         privileges:[
                             {resource:{db:<db_name>,collection:<coll_name>},actions:[<action_name>]}
                         ],
                         roles:[{role:<role_name>,db:<db_name>}]
                    })

                    db.runCommand({userInfo:'admin',showPrivileges:1})  ##查看权限详情


          修改用户名密码
          需要具备 changePassword changeOwnPassword
          db.changeUserPassword(<user_name>,<new_password>)
          db.updateUser(<user_name>,{update_object})

          权限伸缩
               如何增加权限
               db.grantRolesToUser(
                    <user_name>,
                    [{role:<role_name>,db:<db_name>}]
               )
               如何收缩权限
               db.revokeRolesFromUser(
                    <user_name>,
                    [{role:<role_name>,db:<db_name>}]
               )
mac下ssh登录记录账号

vim ~/.ssh/config
Host action1  # 别名
HostName 123.57.204.35  # 主机名
Port 22 # 端口
User root # 用户名
#IdentityFile ~/.ssh/id_rsa  # 密钥文件的路径  
Host action2
HostName 59.110.218.33
Port 22
User root


要是想要免密登录,可以参考
http://xingdong365.com/network/280.html


linux下自制证书
cd /etc/pki/tls/certs
make action.key //期间会让你输入密码

mv action.key action.key.raw
openssl rsa -in action.key.raw -out action.key   //期间会让你输入刚刚的密码,此步骤是将刚建立的文件的密码取消掉

rm -f action.key.raw
chmod 400 action.key  //权限400

make action.crt SERIAL=20170820  //建立所需要的最终证书文件,期间会让你输入证书的信息
ll action* //查看

笔记来源:linux鸟哥的私房菜 服务器架设篇 -www服务器


linux下logrotate配置参数说明
参数 功能
monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,轮循不会进行。
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~ 
size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).

vim /etc/logrotate.d/nginx
/data/wwwlogs/*nginx.log {
  daily
  rotate 5
  missingok
  dateext
  compress
  notifempty
  sharedscripts
  postrotate
    [ -e /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
  endscript
}
某公司给的测试题目201708018

演员的技能用字母A-Z表示,某活动需要演员按顺序完成任务,完成得最多的,可获得奖励。由于演员多才多艺,提前告知任务顺序,很容易完成任务。现在让演员随意表演,最后公布活动任务最长匹配度。如一个演员表演顺序 ABCBDAB,最后活动顺序为BDCABA,那么最大匹配度值为4(匹配值为BCBA或者BDAB)。现在编写程序实现以上功能:

<?php
	
	$a = 'ABCBDAB';
	$b = 'BDCABA';

	$aStrlen = strlen($a);
	$bStrlen = strlen($b);

	$maxCount = 0;

	for ($i=0; $i < $aStrlen; $i++) { 
		$ch = $a[$i];
		$aIdx = $i;
		$bIdx = 0;
		$count = 0;
		$next = false;
		for ($j=$bIdx;$j<$bStrlen; $j++) {
			if($ch == $b[$j]){
				$count++;
				$bIdx = $j;
				$next = true;
			}
			if($j == $bStrlen-1 && $count != 0 && $aIdx < $aStrlen){
				$j = $bIdx;
				$next = true;
			}
			if($next){
				if(++$aIdx == $aStrlen){
					break;
				}
				$next = false;
				$ch = $a[$aIdx];
			}
		}
		if($count > $maxCount){
			$maxCount = $count;

		}

		//假如最大次数大于剩余要比较的字符串,则break
		if($maxCount >= $aStrlen-$i){
			break;
		}
	}


	echo $maxCount;

php利用二叉堆算法来实现 TopK

利用二叉堆算法来实现 TopK
实现流程是:
1、先读取10个或100个数到数组里面,这就是我们的topK数.
2、调用生成小顶堆函数,把这个数组生成一个小顶堆结构,这个时候堆顶一定是最小的.
3、从文件或者数组依次遍历剩余的所有数.
4、每遍历出来一个则跟堆顶的元素进行大小比较,如果小于堆顶元素则抛弃,如果大于堆顶元素则替换之.
5、跟堆顶元素替换完毕之后,在调用生成小顶堆函数继续生成小顶堆,因为需要再找出来一个最小的.
6、重复以上4~5步骤,这样当全部遍历完毕之后,我们这个小顶堆里面的就是最大的topK,因为我们的小顶堆永远都是排除最小的留下最大的,而且这个调整小顶堆速度也很快,只是相对调整下,只要保证根节点小于左右节点就可以.
7、算法复杂度的话按top10最坏的情况下,就是每遍历一个数,如果跟堆顶进行替换,需要调整10次的情况,也要比排序速度快,而且也不是把所有的内容全部读入内存,可以理解成就是一次线性遍历.


<?php
	//为了测试运行内存调大一点
	ini_set('memory_limit', '2024M');
	//生成小顶堆函数
	function Heap(&$arr,$idx){
	    $left  = ($idx << 1) + 1;
	    $right = ($idx << 1) + 2;

	    if (!isset($arr[$left])){
	        return;
	    }
	    if(isset($arr[$right]) && $arr[$right] < $arr[$left]){
	        $l = $right;
	    }else{
	        $l = $left;
	    }

	    if ($arr[$idx] > $arr[$l]){
	         $tmp = $arr[$idx]; 
	         $arr[$idx] = $arr[$l];
	         $arr[$l] = $tmp;
	         Heap($arr,$l);
	    }
	}

	/*
	  当然这个数据集并不一定全放在内存,也可以在
	  文件里面,因为我们并不是全部加载到内存去进
	  行排序
	*/
	for($i=0;$i<500000;$i++){
	    $numArr[] = $i;    
	}
	//打乱它们
	shuffle($numArr);
	//先取出10个到数组
	$topArr = array_slice($numArr,0,10);
	//获取最后一个有子节点的索引位置
	//因为在构造小顶堆的时候是从最后一个有左或右节点的位置
	//开始从下往上不断的进行移动构造(具体可看上面的图去理解)
	$idx = floor(count($topArr) / 2) - 1;
	//生成小顶堆
	for($i=$idx;$i>=0;$i--){
	    Heap($topArr,$i);
	}

	echo time()."<hr/>";
	//这里可以看到,就是开始遍历剩下的所有元素
	for($i = count($topArr); $i < count($numArr); $i++){
	    //每遍历一个则跟堆顶元素进行比较大小
	    if ($numArr[$i] > $topArr[0]){
	        //如果大于堆顶元素则替换
	        $topArr[0] = $numArr[$i];
	        /*
	          重新调用生成小顶堆函数进行维护,只不过这次是从堆顶
	          的索引位置开始自上往下进行维护,因为我们只是把堆顶
	          的元素给替换掉了而其余的还是按照根节点小于左右节点
	          的顺序摆放这也就是我们上面说的,只是相对调整下,并
	          不是全部调整一遍
	        */
	        Heap($topArr,0);
	    }
	}
	echo "<hr/>";
	var_dump($topArr);
	echo "<hr/>".time()."<hr>";


源文链接:简书  http://www.jianshu.com/p/df71c71cdc57 

DNS(Domain Name System)服务器相关的几个命令

DNS(Domain Name System)服务器相关的几个命令

host 
example:
host www.baonisheng.cn
host -a www.baonisheng.cn
nslookup
example:
nslookup www.baonisheng.cn
dig
example:
dig www.baonisheng.cn
dig -x 123.57.204.35 //查询反解信息
whois
example:
whois baonisheng.cn //查询域名注册信息

优惠券
最新微语