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 //當前操作系統的指針大?。?2位系統一般是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 ]
從上圖中可以看出,提供靜態頁面的服務停止后,所有圖片都不能顯示,當然把服務再啟動起來就可以訪問正常了,這里就不在測試了…
驗證健康狀態檢測
查看緩存命中率狀態;命中率的高低
原創文章,作者:Net19_口香糖,如若轉載,請注明出處:http://www.www58058.com/39130