一.背景
公司使用专线与第三方公司进行系统交互,给定了我们业务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/
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位操作系统
tar -zxvf haproxy-1.4.27.tar.gz
cd haproxy-1.4.27
make TARGET=linux26 ARCH=x86_64
3.预编译make没报错则可以make install
可以设置PREFIX为软件安装目录
make install PREFIX=/usr/local/haproxy
4.添加service脚本管理服务
直接使用Haproxy命令管理服务不是很方便,我们还是习惯了使用service命令来管理服务。所以我们需要添加一下自定义service, 使用service来管理Haproxy服务。
Centos6可以添加service脚本,用service命令来管理haproxy:
service haproxy check #检查配置文件语法是否正确
service haproxy status #查看服务运行状态
service haproxy start/stop/restart #服务启动、停止、重启
在/etc/init.d/新增haproxy文件(附加可执行权限, chmod +x haproxy),文件内容如下:
#!/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
文件内容样例:
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