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这个后端群组