Centos6源码安装Haproxy进行四层代理

一.背景

    公司使用专线与第三方公司进行系统交互,给定了我们业务IP的使用范围,防火墙策略只开放业务IP范围之内的IP地址才能访问,如果源IP不在业务IP范围之内,那么通过互联IP过去是访问不了的。我们的做法是为了不影响现有业务,找一台服务器配置业务IP,然后通过台服务器做4层代理进行转发即可。 四层代理常见的开源方案有Haproxy、Nginx等,Nginx一般用来做7层代理相对较多,不过也支持4层代理。本着最简单和高效的原则,最终选定Haproxy理由如下:

    1.软件体积小,高性能、稳定。

    2.我们的需求只是做4层代理,7层代理不需要,尽管Haproxy也支持7层代理,但是它最初的优势就是4层代理。

    3.专业的事交给专业的人,软件也是如此,强调4层代理建议使用Haproxy而非Nginx, 尽管Nginx也可以做到。

如果是Centos7安装Haproxy也很简单了,直接yum install haproxy, 配置一下haproxy.cfg,启动systemctl start haproxy即可。 但是之前的系统是Centos6.3, 属于相对很老的系统。Centos6的yum源已经停止更新和支持,不能直接使用yum安装, 所以只能考虑在Centos6上进行源码安装。

二.安装流程

1.下载源码包

可以下载自己指定的版本, 具体版本下载列表网址: http://www.haproxy.org/

1
wget http://www.haproxy.org/download/1.4/src/haproxy-1.4.27.tar.gz

2.解压、make

(可以查看README文件,查看make更多预编译参数)

一般没有特殊参数要求指定,指令2个参数即可:

TARGET = linux26 #首先查看uname -r, Linux内核是多少版本,查看README文件可以看到这个参数的解释,我服务的内核版本是2.6,所以使用linux26

ARCH = x86_64 #代表服务器是的CPU架构和系统位数, 我的是x86架构,64位操作系统

1
2
3
tar -zxvf haproxy-1.4.27.tar.gz 
cd haproxy-1.4.27
make TARGET=linux26 ARCH=x86_64

3.预编译make没报错则可以make install

可以设置PREFIX为软件安装目录

1
make install PREFIX=/usr/local/haproxy

4.添加service脚本管理服务

直接使用Haproxy命令管理服务不是很方便,我们还是习惯了使用service命令来管理服务。所以我们需要添加一下自定义service, 使用service来管理Haproxy服务。

Centos6可以添加service脚本,用service命令来管理haproxy:

1
2
3
service haproxy check #检查配置文件语法是否正确
service haproxy status #查看服务运行状态
service haproxy start/stop/restart #服务启动、停止、重启

在/etc/init.d/新增haproxy文件(附加可执行权限, chmod +x haproxy),文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/bin/sh
#
# haproxy
#
# chkconfig: - 85 15
# description: HAProxy is a free, very fast and reliable solution \
# offering high availability, load balancing, and \
# proxying for TCP and HTTP-based applications
# processname: haproxy
# config: /etc/haproxy/haproxy.cfg
# pidfile: /var/run/haproxy.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

exec="/usr/local/haproxy/sbin/haproxy"
prog=$(basename $exec)

[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog

cfgfile=/etc/haproxy/haproxy.cfg
pidfile=/var/run/haproxy.pid
lockfile=/var/lock/subsys/haproxy

check() {
$exec -c -V -f $cfgfile $OPTIONS
}

start() {
$exec -c -q -f $cfgfile $OPTIONS
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi

echo -n $"Starting $prog: "
# start it up here, usually something like "daemon $exec"
daemon $exec -D -f $cfgfile -p $pidfile $OPTIONS
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}

stop() {
echo -n $"Stopping $prog: "
# stop it here, often "killproc $prog"
killproc $prog
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}

restart() {
$exec -c -q -f $cfgfile $OPTIONS
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi
stop
start
}

reload() {
$exec -c -q -f $cfgfile $OPTIONS
if [ $? -ne 0 ]; then
echo "Errors in configuration file, check with $prog check."
return 1
fi
echo -n $"Reloading $prog: "
$exec -D -f $cfgfile -p $pidfile $OPTIONS -sf $(cat $pidfile)
retval=$?
echo
return $retval
}

force_reload() {
restart
}

fdr_status() {
status $prog
}

case "$1" in
start|stop|restart|reload)
$1
;;
force-reload)
force_reload
;;
check)
check
;;
status)
fdr_status
;;
condrestart|try-restart)
[ ! -f $lockfile ] || restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|try-restart|reload|force-reload}"
exit 2
esac

5.Haproxy.cfg配置文件模板

默认配置文件路径: /etc/haproxy/haproxy.cfg
文件内容样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
global
defaults
log global
mode tcp
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000

#监听代理,对方->我方API 转发
frontend listen-api-in
bind *:9001
default_backend listen-api-out

backend listen-api-out
server server1 10.23.50.11:9001 maxconn 20480

#代理转发,我方->对方API 转发
frontend call-api-in
bind *:13001
default_backend call-api-out

backend call-api-out
server server1 10.24.112.201:13001 maxconn 20480