马哥教育网络19期+第十八周课程练习

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

LNMP的安装过程不再赘述.

# yum install -y memcached

# cat /etc/sysconfig/memcached 
PORT="11211"                                            #memcached监听在哪个端口上
USER="memcached"                                        #运行memcached进程的用户
MAXCONN="1024"                                          #最大连接数
CACHESIZE="64"                                          #缓存大小(实际生产不会只有64M)
OPTIONS=""                                              #其他选项
# service memcached start            #启动memcached服务

stats命令

STAT pid 22362    //memcache服务器的进程ID  
STAT uptime 1469315    //服务器已经运行的秒数
STAT time 1339671194    //服务器当前的unix时间戳
STAT version 1.4.9    //memcache版本
STAT libevent 1.4.9-stable    //libevent版本
STAT pointer_size 64    //当前操作系统的指针大小(32位系统一般是32bit,64就是64位操作系统)
STAT rusage_user 3695.485200    //进程的累计用户时间
STAT rusage_system 14751.273465    //进程的累计系统时间
STAT curr_connections 69    //服务器当前存储的items数量
STAT total_connections 855430    //从服务器启动以后存储的items总数量
STAT connection_structures 74    //服务器分配的连接构造数
STAT reserved_fds 20    //
STAT cmd_get 328806688    //get命令(获取)总请求次数
STAT cmd_set 75441133    //set命令(保存)总请求次数  
STAT cmd_flush 34    //flush命令请求次数
STAT cmd_touch 0    //touch命令请求次数
STAT get_hits 253547177    //总命中次数
STAT get_misses 75259511    //总未命中次数
STAT delete_misses 4    //delete命令未命中次数
STAT delete_hits 565730    //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 545701515844        //总读取字节数(请求字节数)
STAT bytes_written 1649639749866    //总发送字节数(结果字节数)
STAT limit_maxbytes 2147483648        //分配给memcache的内存大小(字节)
STAT accepting_conns 1            //服务器是否达到过最大连接(0/1)
STAT listen_disabled_num 0    //失效的监听数
STAT threads 4        //当前线程数
STAT conn_yields 14    //连接操作主动放弃数目
STAT hash_power_level 16    //
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 30705763
STAT evicted_unfetched 0
STAT bytes 61380700    //当前存储占用的字节数
STAT curr_items 28786    //当前存储的数据总数
STAT total_items 75441133    //启动以来存储的数据总数
STAT evictions 0    //为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)
STAT reclaimed 39957976    //已过期的数据条目来存储新数据的数目
END

libmemcached 是一个 memcached 的库,客户端库,C 和 C++ 语言实现的客户端库,具有低内存占用率、线程安全、并提供对memcached功能的全面支持

yum install -y libmemcached
# memstat --servers=127.0.0.1
Server: 127.0.0.1 (11211)
   pid: 1672
   uptime: 3347
   time: 1471763883
   version: 1.4.24
   libevent: 1.4.13-stable
   pointer_size: 64
   rusage_user: 0.042993
   rusage_system: 0.055991
   curr_connections: 10
   total_connections: 14
   connection_structures: 11
   reserved_fds: 20
   cmd_get: 0
   cmd_set: 0
   ......
   ......

LB Cluster保持会话的方法:

    session sticky
    session cluster
    session server

# yum install -y php-pecl-memcached

# ll /usr/lib64/php/modules/               #将memcached.so信息添加到php.ini
total 5980
-rwxr-xr-x 1 root root  241589 Jun 10 00:34 curl.so
-rwxr-xr-x 1 root root 3153493 Jun 10 00:34 fileinfo.so
-rwxr-xr-x 1 root root   42480 Feb 11  2016 igbinary.so
-rwxr-xr-x 1 root root  150412 Jun 10 00:34 json.so
-rwxr-xr-x 1 root root  147183 Jun 10 00:34 mcrypt.so
-rwxr-xr-x 1 root root   86984 Aug  2  2013 memcached.so
-rwxr-xr-x 1 root root  861233 Jun 10 00:34 phar.so
-rwxr-xr-x 1 root root 1428036 Jun 10 00:34 zip.so
# wget  
# tar -xvf memcache-2.2.7.tgz
# cd memcache-2.2.7
# ./configure --enable-memcache --with-php-config=/opt/application/php/bin/php-config
# make;make install
# vim /etc/php.ini    #修改php.ini配置文件
extension_dir = "/opt/application/php/lib/php/extensions/no-debug-non-zts-20131226/"
extension = "memcache.so"
# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done
或者:
# cp /opt/application/php/lib/php/extensions/no-debug-non-zts-20131226/* /opt/application/php/lib/php/extensions/
# vim /etc/php.ini
extension = "memcache.so"

