标签归档:haproxy

两台nginx实现https负载均衡

现在网络完全越来越受到重视, 因此https也是大势所趋, 以往nginx都是工作在http方式下, 其实nginx在https下工作也挺好的。 这里将分步骤的逐步实现一套采用nginx, haproxy, keepalived实现的https系统, 并且系统没有单点故障, 基本适应中小系统的安全需要。

1. Nginx https安装    这个文章主要是安装支持https的nginx, 源代码装过程

2. https安装(2)nginx配置   继承上一个文章, 记录配置过程, 然后实现https服务

本文继承前两个文章, 记录通过nginx实现https的功能, 并且通过haproxy将两台nginx的https进行整合, 统一对外提供服务。

但是本文的方法, 在haproxy上仍然存在单点故障, 下一篇文章, 将修正这个错误

 

本文记录详细的安装过程, 供大家参考。

 一. 准备linux操作系统

本文的nginx和haproxy都是在linux下进行的安装与测试, 因此需要linux计算机。

我们采用vmware作为虚拟机软件, 采用下面的已经安装好的虚拟机镜像做为操作系统。 这样节省了安装时间。

链接:http://pan.baidu.com/s/1nutqTkP 密码:f4bh

  1. 安装好vmware软件, 这个百度上搜索, 或者参考:     虚拟机vmware新手使用教程
  1. 下载好虚拟机软件后解压缩到一个比较大的硬盘空间, 记录下目录地址
  2. 启动虚拟机软件, 在文件菜单中, 选择打开按钮, 然后选择好, 您刚才解压缩的文件目录, 选择其中*.vmx文件, 然后打开
  3. 选择运行这个软件, 最后您可以开始这个虚拟机了, 虚机运行后, 最后进入登录界面, 在登录界面中输入 root作为用户名, 密码为 thoughtpolice   或者root

或者查看README-vmware-image.txt 文件

  1. 进入虚拟机后, 使用 ifconfig命令, 检查一下 虚拟机是否网络已经正确启动, 并且查看一下, 这个虚拟机的ip地址
  2. 运行 setup命令, 进入防火墙选项 关闭防火墙
  3. 安装xshell软件, 在xshell软件里面配置一个连接到您虚拟机的连接, 然后连接上。这样方便后续的操作等
  4. 安装xftp软件  方便上传相关文件到服务器。

上述软件, 客户baidu搜索相关安装方法等。

二. nginx下https的安装和配置

  1. 安装https01服务器

本 文目标是测试多机负载均衡下https的工作状况, 因此我们需要安装至少2台nginx服务器, 并且每个服务器都要支持https协议, 因此我们需 要首先安装1台nginx, 然后在配置相关的https服务, 测试没问题了, 然后在站另外一台nginx, 最后安装负载均衡软件。

关于nginx的安装, https的安装, https的配置请参考下面的文章进行

Nginx https安装

https安装(2)nginx配置

参考上面文章, 安装配置完成nginx的https后, 进行测试一下, 配置文件为:

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
  
    server {
        listen       80;
        server_name  test.iigrowing.cn;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
    server {
        listen       443;
        server_name  test.iigrowing.cn;
        ssl                  on;
        ssl_certificate      /etc/pki/tls/certs/rsyslog.crt;
        ssl_certificate_key  /etc/pki/tls/certs/rsyslog.key;
        ssl_session_timeout  5m;
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers   on;
        location / {
            root   html;
            index  index.html index.htm;
        }
   }  
}
  1. 测试https01服务器

进入下图目录中, 编辑hosts文件, 添加一行记录

192.168.128.138  test.iigrowing.cn

另外, 请用您的正确ip地址替换上面的ip地址, 用您喜欢的域名替换测试的域名。 这里用域名就是方便, 啥域名或者使用ip不影响您的测试结果。

haproxy001

  1. 启动一个浏览器, 在浏览器里面输入 https://test.iigrowing.cn

然后, 应该能看到 正确的显示了额,

您也可用修改nginx的html目录下的 index.html文件的内容, 来仔细测试您的工作成果。

 

  1. 关闭这个https01服务器, 然后在vmware的虚拟机菜单中选择

haproxy002

最后在弹出菜单中选择  链接克隆选项  这样可以节省点磁盘空间。 虚拟机名称可为 https02

  1. 克隆完毕启动这个新的虚拟机。

启动虚拟机后, 要先登录, 然后立即检查是否网络启动正常, 以及网络的ip地址, 若是网络不正常。

请运行setup命令

haproxy003

之后选择这个

haproxy005

haproxy006

haproxy007

填写下面的信息

haproxy008

最后选择 保存退出, 然后运行下面的命令, 检查新网卡是否启动正常了

service network restart              启动网卡(英文部分为命令)

Ifconfig                           检查网络是否正常启动

  1. 在xshell中配置一个新的连接, 用这个配置连接到新的虚拟机
  2. 进入/usr/local/nginx/sbin下, 运行./nginx 启动nginx, 然后测试这个https是否正常工作了。

 

