龚哥哥 爱生活、做自己!
Nginx+Lua+Redis搭建高并发服务
发表于 2016-10-2 | 浏览(2352) | 服务器

架构图


一、准备

1、服务器首先是需要安装redis服务,查看本博客中的另一篇文章
2、安装nginx+luq服务,查看本博客中的另一篇文章

二、下载lua redis库

lua-redis库地址 https://github.com/openresty/lua-resty-redis
cd /data/www/lua/vendor
git clone https://github.com/openresty/lua-resty-redis.git

三、vim nginx.conf,http中添加

lua_package_path "/data/www/lua/vendor/lua-resty-redis/lib/?.lua;;";

四、nginx server中操作redis

1、在nginx.conf中嵌入lua代码

location /hello {
	default_type 'text/json';
	local redis = require "resty.redis";
	local instance = redis:new();
	local host = "127.0.0.1";
	local port = 6379;
	local ok,err = instance:connect(host,port);
	if not ok then
	   ngx.log(ngx.ERR,err);
	   ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE);
	end
	local suc, err instance:set('devil', 'hello world')
	f not suc then
		ngx.say("error")
	else
		ngx.say(instance:get('instance'))
	end
}

2、在实际业务中,独立lua代码(下面是一个redis简单的demo)

location /hello {
    default_type 'text/json';
    lua_need_request_body on;
    content_by_lua_file /data/www/lua/www/redis.lua;
}

2.1、lua文件的代码   vim /data/www/lua/www/redis.lua

#!/usr/local/bin/lua

--[[
	redis操作demo
	Devil
	http://gongfuxiang.com
--]]

-- 引入redis库
local redis = require "resty.redis";

-- 实例化redis
local instance = redis:new();

-- redis配置参数
local host = "127.0.0.1";
local port = 6379;

-- 创建redis连接
local ok,err = instance:connect(host,port);
if not ok then
   ngx.log(ngx.ERR,err);
   ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE);
end

-- 获取客户端post过来的body数据
local request_body = ngx.req.get_body_data() or nil
if( request_body ~= nil )
then
	-- 客户端ip
    local client_ip =ngx.req.get_headers()["X-Real-IP"]
    if client_ip == nil then
            client_ip = ngx.req.get_headers()["x_forworded_for"]
    end
    if client_ip == nil then
            client_ip = ngx.var.remote_addr
    end

    -- 当前时间戳
    local time = os.time()

    -- 拼接redis数据
    local data = client_ip.."{-}"..time.."{-}"..request_body

    -- 队列方式存储redis数据
    local suc, err = instance:lpush('key_list', data)
    if not suc then
        ngx.say('{"code":-2, "msg":"操作失败"}')
    end
    ngx.say('{"code":0, "msg":"操作成功"}')
else
    ngx.say('{"code":-1, "msg":"数据有误"}')
end

五、测试,访问 http://localhost/hello

hello world

阅读全文

Nginx结合Lua模块
发表于 2016-10-2 | 浏览(892) | 服务器

一、准备(软件存放目录创建)

mkdir /data
cd /data
mkdir src soft www
cd www
mkdir lua vendor
cd lua www 

二、常用库安装

yum -y install automake autoconf libtool make gcc gcc-c++ libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel

三、nginx依赖库安装

1、安装PCRE库

ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包:
cd /data/src
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
tar -zxvf pcre-8.38.tar.gz
./configure
make && make install

2、安装zlib库

http://zlib.net/zlib-1.2.8.tar.gz 下载最新的 zlib 源码包,使用下面命令下载编译和安装 zlib包:
cd /data/src
wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
./configure
make && make install

3、安装ssl(某些vps默认没装ssl)

cd /data/src
wget http://www.openssl.org/source/openssl-1.0.2.tar.gz
tar -zxvf openssl-1.0.2.tar.gz
./config
make && make install
cp apps/openssl /usr/bin/
如果提示覆盖,确认就OK了,再查看openssl version版本就是最新版了

4、nginx lua扩展库

cd /data/src
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.6.tar.gz
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
mv v0.3.0.tar.gz ngx_devel_kit-0.3.0.tar.gz
mv v0.10.6.tar.gz lua-nginx-module-0.10.6.tar.gz
tar -zxvf ngx_devel_kit-0.3.0.tar.gz
tar -zxvf lua-nginx-module-0.10.6.tar.gz

5、LuaJIT安装

cd /data/src
wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar -zxvf LuaJIT-2.0.4.tar.gz 
cd LuaJIT-2.0.4
make && make install

四、安装nginx

