编译安装配置 haproxy 笔记

梨子2016-11-30
本文最后更新于 1046 天前(2016-11-30),其中的信息可能已经有所发展或者不再适用于现阶段。
本文全长 931 字,全部读完大约需要 3 分钟。

因为浑南校区 v6 不稳定,最近尝试在树莓派上搭建一条 tunnel 来方便浑南的同学连上 v6 的梯子。之前试过用 haproxy 中转代理 ss 加速,所以这次试验的环境就是在 Raspbian (Debian Jessie) 上配置 haproxy。

haproxy 是个很好的负载均衡软件,它可以实现对若干目标服务器的转发,可以定义各种复杂的逻辑。咱这次就是为了让 haproxy 将树莓派的一些端口直接映射到日本等服务器上的远程端口上,这样就可以通过 v4 走树莓派代理再通过 v6 走境外 ss 节点的代理上网了。

首先我们要安装 haproxy。这里千万不要从源上装,官方已经出了 1.7 稳定版了源上的甚至还停留在 1.5。如果已经装了要查看你用的是哪个版本

haproxy -vv

同时这个命令还可以看出 HAProxy 的详细编译构建信息,

OPTIONS = USE_GETADDRINFO=1

如果有这个选项的话则支持 ipv6,笔者此前不知道这件事,怎么配置服务都起不来,好气啊

顺着关键词搜索可以看到 GitHub 中的 haproxy 说明文档下有这么一行

Recent systems can resolve IPv6 host names using getaddrinfo().

所以我们要编译最新的 haproxy

进入官网 http://www.haproxy.org/,找到 1.7 稳定版的最新发布版,下载后解压、编译、构建。

考虑到后期的扩展性,你很可能需要 lua, 因此需要先将 lua5.3 的头文件和库准备好(不需要 lua 支持的话就不用 USE_LUA=1)。简单起见,到 http://haproxy.debian.net/ 找到适合自己发行版和 1.7-stable 的 ppa,按照上面的提示做到更新源(apt-get update)就可以,不用从这里安装。

更新后安装 lua 的开发版:

apt-get install lua

最新版的话应该是 5.3,如果没进行上面那一步更新的话是看不到 5.3 的,更新完了就会出来 5.3 版,按照提示把它装了就可以了。

编译 haproxy

cd ~/src/haproxy
wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.0.tar.gz # if blocked by XXX use proxychains
tar -xzvf haproxy-1.7.0.tar.gz
cd haproxy-1.7.0/
make CFLAGS='-I/usr/include/lua5.3 -O2 -g -fno-strict-aliasing -Wdeclaration-after-statement' USE_GETADDRINFO=1 USE_ZLIB=1 USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_PCRE_JIT=1 TARGET=linux2628

编译过程中可能会报错缺少某些头文件,遇到这种情况你就用 apt-get 把那些缺少的库都装了,然后再重新 make 就好了

make install

不知道为什么 make install 的时候不再给注册 init.d 的服务脚本了。编译完虽然有 haproxy 这个服务但是它不好使,服务运行了却没进程。之前看网上一个教程说 examples 文件夹下有这个服务脚本文件,然而我怎么试都不好使,自己魔改了半天,然后又从网上找了几份脚本,其中不乏给 centos 用的,反正在这里耽误了大量时间。这里给出一个正确可用的服务脚本

https://github.com/haproxytech/haproxy/blob/master/scripts/haproxy.init.debian

把它扔到 /etc/init.d,给它可执行权限,这样就好使了

配置 ss 服务器,这里简单给出一个配置文件,很容易懂不多解释了,编辑 /etc/haproxy/haproxy.cfg,在最下面加上

frontend ss-in
        bind *:port  ##中转端口
        default_backend ss-out
backend ss-out
        server server1 server_IP:port maxconn 20480  ##服务器 IP 和 SS 端口

之前是填上 v6 的 ip 和域名都不好使,我重新编译了以后用 v6 的 ip 可以了,域名还是不行,会出现 could not resolve host 类似的东西。折腾了半天也没解决,如果你知道解决方案极盼赐教)所以目前我还是用 ip 配置的QAQ

启动是这样

haproxy -f /etc/haproxy/haproxy.cfg

以系统服务启动

systemctl start haproxy

还有个问题,在我的系统里启动会失败,会爆出这个问题

Starting haproxy: haproxy[ALERT] 126/120540 (7363) : Starting frontend GLOBAL: cannot bind UNIX socket [/run/haproxy/admin.sock]

原因是没有 /run/haproxy 这个目录,创建一个这个目录就好了(参见http://stackoverflow.com/questions/30101075/haproxy-doesnt-start-can-not-bind-unix-socket-run-haproxy-admin-sock)。不过有个神奇的事是一重启这个目录就又没了,我暂时还不知道怎么回事。为了开机自动启动我在 /etc/init.d/haproxy 里加入了 mkdir 的代码,就可以随服务自动创建这个目录了。

除特殊说明以外,本网站文章采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。