到此我们准备好了,两个有https功能的nginx, 另外两个nginx的证书等信息都是完全一致的, 我们是采用虚拟机clone进行的。里面数据是一致的。

 

 三. 安装haproxy

关于haproxy的功能, 安装配置详情请参考下面的文章

Haproxy学习笔记-源码安装

这里简单进行安装配置, 然后进行配置

  1. 下载软件源代码 wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.3.tar.gz

最后发现国外网站, 下载速度慢, 可以用本文提供的 下载好的版本

         haproxy-1.6.3.tar

  1. 下载本文提供的软件
  2. 启动xftp上传文件, 过程略
  3. 解压缩上传后的软件包
  4. 进入解压缩后的目录
  5. 运行make PREFIX=/usr/local/haproxy install  进行编译安装
  6. 最后执行 cd /usr/local/haproxy 目录
  7. 然后执行 mkdir conf  创建配置目录
  8. 进入文件目录, 执行vi haproxy.cfg  命令创建配置文件, 内容如下
global
    log 127.0.0.1 local0 info #[err warning info debug]
    maxconn 4096
    user root
    group root
    daemon
    nbproc 1
    pidfile /home/admin/haproxy/logs/haproxy.pid

defaults
    maxconn 2000
    contimeout 5000
    clitimeout 30000
    srvtimeout 30000

frontend https
    bind :443
    default_backend cluster_https

backend cluster_https
    mode tcp
    balance roundrobin
    server https01 192.168.128.136:443
    server https02 192.168.128.137:443

listen admin_stats
    bind 0.0.0.0:1080
    mode http
    log 127.0.0.1 local0 err
    stats uri /admin?stats
  1. 执行下面命令创建目录 mkdir -p  /home/admin/haproxy/logs/
  1. 执行  /usr/local/haproxy/sbin/haproxy  -f  /usr/local/haproxy/conf/haproxy.cfg
  2. 通过 netstat -ntlp  查看是否 启动了443端口
  3. 通过 http://test.iigrowing.cn:1080/admin?stats查看相关统计信息

haproxy009

 最后.  测试整个haproxy下的用nginx实现的https程序

  1. 登录https01服务器, 进入/usr/local/nginx/html 下  编辑html 修改内容, 添加些字符串 111111111111等, 这样方便我们了解到 我们访问的是https01机器
  2. 登录https02服务器, 进入/usr/local/nginx/html 下  编辑html 修改内容, 添加些字符串 222222222222等, 这样方便我们了解到 我们访问的是https01机器
  3. 启动firefox浏览器 输入 https://test.iigrowing.cn请确保协议时https, 另外域名解析到 haproxy的地址上。
  4. 在启动另外一个chrome浏览器, 然后同样输入上述的地址, 多次测试发现有时显示带 111有时显示带222的,测试基本正常

 

 

 

haproxy安装配置调优

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。

HAProxy 特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

其支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。。
如果说在功能上,能以proxy反向代理方式实现 WEB均衡负载,这样的产品有很多。包括 Nginx,ApacheProxy,lighttpd,Cheroke 等。
但要明确一点的,Haproxy 并不是 Http 服务器。以上提到所有带反向代理均衡负载的产品,都清一色是 WEB 服务器。简单说,就是他们能自个儿提供静态(html,jpg,gif..)或动态(php,cgi..)文件的传输以及处理。而Haproxy 仅仅,而且专门是一款的用于均衡负载的应用代理。其自身并不能提供http服务。

但其配置简单,拥有非常不错的服务器健康检查功能还有专门的系统状态监控页面,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。自1.3版本开始还引入了frontend,backend,frontend根据任意HTTP请求头内容做规则匹配,然后把请求定向到相关的backend。

另外, 版本1.3 是处于活跃开发阶段的版本, 它支持如下新特性:

l 内容交换 : 可以根据请求(request)的任何一部分 来选择一组服务器, 比如请求的 URI , Host头(header) , cookie , 以及其他任何东西. 当然,对那些静态分离的站点来说,对此特性还有更多的需求。

l 全透明代理 : 可以用 客户端IP地址 或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy 补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。

l 基于树的更快的调度器 : 1.2.16以上的版本要求所有的超时都设成同样的值以支持数以万计的全速连接. 这个特性已经移植到1.2.17.

l 内核TCP拼接 : 避免了内核到用户然后用户到内核端的数据拷贝, 提高了吞吐量同时又降低了CPU使用率 . Haproxy 1.3支持Linux L7SW 以满足在商用硬件上数Gbps 的吞吐的需求。

l 连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点。

l 细微的头部处理 : 使得编写基于header的规则更为简单,同时可以处理URI的某部分。

l 快而可靠的头部处理 : 使用完全RFC2616 兼容的完整性检查对一般的请求全部进行分析和索引仅仅需要不到2ms 的时间。

