第十八周作业

1、为LNMP架构添加memcached支持,并完成对缓存效果的测试报告;

第十八周作业

环境准备:

1)LNMP(php-fpm)环境已搭建完毕

2)Wordpress已部署完成

1.在memcache服务器上安装memcached包并启动服务

]# yum install memcached -y
]# systemctl start memcached.service

2.查看memcached状态信息

]# telnet 192.168.0.24 11211                #memcached默认端口是11211,使用telnet进行连接管理
Trying 192.168.0.24...
Connected to 192.168.0.24.
Escape character is '^]'.
stats            #stats命令用来查看memcahced状态
STAT pid 2852    #memcache服务器的进程ID  
STAT uptime 23   #服务器已经运行的秒数
STAT time 1497241012    #服务器当前的unix时间戳
STAT version 1.4.15     #memcache版本
STAT libevent 2.0.21-stable    #libevent版本
STAT pointer_size 64    #当前操作系统的指针大小(32位系统一般是32bit,64就是64位操作系统)
STAT rusage_user 0.001610    #进程的累计用户时间
STAT rusage_system 0.012883   #进程的累计系统时间
STAT curr_connections 10    #服务器当前存储的items数量
STAT total_connections 11    #从服务器启动以后存储的items总数量
STAT connection_structures 11    #服务器分配的连接构造数
STAT reserved_fds 20    
STAT cmd_get 0   #get命令(获取)总请求次数
STAT cmd_set 0    #set命令(保存)总请求次数  
STAT cmd_flush 0    #flush命令请求次数
STAT cmd_touch 0    #touch命令请求次数
STAT get_hits 0     #总命中次数
STAT get_misses 0    #总未命中次数
STAT delete_misses 0    #delete命令未命中次数
STAT delete_hits 0    #delete命令命中次数
STAT incr_misses 0    #incr命令未命中次数
STAT incr_hits 0    #incr命令命中次数
STAT decr_misses 0    #decr命令未命中次数
STAT decr_hits 0    #decr命令命中次数
STAT cas_misses 0    #cas命令未命中次数
STAT cas_hits 0        #cas命令命中次数
STAT cas_badval 0    #使用擦拭次数
STAT touch_hits 0    #touch命令未命中次数
STAT touch_misses 0    #touch命令命中次数
STAT auth_cmds 0    #认证命令处理的次数
STAT auth_errors 0    #认证失败数目
STAT bytes_read 7        #总读取字节数(请求字节数)
STAT bytes_written 0    #总发送字节数(结果字节数)
STAT limit_maxbytes 67108864      #分配给memcache的内存大小(字节)
STAT accepting_conns 1            #服务器是否达到过最大连接(0/1)
STAT listen_disabled_num 0    #失效的监听数
STAT threads 4        #当前线程数
STAT conn_yields 0    #连接操作主动放弃数目
STAT hash_power_level 16    
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT bytes 0   //当前存储占用的字节数
STAT curr_items 0    #当前存储的数据总数
STAT total_items 0    #启动以来存储的数据总数
STAT evictions 0    #为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)
STAT reclaimed 0    #已过期的数据条目来存储新数据的数目
END

3.在php服务器上安装php-pecl-memcache

]# yum install php-pecl-memcache -y 
]# php -m|grep memcache                #查看memcache模块是否被应用到php
memcache

4.测试php到memcached的连接

]# vim index.php
<?php
$memcache = new Memcache;             //创建一个memcache对象
$memcache->connect('192.168.0.24',11211) or die ("Could not connect"); //连接Memcached服务器
$memcache->set('key','test');        //设置一个变量到内存中,名称是key 值是test
$get_value = $memcache->get('key');   //从内存中取出key的值
echo $get_value;
?>

浏览器访问http://192.168.0.22,返回字符”test”即为正常

5.为Wordpress配置memcached

#在wordpress官网下载memcahced插件,放到cp-content目录下
]# cp object-cache.php /data/www/wordpress/wp-content
]# vim object-cache.php +418               #修改418行中memcached默认地址为实际地址
...
                  $buckets = array('192.168.0.24:11211');
...

6.登录wordpress进行一些操作后,发现memcached中已经缓存了一些信息

]# telnet 192.168.0.24 11211
Trying 192.168.0.24...
Connected to 192.168.0.24.
Escape character is '^]'.
stats
STAT pid 3164
STAT uptime 7178
STAT time 1497257007
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.060055
STAT rusage_system 1.233451
STAT curr_connections 19
STAT total_connections 23
STAT connection_structures 21
STAT reserved_fds 20
STAT cmd_get 611
STAT cmd_set 56
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 515            #已命中缓存515次
STAT get_misses 96
STAT delete_misses 2
STAT delete_hits 1
STAT incr_misses 0
STAT incr_hits 2
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 91663
STAT bytes_written 478934
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 21105
STAT curr_items 48
STAT total_items 58 STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END

7.性能测试

