Ubuntu16.04 root用户登录没有声音的解决方法

分类:技术文档 - Linux | 阅读(1199) | 发布于:2017-11-30 13:03 | 标签: 声音

Ubuntu16.04 root用户登录没有声音的解决方法  

备注:
1)Ubuntu Desktop版本:16.04
2)Linux工作用户:root

1. 临时方法
在终端中执行命令:
pulseaudio --start --log-target=syslog

2. 永久方法
将上面的命令添加到用户启动脚本中:
pulseaudio --start --log-target=syslog

阅读更多...

PHP使用变量引用实现先使用后赋值

分类:技术文档 - PHP文档 | 阅读(1181) | 发布于:2017-07-11 17:26 | 标签:无

一般情况下,变量需要先赋值再使用,但是在一些另类的情形下,需要先使用后来赋值,
例如下面:
<?php
class test
{
	public function run()
	{
		
		//uid初始化
		$uid = 0;
		
		//uid使用
		$user = [];
		$user['detail'] = $this->get_user_detail($uid);
		$user['employment'] = $this->get_user_employment($uid);
		
		//uid赋值
		$uid = 123456;
		
		print_r($user);
	}
	
	private function get_user_detail(&$uid){
		return [
			'uid'=>&$uid,
			'name'=>'zhangsan',
			'sex'=>'male',
		];
	}
	
	private function get_user_employment(&$uid){
		return [
			'uid'=>&$uid,
			'company_name'=>'ggt',
			'tel'=>'010-87654321',
		];
	}

}

$test = new test();
$test -> run();
运行后显示:
Array
(
    [detail] => Array
        (
            [uid] => 123456
            [name] => zhangsan
            [sex] => male
        )

    [employment] => Array
        (
            [uid] => 123456
            [company_name] => ggt
            [tel] => 010-87654321
        )

)

阅读更多...

ubuntu14.04 ssh允许root用户远程登录

分类:技术文档 - Linux | 阅读(1324) | 发布于:2017-06-19 13:45 | 标签: ssh

1.修改 root 密码
sudo passwd root

2. 以其他账户登录,通过 sudo nano 修改 /etc/ssh/sshd_config :
su - root
vi /etc/ssh/sshd_config

3. 注释掉 #PermitRootLogin without-password,添加 PermitRootLogin yes
#PermitRootLogin without-password
PermitRootLogin yes

4. 重启 ssh  服务
service ssh restart

阅读更多...

HTTPS的工作原理

分类:技术文档 - PHP文档 | 阅读(2518) | 发布于:2017-05-18 10:18 | 标签: HTTPS

HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法。握手过程的简单描述如下:

1.浏览器将自己支持的一套加密规则发送给网站。

2.网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。

3.获得网站证书之后浏览器要做以下工作:

a) 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。

b) 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。

c) 使用约定好的HASH计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。

4.网站接收浏览器发来的数据之后要做以下的操作:

a) 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。

b) 使用密码加密一段握手消息,发送给浏览器。

5.浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。另外,HTTPS一般使用的加密与HASH算法如下:

非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DES
HASH算法:MD5,SHA1,SHA256

其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。由于浏览器生成的密码是整个数据加密的关键,因此在传输的时候使用了非对称加密算法对其加密。非对称加密算法会生成公钥和私钥,公钥只能用于加密数据,因此可以随意传输,而网站的私钥用于对数据进行解密,所以网站都会非常小心的保管自己的私钥,防止泄漏。

TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。正是由于HTTPS非常的安全,攻击者无法从中找到下手的地方,于是更多的是采用了假证书的手法来欺骗客户端,从而获取明文的信息,但是这些手段都可以被识别出来,我将在后续的文章进行讲述。

阅读更多...

nginx 视频直播/点播服务

分类:技术文档 - Linux | 阅读(3189) | 发布于:2017-04-19 17:04 | 标签: nginx 直播 点播 rtmp

近年互联网直播业务非常火热。工作之余也研究了下,发现nginx上配置视频直播点播也很容易实现,特分享如下。

一、ubuntu14.04安装nginx及nginx_rtmp_module扩展
nginx根据是否已安装和安装的方式不同,有一下三种方式安装及扩展安装。

