keepalived+varnish+haproxy+LNAMP

Third test

 

nfs: 192.168.1.40

rp1: 192.168.1.41

rp2: 192.168.1.42

mariadb: 192.168.1.43

web1: 192.168.1.110

web2: 192.168.1.111

app1: 192.168.1.112

app2: 192.168.1.113

实验效果:用keepalived高可用反向代理服务器haproxy,将静态页面反代到varnish缓存服务器,动态页面反代到后端的app服务器,访问内容如果在缓存服务器上有缓存,就直接返回,如果没有就到后端web服务器取

NFS:192.168.1.40
  1. yum install nfs-utils rpcbind
  2. vim /etc/exports
    /mnt/share      192.168.1.0/24(rw,async,all_squash)

    mkdir /mnt/share

    systemctl start nfs rpcbind

    showmount -e 192.168.1.40

  3. chmod o+w /mnt/share

//给目录一个写权限,因为之后要将此目录挂载到web和app服务上,以备上传图片

app1:192.168.1.41
  1. yum install -y epel-releaseyum install -y haproxy varnish keepalived

    ntpdate 192.168.1.64

haproxy配置
  1. cd /etc/haproxy
  2. vim haproxy.cfg

global

log 127.0.0.1 local2

chroot /var/lib/haproxy

pidfile /var/run/haproxy.pid

maxconn 4000

user haproxy

group haproxy

daemon

stats socket /var/lib/haproxy/stats

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 myweb *:80

compression algo gzip

compression type text/html text/plain application/xml application/javascript

reqadd X-Proxy-By:\ HAProxy

default_backend websrvs

acl websrvs path_end -i .jpg .jpeg .htm .gif .png .css .js .ico

//请求报文中以此类结尾的都定义为websrvs

acl appsrvs path_end .php

use_backend appsrvs if appsrvs

//调用下面定义的dynsrvs的服务器,如果附合acl定义的

appsrvs规则

use_backend websrvs if websrvs

backend websrvs

balance roundrobin

server srv1 192.168.1.41:6081 check inter 3000ms rise 2 fall 2

server srv2 192.168.1.42:6081 check inter 3000ms rise 2 fall 2

backend appsrvs

balance source

server dynsrv1 192.168.1.112:80 check inter 3000ms rise 2 fall 2

server dynsrv2 192.168.1.113:80 check inter 3000ms rise 2 fall 2

listen stats

bind *:9099

stats enable

stats uri /myproxy?admin

stats realm “HAProxy Stats Page”

stats auth admin:admin

stats admin if TRUE

varnish配置
  1. cd /etc/varnish
  2. vim varnish.params

VARNISH_STORAGE=”file,/data/varnish/cache,1g”

//注释掉用内存缓存访问,改为用磁盘缓存

  1. vim default.vcl

vcl 4.0;

import directors;

backend websrv1 {

.host = “192.168.1.110”;

.port = “80”;

}

backend websrv2 {

.host = “192.168.1.111”;

.port = “80”;

}

backend appsrv1 {

.host = “192.168.1.112”;

.port = “80”;

}

backend appsrv2 {

.host = “192.168.1.113”;

.port = “80”;

}

sub vcl_init {

new staticsrvs = directors.round_robin();

staticsrvs.add_backend(websrv1);

staticsrvs.add_backend(websrv2);

new appsrvs = directors.hash();

appsrvs.add_backend(appsrv1,1);

appsrvs.add_backend(appsrv2,1);

}

sub vcl_recv {

if (req.url ~ “(?i).(css|js)$”) {

set req.backend_hint =appsrvs.backend(req.http.cookie);

}

if (req.url ~ “(?i).(jpg|jpeg|png|gif)$”) {

set req.backend_hint = staticsrvs.backend();

} else {

set req.backend_hint = appsrvs.backend(req.http.cookie);

}

}

sub vcl_backend_response {

if (beresp.http.cache-control !~ “s-maxage”) {

if (bereq.url ~ “(?i).(jpg|jpeg|png|gif|css|js|html|htm)$”) {

unset beresp.http.Set-Cookie;

set beresp.ttl = 3600s;

}

}

}

//定义符合条件的文件由varnish缓存3600秒

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;

}

}

keepalived配置
  1. vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost

}

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node1

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

vrrp_mcast_group4 224.1.101.30

}

vrrp_instance VI_1 {

state MASTER

interface eno16777736

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1234

}

virtual_ipaddress {

192.168.1.50/24 dev eno16777736 label eno16777736:0

}

notify_master “/etc/keepalived/notify.sh master”

notify_backup “/etc/keepalived/notify.sh backup”

}

vrrp_instance VI_2 {

state BACKUP

priority 96

interface eno16777736

virtual_router_id 52

advert_int 1

authentication {

auth_type PASS

auth_pass 1234

}

virtual_ipaddress {

192.168.1.51/24 dev eno16777736 label eno16777736:0

}

notify_master “/etc/keepalived/notify.sh master”

notify_backup “/etc/keepalived/notify.sh backup”

}

keepalived 报警脚本