1、安装nginx

Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx 安装到 /data/soft/nginx 目录下的详细步骤:
cd /data/src
wget http://nginx.org/download/nginx-1.9.9.tar.gz
tar -zxvf nginx-1.9.9.tar.gz
cd nginx-1.9.9
./configure --sbin-path=/data/soft/nginx/nginx \--conf-path=/data/soft/nginx/nginx.conf \--pid-path=/data/soft/nginx/nginx.pid \--with-http_realip_module \--with-http_ssl_module \--with-pcre=/data/src/pcre-8.38 \--with-zlib=/data/src/zlib-1.2.8 \--with-http_stub_status_module \--add-module=/data/src/ngx_cache_purge-2.3 \--add-module=/data/src/ngx_devel_kit-0.3.0 \--add-module=/data/src/lua-nginx-module-0.10.6
make && make install

2、告诉nginxlua库路径

export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0

3、查看nginx是否正常

nginx -v
可能会出现下面的错误
./objs/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
解决方法:
ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

8、nginx常用操作

cp /data/soft/nginx/nginx /etc/init.d/
/etc/init.d/nginx 				启动nginx
/etc/init.d/nginx -s reload		重启nginx
/etc/init.d/nginx -s stop		关闭nginx

9、进入nginx目录校验lua是否能够正常运行

cd /data/soft/nginx
vim nginx.conf(server中添加以下代码)
location /hello { 
	default_type 'text/plain'; 
	content_by_lua 'ngx.say("hello, lua")'; 
}
重启nginx即可,访问 http://localhost/hello 会出现 hello,lua

阅读全文

PHP采用Swoole扩展开发高性能WebSocket
发表于 2016-9-17 | 浏览(2226) | PHP

需要安装PHP Swoole扩展,官网地址:http://www.swoole.com/

安装教程可查看本博客中swoole安装

1、index.html 内容如下

<!DOCTYPE html>
<head>
<title>socket demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="./jquery-2.1.3.min.js"></script>
</head>
<body>
<input type="text" id="msg" />
<button id="send">发送</button>
</body>
</html>
<script>
$(function()
{
	// 创建socket对象
	var socket = new WebSocket('ws://'+document.domain+':9501');

	// 打开Socket 
	socket.onopen = function(event)
	{

		$('#send').on('click', function()
		{
			var msg = $('#msg').val();
			socket.send(msg);
			console.log(msg);
		});
		// 发送一个初始化消息
		socket.send("客户端初始化!"); 

		// 监听消息
		socket.onmessage = function(event) { 
			console.log("客户端监听到的消息:", event); 
		}; 

		// 监听Socket的关闭
		socket.onclose = function(event) { 
		console.log("Socket关闭了", event); 
		}; 

	  // 关闭Socket.... 
	  //socket.close() 
	};
});
</script>

2、web_socket.php 内容如下

<?php

// 本机的ip
// 通过命令行运行 cli
$server = new swoole_websocket_server("192.168.0.110", 9501);

// 握手成功回调
$server->on('open', function(swoole_websocket_server $server, $request)
{
    echo "server: handshake success with fd{$request->fd}\n";
});

// 消息监听
$server->on('message', function(swoole_websocket_server $server, $frame)
{
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
    $server->push($frame->fd, "this is server {$frame->data}");
});

// 关闭监听
$server->on('close', function($ser, $fd)
{
    echo "client {$fd} closed\n";
});

// http请求监听, 如果监听了Request则可以通过http访问
// 通过 http://192.168.0.110:9501 访问
$server->on('Request', function($req, $respone)
{
    // $req->get, $req->post
    if(!empty($req->get))
    {
        // 使用全局变量
        global $server;

        // 服务器推送消息给客户端
        // 参数1 socketID, 参数2 推送内容
        $server->push(1, "this is server hello request {$req->get['msg']}");

        // 响应完成
        $respone->end("success");
    }
});

// 开始
$server->start();

?>

3、在命令行运行web_socket.php

php web_socket

4、客户端在浏览器上访问,可发送消息到服务器并且响应服务器推送的消息

http://192.168.0.110/index.html

5、服务器端推送消息给客户端,在客户端页面可看见推送的消息

http://192.168.0.110:9501?msg=hello

6、测试结果,这里输入什么就给返回什么,在项目中根据自己项目做fid与用户的关联即可。

阅读全文

CentOS搭建FTP服务器
发表于 2016-9-16 | 浏览(895) | 服务器

1、查看是否已经安装vsftpd

rpm -qa | grep vsftpd

2、安装vsftpd

yum -y install vsftpd

2.1、将vsftpd加入开机启动

chkconfig vsftpd on

3、vsftpd配置  vim /etc/vsftpd/vsftpd.conf

# 设定不允许匿名访问
anonymous_enable=NO

# 设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问
local_enable=YES

# 使用户不能离开主目录
chroot_list_enable=YES
ascii_upload_enable=YES

