服務端部署
第一個里程碑:安裝依賴關系
Memcache用到了libevent這個庫用於Socket的處理。
1 [root@nfs01 ~]# yum install libevent libevent-devel nc -y
第二個里程碑:安裝memcache
1 [root@nfs01 ~]# yum install memcached -y 2 [root@nfs01 ~]# which memcached 3 /usr/bin/memcached
第三個里程碑:啟動memcached服務
1 [root@nfs01 ~]# memcached -m 16m -p 11211 -d -u root -c 8192 2 [root@nfs01 ~]# lsof -i :11211 3 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 4 memcached 10796 root 26u IPv4 85717 0t0 TCP *:memcache (LISTEN) 5 memcached 10796 root 27u IPv6 85718 0t0 TCP *:memcache (LISTEN) 6 memcached 10796 root 28u IPv4 85721 0t0 UDP *:memcache 7 memcached 10796 root 29u IPv6 85722 0t0 UDP *:memcache 8 [root@nfs01 ~]# netstat -lntup |grep memca 9 tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 10796/memcached 10 tcp 0 0 :::11211 :::* LISTEN 10796/memcached 11 udp 0 0 0.0.0.0:11211 0.0.0.0:* 10796/memcached 12 udp 0 0 :::11211 :::* 10796/memcached
注:memcached可以同時啟動多個實例,端口不一致即可。
[root@nfs01 ~]# memcached -m 16m -p 11212 -d -u root -c 8192
參數說明:
參數 |
參數說明 |
-m |
max memory to use for items in megabytes (default: 64 MB) |
-p |
TCP port number to listen on (default: 11211) |
-d |
run as a daemon |
-u |
assume identity of <username> (only when run as root) |
-c |
max simultaneous connections (default: 1024) |
第四個里程碑:寫入開機自啟動
1 echo 'memcached -m 16m -p 11211 -d -u root -c 8192' >>/etc/rc.local
客戶端部署(web服務器)
第一個里程碑:安裝PHP memcache 擴展插件
命令集如下:
1 cd /server/tools 2 wget http://pecl.php.net/get/memcache-2.2.7.tgz 3 tar xf memcache-2.2.7.tgz 4 cd memcache-2.2.7 5 /application/php/bin/phpize 6 ./configure -enable-memcache --with-php-config=/application/php/bin/php-config 7 make && make install
完整操作過程:
1 [root@web01 ~]# cd /server/tools/ 2 [root@web01 tools]# wget http://pecl.php.net/get/memcache-2.2.7.tgz 3 [root@web01 tools]# tar xf memcache-2.2.7.tgz 4 [root@web01 tools]# cd memcache-2.2.7 5 6 [root@web01 memcache-2.2.7]# /application/php/bin/phpize 7 Configuring for: 8 PHP Api Version: 20121113 9 Zend Module Api No: 20121212 10 Zend Extension Api No: 220121212 11 [root@web01 memcache-2.2.7]# ./configure -enable-memcache --with-php-config=/application/php/bin/php-config 12 [root@web01 memcache-2.2.7]# make && make install
查看是否安裝成功
1 [root@web01 memcache-2.2.7]# ls -l /application/php/lib/php/extensions/no-debug-non-zts-20121212/ 2 total 252 3 4 -rwxr-xr-x 1 root root 258048 Nov 7 10:03 memcache.so
memcache.so表示插件安裝成功。
第二個里程碑:配置memcache客戶端使其生效
1 [root@web01 memcache-2.2.7]# cd /application/php/lib/ 2 [root@web01 lib]# vim php.ini 3 …… 4 [root@web01 lib]# tail -2 php.ini 5 extension_dir = "/application/php/lib/php/extensions/no-debug-non-zts-20121212/" 6 extension = memcache.so
第三個里程碑:檢測語法,重啟服務
1 [root@web01 lib]# /application/php/sbin/php-fpm -t 2 [07-Nov-2017 10:20:44] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful
#重啟服務
1 killall php-fpm 2 killall php-fpm 3 /application/php/sbin/php-fpm
瀏覽器訪問phpinfo頁面出現memcache信息表示配置成功。
第四個里程碑:編寫測試memcache文件
1 [root@web01 blog]# cat test_memcache.php 2 <?php 3 $memcache = new Memcache; 4 $memcache->connect('172.16.1.31', 11211) or die ("Could not connect NFS server"); 5 $memcache->set('key', 'Memcache connect OK'); 6 $get = $memcache->get('key'); 7 echo $get; 8 ?>
測試出現Memcache connect OK 表示連接成功
1 [root@web01 blog]# /application/php/bin/php test_memcache.php 2 Memcache connect OK
第五個里程碑:修改php配置(設置session共享)
1 [root@web01 ~]# vim /application/php/lib/php.ini
原配置
1 session.save_handler = files 2 session.save_path = "/tmp"
修改為:
1 session.save_handler = memcache 2 session.save_path = "tcp://172.16.1.31:11211"
⚠修改完成之后要重啟php服務
1 killall php-fpm 2 killall php-fpm 3 /application/php/sbin/php-fpm
修改之前phpinfo信息
修改之后phpinfo信息
到此企業級memcache(session共享)部署完畢
1.1.1 Memcached在集群中session共享存儲的優缺點
優點:
1)讀寫速度上會比普通文件files速度快很多。
2)可以解決多個服務器共用session的難題。
缺點:
1)session數據都保存在memory中,持久化方面有所欠缺,但對session數據來說不是問題。
2)一般是單台,如果部署多台,多台之間數據無法同步。通過hash算法分配依然有session丟失的問題。
替代方案:
1)可以用其他的持久化系統存儲session,例如redis,ttserver來替代memcached.
2)高性能並發場景,cookies效率比session要好很多,因此,大網站都會用cookies解決會話共享的問題.
3)一些不好的方法:lvs-p,nginx ip_hash,不推薦使用.
DedeCMS使用memcache問題
問題: 上述文件進行修改后,DedeCMS發現無法訪問后台 http://www.etiantia.org/dede
解決辦法:
修改文件一:
1 [root@web01 include]# pwd 2 /application/nginx/html/www/include 3 4 [root@web01 include]# vim common.inc.php 5 135 //Session保存路徑 6 136 $enkey = substr(md5(substr($cfg_cookie_encode,0,5)),0,10); 7 137 //$sessSavePath = DEDEDATA."/sessions_{$enkey}"; 8 138 $sessSavePath = "tcp://172.16.1.31:11211"; 9 139 if ( !is_dir($sessSavePath) ) mkdir($sessSavePath);
修改文件二:
1 [root@web01 include]# vim vdimgck.php 2 24 $enkey = substr(md5(substr($cfg_cookie_encode,0,5)),0,10); 3 25 //$sessSavePath = DEDEDATA."/sessions_{$enkey}"; 4 26 $sessSavePath = "tcp://172.16.1.31:11211"; 5 27 if ( !is_dir($sessSavePath) ) mkdir($sessSavePath);
讓DedeCMS直接使用memcache的共享.解決問題.
特別感謝:元芳