l 模块化设计 : 允许更多人加入进此项目,调试也非常简单. poller已经分离, 已经使得它们的开发简单了很多. HTTP已经从TCP分离出来了,这样增加新的七层特性变得非常简单. 其他子系统也会很快实现模块化

l 投机I/O 处理 : 在一个套接字就绪前就尝试从它读取数据。poller仅推测哪个可能就绪哪个没有,尝试猜测,并且如果成功,一些开销很大的系统调用就可以省去了。如果失败,就会调用这些系统调用。已知的使用Linux epoll()已经净提升起码10%了。

l ACLs : 使用任意规则的任意组合作为某动作的执行条件。

l TCP 协议检查 : 结合ACL来对请求的任意部分进行检查,然后再进行转发。这就可以执行协议验证而不是盲目的进行转发。比如说允许SSL但拒绝SSH。

l 更多的负载均衡算法 : 现在,动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现。其他算法比如Weighted Measured Response Time也很快会实现。

安装和配置
Haproxy 的配置相当简单,

从官方网站:http://www.haproxy.org 下载最新版本。

# wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.20.tar.gz
# tar zcvf haproxy-1.3.20.tar.gz
# cd haproxy-1.3.20
# make TARGET=linux26 PREFIX=/usr/local/haprpxy
# make install PREFIX=/usr/local/haproxy

安装完毕后,进入安装目录创建配置文件
# cd /usr/local/haproxy
# vi haproxy.cfg

配置内容如下:
global
log 127.0.0.1 local0
#log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
chroot /usr/local/haproxy
uid 99 #所属运行的用户uid
gid 99 #所属运行的用户组
daemon
nbproc 1
pidfile /usr/local/haproxy/run/haproxy.pid
#debug
#quiet
defaults
log global
log 127.0.0.1 local3 #日志文件的输出定向
mode http #所处理的类别
option httplog #日志类别
option httpclose
option dontlognull
option forwardfor
option redispatch
retries 2 #设置多个haproxy并发进程提高性能
maxconn 2000
balance roundrobin #负载均衡算法
stats uri /haproxy-stats #haproxy 监控页面的访问地址
# 可通过 http://localhost:1080/haproxy-stats 访问
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen localhost 0.0.0.0:1080 #运行的端口及主机名
mode http
option httpchk GET /index.htm #健康检测
server s1 127.0.0.1:3121 weight 3 check #后端的主机 IP &权衡
server s2 127.0.0.1:3122 weight 3 check #后端的主机 IP &权衡