# 设定支持ASCII模式的上传和下载功能
ascii_download_enable=YES

# 启用“倾听”指令时,vsftpd在独立模式和运行,监听IPv4的套接字。这个指令不能一起使用, listen_ipv6指令
listen=YES

# PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证以下这些是关于vsftpd虚拟用户支持的重要配置项,默认vsftpd.conf中不包含这些设定项目,需要自己手动添加
pam_service_name=vsftpd

# 设定启用虚拟用户功能
guest_enable=YES

# 指定虚拟用户的宿主用户,CentOS中已经有内置的ftp用户了
guest_username=ftp

# 设定虚拟用户个人vsftp的CentOS FTP服务文件存放路径。存放虚拟用户个性的CentOS FTP服务文件(配置文件名=虚拟用户名进行认证
user_config_dir=/etc/vsftpd/vuser_conf
chroot_list_file=/etc/vsftpd/vuser_passwd.txt

# 授权用户权限(新版本需要设置此参数)
#allow_writeable_chroot=YES

# 开启PASV模式
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40080
pasv_promiscuous=YES

# 阻止特定的本地用户登录ftp
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list

4、创建用户和密码文本  vim /etc/vsftpd/vuser_passwd.txt,注意奇行是用户名,偶行是密码

devil
123456

4.1、生成虚拟用户认证的db文件

db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db

4.2、安装Berkeley DB工具,很多人找不到db_load的问题就是没有安装这个包(已安装则跳过)

yum install db4 db4-utils

5、编辑认证文件  vim /etc/pam.d/vsftpd,全部注释掉原来语句,再增加以下两句

auth       required     pam_userdb.so db=/etc/vsftpd/vuser_passwd
account    required     pam_userdb.so db=/etc/vsftpd/vuser_passwd

6、创建虚拟用户配置文件目录

mkdir /etc/vsftpd/vuser_conf

6.1、创建虚拟用户配置文件  vim /etc/vsftpd/vuser_conf/devil

local_root=/data/ftp/devil #虚拟用户根目录,根据实际情况修改
write_enable=YES
anon_umask=022 #掩码
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

7、设置Selinux(如果你的selinux是开启的话)

setsebool -P ftp_home_dir=1   #设置ftp可以使用home目录
sersebool -P allow_ftpd_full_access=1   #设置ftp用户可以有所有权限

8、设置FTP根目录权限

mkdir -p /data/ftp/devil
chmod 755 /data/ftp
chmod -R 777 /data/ftp/devil

9、配置防火墙  vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 40000:40080 -j ACCEPT

10、查看selinux安全模式(如果显示 Enforcing ,则需要改成 Disabled 模式)

getenforce

10.1、selinux模式为Disabled则跳过,vim /etc/selinux/config

SELINUX=disabled
默认是enforcing  把他修改为 disabled

11、启动vsftpd服务

service vsftpd start

12、重启防火墙(如果防火墙不想配置,则关闭防火墙即可,线上建议开启防火墙)

service iptables restart

13、测试 在客户端使用

ip 当前服务器的ip(ifconfig查看当前ip)
用户 devli
密码 123456

阅读全文

rsync+inotify搭建多台服务器之间文件实时同步
发表于 2016-8-31 | 浏览(3406) | 服务器

一、准备

Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而Inotify-tools就是这样的一个第三方软件。

1、服务器

操作系统		CentOS-6.5-x86_64 6.5
Linux内核	2.6.32

master		192.168.0.200	客户端(数据服务器)
slave1		192.168.0.110	数据同步服务器(备份服务器1)
slave2		192.168.0.111	数据同步服务器(备份服务器2)

2、基础命令安装(所有服务器都需要安装,已经安装可跳过)

yum install -y gcc gcc-c++ make wget

二、数据同步服务端配置(备份服务器)

1、检查是否已安装rsync

rpm -qa | grep rsync

2、安装rsync和xinetd超级守护进程

yum -y install xinetd rsync

3、创建rsync用户及模块目录并更改其用户组(用户运行rsync的用户,不建议使用root)

useradd rsync -s /sbin/nologin  -M
grep rsync /etc/passwd
mkdir -p /data/www
chown -R rsync:rsync /data

4、配置rsync认证文件 /etc/rsync.password(格式 用户:密码)

echo "rsync:rsync" > /etc/rsync.password

4.1、为密码文件提权,增加安全性,文件权限修改成600

chmod 600 /etc/rsync.password

5、为rsync服务提供配置文件,vim  /etc/rsyncd.conf 文件默认不存在,手动创建即可

# 工作中指定用户(需要指定用户)
uid = rsync
gid = rsync

# 相当于黑洞.出错定位
use chroot = no

