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 挂载后会如下图所示:

此时访问 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