vim /etc/keepalived/notify.sh

#!/bin/bash

contact=’root@localhost’

//定义谁可以接收邮件

notify() {

local mailsubject=”$(hostname) to be $1, vip floating”

//声明本地局部变量,mailsubject是声明标题的,$(hostname)是当前主机名,意思是当前主机发生了变化,VIP流动了,$1是状态,给什么状态就显示什么状态

local mailbody=”$(date +’%F %T’): vrrp transition, $(hostname) changed to be $1″

//这是定义邮件正文的,$(date +’%F %T’)是时间,意思是在这个时刻vrrp发生了状态转移,$(hostname)当前主机变成了$1状态

echo “$mailbody” | mail -s “$mailsubject” $contact

//调用本地邮件服务器向本地用户发邮件,如果要使用互联网上的邮件服务器发邮件要用python写脚本

}

case $1 in

//$1是脚本的位置变量,看传输的是下面的哪一个什么

master)

notify master

;;

backup)

notify backup

;;

fault)

notify fault

;;

*)

echo “Usage: $(basename $0) {master|backup|fault}”

exit 1

;;

esac

chmod +x notify.sh

bash -n notify.sh

//检查语法

bash -x notify.sh master

systemctl start haproxy varnish keepalived

//启动所有服务

app2:192.168.1.42

app2服务器上所安装的软件与配置与app1上是一致的,只是将keepalived的配置做一下调整,如下

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost

}

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node1

vrrp_skip_check_adv_addr

vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

vrrp_mcast_group4 224.1.101.30

}

vrrp_instance VI_1 {

state BACKUP

interface eno16777736

virtual_router_id 51

priority 96

advert_int 1

authentication {

auth_type PASS

auth_pass 1234

}

virtual_ipaddress {

192.168.1.50/24 dev eno16777736 label eno16777736:0

}

notify_master “/etc/keepalived/notify.sh master”

notify_backup “/etc/keepalived/notify.sh backup”

}

vrrp_instance VI_2 {

state MASTER

priority 100

interface eno16777736

virtual_router_id 52

advert_int 1

authentication {

auth_type PASS

auth_pass 1234

}

virtual_ipaddress {

192.168.1.51/24 dev eno16777736 label eno16777736:0

}

notify_master “/etc/keepalived/notify.sh master”

notify_backup “/etc/keepalived/notify.sh backup”

}

mariadb:192.168.1.43

1.yum install -y mariadb-server

2.vim /etc/my.cnf

skip_name_resolve=ON

innodb_file_per_table=ON

mysql_secure_installation

Set root password? [Y/n] y #是否设置密码

New password: #输入要设置的密码

Re-enter new password:

Remove anonymous users? [Y/n] y #是否删除匿名用户

Disallow root login remotely? [Y/n]n

#是否禁止管理员远程登录(为了试验方便,设置成不要,生成中禁止远程登录)

Remove test database and access to it? [Y/n]n

#删除测试数据库

Reload privilege tables now? [Y/n]y #重载

mysql -uroot -pcentos

create database wordpress;

grant all on wordpress.* to ‘wps’@’%’ identified by ‘centos’;

flush privileges;

mysql -uwps -pcentos

systemctl start mariadb

web1:192.168.1.110
  1. yum install -y epel-releaseyum install -y nginx nfs-utils
  2. vim /etc/nginx/conf.d/web.conf

server {

server_name 192.168.1.110;

index index.html;

root /data/apps;

}

  1. systemctl start nginx
  2. mkdir -p /data/apps
  3. 上传wordpress软件包到服务器
  4. unzip wordpress-4.3.1-zh_CN.zip
  5. cp -r wordpress /data/apps
  6. cd /data/apps
  7. ln -sv wordpress wps
  8. mkdir /data/apps/wps/wp-content/uploads
  9. mount -t nfs 192.168.1.40:/mnt/share /data/apps/wps/wp-content/uploads
  10. mkdir /data/apps/wps/html
  11. mount -t nfs 192.168.1.40:/mnt/html /data/apps/wps/html
web2:192.168.1.111
  1. yum install -y epel-releaseyum install -y nginx nfs-utils
  2. vim /etc/nginx/conf.d/web.conf

server {

server_name 192.168.1.111;

index index.html;

root /data/apps;

}

  1. systemctl start nginx
  2. mkdir -p /data/apps
  3. 上传wordpress软件包到服务器
  4. unzip wordpress-4.3.1-zh_CN.zip
  5. cp -r wordpress /data/apps
  6. cd /data/apps
  7. ln -sv wordpress wps
  8. mkdir /data/apps/wps/wp-content/uploads
  9. mount -t nfs 192.168.1.40:/mnt/share /data/apps/wps/wp-content/uploads
  10. mkdir /data/apps/wps/html
  11. mount -t nfs 192.168.1.40:/mnt/html /data/apps/wps/html
app1:192.168.1.112
  1. yum install httpd php-mysql php-mbstring nfs-utils
  2. vim /etc/httpd/conf.d/app.conf

<VirtualHost 192.168.1.112:80>

DocumentRoot “/data/apps”