# 有多少个客户端同时传文件
max connections = 200

# 超时时间
timeout = 600

# 进程号文件
pid file = /var/run/rsyncd.pid

# 锁文件
lock file = /var/run/rsync.lock

# 日志文件
log file = /var/log/rsyncd.log

# 模块配置
# 这个模块对应的是推送目录,模块名称随便起
[rsync]

# 需要同步的目录
path = /data/www/

# 表示出现错误忽略错误
ignore errors

# 表示网络权限可写(本地控制真正可写)
read only = false

# 这里设置IP或让不让同步
list = false

# 白名单,可以访问此模块的主机
hosts allow = 192.168.0.200

# 黑名单,*表示任何主机
hosts deny = *

# 认证此模块的用户名,虚拟用户
auth users = rsync

# 虚拟用户的密码文件
secrets file = /etc/rsync.password

6、配置rsync操作脚本

A、启动脚本

echo "rsync --daemon --config=/etc/rsyncd.conf" > /etc/init.d/rsync-start
chmod +x /etc/init.d/rsync-start

B、停止脚本

echo "killall -9 rsync > /dev/null 2>&1; rm -rf /var/run/rsyncd.pid" > /etc/init.d/rsync-stop
chmod +x /etc/init.d/rsync-stop

C、重启脚本

echo "/etc/init.d/rsync-stop; /etc/init.d/rsync-start" > /etc/init.d/rsync-restart
chmod +x /etc/init.d/rsync-restart

6.1、以后服务器启动后,手动启动rsync脚本即可

/etc/init.d/rsync-start 		启动
/etc/init.d/rsync-stop 			停止
/etc/init.d/rsync-restart 		重启

7、启动xinetd超级守护进程服务

service xinetd start

8、配置防火墙允许873端口通信  vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 873 -j ACCEPT

9、查看rsync服务是否成功开启

ps -ef | grep rsync

10、检查873端口是否成功监听

netstat -ntlp | grep 873

三、客户端配置

1、检查是否已安装rsync

rpm -qa | grep rsync

1.1、安装rsync服务

yum -y install rsync

2、创建本地监控的目录

mkdir -p /data/www

3、配置rsync认证文件 /etc/rsync.password(这里只要写密码即可,切记)

echo "rsync" > /etc/rsync.password

3.1、为密码文件提权,增加安全性,文件权限修改成600

chmod 600 /etc/rsync.password

4、测试一下,进入 /data/www

cd /data/www
touch test.txt
rsync -avz test.txt rsync@192.168.0.110::rsync --password-file=/etc/rsync.password

5、inotify-tools实现实时同步

mkdir /data/soft
cd /data/soft
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar -zxvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify
make && make install

6、编写rsync脚本,添加一下内容  vim /etc/rsync.sh

#!/bin/bash

# 数据同步监控脚本
# @author	Devil
# @version	0.0.1

# inotify-slave的ip地址(多个ip空格分割)
host="192.168.0.110 192.168.0.111"

# 本地监控的目录
src=/data/www/

# inotify-slave的rsync服务的模块名
dst=rsync

# inotify-slave的rsync服务的虚拟用户
user=rsync

# 本地调用rsync服务的密码文件
rsync_passfile=/etc/rsync.password

# inotify的安装目录
inotify_home=/usr/local/inotify

# 参数校验
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
	echo "Check File and Folder"
	exit 9
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src \
| while read file
do
	cd $src
	for tmp_host in $host
	do
		rsync -aruz -R --delete ./  --timeout=100 $user@$tmp_host::$dst --password-file=${rsync_passfile} > /dev/null 2>&1
	done
done
exit 0

6.1、给rsync.sh执行权限

chmod +x /etc/rsync.sh

6.2、配置操作rsync脚本文件,添加以下内容  vim /etc/init.d/rsync

# 脚本名称
name="rsync"

# 拉取正在运行的脚本进程号
PROCESS=`ps -ef | grep $name | grep -v grep | grep -v PPID | awk '{ print $2}'`

# 输出正在停止脚本的提示
if [ -n "$PROCESS" ]
then
	echo "正在停止"
fi

# 停止脚本
for i in $PROCESS
do
	kill -9 $i > /dev/null 2>&1
done

# 是否停止成功
if [ $? != 0 ]
then
	echo "停止失败"
	exit 0
fi

# 启动脚本
/etc/rsync.sh &

# 等待2秒
sleep 2

# 判断脚本是否启动成功
is_rsync=$(ps -ef | grep "$name" | grep -v grep | wc -l)
if [ $is_rsync != 0 ]
then
	echo "启动成功"
else
	echo "启动失败"
fi

6.3、给rsync服务脚本执行权限

chmod +x /etc/init.d/rsync