打开PHP侦探网页:

blob.png

测试memcached

# telnet 192.168.2.214 11211
STAT pid 20439  —— Memcached 进程的ID
STAT uptime 179982 —— 进程运行时间
STAT time 1471773767 ——当前时间
STAT version 1.4.24
STAT libevent 1.4.13-stable
STAT pointer_size 32
STAT rusage_user 21.916668
STAT rusage_system 40.576831
STAT curr_connections 11
STAT total_connections 329
STAT connection_structures 23
STAT reserved_fds 20
STAT cmd_get 2363348 —— 总共获取数据的次数(等于 get_hits + get_misses )
STAT cmd_set 279971 —— 总共设置数据的次数
STAT cmd_flush 0STAT cmd_touch 0STAT get_hits 2286284 —— 命中了多少次数据,也就是从 Memcached 缓存中成功获取数据的次数
STAT get_misses 77064 —— 没有命中的次数
......

还可以用memcached工具

blob.png

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

Haproxy的安装:(也可通过源码安装)

apt-get install haproxy

修改基本的配置文件如下:

配置文件所在地址: /etc/haproxy/haproxy.cfg 

global  
    maxconn 5120  
    chroot /usr/share/haproxy  
    daemon  
    quiet  
    nbproc 2  
    pidfile /usr/share/haproxy/haproxy.pid  
defaults  
    option  httplog  
    option  dontlognull  
    timeout connect 5s  
    timeout client 50s  
    timeout server 20s  
listen http  
    bind :80  
    timeout client 1h  
    tcp-request inspect-delay 2s   
  
    tcp-request content accept if is_http  
    server server-http :8080  
backend servers 
    server server1 127.0.0.1:8080 maxconn 32

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

先安装varnish

#yum -y install varnish

配置文件的简单介绍

NFILES=131072            
MEMLOCK=82000
NPROCS="unlimited"
# DAEMON_COREFILE_LIMIT="unlimited"        #内核最大打开的文件数
RELOAD_VCL=1                               #是否自动加载VCL
VARNISH_VCL_CONF=/etc/varnish/default.vcl  #默认加载的VCL文件
VARNISH_LISTEN_PORT=80                     #监听端口,默认为6081
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1     #管理的IP地址
VARNISH_ADMIN_LISTEN_PORT=6082             #管理端口
VARNISH_SECRET_FILE=/etc/varnish/secret    #密钥文件
VARNISH_MIN_THREADS=50                     #最小线程数量
VARNISH_MAX_THREADS=1000                   #最大线程数量
VARNISH_THREAD_TIMEOUT=120                 #线程超时时间
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin #缓存文件位置
VARNISH_STORAGE_SIZE=1G                    #设置文件缓存大小变量
VARNISH_MEMORY_SIZE=64M                    #设置内存缓存大小变量
#VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}" #默认存储到文件中,这里可以修改存储位置
VARNISH_STORAGE="malloc,${VARNISH_MEMORY_SIZE}" #设置缓存位置为内存
VARNISH_TTL=120                
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
             -f ${VARNISH_VCL_CONF} \
             -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
             -t ${VARNISH_TTL} \
             -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
             -u varnish -g varnish \
             -S ${VARNISH_SECRET_FILE} \
             -s ${VARNISH_STORAGE}"    #所有启动加载选项

启动服务如下:

# service varnish start

Varnish命令介绍

# varnishd -h
-a address:port        #表示varnish对httpd的监听地址及其端口
-b address:port        #表示后端服务器地址及其端口
-d                     #表示使用debug调试模式
-f file                #指定varnish服务器的配置文件
-p param=value         #指定服务器参数,用来优化varnish性能
-P file                #Varnish进程PID文件存放路径
-n dir                 #指定varnish的工作目录
-s kind[,storageoptions] #指定varnish缓存内容的存放方式,常用的方式有:“-s file,<dir_or_file>,<size>”;其中“<dir_or_file>”
                          指定缓存文件的存放路径,“<size>”指定缓存文件的大小
-t                     #指定默认的TTL值
-T address:port        #设定varnish的telnet管理地址及其端口
-V                     #显示varnish版本号和版权信息
-w int[,int[,int]]     #设定varnish的工作线程数,常用的方式有:  -w min,max
 -w min,max,timeout
