1 概述
本文通过HAProxy,Keepalive,实现动静分离wordpress,在每台haproxy和wordpress服务器之间加入缓存,通过缓存实现加速。具体需求如下
.(1) 动静分离部署wordpress,动静都要能实现负载均衡
.(2) 在haproxy和后端主机之间添加varnish进行缓存
.(3) haproxy的设定要求:动静分离
.(4) haproxy高可用
.(5)通过VIP:172.18.50.80来访问wordpress
前提
1:node1 ip是172.18.50.62,node2 ip 是172.18.50.63.写入/etc/hosts文件里,node1和node2实现基于ssh-key的验证。
2:所有主机时间同步。
拓扑图如下
2 配置
172.18.50.62 HAproxy配置,主备配置一样,172.18.50.63不附上代码
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon # turn on stats unix socket stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- 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 connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 frontend http bind *:80 acl url_dyn path_end -i .php acl url_stac path_end -i .jpg .gif .png .css .js .html .txt .ico .svg reqadd sunny-x-via:\ haproxy6b default_backend dynamicblog if url_dyn use_backend staticblog if url_stac option forwardfor header sunny-x-client rspdel Server rspadd Server:\ Sunny-proxy6b backend staticblog balance roundrobin cookie WEBSRV insert nocache server varnish7b 172.18.50.72:80 check weight 1 inter 3000 rise 2 fall 2 cookie cksrv1 backend dynamicblog balance roundrobin cookie WEBSRV insert nocache server varnish7c 172.18.50.73:80 check weight 1 inter 3000 rise 2 fall 2 cookie cksrv2 listen stats bind :9091 stats enable stats auth admin:admin stats admin if TRUE
172.18.50.62 HAproxy配置,主备配置有区别,区别在于四点:
notification_email_from node2@localhost
router_id node2
state BACKUP
priority 90
172.18.50.63不附上代码。
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from node1@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id node1 vrrp_mcast_group4 224.0.100.100 } vrrp_script chk_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -20 } vrrp_script chk_haproxy { script "killall -0 haproxy && exit 0 || exit 1" interval 1 weight -20 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface eth1 virtual_router_id 50 priority 100 advert_int 1 authentication { auth_type PASS auth_pass sunny } virtual_ipaddress { 172.18.50.80 } notify_master "/etc/keepalived/vip1_notify.sh master" notify_backup "/etc/keepalived/vip1_notify.sh backup" notify_fault "/etc/keepalived/vip1_notify.sh fault" track_script { chk_down chk_haproxy } }
172.18.50.62 HAproxy配置里notify.sh脚本如下
#!/bin/bash contact='root@localhost' notify() { mailsubject="$(hostname) to be $1, vip floating" mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1" echo "$mailbody" | mail -s "$mailsubject" $contact } case $1 in master) notify master ;; backup) notify backup ;; fault) notify fault ;; *) echo "Usage: $(basename $0) {master|backup|fault}" exit 1 ;; esac
172.18.50.73 varnish配置default.vcl如下,172.18.50.72配置区别如下
backend static {
.host = "172.18.50.65";
.port = "80";
.probe = check;
}
其他配置一样,172.18.50.72这里就附上脚本
vcl 4.0; probe check { .url = "/index.html"; .window = 5; .threshold = 4; .interval = 2s; .timeout = 1s; } backend dynamic { .host = "172.18.50.75"; .port = "80"; .probe = check; } sub vcl_recv { if (req.restarts == 0){ if (req.http.X-Forwarded-For){ set req.http.X-Forwarded-For = req.http.X-Forwarded-For + "," + client.ip; } else { set req.http.X.Forwarded-For = client.ip; } } } sub vcl_backend_response { if (beresp.http.cache-control !~ "s-maxage") { if (bereq.url ~ "(?i)\.(jpg|jpeg|png|gif|css|js|xml)$") { unset beresp.http.Set-Cookie; set beresp.ttl = 3600s; } } if (bereq.url ~ "(?i).*php.*") { unset beresp.http.Set-Cookie; set beresp.ttl = 3600s; } } sub vcl_deliver { if (obj.hits>0) { set resp.http.X-Cache = "Hit via " + server.ip; } else { set resp.http.X-Cache = "Miss from " + server.ip; } }
后端的172.18.50.65和172.18.50.75这两台wordpress都要安装wordpress和http,同时172.18.50.75是处理动态资源的脚本,所以还需要安装php-fpm.同时在75这台安装mysql.这里就不演示了,相关部署见http://ghbsunny.blog.51cto.com/7759574/1970716文章。j
到这里部署就完成了。可以通过网页访问http://172.18.50.80/blog查看功能是否正常。其中,这里的blog是将wordpress安装包部署后重命名为blog,可根据实际情况自行设定。