7、以后每次只需运行rsync脚本即可,停止启动合并

/etc/init.d/rsync

8、进入监控目录操作文件试试看效果

cd /data/www
touch test.txt
echo "hello" > test.txt
touch world.txt

9、查看备份服务器 192.168.0.100,192.168.0.110

cd /data/www
ls
文件都同步过来了

阅读全文

Keepalived+Haproxy搭建高可用负载均衡
发表于 2016-8-27 | 浏览(3015) | 服务器

Keepalived

简单的是一个路由的软件用C写的这个项目的主要目标是提供简单而强大的设施的负载均衡和高可用性对Linux系统和基于Linux的基础设施。负载均衡架构依赖于众所周知的和广泛使用的Linux虚拟服务器(IPVS)内核模块提供第四层负载均衡。简单的实现了一套检测动态自适应维护和管理服务器根据其健康loadbalanced池。另一方面,高可用性的实现VRRP协议.VRRP路由器故障转移的一个基本的砖。此外,简单的实现了一套钩VRRP有限状态机提供低空和高速协议的相互作用。简单的框架可以单独或一起提供弹性基础设施。

Haproxy

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

架构图


1、环境

CentOS 6.5
keepalived 1.2.23
haproxy 1.5.4

2、准备4台服务器

VIP         192.168.0.200
Master      192.168.0.110
Backup      192.168.0.111
Server1     192.168.0.120
Server2     192.168.0.121

3、安装gcc编译器,openssl,wget,如果已经安装则跳过

yum -y install openssl-devel ncurses-devel gcc gcc-c++ make rpm-build wget

4、创建软件存放目录

mkdir /soft

5、安装keepalived

cd /soft
wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz
tar -zxvf keepalived-1.2.23.tar.gz
cd keepalived-1.2.23
./configure --prefix=/usr/local/keepalived
make
make install

6、将keepalived做成启动脚务

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
chmod +x /etc/init.d/keepalived

7、配置文件修改  vim /etc/keepalived/keepalived.conf

7.1、MASTER 配置信息

global_defs {
    notification_email
    {
        fuxiang.gong@qq.com
    }
    notification_email_from 17091959688@163.com
    smtp_server smtp.163.com
    stmp_connect_timeout 30
    router_id lnmp_node1
}

# 检测haproxy脚本
vrrp_script chk_haproxy {
        script "/etc/keepalived/check_haproxy.sh"
        interval 2
        weight 2
}

# 服务
vrrp_instance VIP_1 {
    state MASTER    #设置为主服务器
    interface eth0  #监测网络接口
    virtual_router_id 51  #主、备必须一样
    priority 100   #主机级别,值越大优先级越高
    advert_int 1   #VRRP Multicast广播周期秒数

    authentication {
        auth_type PASS  #VRRP认证方式,主备必须一致
        auth_pass 1111  #密码
    }
    track_script {
        chk_haproxy  # 执行监控的服务
    }
    virtual_ipaddress {
        192.168.0.200  #漂移IP地址
    }
}

7.2、BACKUP 配置信息

global_defs { 
    notification_email
    {
        fuxiang.gong@qq.com
    }
    notification_email_from 17091959688@163.com
    smtp_server smtp.163.com
    stmp_connect_timeout 30
    router_id lnmp_node2
}

# 检测haproxy脚本
vrrp_script chk_haproxy {
        script "/etc/keepalived/check_haproxy.sh"
        interval 2
        weight 2
}

# 服务
vrrp_instance VIP_1 {
    state BACKUP    #设置为备用服务器
    interface eth0  #监测网络接口
    virtual_router_id 51  #主、备必须一样
    priority 90   #主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高 
    advert_int 1   #VRRP Multicast广播周期秒数
    authentication {
        auth_type PASS  #VRRP认证方式,主备必须一致
        auth_pass 1111  #密码
    }
    track_script {
        chk_haproxy  # 执行监控的服务
    }
    virtual_ipaddress {
        192.168.0.200  #漂移IP地址
    }
}

7.3、添加Haproxy检测脚本 vim  /etc/keepalived/check_haproxy.sh 添加以下内容

#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
	/etc/init.d/haproxy start
fi
sleep 2
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
	/etc/init.d/keepalived stop
fi

7.4、给check_haproxy.sh脚本赋值运行权限(MASTER和BACKUP一致)

chmod +x /etc/keepalived/check_haproxy.sh

7.5、允许两台服务器vrrp包通过防火墙,如果关闭防火墙则跳过(两台服务器上都配置)

MASTER
  vim /etc/sysconfig/iptables
  -A INPUT -i eth0 -p vrrp -s 192.168.0.111 -j ACCEPT

