Haproxy 基本使用
Posted 运维闲聊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haproxy 基本使用相关的知识,希望对你有一定的参考价值。
简要说明
前面说到如何编译安装 haproxy,在这一篇中带大家体验下的 haproxy 中的一些基本使用和操作
haproxy 功能
HAProxy是TCP / HTTP反向代理服务器,尤其适合于高可用性高并发环境:
可以针对HTTP请求添加cookie,进行路由后端服务器
可平衡负载至后端服务器,并支持持久连接
支持基于cookie进行调度
支持所有主服务器故障切换至备用服务器
支持专用端口实现监控服务
支持不影响现有连接情况下停止接受新连接请求
可以在双向添加,修改或删除HTTP报文首部
支持基于pattern实现连接请求的访问控制
通过特定的URI为授权用户提供详细的状态信息
历史版本更新功能:
1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.1 2.2-dev
haproxy 组成
程序环境:
主程序:/usr/sbin/haproxy
配置文件:/etc/haproxy/haproxy.cfg
Unit file:/usr/lib/systemd/system/haproxy.service
配置段:
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端,适用于一对一环境
Haproxy-global 配置
# 有的参数在1.5版本中添加后启动失败的不支持,像1.5不支持CPU绑定的
global配置参数:
官网地址:https://cbonte.github.io/haproxy-dconv/2.0/configuration.html#3
chroot #锁定运行目录
deamon #以守护进程运行
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #socket文件
user, group, uid, gid #运行haproxy的用户身份
nbproc #开启的haproxy进程数,与CPU保持一致
nbthread #指定每个haproxy进程开启的线程数,默认为每个进程一个线程
cpu-map 1 0 #绑定haproxy 进程至指定CPU
maxconn #每个haproxy进程的最大并发连接数
maxsslconn #SSL每个haproxy进程ssl最大连接数
maxconnrate #每个进程每秒最大连接数
spread-checks #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间
pidfile #指定pid文件路径
log 127.0.0.1 local3 info #定义全局的syslog服务器;最多可以定义两个
global 配置示例
[root@dklwj-node01 haproxy]# vim haproxy.cfg
global
maxconn 100000
chroot /usr/local/haproxy
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
# 使用系统为99的ID号的用户,也可以创建haproxy用户来运行
uid 99
gid 99
daemon
# 绑定CPU核心数,需要根据你服务器上实际CPU核心数情况来配置
nbproc 2
cpu-map 1 0
cpu-map 2 1
pidfile /usr/local/haproxy/run/haproxy.pid
log 127.0.0.1 local3 info
# 在系统中ID号为99的用户是nobody
[root@dklwj-node01 haproxy]# id 99
uid=99(nobody) gid=99(nobody) groups=99(nobody)
# 没改之前运行的用户可以看到它是以系统上nobody用户来运行的
[root@dklwj-node01 haproxy]# ps -ef | grep haproxy
root 1317 1 0 11:19 ? 00:00:02 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -p /run/haproxy.pid
nobody 1320 1317 0 11:19 ? 00:00:04 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -p /run/haproxy.pid
nobody 1321 1317 0 11:19 ? 00:00:04 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -p /run/haproxy.pid
root 1584 1279 0 20:35 pts/0 00:00:00 grep --color=auto haproxy
# 创建haproxy用户并把haproxy运行用户改成haproxy的ID即可重启haproxy服务
[root@dklwj-node01 haproxy]# useradd -s /sbin/nologin haproxy
# 查看创建好的haproxyID号,再把它的ID号在配置文件中修改
[root@dklwj-node01 haproxy]# id haproxy
uid=1000(haproxy) gid=1000(haproxy) groups=1000(haproxy)
[root@dklwj-node01 haproxy]# vim haproxy.cfg
global
maxconn 100000
chroot /usr/local/haproxy
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 1000
gid 1000
# 重启haproxy服务
[root@dklwj-node01 haproxy]# systemctl restart haproxy
# 查看重启后端口是否正常监听
[root@dklwj-node01 haproxy]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:9999 *:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:22 [::]:*
# 再次查看haproxy的运行用户是谁
[root@dklwj-node01 haproxy]# ps -ef | grep haproxy
root 1605 1 0 20:38 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -p /run/haproxy.pid
haproxy 1608 1605 0 20:38 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -p /run/haproxy.pid
haproxy 1609 1605 0 20:38 ? 00:00:00 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf -p /run/haproxy.pid
root 1612 1279 0 20:39 pts/0 00:00:00 grep --color=auto haproxy
HAProxy Proxies 配置
defaults [<name>] #默认配置项,针对以下的frontend、backend和lsiten生效,可以多个name
frontend <name> #前端servername,类似于Nginx的一个虚拟主机 server。
backend <name> #后端服务器组,等于nginx的upstream
listen <name> #将frontend和backend合并在一起配置
注:name字段只能使用”-”、”_”、”.”、和”:”,并且严格区分大小写,例如:Web和web是完全不同的两组服务器。
官方原文
All proxy names must be formed from upper and lower case letters, digits,
'-' (dash), '_' (underscore) , '.' (dot) and ':' (colon). ACL names are
case-sensitive, which means that "www" and "WWW" are two different proxies.
Proxies 配置- defaults
defaults 配置参数:
* option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器
* option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
* option http-keep-alive 60#开启会话保持
* option forwardfor #开启IP透传
* mode http #默认工作类型
* timeout connect 120s #连接到一台后端server的最长时间
* timeout client 600s #与客户端的最长空闲时间
* timeout server 600s #等待服务端的超时时长
* timeout http-keep-alive 120s #session 会话保持时间
* #timeout check 5s #对后端服务器的检测超时时间
frontend/backend 配置参数
# frontend配置参数
bind:指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
* bind [<address>]:<port_range> [, ...] [param*]
* mode http/tcp #指定负载协议类型
* use_backend backend_name #调用的后端服务器组名称
# backend配置参数
mode http/tcp/health #指定负载协议类型
option #配置选项
server #定义后端real server
注意:
option后面加httpchk,smtpchk, mysql-check, pgsql-check,ssl-hello-chk方法,可用于实现更多应用层检测功能。
后端服务器状态监测及相关配置
check #对指定real进行健康状态检查,默认不开启
* addr IP #可指定的健康状态监测IP
* port num #指定的健康状态监测端口
* inter num #健康状态检查间隔时间,默认2000 ms
* fall num #后端服务器失效检查次数,默认为3
* rise num #后端服务器从下线恢复检查次数,默认为2
* weight #默认为1,最大值为256,0表示不参与负载均衡
* backup #将后端服务器标记为备份状态
* disabled #将后端服务器标记为不可用状态
* redirect prefix http://www.dklwj.com/ #将请求临时重定向至其它URL,只适用于http模式
* maxconn <maxconn>:当前后端server的最大并发连接数
* backlog <backlog>:当server的连接数达到上限后的后援队列长度
frontend/ backend 示例
[root@dklwj-node01 haproxy]# cat haproxy.cfg
global
maxconn 100000
chroot /usr/local/haproxy
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 1000
gid 1000
daemon
# 绑定CPU核心数
nbproc 2
cpu-map 1 0
cpu-map 2 1
pidfile /usr/local/haproxy/run/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth admin:12345678
frontend WEB_PORT_80
bind 172.20.7.50:80
mode http
use_backend web_port_http_80
frontend web_80
bind 172.20.7.50:80
mode http
use_backend Web_port_http_80
# 在定义后端后端服务器时只要名称中有一个字母是大写的就已经被视为另外一组服务器在开头已经介绍过在定义服务器组时对大小写很敏感虽然名称看上去都是一样其实在调度时被分配到不同的backend中去了
backend web_port_http_80
# server 后面最好是跟着要调度服务器的IP经过之前测试动态上下线服务器能更好的知道是哪台
server 172.20.7.54 172.20.7.54:80 check inter 3000 fall 3 rise 5
server 172.20.7.55 172.20.7.55:80 check inter 3000 fall 3 rise 5
backend Web_port_http_80
server 172.20.7.54 172.20.7.54:80 check inter 3000 fall 3 rise 5
server 172.20.7.55 172.20.7.55:80 check inter 3000 fall 3 rise 5
# 重启haproxy
[root@dklwj-node01 haproxy]# systemctl restart haproxy
[root@dklwj-node01 haproxy]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:9999 *:*
LISTEN 0 128 172.20.7.50:80 *:*
LISTEN 0 128 172.20.7.50:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:22 [::]:*
# 使用客户端访问haproxy地址
[root@dklwj-node05 ~]# curl http://172.20.7.50
<h1>Web Test Page 1</h1>
[root@dklwj-node05 ~]# curl http://172.20.7.50
<h1>Web Test Page 2</h1>
[root@dklwj-node05 ~]#
Proxies 配置- listen
使用listen替换frontend和backend的配置方式:
[root@dklwj-node01 haproxy]# cat haproxy.cfg
global
maxconn 100000
chroot /usr/local/haproxy
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 1000
gid 1000
daemon
# 绑定CPU核心数
nbproc 2
cpu-map 1 0
cpu-map 2 1
pidfile /usr/local/haproxy/run/haproxy.pid
log 127.0.0.1 local3 info
defaults
option http-keep-alive
option forwardfor
maxconn 100000
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth admin:12345678
#frontend WEB_PORT_80
# bind 172.20.7.50:80
# mode http
# use_backend web_port_http_80
#frontend web_80
# bind 172.20.7.50:80
## mode http
# use_backend Web_port_http_80
#
#backend web_port_http_80
# server 172.20.7.54 172.20.7.54:80 check inter 3000 fall 3 rise 5
# server 172.20.7.55 172.20.7.55:80 check inter 3000 fall 3 rise 5
#backend Web_port_http_80
# server 172.20.7.54 172.20.7.54:80 check inter 3000 fall 3 rise 5
# server 172.20.7.55 172.20.7.55:80 check inter 3000 fall 3 rise 5
# 使用listen直接代替frontend和backend简单方便 不过还得看需求噢
listen web_port_80
bind 172.20.7.50:80
mode http
option forwardfor
server 172.20.7.54 172.20.7.54:80 check inter 3000 fall 3 rise 5
server 172.20.7.55 172.20.7.55:80 check inter 3000 fall 3 rise 5
# 重启服务
[root@dklwj-node01 haproxy]# !syste
systemctl restart haproxy
[root@dklwj-node01 haproxy]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:9999 *:*
LISTEN 0 128 172.20.7.50:80 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:22 [::]:*
# 在客户端上尝试访问
[root@dklwj-node05 ~]# curl http://172.20.7.50/index.html
<h1>Web Test Page 1</h1>
[root@dklwj-node05 ~]# curl http://172.20.7.50/index.html
<h1>Web Test Page 2</h1>
后续持续更新haproxy一些基本使用操作..........
文章中有错误的地方还望各位大佬留言指出多谢了
以上是关于Haproxy 基本使用的主要内容,如果未能解决你的问题,请参考以下文章