1.  haproxy  (ACL 规则见文本结尾)

 发布:

sudo docker run -itd  --restart=always --net=host --name haproxy -v /opt/docker/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro  haproxy:2.7.4

 

 

vim   /opt/docker/haproxy/haproxy.cfg

haproxy.cfg
# ################Global settings #############
global
    log         127.0.0.1 local2
    daemon
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout client          1m
    timeout http-keep-alive 10s

    ########## Sea add #######
    maxconn                 5000 #默认的最大连接数
    option redispatch        #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
    option abortonclose      #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
    option dontlognull       #日志中不记录负载均衡的心跳检测记录
    timeout connect 5s   #连接超时
    timeout client 30s   #客户端超时
    timeout server 30s   #服务器超时
    timeout check 10s      #=心跳检测超时


# ########### Stats monitor  #########

frontend stats_monitor
        bind    0.0.0.0:30001
        stats   enable
        stats   uri     /ha-stats
        stats   auth    admin:admin
        stats   admin   if      TRUE
        stats   refresh 5s
        stats   realm   baison-test-Haproxy
#       stats   hide-version


############ Application ###########

################ 例 1 代理web 服务   ################
listen  product-web
        bind 0.0.0.0:19359
        mode tcp
        # 负载均衡算法
        # static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
        balance roundrobin
        # 日志格式
        option tcplog
        # 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
        server product_web_node1 192.168.18.51:9999/ check weight 1 maxconn 2000
        #server product_web_node2 192.168.18.51:9999/ check weight 1 maxconn 2000
        # 使用keepalive检测死链
        # option tcpka


################ 例 2:frontend+backend 模式  配置里面可以定义多个acl进行匹配操作  ##########################
frontend WEB_PORT_7788
        bind 0.0.0.0:7788
        mode http
        ########acl策略配置 此处安装path #############
        acl cbb_web path_beg -i /cbb
        acl dep_web path_beg -i /dep
        use_backend web_prot7788_dep  if  cbb_web
        use_backend web_prot7788_cbb  if  cbb_web
        
        #default_backend
        default_backend    web_prot7788_cbb



backend web_prot7788_dep
        mode http
        option forwardfor
        http-request replace-path  ^/dep/(.*) /\1  #去掉/dep  用于代理动态API
        server dep_node1 192.168.18.51:9998/ check inter 3000 fall 3 rise 5

backend web_prot7788_cbb
        mode http
        option forwardfor
        http-request replace-path  ^/cbb/(.*) /\1  #去掉/cbb 
        server cbb_node1 192.168.18.51:9999/ check inter 3000 fall 3 rise 5

 https://www.cnblogs.com/fgxwan/p/16906387.html


2. 使用ngnix 代理mysql

sudo docker run -itd --restart=always --name=sea_ngnix  --net=host -v /opt/docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro  nginx:1.23.3

 

vim    /opt/docker/ngnix/ngnix.conf

nginx.conf
#user  nobody;
worker_processes  2;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {worker_connections  4096;}


stream {
     # 代理mysql
     upstream mysql_server {
        server 172.17.0.2:3306 max_fails=2 fail_timeout=5s weight=1;
     }

     server {
        listen 63306;
     proxy_timeout 60s; proxy_pass mysql_server; } } ###### start http ####### http { include mime.types; default_type application
/octet-stream; charset utf-8,gbk; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } } ###### 反向代理,其他服务 ##### upstream airapi { server 192.168.18.51:1935; } server { listen 8888; server_name localhost; location / { proxy_pass http://airapi; index index.html index.htm; } } }

 

 

 

ngnix  Steam 端口复用, 同一个端口,不同域名,代理不同服务

 
stream {
  map $ssl_preread_server_name $selected_upstream {
    example1.org upstream_1;
    example2.org upstream_2;
  }

  upstream upstream_1 { server 10.0.0.1:443; }
  upstream upstream_2 { server 10.0.0.2:443; }

  server {
    listen 443;
    proxy_pass $selected_upstream;
    ssl_preread on;
  }
}

 

 

 

 

 

HAproxy ACL书写规则 (详见 link:https://blog.csdn.net/shm19990131/article/details/104972945)

通过ACL控制列表,实现基于 HAproxy的只能负载均衡系统 

ACL主要完成功能:2种

1、通过设置的AC规则检查客户端请求是否合法,如果符合ACL规则要求,则进行放行

2、符合的ACL规则要求的请求将被提交到后端的backend服务器集群,进行实现基于ACL的动静分离负载均衡。

 

ACL规则写入方法

acl 自定义的acl名称 acl方法 -i [匹配的路径或文件]
-i 不区分大小写

匹配方法注解例子
hdr_reg(host) 多条完全合格域名检测 hdr_reg(host) -i www.shm.com I baidu.shm.com
hdr_dom(host) 单条完全合格域名检测 hdr_dom(host) -i www.shm.com
hdr_beg(host) 以某个域名开头 hdr_beg(host) img. ftp. video. www.
path_beg url以什么开头进行检测 path_beg www. 一般很少用
path_end url以什么结尾进行检测 path_end .gif .png .jpg .css .js .jsp .php
url_sub url包含某段字符串进行检测 url_sub buy_sid= 一般很少用
url_dir url包含部分地址路径进行检测 url_dir timetask


详细ACL规则写入:

一、根据域名匹配

1.hdr_reg(host)
acl www_prolicy hdr_reg(host) -i www.shm.com|web.shm.com
如果客户端以 www.shm.com /web.shm.com的域名发送请求,-i忽略大小。此处一般为FQDN

2.hdr_dom(host)
acl www_prolicy hdr_dom(host) -i lvs.shm.com
如果客户端请求的域名满足 lvs.shm.com -i 忽略大小

3.hdr_beg(host)
acl www_prolicy hdr_beg(host) -i img. video. download. ftp.
如果客户端以 img. video. ftp.为开头的域名发送请求 -i 忽略大小

4.url_sub
acl www_prolicy url_sub -i buy_sid=
如果客户端请求的url中包含 buy_sid ,则控制列表返回 true ,否则为 flase

5.url_dir
acl www_prolicy url_dir -i timetask
如果客户端请求的url 中包含 timetask ,则控制策略返回 true,否则为 flase

二、根据请求的页面格式进行匹配

1.path_end
acl url_static path_end .gif .png .jpg .css .js
如果客户端请求的URL中以 .gif .png 。。。结尾返回true

2.php / jsp 页面动静分离
acl url_php path_end .php
acl url_jsp path_end .jsp
如果客户端请求的URL中以 .php / .jsp 结尾 返回true

三、控制列表指向后端真实服务器群组

1、use_backend + backend实例名			表示满足ACL规则后去请求哪个backend实例
2、default_backend + backend实例名		表示没有满足ACL规则后 去默认请求哪个 backend实例
3、block if  + acl策略名				表示阻止该ACL列表的请求

 

use_backend 真实服务器群组名 if ACL规则列表名
use_backend server_bbs if bbs_policy
当用户发送的请求满足 bbs_policy 的ACL规则时,HAproxy就会把请求发往 server_bbs这个真实服务器群组进行匹配

default_backend 真实服务群组名

default_backend server_cache
当用户发送的请求不满足任何一个acl规则时,HAproxy就会把请求发往由default_backend选项指定的server_cache这个后端群组












posted on 2023-03-15 19:30  lshan  阅读(100)  评论(0编辑  收藏  举报