1)这里使用开源web压力测试工具siege进行测试,并发度为5,首先在不使用memcached的情况下进行测试,经过多次测试,发现Elapsed time始终在17~19s左右

]# siege -r10 -c1 http://192.168.0.22/wordpress
Transactions:                    500 hits
Availability:                 100.00 %
Elapsed time:                  19.49 secs
Data transferred:              17.78 MB
Response time:                  0.17 secs
Transaction rate:              25.65 trans/sec
Throughput:                     0.91 MB/sec
Concurrency:                    4.28
Successful transactions:         500
Failed transactions:               0
Longest transaction:            2.89
Shortest transaction:           0.00

2)使用memcached后进行测试,发现性能与不使用memcached时差不多,甚至还略差,但从memcached状态变化来看,缓存确实是生效了,所以可能跟我虚拟机性能以及并发数不够大有关系。

]# siege -r10 -c5 http://192.168.0.22/wordpress
Transactions:                    500 hits
Availability:                 100.00 %
Elapsed time:                  18.43 secs
Data transferred:              17.78 MB
Response time:                  0.15 secs
Transaction rate:              27.13 trans/sec
Throughput:                     0.96 MB/sec
Concurrency:                    4.19
Successful transactions:         500
Failed transactions:               0
Longest transaction:            1.76
Shortest transaction:           0.00

2、部署配置haproxy,能够实现将来自用户的80端口的http请求转发至后端8000上的server服务,写出其配置过程。

第十八周作业

环境准备:

后端web服务器已配置完成,并对外以8000端口提供web服务;

1.安装haproxy

]# yum install haproxy -y

2.编辑haproxy配置文件

]# vim /etc/haproxy/haproxy.cfg
...
listen websrvs                                      #定义一个代理服务器websrvs
    bind        *:80                                #指定代理监听端口为80
    server      websrv  192.168.0.22:8000 check     #定义一个后端websrv,注意:后端服务端口如果与监听端口不一致,需要在地址后指明端口号

3.检查配置无误后启动haproxy服务

]# haproxy -f /etc/haproxy/haproxy.cfg -c
Configuration file is valid
]# systemctl start haproxy.service

4.客户端访问测试

]# curl 192.168.0.22:8000
<h1>This is Backend Server</h1>
]# curl 192.168.0.20                                #通过代理能够正常访问后端webserver <h1>This is Backend Server</h1>

3、阐述varnish的功能及其应用场景,并通过实际的应用案例来描述配置、测试、调试过程。

Web缓存是指一个Web资源(html,js,css,images…)存在于Web服务器和客户端(浏览器),缓存会根据进来的请求报文做出响应,后缓存一份到本地的缓存中;当下一个请求到来的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用从缓存中响应访问请求还是向后端服务器再次发送请求,取决于缓存是否过期及其请求的内容是否发生改变。有效的缓存能减少后端主机的压力,实现快速响应用户的请求,提高用户体验。

varnish就是一种实现上述web缓存功能(通常针对于静态资源提供页面缓存)的一款开源工具,通常它也被称为http或web加速器,同时它也可以做为http反向代理工具,实现负载均衡和动静分离的功能。此外,据官网介绍,Varnish的设计不仅仅是定位于反向代理服务器,根据使用方式的不同,Varnish可扮演的角色也丰富多样,其它可实现的功能如下:

1)WEB应用防火墙;
2)DDoS攻击防护;
3)网站防盗链;
4)负载均衡;
5)integration point;
6)单点登录网关;
7)认证和认证授权;
8)后端主机快速修复;
9)HTTP路由

但在实际生产环境中varnish更多是在HAProxy、Nginx等七层负载均衡器后充当静态资源缓存的反向代理,下图是一个简化的varnish应用场景,主要用来实现静态资源缓存和动静分离。

第十八周作业

1.部署web服务

######在192.168.0.23上配置动态web服务######
~]# yum install nginx php-fpm php-mysql php-mbstring php-gd php-xml -y
~]# mkdir -p /data/www
~]# vim /etc/nginx/nginx.conf
location / {
                root    /data/www;
                index   index.php index.html index.htm;
        }

        location ~ \.php$ {
            root           /data/www;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
~]# systemctl start nginx.service
~]# systemctl start php-fpm.service
######在192.168.0.22上配置静态web服务######
~]# yum install nginx -y
~]# mkdir -p /data/www
~]# vim /etc/nginx/nginx.conf
location / {
                root    /data/www;
                index   index.html index.htm;
        }
~]# systemctl start nginx.service

2.部署mariadb服务器

~]# yum install mariadb-server -y
~]# vim /etc/my.cnf
[mysqld]
...
innodb_file_per_table = ON
skip_name_resolve = ON

~]# systemctl start mariadb.service
~]# mysql
> grant all on *.* to root@'192.168.0.%' identified by 'magedu';
> flush privileges;

3.部署varnish

