HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy功能
补充一点。
什么是正向代理?
在家访问xxoo网站,不希望xxoo网站知道我们的真实ip,于是就找一个proxy,通过proxy来访问,此时proxy代表用户,xxoo网站获取到的IP是proxy的IP。
什么是反向代理?
xxoo网站有很多服务器提供服务,xxoo网站通过一个proxy对外提供一个IP接受用户的请求,然后将请求分发到下面的服务器,这里的proxy对于xxoo网站的其他服务器来说就是反向代理。
组合起来:
你 -> proxy(正向代理) -> proxy(反向代理) -> xxoo网站服务器集群
四层:
lvs, nginx(stream),haproxy(mode tcp)
七层:
http: nginx(http, ngx_http_upstream_module), haproxy(mode http), httpd, ats, perlbal, pound…
apt 安装
# apt search haproxy
# apt-get install haproxy
HAproxy组成
程序环境
服务启停:
systemctl status haproxy
systemctl stop haproxy
systemctl start haproxy
systemctl restart haproxy
haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
haproxy.service
[Unit]
Description=HAProxy Load Balancer
Documentation=man:haproxy(1)
Documentation=file:/usr/share/doc/haproxy/configuration.txt.gz
After=network.target syslog.service
Wants=syslog.service
[Service]
Environment=CONFIG=/etc/haproxy/haproxy.cfg
EnvironmentFile=-/etc/default/haproxy
ExecStartPre=/usr/sbin/haproxy -f ${CONFIG} -c -q
ExecStart=/usr/sbin/haproxy-systemd-wrapper -f ${CONFIG} -p /run/haproxy.pid $EXTRAOPTS
ExecReload=/usr/sbin/haproxy -c -f ${CONFIG}
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
Restart=always
[Install]
WantedBy=multi-user.target
haproxy -h
# haproxy -h
HA-Proxy version 1.6.3 2015/12/25
Copyright 2000-2015 Willy Tarreau <willy@haproxy.org>
Usage : haproxy [-f <cfgfile>]* [ -vdVD ] [ -n <maxconn> ] [ -N <maxpconn> ]
[ -p <pidfile> ] [ -m <max megs> ] [ -C <dir> ] [-- <cfgfile>*]
-v displays version ; -vv shows known build options.
-d enters debug mode ; -db only disables background mode.
-dM[<byte>] poisons memory with <byte> (defaults to 0x50)
-V enters verbose mode (disables quiet mode)
-D goes daemon ; -C changes to <dir> before loading files.
-q quiet mode : don't display messages
-c check mode : only check config files and exit
-n sets the maximum total # of connections (2000)
-m limits the usable amount of memory (in MB)
-N sets the default, per-proxy maximum # of connections (2000)
-L set local peer name (default to hostname)
-p writes pids of all children to this file
-de disables epoll() usage even when available
-dp disables poll() usage even when available
-dS disables splice usage (broken on old kernels)
-dV disables SSL verify on servers side
-sf/-st [pid ]* finishes/terminates old pids.
配置分为命令行配置(优先级最高)和配置文件(haproxy.cfg).
haproxy.cfg主要有两部分组成:global和proxies配置段
global:全局配置段
proxies:代理配置段
我们已经安装了HAProxy, 但HAProxy不是web服务器,所以我们再安装一个nginx配合测试(其他文章会再介绍nginx的)。
# apt-get install nginx
安装完成,访问一下:http://192.168.111.11/ (根据你自己的机器IP更改)
我们开始配置HAProxy来访问nginx.
# cd /etc/haproxy
# cp haproxy.cfg haproxy.cfg.default
# vim haproxy.cfg
更改haproxy.cfg内容如下:
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:81
default_backend servers
backend servers
server server1 127.0.0.1:80 maxconn 32
reload or restart haproxy.
systemctl reload haproxy
访问:http://192.168.111.11:81/
上面的haproxy.cfg还可以使用如下的配置替代:
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen http-in
bind *:81
server server1 127.0.0.1:80 maxconn 32
在配置haproxy时如果需要用到特殊字符,如#, 则需使用转义,转义符号(\).
haproxy有两种引用:弱引用,双引号括起来的引用,里面可以使用转义符号,强引用,单引号括起来的引用,里面不可以使用转义字符。
空格在haproxy配置中作为分隔符,如果确实需要输入空格作为字符串,则需要转义\
.
#
是注释, 如果需要输入#同样需要转义\#
.
弱引用中可以使用$
符号获取变量的值,强引用中$
符号作为字符串使用。
# 下面的这样是等价的
log-format %{+Q}o\ %t\ %s\ %{-Q}r
log-format "%{+Q}o %t %s %{-Q}r"
log-format '%{+Q}o %t %s %{-Q}r'
log-format "%{+Q}o %t"' %s %{-Q}r'
log-format "%{+Q}o %t"' %s'\ %{-Q}r
# 下面的这些也是等价的
reqrep "^([^\ :]*)\ /static/(.*)" \1\ /\2
reqrep "^([^ :]*)\ /static/(.*)" '\1 /\2'
reqrep "^([^ :]*)\ /static/(.*)" "\1 /\2"
reqrep "^([^ :]*)\ /static/(.*)" "\1\ /\2"
haproxy配置可以使用变量,变量只能在双引号中通过$符号取值。
bind "fd@${FD_APP1}"
log "${LOCAL_SYSLOG}:514" local0 notice # send to local server
user "$HAPROXY_USER"
时间在haproxy中默认是毫秒,当然也可以自己指定时间单位。
全局配置一般是系统配置,一般配置一次几乎都不需要改变的,有些配置可以通过命令行去覆盖。
具体见:http://cbonte.github.io/haproxy-dconv/1.6/configuration.html#3
过程管理和安全
性能优化
调试
本次的分享到此结束,希望对你有所帮助。
如果你对我分享的内容感兴趣,欢迎扫码关注公众号:新质程序猿,并设置星标,推送更实时哟!