1.全新安装nginx和nginx_rtmp_module扩展

#!/bin/sh

apt-get update
apt-get install -y gcc libpcre3 libpcre3-dev openssl libssl-dev make git libxml2 libxml2-dev libxslt-dev libgd2-xpm-dev geoip-database libgeoip-dev
cd /usr/local/src/
git clone https://github.com/arut/nginx-rtmp-module.git
wget -c  http://mirrors.sohu.com/nginx/nginx-1.9.14.tar.gz
tar zxvf nginx-1.9.14.tar.gz
cd nginx-1.9.14/
./configure --with-http_ssl_module --add-module=/usr/local/src/nginx-rtmp-module
make 
make install
cd /usr/local/nginx/
ln -s `pwd`/sbin/nginx /usr/sbin/nginx

nginx -V

wget http://www.lixiaocheng.com/editor/attached/file/20160322/20160322112243_43972.txt
mv 20160322112243_43972.txt /etc/init.d/nginx
chmod +x /etc/init.d/nginx
service nginx restart

2.apt-get安装过nginx的,需重新编译安装并添加nginx_rtmp_module扩展

#!/bin/sh
apt-get -y install dpkg-dev libxml2 libxml2-dev libxslt-dev libgd2-xpm-dev geoip-database libgeoip-dev libpcre3 libpcre3-dev libssl-dev  openssl 

nginx -V 2>a 
nginx_config=`cat a |grep configure | cut -d ':' -f 2`
nginx_version=`cat a|grep 'nginx version'|cut -d '/' -f 2 | cut -d ' ' -f 1`
rm -f a

cd /usr/local/src/

# apt-get install -y git
git clone https://github.com/arut/nginx-rtmp-module.git

#官网下载对应的nginx版本
# apt-get source nginx
wget -c "http://nginx.org/download/nginx-${nginx_version}.tar.gz"
tar zxvf "nginx-${nginx_version}.tar.gz"
cd "nginx-$nginx_version"
echo "./configure ${nginx_config} --add-module=/usr/local/src/nginx-rtmp-module" | sh
make

#强制覆盖
cp -rfp objs/nginx /usr/sbin/nginx
#检查是否错误
/usr/sbin/nginx -t
#重启nginx
service nginx restart
nginx -V

3.已经编译安装过nginx的,可以直接添加nginx_rtmp_module扩展

找到安装nginx的源码根目录,如果没有的话下载新的源码
我的安装源码根目录 /usr/local/src/nginx-1.4.6

cd /usr/local/src/
# apt-get install -y git
git clone https://github.com/arut/nginx-rtmp-module.git

nginx -V 2>a 
nginx_config=`cat a |grep configure | cut -d ':' -f 2`
rm -f a

cd nginx-1.4.6
echo "./configure ${nginx_config} --add-module=/usr/local/src/nginx-rtmp-module" | sh
make

#强制覆盖
cp -rfp objs/nginx /usr/sbin/nginx
#检查是否错误
/usr/sbin/nginx -t
#重启nginx
service nginx restart
nginx -V


二、配置使用

编辑nginx的配置文件(/etc/nginx/nginx.conf或/usr/local/nginx/conf/nginx.conf)
1.在http节点外层添加一个rtmp节点,具体内容如下:

rtmp {
	server {
		listen 1935;
		chunk_size 4096;
		max_connections 100;

		#音视频流上传和播放地址都是 rtmp://你的IP/live/streamName 
		#streamName自己是自定义的。
		application live {
			live on;
			record off;
		}

		#这个是上传地址 rtmp://你的IP:/hls/streamName2
		#直播的地址也是这个,点播播放地址在下面
		application hls {
			live on;
			hls on;
			#请先创建相应目录(mkdir -p /var/www/hls/ && chown -R www-data:www-data /var/www )
			hls_path /var/www/hls/;
		}
	}
}