启动服务:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
重启服务:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid` (没有换行)
停止服务:
# killall haproxy
当然,为了方便系统在开机时加载,还可以创建启动脚本:
# vim /etc/rc.d/init.d/haproxy 内容如下:
#! /bin/sh
set -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin
PROGDIR=/usr/local/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/conf/$PROGNAME.conf
PIDFILE=$PROGDIR/run/$PROGNAME.pid
DESC=”HAProxy daemon”
SCRIPTNAME=/etc/init.d/$PROGNAME

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

start()
{
echo -n “Starting $DESC: $PROGNAME”
$DAEMON -f $CONFIG
echo “.”
}

stop()
{
echo -n “Stopping $DESC: $PROGNAME”
haproxy_pid=cat $PIDFILE
kill $haproxy_pid
echo “.”
}

restart()
{
echo -n “Restarting $DESC: $PROGNAME”
$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
echo “.”
}

case “$1″ in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo “Usage: $SCRIPTNAME {start|stop|restart}” >&2
exit 1
;;
esac
exit 0
保存后赐予可执行权限
# chmod +x /etc/rc.d/init.d/haproxy

就可以使用 service haproxy start|stop|restart 来控制服务的启动停止跟重启。
并通过以下命令加载到开机服务启动列表
# chkconfig –add haproxy

配置日志:
# vim /etc/syslog.conf

在最下边增加
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log

重启核心日志服务使配置起效
# service syslog restart

然后就可查看日志了
# tail –f /var/log/harpoxy.log

Aug 22 15:32:06 localhost haproxy[64136]: Proxy www started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy cherokee started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy wap started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy pic started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy img started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy public started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy public started.
Aug 22 15:32:59 localhost haproxy[64137]: 219.142.128.30:6416 [22/Aug/2009:15:32:59.754] public stats/ 0/-1/-1/-1/0 200 17329 – - PR– 0/0/0/0/0 0/0 “GET /?stats HTTP/1.1″
Aug 22 15:32:59 localhost haproxy[64137]: 219.142.128.30:6416 [22/Aug/2009:15:32:59.754] public stats/ 0/-1/-1/-1/0 200 17329 – - PR– 0/0/0/0/0 0/0 “GET /?stats HTTP/1.1″

应用举例

WEB 均衡负载 & 虚拟主机
重新打开配置文件 haproxy.cfg,留意最下部分的均衡主机选项
listen localhost 0.0.0.0:1080 #运行的端口及主机名
mode http
option httpchk GET /index.htm #用于健康检测的后端页面
server s1 127.0.0.1:3121 weight 3 check #后端的主机 IP &权衡
server s2 127.0.0.1:3122 weight 3 check #后端的主机 IP &权衡

在实验中,我们的的后端是 squid 分开了2个端口在同一台服务器上。
以其中一项为例:

server s1 127.0.0.1:3121 weight 3 check

s1 是可自己定义的服务器别名
127.0.0.1:3121 服务器的IP地址以及端口号
weight 3 所能分配到请求的高低权衡,数字越大分配到的请求数就越高
check 接受 haproxy 的定时检查,以确定后端服务器的健康情况。

如需配置虚拟主机,相当简单,紧需修改 localhost 为你虚拟主机的的域名,加到haproxy配置中, 再为其分配后端服务器的参数即可。

例:

listen www.x1.com 0.0.0.0:1080 #运行的端口及主机名
mode http
option httpchk GET /index.htm #用于健康检测的后端页面
server s1 127.0.0.1:3121 weight 3 check #后端的主机 IP &权衡
server s2 127.0.0.1:3122 weight 3 check #后端的主机 IP &权衡

listen www.x2.com 0.0.0.0:1080 #运行的端口及主机名
mode http
option httpchk GET /index.htm #用于健康检测的后端页面
server s1 127.0.0.1:3121 weight 3 check #后端的主机 IP &权衡
server s2 127.0.0.1:3122 weight 3 check #后端的主机 IP &权衡

保存配置后重新加载,即可生效,刷新管理页面也可看到新的虚拟主机。

性能对比
在此,我们用最近最火红的 http 兼前端WEB均衡负载服务器 Nginx 与 Haproxy 做个简单的性能对比。
测试环境:

CPU:Xeon2.8G X2
RAM:4G
OS:RedHat As5.3 X64

工具:apache ab
参数:ab -i -c 500 -n 100000 (500并发,1W请求)
最终服务端:2个squid 需实现均衡负载

成绩如下:

####### Nginx + haproxy : (由Nginx通过反向代理发送请求至haproxy, 并由其进行均衡负载)

Concurrency Level: 500
Time taken for tests: 53.758 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 38600386 bytes
HTML transferred: 0 bytes

Requests per second: 1860.19 [#/sec] (mean)
Time per request: 268.790 [ms] (mean)
Time per request: 0.538 [ms] (mean, across all concurrent requests)
Transfer rate: 701.21 [Kbytes/sec] received
####### haproxy : (单独由haproxy进行均衡负载)
Concurrency Level: 500
Time taken for tests: 32.562 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 36606588 bytes
HTML transferred: 0 bytes
Requests per second: 3071.02 [#/sec] (mean)
Time per request: 162.812 [ms] (mean)
Time per request: 0.326 [ms] (mean, across all concurrent requests)
Transfer rate: 1097.85 [Kbytes/sec] received
####### nginx : (单独由nginx进行均衡负载)
Concurrency Level: 500
Time taken for tests: 36.539 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 38600000 bytes
HTML transferred: 0 bytes
Requests per second: 2736.82 [#/sec] (mean)
Time per request: 182.694 [ms] (mean)
Time per request: 0.365 [ms] (mean, across all concurrent requests)
Transfer rate: 1031.65 [Kbytes/sec] received

反复测试,得出其结果:
Haproxy 单独进行均衡负载的性能最强,超过了Nginx。
然而 Nginx + Haproxy 的搭配性能最弱,应该是跟通过了2层反向代理有关。
所以想用 Haproxy 替代 Nginx 所自带的均衡负载功能将会令性能打折。
但虽然如此 Haproxy 对均衡负载功能远比 Nginx 成熟,例如session粘贴,cookies 引导等都是 nginx 所没有的。
可根据需要而选择搭配。
相关启动参数介绍

相关启动参数介绍
#./haproxy –help //haproxy相关命令参数介绍.
haproxy -f < 配置文件>
[-n 最大并发连接总数] [-N 每个侦听的最大并发数] [-d] [-D] [-q] [-V] [-c] [-p ] [-s] [-l] [-dk]
[-ds] [-de] [-dp] [-db] [-m < 内存限制M>] [{-sf|-st} pidlist...]
-d 前台,debug模式
-D daemon模式启动
-q 安静模式,不输出信息
-V 详细模式
-c 对配置文件进行语法检查
-s 显示统计数据
-l 显示详细统计数据
-dk 不使用kqueue
-ds 不使用speculative epoll
-de 不使用epoll
-dp 不使用poll
-db 禁用后台模式,程序跑在前台
-sf 程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后
-st 程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后

keepalived+haproxy实现web服务的高可用和负载均衡

简介:

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换.Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器.

Haproxy 反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入.新的1.3引入了frontend,backend,frontend根据任意HTTP请求头内容做规则匹配,然后把请求定向到相关的backend.

实验环境以及服务器信息:

OS:   RedHat  AS 5.1

软件列表:

keepalived-1.2.2.tar.gz

haproxy-1.4.13.tar.gz

服务器信息:

Master server  10.10.0.99   (调度主服务器)

Slave server    10.10.0.98   (从调度服务器)

VIP: 10.10.0.97  (调度服务器的虚拟IP)

Real server:

10.10.0.96

10.10.0.95

安装keepalived

#  tar zxvf  keepalived-1.2.2.tar.gz

#  cd keepalived-1.2.2

#  ./configure –-prefix=/usr/local/keepalived

#  make&&make install

#  cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
#  cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
#  mkdir /etc/keepalived
#  cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
#  cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

#  chkconfig –add keepalived

#  chkconfig  keepalived on

#  vi /etc/keepalived/keepalived.conf

global_defs {

notification_email {

xxxxxx@139.com

}

notification_email_from xxxxxx@139.com

smtp_server mail.139.com

smtp_connect_timeout 30

router_id LVS_DEVEL
}

vrrp_instance VI_1 {

state MASTER

interface eth1

virtual_router_id 51

priority 100

advert_int

authentication {

auth_type PASS

auth_pass 1111
}

virtual_ipaddress {

192.168.0.97

}

}

virtual_server 10.10.0.97 80 {

delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP

real_server 10.10.0.95 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}

real_server 10.10.0.96 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}

}

关于keepalived配置文件的选项解释 可以去网上搜下 由于选项参数居多这里就不说明了

#  service keepalived start

安装haproxy

#   tar zxvf  haproxy-1.4.13.tar.gz

#   mv  haproxy-1.4.13 haproxy

#   cd haproxy

#   make TARGET=linux26

#   vi /usr/local/haproxy/conf/haproxy.conf

#   mkdir –p /var/chroot/haproxy

global
chroot /var/chroot/haproxy
daemon
gid     0
log 127.0.0.1 local3
nbproc  2
pidfile /var/run/haproxy-private.pid
ulimit   -n        65535
user    root
maxconn         32000
spread-checks           4
tune.maxaccept          8
tune.maxpollevents      100
defaults sxit
log     global
mode    http
option  httplog
option  dontlognull
log 127.0.0.1 local3
retries 3
option redispatch
maxconn     32000
contimeout      5000
clitimeout        50000
srvtimeout       50000
listen  sxit 0.0.0.0:80
appsession JSESSIONID len 52 timeout 3h
cookie SRV insert indirect nocache
mode http
stats enable
stats hide-version
stats uri  /haproxy-stats
stats realm Haproxy\ statistics
stats auth sxit:sxit

stats refresh 3s
monitor-uri /haproxy_test
balance roundrobin
option httpclose
option forwardfor
option httpchk HEAD /index.html HTTP/1.0
server s1 10.10.0.98:80 check inter 2000  weight 3
server s3 10.10.0.99:80 check inter 2000  weight 3

# /usr/local/haproxy/sbin/haproxy –f  /usr/local/haproxy/config/haproxy.config

如果启动没有报什么错误的话,就在浏览器上输入如下地址

http://10.10.0.97/haproxy-stats  (查看服务器状态信息的页面,登录的时候输入上面设置的账号和密码sxit),页面状态如下:

wps_clip_image-3309

测试负载均衡效果以及高可用性
负载均衡测试:

启动真实服务器的web服务,在2个真实服务器上创建2个首页文件,内容分别为test1和test2,如果在浏览器上访问web服务每次刷新既显示test1又显示tetst2就说明负载均衡已经生效了.

高可用性测试:

拔掉主调度服务器的网线或者关闭主调度服务器,看下VIP是否顺利的切换到从调度器,假如切换正常,那就说明keepalived已经成功生效了.

Haproxy学习笔记-源码安装

原创文章,转载请指明出处并保留原文url地址

haproxy简介

1.1 Haproxy功能介绍

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

下图是HAProxy的架构:

wps_clip_image-4675[4][1]

1.2 Haproxy监控

下图是HAProxy的监控页面截图:

wps_clip_image-15376[3][1]

1.3 Haproxy基本特点

HAProxy相比LVS的使用要简单很多,功能方面也很丰富。当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。在4层模式下,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求 (request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。

l 免费开源,稳定性也是非常好,这个可通过我做的一些小项目可以看出来,单Haproxy也跑得不错,稳定性可以与LVS相媲美;

l 根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom's 10GbE NICs (Myri-10G PCI-Express),这个作为软件级负载均衡,也是比较惊人的;

l HAProxy可以作为MySQL、邮件或其它的非web的负载均衡,我们常用于它作为MySQL(读)负载均衡;

l 自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警,这个也是我非常喜欢它的原因之一;

l HAProxy支持虚拟主机。

2 . linux环境准备

2.1 linux准备

我们采用vmware软件安装linux系统来完成实验。

1. vmware软件到搜索引擎搜索并下载安装, linux软件可以到下面地址下载安装好的linux虚拟机, 然后在vmware中运行。

wps_clip_image-11398[3][1]

Url:http://www.thoughtpolice.co.uk/vmware/#download

http://downloads.sourceforge.net/thoughtpolicevm/centos-5.2-i386-server.zip

2. 解压缩下载后的虚拟机文件到一个硬盘空间比较大的硬盘分区中.

打开解压缩的文件目录

3. 双击文件centos-5.5-x86_64-server.vmx,然后启动vmware虚拟机

wps_clip_image-14196[3][1]

4. 登录系统

如下图, 启动后系统如下界面

wps_clip_image-27502[3][1]

用户点击鼠标左键后, 在登录页面可以输入用户名 :root

然后提示输入密码信息, 用户可以输入原始密码 :"thoughtpolice"(密码是双引号中内容)The root password for this image is "thoughtpolice".

2.2 Linux的操作工具准备

配置SecureCRT软件(自行到百度搜索下载)

SecureCRT是一常见的linux终端软件,我们可以通过这个软件登录我们的虚拟机系统,完成各种操作,他的操作方法比直接在虚拟机上操作方便多了.软件的下载及安装大家自己去搜索及下载.

wps_clip_image-21540[3][1]

安装完成后, 启动软件, 然后点击

图1处 启动快速连接,

图2处 输入ip地址

图3处 输入用户名

2.3 Linux环境更改

1. 通过登录虚拟机, 检查虚拟机的ip地址(一般虚拟机是采用dhcp方式分配的ip地址,因此需要我们检查一下ip地址)

wps_clip_image-17221[3][1]

2. 配置linux的登陆终端

wps_clip_image-5255[3][1]

打开SecureCRT软件, 创建连接, 最后在会话选项中,填写上面信息,重要的是ip地址, 端口, 用户名

最后保存确定, 然后登陆,相关过程省略。

3 安装nginx

1. 添加nginx的yum安装源

vi  /etc/yum.repos.d/nginx.repo

填入如下数据:

[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/centos/5/$basearch/

gpgcheck=0

enabled=1

保存退出

2. 安装 nginx

yum install nginx

3. 配置nginx

cd /

mkdir wwwroot

chown -R sch:sch /wwwroot/

cd /wwwroot/

vi a.txt

输入如下内容:hello this is a.txt

保存退出vi

4. Nginx配置文件

cd /etc/nginx/

cd conf.d/

vi default.conf

删除原来的数据, 替换为下面配置

server {

listen       8080;

server_name  test.com;

location / {

root   /wwwroot/test;

index  index.html index.htm;

}

error_page   500 502 503 504  /50x.html;

location = /50x.html {

root   /usr/share/nginx/html;

}

}

保存退出

5. 启动nginx

[root@bogon conf.d]# nginx       //启动nginx。

或者通过nginx -s  reload 从新启动nginx,是配置文件生效

6. 修改本机hosts文件,如下图

wps_clip_image-13698[3][1]

7. 测试nginx配置

wps_clip_image-568[3][1]

打开浏览器, 输入: http://test.com:8080/a.txt 后输出结果如上图, 说明nginx已经配置完成。

8. 关闭虚拟机防火墙

注意:虚拟机中有可能个防火墙等还打开, 需要关闭, 或者无法连接。

关闭虚拟机的防火墙,如下:

[sch@bogon ~]$ su -            // 切换到root

Password:                    // 输入root账号密码

[root@bogon ~]# setup         // 启动配置界面

wps_clip_image-847[3][1]

如上图, 移动光标键, 选择 防火墙选项(图中黑色的部分),然后 按动tab键, 移动当前焦点到 “run  tool”按钮, 回车

wps_clip_image-10192[3][1]

进入上图界面后, 选中绿色区域的设置, 然后移动tab键, 选中ok后,屏蔽了防火墙, 这么设置后,nginx应该可以被访问了。

4 安装haproxy

1. 运行yum命令, 为虚拟机安装编译haproxy的必要工具

yum -y groupinstall "Development Tools"    // 安装gcc等linux开发工具

2. 下载haproxy程序,并编译

# wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.20.tar.gz         // 下载程序
# tar xzvf haproxy-1.3.20.tar.gz                                       // 解压缩
# cd haproxy-1.3.20                                            // 进入源码目录
# make TARGET=linux26 PREFIX=/usr/local/haprpxy                   // 编译
# make install PREFIX=/usr/local/haproxy                             // 安装

3. 配置haproxy

[root@bogon ~]# cd /usr/local/haproxy/

[root@bogon haproxy]# mkdir conf

[root@bogon conf]# pwd

/usr/local/haproxy/conf

[root@bogon conf]# vi haproxy.conf

输入如下配置:

global

log 127.0.0.1   local0

maxconn 4096

chroot /usr/local/haproxy

uid 501

gid 501

daemon

nbproc 1

pidfile /usr/local/haproxy/logs/haproxy.pid

defaults

log     127.0.0.1       local3

mode    http

option httplog

option httpclose

option dontlognull

option forwardfor

option redispatch

retries 2

maxconn 2000

balance roundrobin

stats   uri     /haproxy-stats

contimeout      5000

clitimeout      50000

srvtimeout      50000

listen web_proxy 192.168.186.161:80

server web1 localhost:8080 cookie app1inst1 check inter 2000 rise 2 fall 5

listen admin_stat

bind *:8011                     # 监听端口

mode http                       # http的7层模式

option httplog

log global

stats refresh 30s               # 统计页面自动刷新时间

stats uri /admin?stats           # 统计页面URL

stats realm Haproxy\ Statistics  # 统计页面密码框上提示文本

stats auth admin:admin          # 统计页面用户名和密码设置

stats hide-version              # 隐藏统计页面上HAProxy的版本信

保存退出。

4. 启动haproxy

输入如下命令: /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf

5. 测试haproxy

启动浏览器程序,进行测试

wps_clip_image-27307[3][1]

请注意上面蓝色得地址栏中, 绿色区域里面没有8080的端口号,说明是工作在80端口, 而80端口是haproxy进行监听的,同时显示数据是nginx给出的内容,因此, haproxy配置完成。

完成测试。

haproxy 命令配置实例

一:Global parameters
* Process management and security
- chroot 改变当前工作目录
- daemon 运行方式为后台工作
- user - group 工作用户和组
-log <address> <facility>日志输出设备
- nbproc 创建工作的进程数目
-pidfile pid文件位置
- ulimit-n 设置每个进程的可用的最大文件描述符
- stats 创建监控所用的套接字目录
- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量
- description 描述实例的名称
maxconn <number> 每个进程可用的最大连接数
maxpipes <number>  每个进程可用的最大管道数
nokqueue  nopoll  nosepoll nosplice  禁用这些功能
spread-checks <0..50, in percent>  health check 的时间间隔
tune.bufsize <number>
tune.maxaccept <number>
tune.maxpollevents <number>
tune.maxrewrite <number>
tune.rcvbuf.client <number>
tune.rcvbuf.server <number>
tune.sndbuf.client <number>
tune.sndbuf.server <number>
以上凭字面理解吧
debug  调试模式,输出启动信息到标准输出
quiet   安装模式,启动时无输出

二:defaults 块
作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen
frontend 块,接受请求的端口组
backend块,后端处理的server 组
listen块,frontend和backend 块的结合

三:常用配置命令

balance <algorithm> [ <arguments> ]
balance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置

Examples :
balance roundrobin
balance url_param userid
balance url_param session_id check_post 64
balance hdr(User-Agent)
balance hdr(host)
balance hdr(Host) use_domain_only

block { if | unless } <condition>  在7层阻止访问
Example:
acl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像
acl invalid_src src_port 0:1023
acl local_dst hdr(host) -i localhost
block if invalid_src || local_dst

capture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母

Example:
capture cookie ASPSESSION len 32

capture request header <name> len <length>
capture response header <name> len <length> 同上

clitimeout <timeout> (deprecated)
contimeout <timeout> (deprecated)  客户端超时时间,不赞成设置

cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接

default_backend <backend> 默认应用的后端

Example :
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
default_backend dynamic    当没有匹配时就用dynamic

errorfile <code> <file> 定义出现错误的代码的返回页
Example :
errorfile 400 /etc/haproxy/errorfiles/400badreq.http
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
errorfile 503 /etc/haproxy/errorfiles/503sorry.http

errorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url
force-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端
fullconn <conns>  定义后端组的最大连接数
grace <time>  haproxy停止后,再持续多长时间用于处理连接
http-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡
http-check send-state 允许haproxy 发送 X-Haproxy-Server-State
http-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制
Example:
acl nagios src 192.168.129.3
acl local_net src 192.168.0.0/16
acl auth_ok http_auth(L1)

http-request allow if nagios
http-request allow if local_net auth_ok
http-request auth realm Gimme if local_net auth_ok
http-request deny

Example:
acl auth_ok http_auth_group(L1) G1

http-request auth unless auth_ok

mode { tcp|http|health }   设定启动的实例的协议类型
monitor fail { if | unless } <condition>  监控失败条件设置

option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求
option accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患)
option accept-invalid-http-response 接受无效的response ,建议关闭
option allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面
option checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。
- all those without "Set-Cookie" header ;
- all those with a return code other than 200, 203, 206, 300, 301, 410,
provided that the server has not set a "Cache-control: public" header ;
- all those that come from a POST request, provided that the server has not
set a 'Cache-Control: public' header ;
- those with a 'Pragma: no-cache' header
- those with a 'Cache-control: private' header
- those with a 'Cache-control: no-store' header
- those with a 'Cache-control: max-age=0' header
- those with a 'Cache-control: s-maxage=0' header
- those with a 'Cache-control: no-cache' header
- those with a 'Cache-control: no-cache="set-cookie"' header
- those with a 'Cache-control: no-cache="set-cookie,' header
(allowing other fields after set-cookie)

option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系
option contstats   允许连续的流量统计更新
option dontlog-normal   开启正常连接的日志
option dontlognull   记录空连接
option forceclose  允许关闭session 在后端把response 发送后
option forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server
option http-pretend-keepalive    定义是否haproxy要宣布同server keepalive
option http-server-close   是否开启在server 端 connection closing
option http-use-proxy-header    用non-standard Proxy-Connection 替换 connection

option httpchk <method> <uri> <version>  允许用http协议检查server 的健康
Examples :
# Relay HTTPS traffic to Apache instance and check service availability
# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
backend https_relay
mode tcp
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
server apache1 192.168.1.1:443 check port 80

option httplog [ clf ] 定制日志格式
option http_proxy  开启http 代理模式,只有最基本的代理功能
option ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡
option independant-streams  启用双向超时处理,如socket 的read 和write
option log-health-checks   记录健康检查日志
option log-separate-errors   对非完全成功的连接改变日志记录等级
option logasap   大传输大文件时可以提前记录日志
option mysql-check   mysql 健康检查
option nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了
option originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server
option persist     强制将http请求发往已经down 掉的server
option redispatch   是否允许重新分配在session 失败后
option smtpchk   smtp 检查
option socket-stats  允许对单个socket进行统计
option srvtcpka  是否允许向server 发送keepalive
option tcpka 是否允许向server和client发送keepalive
option tcplog  允许记录tcp 连接的状态和时间
option transparent   允许客户端透明代理
rate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection

redirect location <to> [code <code>] <option> [{if | unless} <condition>]
redirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite

Example: move the login URL only to HTTPS.
acl clear      dst_port  80
acl secure     dst_port  8080
acl login_page url_beg   /login
acl logout     url_beg   /logout
acl uid_given  url_reg   /login?userid=[^&]+
acl cookie_set hdr_sub(cookie) SEEN=1

redirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set
redirect prefix   https://mysite.com           if login_page !secure
redirect prefix   http://mysite.com drop-query if login_page !uid_given
redirect location http://mysite.com/           if !login_page secure
redirect location / clear-cookie USERID=       if logout

Example: send redirects for request for articles without a '/'.
acl missing_slash path_reg ^/article/[^/]*$
redirect code 301 prefix / drop-query append-slash if missing_slash
redisp (deprecated)
redispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用
reqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string

Example : add "X-Proto: SSL" to requests coming via port 81
acl is-ssl  dst_port       81
reqadd      X-Proto:\ SSL  if is-ssl

reqallow  <search> [{if | unless} <cond>]
reqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制

Example :
# allow www.* but refuse *.local
reqiallow ^Host:\ www\.
reqideny  ^Host:\ .*\.local

reqdel  <search> [{if | unless} <cond>]
reqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容

Example :
# remove X-Forwarded-For header and SERVER cookie
reqidel ^X-Forwarded-For:.*
reqidel ^Cookie:.*SERVER=

reqdeny  <search> [{if | unless} <cond>]
reqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问

reqrep  <search> <string> [{if | unless} <cond>]
reqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换
Example :
# replace "/static/" with "/" at the beginning of any request path.
reqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2
# replace "www.mydomain.com" with "www" in the host name.
reqirep ^Host:\ www.mydomain.com   Host:\ www

reqtarpit  <search> [{if | unless} <cond>]
reqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息

Examples :
# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
# block all others.
reqipass   ^User-Agent:\.*(Mozilla|MSIE)
reqitarpit ^User-Agent:

# block bad guys
acl badguys src 10.1.0.3 172.16.13.20/28
reqitarpit . if badguys

retries <value> 当对server的connection失败后,重试的次数
rspadd <string> [{if | unless} <cond>] response 增加信息
rspdel  <search> [{if | unless} <cond>]
rspidel <search> [{if | unless} <cond>]  (ignore case)
rspdeny  <search> [{if | unless} <cond>]
rspideny <search> [{if | unless} <cond>]  (ignore case)
rsprep  <search> <string> [{if | unless} <cond>]
rspirep <search> <string> [{if | unless} <cond>]  (ignore case)
以上和request 的差不多

source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server

一些timeout

srvtimeout <timeout> server 处理超时,不赞成设置
timeout check                             X          -         X         X
timeout client                            X          X         X         -
timeout clitimeout          (deprecated)  X          X         X         -
timeout connect                           X          -         X         X
timeout contimeout          (deprecated)  X          -         X         X
timeout http-keep-alive                   X          X         X         X
timeout http-request                      X          X         X         X
timeout queue                             X          -         X         X
timeout server                            X          -         X         X
timeout srvtimeout          (deprecated)  X          -         X         X
timeout tarpit                            X          X         X         X

stats auth <user>:<passwd> 监控统计的帐号和密码
backend public_www
server srv1 192.168.0.1:80
stats enable
stats hide-version
stats scope   .
stats uri     /admin?stats
stats realm   Haproxy\ Statistics
stats auth    admin1:AdMiN123
stats auth    admin2:AdMiN321

# internal monitoring access (unlimited)
backend private_monitoring
stats enable
stats uri     /admin?stats
stats refresh 5s

还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