http://www.ttlsa.com/linux/haproxy-study-tutorial/
https://www.sohu.com/a/166112427_151779
4层效率高于7层
haproxy实现访问控制,动静分离
haproxy实现读写分离
主备,读写分离,主从复制
tar zxf haproxy-1.7.3.tar.gz
cd haproxy-1.7.3
ls
Makefile 各模块之间的调用
rpm:redhat package manager
源码安装比较随意
##命令find -name *.spec有这个文件表示可以用源码软件包安装
[root@server1 haproxy-1.7.3]# find -name *.spec
./examples/haproxy.spec
yum install rpm-build pcre-devel gcc -y
gdb c语言调试工具
[root@server1 ~]# rpmbuild -tb haproxy-1.7.3.tar.gz
[root@server1 ~]# cd /root/rpmbuild/RPMS/x86_64/
[root@server1 x86_64]# ls haproxy-1.7.3-1.x86_64.rpm
[root@server1 x86_64]# rpm -ivh haproxy-1.7.3-1.x86_64.rpm
建立haproxy用户和组。利用linux对haporxy用户的访问控制实现对haporxy服务的控制
[root@server1 ~]# groupadd -g 200 haproxy
[root@server1 ~]# useradd -u 200 -g 200 -M haproxy ##-M参数表示不自动建立用户的登陆目录
[root@server1 ~]# id haproxy
uid=200(haproxy) gid=200(haproxy) groups=200(haproxy)
5.找到haproxy的配置文件,并复制到/etc/haproxy目录下
[root@server1 ~]# cd haproxy-1.7.3/examples/
[root@server1 examples]# cp content-sw-sample.cfg /etc/haproxy/haproxy.cfg
6.编辑配置文件
[root@server1 examples]# cd /etc/haproxy/
[root@server1 haproxy]# vim haproxy.cfg
global # 全局定义
maxconn 10000 # 最大连接数
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0 # 夲机日志
uid 200 # haproxy用户的uid
gid 200 # haproxy用户的gid
chroot /var/empty
daemon
defaults # 默认条件
mode http #默认使用 http 的 7 层模式 tcp: 4 层
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
stats uri /admin/stats ##监控页面 数据流量 F12显示细节
option prefer-last-server
retries 2
option redispatch
timeout connect 5s
timeout server 5s
# The public 'www' address in the DMZ
frontend public ##前端
bind *:80 name clear ##监听所有端口
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img } ##动静分离
#use_backend static if { path_beg /img /css }
default_backend static # 默认使用static后端服务器集群
# The static backend backend for 'Host: img', /img and /css.
backend static
balance roundrobin # 负载均衡算法rr
server statsrv1 172.25.99.2:80 check inter 1000 # 后端服务器server2
server statsrv2 172.25.99.3:80 check inter 1000 # 后端服务器server3
7. 然后在server2和server3上安装httpd,开启httpd,再编写默认发布内容
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# /etc/init.d/httpd start
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# vim index.html
server2
[root@server3 ~]# yum install httpd -y
[root@server3 ~]# /etc/init.d/httpd start
[root@server3 ~]# cd /var/www/html
[root@server3 html]# vim index.html
server3
8.
打开haproxy服务
[root@server1 ~]# /etc/init.d/haproxy start
9.在浏览器测试(轮循)
[root@server1 haproxy]# curl 172.25.99.1
server2
[root@server1 haproxy]# curl 172.25.99.1
server3
[root@server1 haproxy]# curl 172.25.99.1
server2
[root@server1 haproxy]# curl 172.25.99.1
server3
firefox
172.25.99.1/admin/stats
##监控页面 数据流量 F12显示细节
down一台httpd再次查看
172.25.99.1/monitoruri
##200ok --> 正常
定义用户和密码,以及刷新次数
用户为admin,密码是redhat,刷新次数为5s刷新一次
defaults
stats uri /admin/stats
stats auth admin:redhat
stats refresh 5s
/etc/init.d/haproxy restart
cd /etc/haproxy
vim haproxy.cfg
43 acl blacklist src 172.25.99.250
44 http-request deny if blacklist
/etc/init.d/haproxy reload ##重启haproxy服务
测试:登陆172.25.99.1
为了体现良好的人机交互,
此处需要给server1安装httpd服务,并将端口改为8080(80端口被public占用),编写默认发布目录内容
yum install httpd -y
vim /etc/httpd/conf/httpd.conf
136 Listen 8080
vim /var/www/html/ndex.html
/etc/init.d/httpd start
测试:
将上面的黑名单删除或者注释掉
vim /etc/rsyslog.conf
去掉UDP注释
$ModLoad imudp ##日志接收插件
$UDPServerRun 514 ##日志接收插件使用端口
cat tail /var/log/haproxy
查看日志,5妙一刷新
测试:以php结尾将访问php页面
其余默认访问静态页面
38 acl read method HEAD
39 acl read method GET
40 acl write method POST
41 acl write method PUT
sserver2:
yum iinstall php -y
[root@server2 html]# cd /var/www/html/upload/ ##此处upload可以新建
[root@server2 upload]# ls
index.php upload_file.php ##两个文件的内容在下面可以看到
[root@server2 upload]# chmod 644 *
[root@server2 upload]# mv * ..
[root@server2 upload]# cd ..
[root@server2 html]# chmod 777 upload
[root@server2 html]# ls
index.html index.php upload upload_file.php
index.php文件( 选择图片的静态页面 )
upload_file.php 文件内容(上传图片的动态页面),当前只支持gif、jpeg、pjpeg三种格式
编写,添加png图片格式,可以修改size大小防止上传失败,单位为b
0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "
";
echo "Type: " . $_FILES["file"]["type"] . "
";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "
";
# 上传成功显示的信息(所以上传图片是个动态的过程)
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file"; ##不符合上传条件显示Invalid file
}
?>
将编写好的upload相关文件传到server3上
[root@server2 html]# scp -rp * server3:/var/www/html/
测试:
上传点击browse,提交
提交成功
在server2默认发布目录查看上传结果
server3里没有的
cgi通用网关接口
fastcgi
http和解析分开