说明:
application 表示一个应用
地址后面的streamName可以自己定义,点播时会在相应目录下生成类似 streamName.m3u8 和 streamName.ts 的文件。
live on; 表示打开直播。
hls on; 表示打开点播,会在服务器上生成临时文件的。
record off; 是关闭保存视频的功能。
点播播放的地址是一个http协议的数据流地址。例如下面配置的 http://你的IP:8080/hls/streamName2.m3u8 。
点播的文件默认是逐个生成的,又会逐个自动删除。m3u8文件是一个动态的。用vim可以查看。

2.在下面的http节点内部添加一个server节点,具体内容如下:

#这个是点播播放地址 http://你的IP:8080/hls/streamName2.m3u8
server {
		listen      8080;
		index index.html;
		root  /var/www/hls/;

		location /hls {
				alias /var/www/hls/;
				types {
						application/vnd.apple.mpegurl m3u8;
						video/mp2t ts;
				}
				add_header Cache-Control no-cache;
		}
}
说明:
这个节点是配置的一个虚拟主机,目的是为了播放上面点播服务生成的视频流。
url中streamName2是根据录制推流的名字来的。需要保持一致。

默认下,该地址有一定的时限行,需要每次都先确认一下,服务器上是否存在该m3u8文件。

3.测试使用

    a.推视频流到服务器

        (1).使用linux上ffmpeg工具模拟推流到服务器

        安装ffmpeg工具

apt-get -y install build-essential git-core checkinstall yasm texi2html libvorbis-dev libx11-dev libvpx-dev libxfixes-dev zlib1g-dev pkg-config netcat libncurses5-dev libfaac-dev  libmp3lame-dev libx264-dev

FFMPEG_VERSION=2.3.3

cd /usr/local/src
if [ ! -d "/usr/local/src/ffmpeg-${FFMPEG_VERSION}" ]; then
  sudo wget "http://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION}.tar.bz2"
  sudo tar -xjf "ffmpeg-${FFMPEG_VERSION}.tar.bz2"
fi

cd "ffmpeg-${FFMPEG_VERSION}"
./configure --enable-version3 --enable-postproc --enable-libvorbis --enable-libvpx --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libx264
make
checkinstall --pkgname=ffmpeg --pkgversion="5:${FFMPEG_VERSION}" --backup=no --deldoc=yes --default

ffmpeg –version

使用ffmpeg工具把本地的视频文件模拟推送到服务器

ffmpeg -re -i /data/localFile.mp4 -c copy -f flv rtmp://你的IP/live/streamName
这个命令会把本地的localFile.mp4模拟推入live直播流,然后可以通过 rtmp://你的IP/live/streamName地址观看该直播。
ffmpeg -re -i /data/localFile.mp4 -c copy -f flv /var/www/hls/streamName
这个命令会把本地的localFile.mp4模拟推入到hls应用中,然后可以通过rtmp://你的IP/hls/streamName 地址观看该直播,也可以通过播放器打开http://你的IP:8080/hls/streamName.m3u8查看该视频的点播

        (2).Windows上使用一些专业工具推流到服务器