如:-w3,25600,50       #这里最小启动的线程数不能设定过大,设置过大,会导致varnish运行异常缓慢

环境如下:

blob.png

在lamp1、lamp2上分别都安装服务并启动

######在Lamp1服务器上安装Httpd、Php、Mysql,启动服务
# yum -y install httpd php mysql-server php-mysql
# service httpd start
# service mysqld start
------------------------------------------------------------------------
######在Lamp2服务器上安装Httpd、Php,启动服务
# yum -y install httpd php php-mysql
# service httpd start

lamp上都测试php界面

blob.png

安装论坛程序:

# mysql
mysql> create database bbs;
mysql> grant all on bbs.* to 'bbsuser'@'172.16.%.%' identified by 'bbspass';
mysql> flush privileges;
注释:为论坛创建一个数据库并授权用户访问
------------------------------------------------------------------------
######安装论坛程序
# unzip Discuz_X3.0_SC_UTF8.zip
# cp -rf upload/* /var/www/html/
# chmod -R +w /var/www/html/{config,data,uc_server,uc_client}    #添加可写权限
# chown -R apache /var/www/html/*      #修改属主权限

blob.png

将论坛程序拷贝到lamp2服务器上一份并访问测试

# scp -rp /var/www/html/* 172.16.14.3:/var/www/html/
# service httpd restart    #重启lamp2服务器的WEB服务

安装web服务器并测试页面:

# yum -y install httpd
# service httpd start
# echo "<h1>WEB</h1>" > /var/www/html/index.html #创建测试页

blob.png

将Lamp1服务器上的论坛程序拷贝到WEB服务器一份,因为需要论坛中的一些静态文件如:(.jpg|.html)结尾的文件等

# scp -rp /var/www/html/* 172.16.14.3:/var/www/html/

Varnish安装及配置

在第一部分中我们已经修改过默认监听端口为"80",接下来为Varnish提供一个VCL配置文件,建议基于默认的配置文件基础上修改,修改前
备份一下文件。
[root@varnish ~]# cd /etc/varnish/
[root@varnish varnish]# cp default.vcl default.vcl.bak
[root@varnish varnish]# vim default.vcl
######定义ACL
acl purgers {                    #定义acl,实现IP地址过滤
    "127.0.0.1";
    "172.16.0.0"/16;
}
######定义健康状态检测
probe dynamic {                  #设置动态网站服务器健康状态检测
    .url = "/index.html";
    .interval = 5s;
    .timeout = 1s;
    .expected_response = 200;
}            #这里设置了两个健康状态检测主要是为了区分动、静网站
probe static {                   #设置动态网站服务器健康状态检测
    .url = "/index.html";        #定义检测的页面
    .interval = 5s;              #探测请求的发送周期,默认为5秒
    .timeout = 1s;               #每次探测请求的过期时间
    .expected_response = 200;
}
######定义后端服务器
backend app1 {                  #定义一个后端服务器
    .host = "172.16.14.2";      #服务器地址
    .port = "80";               #服务器监听端口
    .probe = dynamic;           #健康状态检测
}
backend app2 {
    .host = "172.16.14.3";
    .port = "80";
    .probe = dynamic;
}
backend web {          
    .host = "172.16.14.4";
    .port = "80";
    .probe = static;
}
######定义后端服务器组,实现负载均衡效果
director apps random {          #定义一个后端服务器组,实现负载均衡效果
    {
         .backend = app1;       #调用前面已定义过的后端主机
     .weight = 2;           #设置权重
    }
    {
     .backend = app2;
     .weight = 2;
    }
}
######定义vcl_recv函数,实现请求到达并成功接收后调用此函数中定义的规则
sub vcl_recv {
######定义动、静分离,以".php"或".php?后面跟所有文件"结尾的请求都发送到动态服务器,其他请求都发送到静态服务器
    if (req.url ~ "\.php(\?\.*|$)") {
    set req.backend = apps;
    } else {
    set req.backend = web;
    }
    return(lookup);
######定义允许清除缓存的IP地址,调用的是前面定义的ACL
    if (req.request == "PURGE") {
        if (!client.ip ~ purgers) {
        error 405 "Method not allowed";
    }
        return(lookup);
    }
######重新定义http请求首部,让后端服务器可以记录请求客户端的真实IP地址
        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;
            }
         }
