haproxy 基本应用


目录
  • 1 基于 cookie 实现会话绑定
  • 2 基于 uri 实现调度
  • 3 基于 hdr 实现调度
  • 4 基于 lamp 部署 discuz,实现动静分离
  • 5 用 keepalived 高可用 haproxy

1 基于 cookie 实现会话绑定

frontend webserver
        bind *:80
        use_backend websrvs

backend websrvs
        cookie SERVERID insert nocache indirect    # 将浏览器 cookie 插入到 backend server 原有 cookie 中,后两项可以不加
        server web1 192.168.2.11:80 check cookie web1srv
        server web2 192.168.2.12:80 check cookie web2srv    # 每个 server 有其唯一的 cookie 标识

有 cookie 时怎么操纵 cookie:

nocache:不允许缓存
indirect:间接的方式实现 cookie 生效

2 基于 uri 实现调度

frontend webserver
        bind *:80
        use_backend websrvs

backend websrvs
        balance uri    # 指明 uri 调度算法
        hash-type consistent    # 一致性哈希
        server web1 192.168.2.11:80 check
        server web2 192.168.2.12:80 check

3 基于 hdr 实现调度

frontend webserver
        bind *:80
        use_backend websrvs

backend websrvs
        balance hdr (User-Agent)    # 根据请求报文中 User-Agent 首部的值做 hash
        hash-type consistent    # 一致性 hash
        server web1 192.168.2.11:80 check
        server web2 192.168.2.12:80 check

4 基于 lamp 部署 discuz,实现动静分离

mariadb-server:node4:192.168.2.14,非关键配置步骤省略

静态服务器:
	node1:192.168.2.11
	node4:192.168.2.14:这里我们把 14 也作为静态 web
动态服务器:
	node2:192.179.2.12
	
调度器:
	node3:192.168.2.13

node4:
配置 mariadb-server:

create database discuz;
grant all on discuz.* to dzadmin@'192.168.2.%' identified by '123456';
grant all on discuz.* to dzadmin@'localhost' identified by '123456';

node2:作为动态服务器,需要和 mysql 交互,所以我们就先在它上面先部署 discuz 好了

yum install httpd php php-mysql    # 部署为一个动态服务器,这里我们就以模块化方式结合 php 工作,fpm 方式安装 php-fpm 即可

下载 discuz:
wget https://gitee.com/3dming/DiscuzL/attach_files/891046/download
或者
wget http://download.comsenz.com/DiscuzX/3.3/Discuz_X3.3_SC_UTF8.zip

cp -a  upload/* /var/www/html/    # 只需要 upload 这个文件夹里的内容就好,复制到网站根目录

cp config_global_default.php config_global.php    # 复制这两个配置文件
cp config_ucenter_default.php config_ucenter.php

cd /var/www/html      
chown -R apache.apache ./*        # 修改 属主属组

浏览器访问: 192.168.2.11/install/index.php        # 页面安装 discuz

scp -r /var/www/html/* root@192.168.2.11:/var/www/html/    # 11 和 14 都拷贝一份,并在 11 和 14 上把属主属组都改为 apache

这里恰巧 apache 用户的 uid 相同,我们有意让 192。168.2.14 上 apache 用户的 uid 和 12 上不一样,等下挂载时看有何区别
因为 node4 上 apache 用户 uid 和 node2 不一样,所以 node4 挂载后会如下图所示:
![image](https://img2020.cnblogs.com/blog/597917/202201/597917-20220105184231899-1646022056.png)
此时访问 node4 的 web 服务是访问不了的
这种情况怎么办呢?
node2 共享文件的时候可以压缩所有用户为nfsnobody,然后 node1 和 node4 都会创建这么一个用户,由于 uid 是 65534 这个数值足够大,一般不会冲突;当然也可以明确指定压缩后的 uid 为 0
还需要给 data 目录执行权限
下面进行配置

我们将 node2 作为 nfs 服务器

yum install nfs-utils -y
discuz 中需要共享出去两个目录:
/data   -----数据缓存及附件
/static -----静态文件

共享这两个目录:vim /etc/exports
/var/www/html/data 192.168.2.11(rw,all_squash,anonuid=0,insecure) 192.168.2.14(rw,all_squash,anonuid=0,insecure)
/var/www/html/static 192.168.2.11(rw,all_squash,anonuid=0,insecure) 192.168.2.14(rw,all_squash,anonuid=0,insecure)

chmod -R +x /var/www/html/data

node1 和 node 4 挂载 上面两个目录:

mount -t nfs 192.168.2.12:/var/www/html/data /var/www/html/data
mount -t nfs 192.168.2.12:/var/www/html/static /var/www/html/static

实现动静分离:
node3 作为负载均衡器:

frontend  dz
    bind *:80
    acl url_static       path_beg       -i /data /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js .html .ico

    use_backend static          if url_static
    default_backend             dyn

backend dyn
        balance roundrobin
        server node2 192.168.2.12:80 check


backend static
        balance roundrobin
        server ndoe1 192.168.2.11:80 check
        server node4 192.168.2.14:80 check

5 用 keepalived 高可用 haproxy