我是使用 锐动PC录制/直播SDK(http://www.rdsdk.com/contrast/pc3.html)[非打广告]包中的demo来推流的,这个可以免费使用且免安装。
网上推荐的常见推流测试工具有 OBS, XSplit, FMLE 等。
推流的地址是 rtmp://你的IP/hls/streamName 或者 rtmp://你的IP/live/streamName

        (3).自己编写手机等设备的APP,录制手机摄像头捕捉到的头像及麦克风捕捉到的声音,一起推送到服务器。

这类安卓或IOS的SDK也比较多。可自行开发。

    b.使用播放器点播播放视频

Windows和linux桌面版都可以是VLC播放器打开 http://你的IP:8080/hls/streamName.m3u8这个地址观看直播(这个播放器不支持rtmp直播播放?)

    c.使用Web浏览器在网页上播放直播视频

编写HTML页面index.html:

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8">
		<title>HLS Player</title>
	</head>
	<body>
	<video poster="poster.png" height="720" width="1280" controls>
		<source src="http://你的IP/hls/streamName.m3u8" type="application/vnd.apple.mpegurl" />
		<p class="warning">Your browser does not support HTML5 video.</p>
	</video>
	</body>
</html>
修改IP,保存页面至/var/www/hls/index.html中。
用苹果设备访问http://你的IP:8080/index.html就可以看到该直播了。
由于H5兼容性问题,只能在苹果设备上用浏览器访问。
如果想要其他设备都能访问需做兼容处理。一般用flash嵌入网页中去播放直播(rtmp://...)或点播(http://...xxx.m3u8)

    d.使用nginx_rtmp_module扩展包内文件来同时录制和直播测试

在nginx_rtmp_module扩展包内有测试文件,复制该文件夹内的文件到站点根目录(如/var/www/html)
cp -r /usr/local/src/nginx-rtmp-module/test/www/* /var/www/html;
修改index.html文件中rtmp的地址为 rtmp://你的IP/live/streamName
修改record.html文件中flashvars的streamer为 rtmp://你的IP/live 并改flashvars的file值为streamName
保存。

使用浏览器同时打开两个页面 :
    http://你的IP:8080/index.html(这个是直播观看的地址)
    http://你的IP:8080/record.html(这个是直播录像的地址,采用的是flash录制电脑的摄像头[请点击允许])


三、其他

1.nginx-rtmp-module的配置请看Wiki https://github.com/arut/nginx-rtmp-module/wiki/Control-module
2.以上环境只是测试学习使用。公网上必须考虑权限安全,网络带宽,视频质量等。
3.此类产品网络上也比较多,例如阿里云基础服务中就有视频直播点播的功能。


阅读更多...

PHP RSA 非对称加密解密实例

分类:技术文档 - PHP文档 | 阅读(2409) | 发布于:2017-04-07 15:37 | 标签: 加密 解密 非对称加密 rsa

PHP服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密


1、加密解密的第一步是生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)

下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:

#1.生成原始 RSA私钥文件 rsa_private_key.pem
openssl genrsa -out rsa_private_key.pem 1024
#2.将原始 RSA私钥转换为 pkcs8格式
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
#3.生成RSA公钥 rsa_public_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给Android跟iOS等前端


2、php中用生成的公钥、私钥进行加密解密

//rsa.php :
<?php
//私钥
$private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDlRTEqGarpu6eesOseMMw4S7orIL43DJEU7LbOc8g1YWCRiQRK
BIiz3iyeAxAgOjRuSP+4mIL8V6FOS75lPPVM7F4FhrZzrqJaOcsCXrIUZ2cDoQ9+
Z17gHWmPVPVA9Q4QPO1A6KpeXpGjRmSSqIeLBmm3GtuSAN6tEP9KNSf/JQIDAQAB
AoGAWhUDqj0HkGqxA4MT/nrB4uSuMz/cPRjs8EHJ2fhYE9E89jHVw5dgdvu2oCcn
8OGttB9uioMyBCASOwc7ud9nqaEm7A8vS0QAV5thYC7hrn4x4HmskfpxdkGUol3i
xy7roe3sjtyG6E4VtVvCWr05HxBYPBSVXl9w6ODBHS3SeYkCQQD94Js1IlQpnPwx
OUpBopMOfr5qnu9sJoaxsCdo22B3alc5phP+2+Fz9ElaLi/3Jnn92hGuFTjF1pmd
M/mgY6v7AkEA5y/q0xsq1x+ya/oXjT6dkC4D1xaCduvASaKUiSEp3SbYjWx4FP7v
jgl2nrCGXjpPjW36rVyjbYDEAE+ZrvT3XwJAZlqFeJiMgfJuopHMZEXdL/zdXDMT
p/CoYT75xIadj8dpvy475YZUkOEuKZNxdx0mFbgzZJHdv7VTXVO1EnrcvQJBAJw3
KLnVVbFfXbTQnTF36ggOz9F7CFVLH/ehwDSZECy7nwCRFuM5EK4tftXj+ieZxz+N
3SFfw56ur8J2BybNqIkCQBLSa4KhNzHUcD7ZgfNTkvc6X2ajhgEBD47UIxQ80kRd
fPiAiZcfZnoRmi7NykALVilO32fUgovvfopi3aPeKCo=
-----END RSA PRIVATE KEY-----';

//公钥
$public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlRTEqGarpu6eesOseMMw4S7or
IL43DJEU7LbOc8g1YWCRiQRKBIiz3iyeAxAgOjRuSP+4mIL8V6FOS75lPPVM7F4F
hrZzrqJaOcsCXrIUZ2cDoQ9+Z17gHWmPVPVA9Q4QPO1A6KpeXpGjRmSSqIeLBmm3
GtuSAN6tEP9KNSf/JQIDAQAB
-----END PUBLIC KEY-----';

//echo $private_key;
$pi_key = openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
$pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的
print_r($pi_key);echo "\n";
print_r($pu_key);echo "\n";


$data = "www.lixiaocheng.com";//原始数据
$encrypted = ""; 
$decrypted = ""; 

echo "source data:",$data,"\n";

echo "private key encrypt:\n";

openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密
$encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
echo $encrypted,"\n";

echo "public key decrypt:\n";

openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来
echo $decrypted,"\n";

echo "---------------------------------------\n";
echo "public key encrypt:\n";

openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密
$encrypted = base64_encode($encrypted);
echo $encrypted,"\n";

echo "private key decrypt:\n";
openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密
echo $decrypted,"\n";

运行后输出:


>php rsa.php
Resource id #4
Resource id #5
source data:www.lixiaocheng.com
private key encrypt:
dR2713sx+kXvgY6s+A2i9eIDdo7dYMkN7bcp306TV7RbA7oD4YRHc4pW8S193ks+DyrLzvKllFIsy4IZEFLv+Tw41fpiEE+7ZwYf9j/j6p4JT7OH9LDaBuxSo1rHzhTbCB9ut3zrfD7JUl67UfWVHHNRJgJEbv10TMIKXhz4tQc=
public key decrypt:
www.lixiaocheng.com
---------------------------------------
public key encrypt:
begbEJ2j1FKwzIa4HOFcSw7orLWOZXOvpu85IX0VxXT0W5jqGFYc61zTjzvvBiGtdVrDiP72l61P2mNWFQ3unO5fnaHiBg0YP94wf2WKjPSo2G2JmGuRzvGvDkFUSle2QY2Sv9uHl8LvYNHFRtI4HRAP4ddniJr+3k80YbQKIF8=
private key decrypt:
www.lixiaocheng.com

>


阅读更多...

Memcache 查看列出所有key方法

分类:技术文档 - memcache | 阅读(1410) | 发布于:2016-12-01 14:15 | 标签: Memcache

1. cmd上登录memcache
telnet 127.0.0.1 11211 //这条是命令
2.  使用stats items命令列出所有keys
stats items    //这条是命令
//...
STAT items:7:number 16
STAT items:7:age 11237
STAT items:7:evicted 0
STAT items:7:evicted_nonzero 0
STAT items:7:evicted_time 0
STAT items:7:outofmemory 0
STAT items:7:tailrepairs 0
STAT items:7:reclaimed 184
STAT items:7:expired_unfetched 184
STAT items:7:evicted_unfetched 0
//...
END
3. 通过itemid获取key:基于列出的items id,本例中为7,第2个参数为列出的长度,0为全部列出
stats cachedump 7 0 //这条是命令
//...
ITEM tvmmr0ffcndg7vkda4hthp3vj2 [283 b; 1480574875 s]
ITEM ggt-wechat-accesstoken [230 b; 1474454246 s]
ITEM mad3o8177vbd01un1nf8r3ev66 [283 b; 1480566042 s]
ITEM 54eimuq8ft9526d7d9f6181sl7 [283 b; 1480561935 s]
//...
END
4. 通过get获取key值
上面的stats cachedump命令列出了我的session key,接下来就用get命令查找对应的session值
get tvmmr0ffcndg7vkda4hthp3vj2 //这条是命令
VALUE tvmmr0ffcndg7vkda4hthp3vj2 0 283
ggt_app_|a:1:{s:4:"user";a:9:{s:2:"Id";s:1:"1";s:8:"UserN......oleName";s:9:"产品部";s:6:"IsRoot";i:1;}}
END


阅读更多...

nginx根据url参数进行不同的代理

分类:技术文档 - Linux | 阅读(2198) | 发布于:2016-11-23 20:55 | 标签: nginx 反向代理

项目中由于产品迭代,新的版本不兼容旧的版本,但是又不能立马下线旧的版本,只能共存。
此时可以使用URL地址里面加版本号来区分,不同的版本号对应不同的产品版本。
例如,现在有8080,8081,8082三个版本,默认访问8080这个最老的版本。
配置nginx反向代理如下:
server {
        listen 80;
        server_name localhost;
        location / {
             set $proxyPort "8080";
             if ($arg_v = 1) {
                 set $proxyPort "8081";
             }
             if ($arg_v = 2) {
                 set $proxyPort "8082";
             }
             proxy_pass "http://127.0.0.1:$proxyPort";
        }
}
各版本配置:
server {
        listen 8080;
        server_name 8080;
        root /var/www/8080/;
        index index.html;
}
server {
        listen 8081;
        server_name 8081;
        root /var/www/8081/;
        index index.html;
}
server {
        listen 8082;
        server_name 8082;
        root /var/www/8082/;
        index index.html;
}
此时 ,访问http://hostname是走的端口号8080的代理,
访问http://hostname?v=1是走的端口号8081的代理,
访问http://hostname?v=2是走的端口号8082的代理.

阅读更多...

keepalived + nginx 高可用实现

分类:技术文档 - Linux | 阅读(3272) | 发布于:2016-11-16 20:13 | 标签: keepalived nginx 高可用

keepalived可以认为是VRRP协议在Linux上的实现,主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的.
nginx Master   :192.168.154.141
nginx Backup  :192.168.154.142
VIP                 :192.168.154.150

一、软件安装
安装keepalived,(nginx安装不介绍)
apt-get install libpopt-dev daemon  openssl  libssl-dev

cd /usr/local/src/;
wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz
tar zxvf keepalived-1.1.19.tar.gz
cd keepalived-1.1.19/
./configure --prefix=/usr/local/keepalived
make && make install

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bakup



二、keepalived配置(/etc/keepalived/keepalived.conf)
Master:
! Configuration File for keepalived
global_defs {
    notification_email {
        #test@test.com
    }
    #notification_email_from test@example.com
    #smtp_server mail.example.com
    #smtp_connect_timeout 30
    router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh" # 自己写的检测脚本。也可以是一行命令如killall -0 nginx
    interval 2 # 每2s检测一次
    weight -10 # 检测失败(脚本返回非0)则优先级 -10
    fall 3  # 检测连续 2 次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 2 # 检测 1 次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
    state MASTER                                #其他 BACKUP
    interface eth0                              #实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
    mcast_src_ip  192.168.154.141       #本机IP  发送多播数据包时的源IP地址
    virtual_router_id 51                        #这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
    priority 100                                        #其他  95,设置本节点的优先级,优先级高的为master
    advert_int 2                                        #检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
    nopreempt                                           #仅在主机设置
    authentication {                            #定义认证方式和密码,主从必须一样
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.154.150 #虚拟出来的IP
    }

    track_script {
       chk_nginx  # 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换
    }
}

Backup:
! Configuration File for keepalived
global_defs {
    notification_email {
        #test@test.com
    }
    #notification_email_from test@example.com
    #smtp_server mail.example.com
    #smtp_connect_timeout 30
    router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    weight -10
    fall 3
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0                             
    mcast_src_ip  192.168.154.142
    virtual_router_id 51
    priority 95
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.154.150
    }

    track_script {
       chk_nginx
    }
}

检测nginx状态
/etc/keepalived/check_nginx.sh:
#!/bin/bash

check_code=`curl --connect-timeout 3 -s -w "%{http_code}" http://127.0.0.1/index.php  -o /dev/null`
if [ "$check_code" != "200" ]; then
        exit 1
else
        exit 0
fi
chmod +x /etc/keepalived/check_nginx.sh
(一定不能忘记赋权限)

三、启动并测试
分别在两台服务器上 启动keepalived
keepalived -D
创建测试php文件/var/www/html/index.php,并写入本机IP;
echo "<?php echo '`ifconfig eth0 |grep 'inet addr'|cut -d':' -f2 |cut -d' ' -f1`';" > /var/www/html/index.php
用浏览器打开 VIP (http://192.168.154.150) ,正常应该是141上的页面,
再关闭PHP (service php5-fpm stop),
再次打开 VIP 此时应该是142上的页面。

阅读更多...

keepalived 配置详细注解

分类:技术文档 - PHP文档 | 阅读(3552) | 发布于:2016-11-15 20:25 | 标签: keepalived

global_defs {
    notification_email {  #指定keepalived在发生切换时需要发送email到的对象,一行一个
        sysadmin@fire.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
    smtp_server localhost #指定smtp服务器地址
    smtp_connect_timeout 30 #指定smtp连接超时时间
    router_id LVS_DEVEL #运行keepalived机器的一个标识
}

vrrp_sync_group VG_1{ #监控多个网段的实例
    group {
        inside_network #实例名
        outside_network
    }
    notify_master /path/xx.sh #指定当切换到master时,执行的脚本
    netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本
    notify_fault "path/xx.sh VG_1" #故障时执行的脚本
    notify /path/xx.sh
    smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}

vrrp_instance inside_network {
    state BACKUP #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决定
    interface eth0 #设置实例绑定的网卡
    dont_track_primary #忽略vrrp的interface错误(默认不设置)
    track_interface{ #设置额外的监控,里面那个网卡出现问题都会切换
        eth0
        eth1
    }
    mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
    garp_master_delay #在切换到master状态后,延迟进行gratuitous ARP请求
    virtual_router_id 50 #VPID标记
    priority 99 #优先级,高优先级竞选为master
    advert_int 1 #检查间隔,默认1秒
    nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
    preempt_delay #抢占延时,默认5分钟
    debug #debug级别
    authentication { #设置认证
        auth_type PASS #认证方式
        auth_pass 111111 #认证密码
    }
    virtual_ipaddress { #设置vip
        192.168.202.200
    }
}

virtual_server 192.168.202.200 23 {

    delay_loop 6 #健康检查时间间隔
    lb_algo rr  #十种调度算法(rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)
    lb_kind DR  #三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR)
    persistence_timeout 5 #会话保持时间
    protocol TCP #使用的协议
    persistence_granularity <NETMASK> #lvs会话保持粒度
    virtualhost <string> #检查的web服务器的虚拟主机(host:头)   
    sorry_server<IPADDR> <port> #备用机,所有realserver失效后启用

    real_server 192.168.200.5 23 {
        weight 1 #默认为1,0为失效
        inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
        notify_up <string> | <quoted-string> #在检测到server up后执行脚本
        notify_down <string> | <quoted-string> #在检测到server down后执行脚本

        TCP_CHECK {
            connect_timeout 3 #连接超时时间
            nb_get_retry 3 #重连次数
            delay_before_retry 3 #重连间隔时间
            connect_port 23  健康检查的端口的端口
            bindto <ip> 
        }

        HTTP_GET | SSL_GET{
            url{ #检查url,可以指定多个
                path /
                digest <string> #检查后的摘要信息
                status_code 200 #检查的返回状态码
            }
            connect_port <port>
            bindto <IPADD>
            connect_timeout 5
            nb_get_retry 3
            delay_before_retry 2
        }

        SMTP_CHECK{
            host{
                connect_ip <IP ADDRESS>
                connect_port <port> #默认检查25端口
                bindto <IP ADDRESS>
            }
            connect_timeout 5
            retry 3
            delay_before_retry 2
            helo_name <string> | <quoted-string> #smtp helo请求命令参数,可选
        }

        MISC_CHECK{
            misc_path <string> | <quoted-string> #外部脚本路径
            misc_timeout #脚本执行超时时间
            misc_dynamic #如设置该项,则退出状态码会用来动态调整服务器的权重
                         #返回0 正常,不修改;返回1,检查失败,权重改为0;
                         #返回2-255,正常,权重设置为:返回状态码-2
        }
    }

}

阅读更多...