~]# yum install varnish -y
######将varnish的监听端口设置为80######
~]# vim /etc/varnish/varnish.params
VARNISH_LISTEN_PORT=80            
######配置varnish参数文件######
~]# vim /etc/varnish/default.vcl
######设置默认的后端静态服务器ip和端口######
backend default {
    .host = "192.168.0.22";
    .port = "80";
######配置健康状态监测######
    .probe = {
        .url = "/";
        .interval = 2s;
        .window = 5;
        .threshold = 4;
    }

}
######配置后端动态web服务器######
backend appsrv {
    .host = "192.168.0.23";
    .port = "80";
######配置健康状态监测######
    .probe = {
        .url = "/";
        .interval = 2s;
        .window = 5;
        .threshold = 4;
    }

}
######定义Purge-ACL控制######
acl purgers {
    "127.0.0.1";
    "192.168.0.0"/24;
}
######定义purge操作######
sub vcl_purge {
    return(synth(200,"Purged"));
}

sub vcl_recv {
######动静分离######
        if (req.url ~ "(?i)\.php$") {
             set req.backend_hint = appsrv;
         } else {
             set req.backend_hint = default;
         }
######如果请求方法为PURGE,且客户端IP满足acl,则执行purge操作,否则返回405页面并提示######
        if (req.method == "PURGE") {                
             if (!client.ip ~ purgers) {
                 return(synth(405,"Purging not allowed for" + client.ip));
                 return(purge);
             }
         }
}
######记录缓存命中状态######
sub vcl_deliver {
        if (obj.hits>0) {
              set resp.http.X-Cache="HIT";
    } else {
              set resp.http.X-Cache="MISS";
    }
}
######启动服务使配置生效######
~]# systemctl start varnish.service

4.创建探测页

######在192.168.0.23上创建动态探测页######
~]# vim /data/www/index.php <?php
        $conn = mysql_connect('192.168.0.25','root','magedu');
        if ($conn)
                echo "Dynamic webserver to Mariadb is OK!";
        else
                echo "Failure";
?>
######在192.168.0.22上创建静态探测页######
~]# vim /data/www/index.html
<h1>I'm Static Server!</h1>

5.varnish缓存效果测试

######在varnish CLI命令接口下创建并启用vcl######
~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
######加载默认vcl配置文件,并命名为test1######
varnish> vcl.load test1 default.vcl 
200        
VCL compiled.
######激活test1######
varnish> vcl.use test1
200        
VCL 'test1' now active
######通过健康状态监测可以看到后端服务器都正常######
varnish> backend.list
200        
Backend name                   Refs   Admin      Probe
default(192.168.0.22,,80)      2      probe      Healthy 5/5
appsrv(192.168.0.23,,80)       2      probe      Healthy 5/5

######第一次访问静态页面,MISS######
~]# curl -I 192.168.0.21/index.html
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Thu, 22 Jun 2017 13:32:56 GMT
Content-Type: text/html
Content-Length: 23
Last-Modified: Wed, 21 Jun 2017 14:03:45 GMT
ETag: "594a7cc1-17"
X-Varnish: 2
Age: 0
Via: 1.1 varnish-v4
X-Cache: MISS                     
Connection: keep-alive
######第二次访问静态页面,HIT!######
[root@dbserver ~]# curl -I 192.168.0.21/index.html
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Thu, 22 Jun 2017 13:32:56 GMT
Content-Type: text/html
Content-Length: 23
Last-Modified: Wed, 21 Jun 2017 14:03:45 GMT
ETag: "594a7cc1-17"
X-Varnish: 32770 3
Age: 2
Via: 1.1 varnish-v4
X-Cache: HIT                       #第二次访问状态为HIT,说明缓存生效
Connection: keep-alive
######第一次访问动态页面,MISS######
~]# curl -I 192.168.0.21/index.php
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Wed, 21 Jun 2017 15:51:49 GMT
Content-Type: text/html
X-Powered-By: PHP/5.4.16
X-Varnish: 5
Age: 0
Via: 1.1 varnish-v4
X-Cache: MISS                    
Content-Length: 4
Connection: keep-alive
######第二次访问动态页面,HIT!######
~]# curl -I 192.168.0.21/index.php
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Wed, 21 Jun 2017 15:51:49 GMT
Content-Type: text/html
X-Powered-By: PHP/5.4.16
X-Varnish: 32772 6
Age: 2
Via: 1.1 varnish-v4
X-Cache: HIT
Content-Length: 4
Connection: keep-alive
######分别访问动静资源均正常,说明动静分离实现成功######
~]# curl 192.168.0.21/index.html
<h1>I‘m Static Server</h1>
~]# curl 192.168.0.21/index.php
Dynamic Server to Mariadb is OK! 

原创文章,作者:N26-西安-方老喵,如若转载,请注明出处:http://www.178linux.com/77956

评论列表(3条)

  • ch368087977
    ch368087977 2017-06-22 23:01

    想问一下图式用什么软件画的呢

    • N26-西安-方老喵
      N26-西安-方老喵 回复 ch368087977 2017-06-23 08:10

      Edraw

  • luoweiro
    luoweiro 2017-06-26 22:27

    图文并茂,尤其是还是用了siege做压测,这点是非常赞的,如果能配合一点性能压测效果会更好,加油。

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code