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侦探网页:
测试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工具
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运行异常缓慢
环境如下:
在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界面
安装论坛程序:
# 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/* #修改属主权限
将论坛程序拷贝到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 #创建测试页
将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 ]
从上图中可以看出,提供静态页面的服务停止后,所有图片都不能显示,当然把服务再启动起来就可以访问正常了,这里就不在测试了…
验证健康状态检测
查看缓存命中率状态;命中率的高低
原创文章,作者:oranix,如若转载,请注明出处:http://www.178linux.com/76634