######除了定义的请求方法外,其他请求都到后端服务器
    if (req.request != "GET" &&
        req.request != "HEAD" &&
        req.request != "PUT" &&
        req.request != "POST" &&
        req.request != "TRACE" &&
        req.request != "OPTIONS" &&
        req.request != "DELETE") {
        return (pipe);
    }
    if (req.request != "GET" && req.request != "HEAD") {
        return (pass);
    }
######定义不缓存认证与Cookie信息
    if (req.http.Authorization || req.http.Cookie) {
        return (pass);
    }
######定义压缩功能
    if (req.http.Accept-Enconding) {
       if (req.url ~ "\.(jpg|jpeg|gif|bmp|png|flv|gz|tgz|tbz|mp3)$") {
           remove req.http.Accept-Encoding;
       remove req.http.Cookie;
       } else if (req.http.Accept-Encoding ~ "gzip") {
       set req.http.Accept-Encoding = "gzip";
       } else if (req.http.Accept-Encoding ~ "deflate") {
       set req.http.Accept-Encoding = "deflate";
       } else { remove req.http.Accept-Encoding;
       }
    }
######定义指定格式结尾的文件去除Cookie信息
    if (req.request == "GET" && req.url ~ "\.(jpeg|jpg|gif|png|bmp|swf)$") {
    unset req.http.cookie;
    }