DirectoryIndex index.php index.html

<Directory “/data/apps”>

Options FollowSymLinks

AllowOverride All

Require all granted

</Directory>

CustomLog “logs/wp_access.log” combined

ErrorLog “logs/wp_error.log”

</VirtualHost>

  1. mkdir -p /data/apps
  2. 上传wordpress软件包到服务器
  3. unzip wordpress-4.3.1-zh_CN.zip
  4. cp -r wordpress /data/apps
  5. cd /data/apps
  6. ln -sv wordpress wps
  7. cd wps
  8. cp wp-config-sample.php wp-config.php
  9. vim wp-config.php

/** WordPress数据库的名称 */

define(‘DB_NAME’, ‘wordpress’);

/** MySQL数据库用户名 */

define(‘DB_USER’, ‘wps’);

/** MySQL数据库密码 */

define(‘DB_PASSWORD’, ‘centos’);

/** MySQL主机 */

define(‘DB_HOST’, ‘192.168.1.43’);

  1. systemctl start httpd
  2. mkdir /data/apps/wps/wp-content/uploads
  3. mount -t nfs 192.168.1.40:/mnt/share /data/apps/wps/wp-content/uploads
  4. mkdir /data/apps/wps/html
  5. mount -t nfs 192.168.1.40:/mnt/html /data/apps/wps/html
app2:192.168.1.113
  1. yum install httpd php-mysql php-mbstring nfs-utils
  2. vim /etc/httpd/conf.d/app.conf

<VirtualHost 192.168.1.113:80>

DocumentRoot “/data/apps”

DirectoryIndex index.php index.html

<Directory “/data/apps”>

Options FollowSymLinks

AllowOverride All

Require all granted

</Directory>

CustomLog “logs/wp_access.log” combined

ErrorLog “logs/wp_error.log”

</VirtualHost>

  1. mkdir -p /data/apps
  2. 上传wordpress软件包到服务器
  3. unzip wordpress-4.3.1-zh_CN.zip
  4. cp -r wordpress /data/apps
  5. cd /data/apps
  6. ln -sv wordpress wps
  7. cd wps
  8. cp wp-config-sample.php wp-config.php
  9. vim wp-config.php

/** WordPress数据库的名称 */

define(‘DB_NAME’, ‘wordpress’);

/** MySQL数据库用户名 */

define(‘DB_USER’, ‘wps’);

/** MySQL数据库密码 */

define(‘DB_PASSWORD’, ‘centos’);

/** MySQL主机 */

define(‘DB_HOST’, ‘192.168.1.43’);

  1. systemctl start httpd
  2. mkdir /data/apps/wps/wp-content/uploads
  3. mount -t nfs 192.168.1.40:/mnt/share /data/apps/wps/wp-content/uploads
  4. mkdir /data/apps/wps/html
  5. mount -t nfs 192.168.1.40:/mnt/html /data/apps/wps/html
修改本机hosts文件

加入 www.test.com 192.168.1.50 www.test.com 192.168.1.51

测试:

访问www.test.com/wps

keepalived+varnish+haproxy+LNAMPclipboard

将固定链接改为html形式

clipboard1

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/91596

(2)
ruopu1989ruopu1989
上一篇 2018-02-13 12:33
下一篇 2018-02-22 15:40

相关推荐

  • ubuntu kylin虚拟机安装KVM

    1.确定物理机CPU是否支持虚拟化    查看方法1:计算机->属性->处理器(Inter(R) Core(TM) i5-2450M),然后去网上查看自己的电脑CPU是否支持虚拟化,    地址http://ark.intel.com/zh-cn/找到自己CPU的信息,虚拟化技术后是否显示为yes,如果是n…

    Linux干货 2016-10-15
  • Linux学习总结及练习&day08-sed文本处理工具

    第一部分、Linux文本处理三剑客之sed(Stream EDitor)文本编辑工具     一、sed的基本功能工作原理     sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令…

    Linux干货 2016-08-10
  • sed工具

    sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来…

    2017-08-26
  • 第二天作业

    一、Linux 文件管理类命令   cd、pwd、mkdir、rmdir、ls、cp、rm、mv、cat、tac、more、less、head、tail、touch     1、目录类相关命令     cd:change directory 切换目录     pwd:print …

    Linux干货 2016-08-22
  • vsftpd相关应用解析

    FTP(File Transfer Protocol)文件传输协议 FTP 是 TCP/IP 协议组中的协议之一。该协议是Internet文件传送的基础,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称…

    2017-06-06
  • Linux 入门基础 及一些常见命令(上)

    计算机的组成及其各部分的功能 现代计算机的基本结构是由匈牙利-美国科学家冯· 诺依曼于1946年提出的。迄今为止所有进入实用的电子计算机  都是按冯· 诺依曼提出的结构体系和工作原理设计制造的,故又统称为“冯·诺依曼型计算机". 根据冯.诺依曼原理:计算机由运算器、控制器、存储器、输入设备、输出设备所组成. 运算器: 进行算术与逻辑运算.…

    Linux干货 2016-09-17