BACKUP
  vim /etc/sysconfig/iptables
  -A INPUT -i eth0 -p vrrp -s 192.168.0.110 -j ACCEPT

重启防火墙
service iptables restart

8、启动keepalived服务

service keepalived start

8.1、查看服务器多了一个虚拟IP,keepalived配置成功

MASTER  ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:d9:a8:bd brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.110/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.200/32 scope global eth0
    inet6 fe80::20c:29ff:fed9:a8bd/64 scope link 
       valid_lft forever preferred_lft forever


BACKUP  ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:d9:8f:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.109/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::20c:29ff:fed9:8f72/64 scope link 
       valid_lft forever preferred_lft forever

8.2、查看Keepalived日志

tail -f /var/log/messages


9、yum方式安装haproxy

yum install -y haproxy

9.2、查看haproxy版本信息

rpm -qi haproxy 或 haproxy -version

Name        : haproxy                      Relocations: (not relocatable)
Version     : 1.5.4                             Vendor: CentOS
Release     : 3.el6                         Build Date: 2016年05月11日 星期三 03时17分37秒
Install Date: 2016年08月24日 星期三 05时34分08秒      Build Host: worker1.bsys.centos.org
Group       : System Environment/Daemons    Source RPM: haproxy-1.5.4-3.el6.src.rpm
Size        : 2552550                          License: GPLv2+
Signature   : RSA/SHA1, 2016年05月12日 星期四 18时49分33秒, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://www.haproxy.org/
Summary     : HAProxy is a TCP/HTTP reverse proxy for high availability environments
Description :
HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high
availability environments. Indeed, it can:
 - route HTTP requests depending on statically assigned cookies
 - spread load among several servers while assuring server persistence
   through the use of HTTP cookies
 - switch to backup servers in the event a main one fails
 - accept connections to special ports dedicated to service monitoring
 - stop accepting connections without breaking existing ones
 - add, modify, and delete HTTP headers in both directions
 - block requests matching particular patterns
 - persists clients to the correct application server depending on
   application cookies
 - report detailed status as HTML pages to authenticated users from a URI
   intercepted from the application

9.2、查看haproxy位置

rpm -ql haproxy

10、添加独立日志  vim /etc/rsyslog.conf 在底部添加以下配置信息

# haproxy
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514  # 启动udp,启动端口后将作为服务器工作    
# # Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514  # 启动tcp监听端口    
local2.* /var/log/haproxy.log

10.1、重启日志服务

service rsyslog restart

10.2、vim haproxy.cfg 在global端中需要添加此行

log 127.0.0.1 local2

11、配置防火墙,允许80,1080端口访问,添加以下两行(测试可以直接关闭防火墙)

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1080 -j ACCEPT

11.1、重启防火墙

service iptables restart

15、编辑配置文件  vim /etc/haproxy/haproxy.cfg

15.1、一个最简单的http服务的配置

global
log 127.0.0.1 local2  # 定义日志
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

frontend webser #webser为名称
option forwardfor
bind *:80
default_backend webserver
backend webserver
balance roundrobin #使拥roundrobin 算法
server app1 192.168.1.120:80 check
server app2 192.168.1.121:80 check

15.2、haproxy统计页面的输出机制

frontend webser
log 127.0.0.1 local2
option forwardfor
bind *:80
default_backend webserver
backend webserver
cookie node insert nocache
balance roundrobin
server app1 192.168.0.120:80 check cookie node1 intval 2 rise 1 fall 2
server app2 192.168.0.121:80 check cookie node2 intval 2 rise 1 fall 2
listen statistics
bind *:8009 # 自定义监听端口
stats enable # 启用基于程序编译时默认设置的统计报告
stats auth admin:admin # 统计页面用户名和密码设置
stats uri /admin?stats # 自定义统计页面的URL,默认为/haproxy?stats
stats hide-version # 隐藏统计页面上HAProxy的版本信息
stats refresh 30s # 统计页面自动刷新时间
stats admin if TRUE #如果认证通过就做管理功能,可以管理后端的服务器
stats realm Hapadmin # 统计页面密码框上提示文本,默认为Haproxy\ Statistics

15.3、静态与动态请求分离

# web服务
frontend webservs

# 绑定80端口,域名不限
bind *:80

# 定义静态规则
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js .html
acl host_static hdr_beg(host) -i img. imgs. video. videos. ftp. image. download.

# 定义动态规则
acl url_php path_end -i .php

# 后端请求归纳
use_backend static if url_static or host_static
use_backend dynamic if url_php

# 默认动态组
default_backend dynamic

# 静态请求处理
backend static
# 分配算法(轮流分配)
balance roundrobin
# 实际处理请求的服务器列表
server node1 192.168.0.120:80 check maxconn 3000