######定义防盗链设置
    if (req.http.referer ~ "http://.*") {
        if (!(req.http.referer ~ "http://.*\.baidu\.com" || req.http.referer ~"http://.*\.google\.com.*")) {
              set req.http.host = "www.allen.com";
          set req.url = "http://172.16.14.4/error.html";
    }
    }
}
######定义vcl_hash函数
sub vcl_hash {
    hash_data(req.url);
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    return(hash);
}
######定义vcl_hit函数
sub vcl_hit {
    if (req.request == "PURGE") { #语法方法为"PURGE"
       purge;                     #清除缓存
       error 200 "Purged.";       #返回错误状态码为"200"
    }
    return(deliver);
}
######定义vcl_miss函数
sub vcl_miss {
    if (req.request == "PURGE") {
    purge;
    error 404 "Not In Cache.";
    }
    return(fetch);
}
######定义vcl_psss函数
sub vcl_pass {
    if (req.request == "PURGE") {
       error 502 "Purged On A Passed Object.";
    }
    return(pass);
}
######定义vcl_fetch函数
sub vcl_fetch {
######定义缓存,如果匹配到已定义文件结尾的缓存1天,其他则缓存1小时
    if (req.request == "GET" && req.url ~ "\.(html|jpg|png|bmp|jpeg|gif|js|ico|swf|css)$") {
       set beresp.ttl = 1d;
       set beresp.http.expires = beresp.ttl;
    } else {
       set beresp.ttl = 1h;
    }
    return(deliver);
}
######定义在http首部中,如果请求命中显示"HIT",未命中则显示"MISS"
sub vcl_deliver {
    if (obj.hits > 0) {
       set resp.http.X-Cache = "HIT";
    } else {
       set resp.http.X-Cache = "MISS";
    }
}
----------------------------------------------------------------------
[root@varnish ~]# service varnish restart    #重启服务生效,重启服务器后所有缓存将被清除,当然也可以不用重启服务使其生效,如下:
----------------------------------------------------------------------
[root@varnish ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
varnish> help                        #获取帮助
varnish> vcl.load acl_1 default.vcl  #加载acl文件,acl_1为配置名称
200   
VCL compiled.
varnish> vcl.list                    #查看加载的acl文件列表
200   
active          7 boot
available       0 acl_1
varnish> vcl.use acl_1               #应用acl文件
200
varnish> quit                        #退出
------------------------------------------------------------------------
注释:  -S:指定varnish的密钥文件  -T:指定varnish服务器地址及管理端口,默认端口为"6082"

服务验证:

压力测试,如下:
######后端服务器不经过缓存测试
[root@localhost ~]# ab -c 100 -n 1000 http://172.16.14.2/index.php
Concurrency Level:      1000
Time taken for tests:   6.812 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Non-2xx responses:      10051
Total transferred:      2281577 bytes
HTML transferred:       0 bytes
Requests per second:    1468.04 [#/sec] (mean)  #每秒请求并发
Time per request:       681.179 [ms] (mean)
Time per request:       0.681 [ms] (mean, across all concurrent requests)
Transfer rate:          327.10 [Kbytes/sec] received
----------------------------------------------------------------------
######经过缓存测试
[root@localhost ~]# ab -c 1000 -n 10000 http://172.16.14.1/index.php
Concurrency Level:      1000
Time taken for tests:   2.594 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Non-2xx responses:      10056
Total transferred:      3117360 bytes
HTML transferred:       0 bytes
Requests per second:    3855.05 [#/sec] (mean)
Time per request:       259.400 [ms] (mean)
Time per request:       0.259 [ms] (mean, across all concurrent requests)
Transfer rate:          1173.59 [Kbytes/sec] received
----------------------------------------------------------------------
注释:从上面数据中可以看出,经过缓存做压力测试并发量高
测试缓存是否能命中
[root@lamp2 ~]# curl -I http://172.16.14.1/index.php
HTTP/1.1 301 Moved Permanently
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
location: forum.php
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Accept-Ranges: bytes
Date: Wed, 09 Oct 2013 01:09:01 GMT
X-Varnish: 2142028839
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS    #第一次请求,未命中显示"MISS"
------------------------------------------------------------------------
[root@lamp2 ~]# curl -I http://172.16.14.1/index.php
HTTP/1.1 301 Moved Permanently
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/5.3.3
location: forum.php
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Accept-Ranges: bytes
Date: Wed, 09 Oct 2013 01:09:08 GMT
X-Varnish: 2142028841 2142028839
Age: 7
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT    #第二次请求,命中则显示"HIT"

验证动、静分离的效果:

[root@web ~]# service httpd stop    #停止提供静态页面的httpd服务
Stopping httpd:                                            [  OK  ]

blob.png

从上图中可以看出,提供静态页面的服务停止后,所有图片都不能显示,当然把服务再启动起来就可以访问正常了,这里就不在测试了…

验证健康状态检测

blob.png

查看缓存命中率状态;命中率的高低

blob.png

原创文章,作者:Net19_口香糖,如若转载,请注明出处:http://www.178linux.com/39130

(0)
Net19_口香糖Net19_口香糖
上一篇 2016-09-19
下一篇 2016-09-19

相关推荐

  • MariaDB数据库基于SSL实现远程访问和主从复制

    MariaDB数据库基于SSL实现远程访问和主从复制 实验环境 系统环境:Centos6.5 数据库版本:5.5.36-MariaDB-log MariaDB Server 虚机数量:2 方案实施: 1,配置CA;并为node1和node2生成key和证书 2,在node1和node2上安装Mariadb 3,配置节点1为MariaDB主节点 4,配置节点2…

    Linux干货 2016-05-18
  • Linux网站架构系列之Apache—-进阶篇

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nolinux.blog.51cto.com/4824967/1320167 本篇博文为Linux网站架构系列之apache的第二篇,我将带大家一起学习apache的编译参数,目录结构和配置文件等方面的知识,实现对apac…

    Linux干货 2016-08-15
  • N25_第六周作业

    1、复制/etc/rc.d/rc.sysinit文件至tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; :%s@^[[:space:]]\+@#&@g(CentOS7下并未看到这个文件) 2、复制/boot/grub/grub.conf至/tmp目录中,删除/tmp/grub.conf文件中的行首的空白字符;…

    Linux干货 2017-02-15
  • 新鲜出炉的一篇好PPT,MySQL Optimizer团队力作

    新鲜出炉的一篇好PPT,MySQL Optimizer团队Senior Principal Software Engineer Øystein同学亲自操刀完成的《How to Analyze and Tune MySQL Queries for Better Performance》内容值得期待,有实现分析,有实战用例。有需要的朋友可以点击下载! 下载地址:…

    Linux干货 2015-02-27
  • Linux磁盘管理

    面对一块硬盘,我们该如何使用它呢?本文从机械硬盘结构,分区,格式化,和挂载四个层次进行介绍。 一、机械硬盘结构 现在服务器使用机械式硬盘是主流,因为其造价低,容量大,和固态硬盘相比读写性能要差很多。机械硬盘主要由以下几个部件构成:转轴Spindle,盘片Platter,机械臂Boom,磁头Head。工作机制是马达带动盘片高速旋转,磁头对盘片进行擦写数据或读取…

    Linux干货 2016-09-01
  • Windows与linux分区的区别:

        对于我们普通人来讲,分区就是我们看到的“我的电脑”下面的C盘、D盘、E盘······,每个分区都有自己的区域,无法使用别的分区的空间,这样可以起到保护分区中文件的作用。其实,这样很容易理解。可是,对于linux初学者来讲,因为使用习惯了windows,到了linux下面,一下子很难转换过来。  &nb…

    2017-07-16