# 动态请求处理
backend dynamic
# 分配算法(轮流分配)
balance roundrobin
# 实际处理请求的服务器列表
server node1 192.168.0.121:80 check maxconn 3000
server node2 192.168.0.122:80 check maxconn 3000

15.4、http完整配置负载均衡

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 30000
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
frontend http-in
bind *:80
mode http
log global
option httpclose
option logasap #不等待响应结束就记录日志,表示提前记录日志,一般日志会记录响应时长,此不记录响应时长
option dontlognull #不记录空信息
capture request header Host len 20 #记录请求首部的前20个字符
capture request header Referer len 60 #referer跳转引用,就是上一级
default_backend servers

frontend healthcheck
bind :1099 #定义外部检测机制
mode http
option httpclose
option forwardfor
default_backend servers
backend servers
balance roundrobin
server websrv1 192.168.0.120:80 check maxconn 2000
server websrv2 192.168.0.121:80 check maxconn 2000

15.5、MySQL完整配置负载均衡

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
defaults
mode tcp
log global
option httplog
option dontlognull
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 600
listen stats
mode http
bind 0.0.0.0:1080
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth admin:admin
stats admin if TRUE
frontend mysql
bind *:3306
mode tcp
log global
default_backend mysqlservers
backend mysqlservers
balance leastconn
server dbsrv1 192.168.1.120:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
server dbsrv2 192.168.1.121:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300

16、启动haproxy服务

service haproxy start

17、查看统计页面

http://192.168.0.200:1080/haproxyadmin?stats
用户名和密码 admin

18、查看Haproxy日志

tail -f /var/log/haproxy.log

19、Haproxy配置信息 MASTR 与 BACKUP配置完全相同

20、访问服务器VIP地址会自动分配到不同服务器进行处理

http://192.168.0.200

1、关闭MASTER服务,BACKUP会自动升级为MASTER接替服务。启动MASTER的Keepalived服务,会自动切回原来的MASTER服务器。
2、关闭Haproxy服务,脚本会尝试启动Haproxy服务,如果启动失败则关闭Keepalived服务,让备用服务器接替。

到这里一个完整的web负载均衡服务器就配置完成了,Haproxy主要做服务分配,Keepalived做双机热备,Keepalived还可以配置成双主热备。在keepalived中检测Haproxy是否可用,不可用是否关闭Keepalived服务器,具体可以根据自己业务做处理。

阅读全文

CentOS yum remove卸载软件出错
发表于 2016-8-26 | 浏览(972) | 服务器

卸载过程中的错误

error: %preun(XXX-1.5.4-3.el6.x86_64) scriptlet failed, exit status 1
Error in PREUN scriptlet in rpm package XXX要卸载的包名

解决方案

yum --setopt=tsflags=noscripts remove XXX要卸载的包名

查看软件包

rpm -ql XXX包名

阅读全文

CentOS使用Keepalived搭建双机热备
发表于 2016-8-23 | 浏览(1266) | 服务器

1、环境

CentOS6.5
keepalived-1.2.23

2、准备两台服务器和一个VIP IP

Master      192.168.0.109
Backup      192.168.0.110
VIP         192.168.0.200

3、安装gcc编译器,openssl,wget,如果已经安装则跳过

yum -y install openssl-devel ncurses-devel gcc gcc-c++ make rpm-build wget

4、目录创建

mkdir /data/soft
mkdir /data/nginx
mkdir /data/www

6、安装keepalived

cd /data/soft
wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz
tar -zxvf keepalived-1.2.23.tar.gz
cd keepalived-1.2.23
./configure --prefix=/usr/local/keepalived
make
make install

7、将keepalived做成启动脚务

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
chmod +x /etc/init.d/keepalived

8.1、MASTER配置文件,位置 /etc/keepalived/keepalived.conf

global_defs {
    notification_email
    {
        fuxiang.gong@qq.com
    }
    notification_email_from 17091959688@163.com
    smtp_server smtp.163.com
    stmp_connect_timeout 30
    router_id lnmp_node1
}

# 服务
vrrp_instance LNMP {
    state MASTER    #设置为主服务器
    interface eth0  #监测网络接口
    virtual_router_id 51  #主、备必须一样
    priority 100   #主机级别,值越大优先级越高
    advert_int 1   #VRRP Multicast广播周期秒数

    authentication {
        auth_type PASS  #VRRP认证方式,主备必须一致
        auth_pass 1111  #密码
    }
    virtual_ipaddress {
        192.168.0.200  #VRRP HA虚拟地址
    }
}

8.2、BACKUP配置文件

global_defs { 
    notification_email
    {
        fuxiang.gong@qq.com
    }
    notification_email_from 17091959688@163.com
    smtp_server smtp.163.com
    stmp_connect_timeout 30
    router_id lnmp_node2
}

# 服务
vrrp_instance LNMP {
    state BACKUP    #设置为备用服务器
    interface eth0  #监测网络接口
    virtual_router_id 51  #主、备必须一样
    priority 90   #主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高 
    advert_int 1   #VRRP Multicast广播周期秒数
    authentication {
        auth_type PASS  #VRRP认证方式,主备必须一致
        auth_pass 1111  #密码
    }
    virtual_ipaddress {
        192.168.0.200  #VRRP HA虚拟地址
    }
}

8.3、允许两台服务器vrrp包通过防火墙,如果关闭防火墙则跳过(两台服务器上都配置)

MASTER
  vim /etc/sysconfig/iptables
  -A INPUT -i eth0 -p vrrp -s 192.168.0.111 -j ACCEPT

BACKUP
  vim /etc/sysconfig/iptables
  -A INPUT -i eth0 -p vrrp -s 192.168.0.110 -j ACCEPT

重启防火墙
service iptables restart

9、keepalived操作,这里做启动操作

service keepalived start      启动
service keepalived stop       停止
service keepalived restart    重启

10、查看已经成功添加虚拟网卡

主服务器  ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:d9:a8:bd brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.109/24 brd 192.168.0.255 scope global eth0
    inet 192.168.0.200/32 scope global eth0
    inet6 fe80::20c:29ff:fed9:a8bd/64 scope link 
       valid_lft forever preferred_lft forever


BACKUP服务器  ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:d9:8f:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.110/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::20c:29ff:fed9:8f72/64 scope link 
       valid_lft forever preferred_lft forever

11、安装nginx,详细步骤查看博客中其它nginx安装方法文章

12、把nginx访问指向 /data/www目录,在 /data/www 目录中创建index.html内容分别写 MASTER, BACKUP(通过浏览器访问 192.168.0.200 ),默认MASTER,如果关闭MASTER keepalived服务,BACKUP服务器将自动升级为MASTER提供服务。开启MASTER keepalived服务,自动切换MASTER服务器来服务,BACKUP降级为备用服务。

13、查看日志

tail -f /var/log/messages

阅读全文

Linux下一个网卡配置多个ip(虚拟ip)
发表于 2016-8-23 | 浏览(1232) | 服务器

临时设置,关机失效

在同一个网段的虚拟ip(本机,同网段的电脑可以ping通)以下192.168.0.100只能在本机ping通

ifconfig eth0:1 10.0.82.200 netmask 255.255.255.0
ifconfig eth0:1 192.168.0.100 netmask 255.255.255.0

设置永久ip

1、设置子ip配置文件

cd /etc/sysconfig/network-scripts

2、创建新文件 vim ifcfg-eth0:0,添加以下内容,保存退出

DEVICE=eth0:0  # 虚拟网络接口,随意    
ONBOOT=yes  # 系统启动时激活
BOOTPROTO=static  # 使用静态ip地
IPADDR=10.0.82.200  # 该虚拟网络接口的ip别名,随意
NETMASK=255.255.255.0  # 子网掩码,对应ip别名
GATEWAY=10.0.82.1  # 网关,对应ip别名
HWADDR=00:0c:29:d9:a8:bd  # 网卡MAC地址,与 eth0 相同
USERCTL=yes  # 是否给予非root用户设备管理权限

3、重启网卡

service network restart

4、临时清除ip别名

ifconfig eth0:0 down

阅读全文

VMware完整克隆虚拟机后连不上网络
发表于 2016-8-19 | 浏览(693) | 服务器

完整克隆之后却不能连接到虚拟机了,产生这个问题的原因是克隆之后,新的克隆副本的网卡信息被修改了,所以需要手动设置下。原先使用的eth0网卡已经被使用了所以不能使用。

1、修改 70-persistent-net.rules 文件(删除旧网卡信息,使用新网卡信息)

vi /etc/udev/rules.d/70-persistent-net.rules

上面就是克隆后的文件信息,如果不是克隆的,红色部分没有。因为克隆了,所以就多出来红色部分的了。因为使用的还是旧网卡信息,所以导致了xshell连接不上。这里我们删除黄色框中东西,并将红色最后的eth1改成eth0。同时记住 ATTR{address}的值。

1.jpg

2、修改 ifcfg-eth0文件(将原来的旧网卡的HWADDR改成新网卡的HWADDR)

vi /etc/sysconfig/network-scripts/ifcfg-eth0

HWADDR的值就是上图中ATTR{addres}的值,然后设置一下想要的IP。reboot重启后就可以使用xshell连接了,注释黄色一行,红色一行为新添加。

2.jpg

3、重启服务器即可

init 6

阅读全文

TOP