LNMMP之nginx+“php-fpm”及memcached
說明:nginx不能像apache一樣動態的裝卸載php模塊,所以只能使用fastcgi協議跟後端php建立連接。Nginx提供靜態頁面,並將動態頁面提交給後端php-fpm服務器處理,
爲了應付更大的訪問量對服務器造成的壓力,方案引進了memcached做爲緩存服務器。
Memcached是一種開發工具,作爲一個服務器啓動使用。要想使用它需要程序員在php代碼中調用使用。需要結合使用memcachephp擴展來實現調用這一功能。
Memcached簡介:
Memcached是一種免費、開源、高性能、分佈式內存對象緩存系統,用於加速動態web應用程序,減輕數據庫負載。可應用各種需要緩存的場景,其主要目的是通過降低對Database的訪問來加速web應用程序。它是一個基於內存的“鍵值對”存儲,用於存儲數據庫調用、API調用或頁面引用結果的直接數據,如字符串、對象等。
Memcached簡單而強大。它的簡單的設計促進快速部署,易於開發,解決了大數據緩存面臨許多問題。是一款比較常用的開發工具。
Memcached工作機制
1. 簡單key/value存儲:服務器不關心數據本身的意義及結構,只要是可序列化數據即可。、
2. 功能的實現一半依賴於客戶端,一半基於服務器端:客戶負責發送存儲項至服務器端、從服務端獲取數據以及無法連接至服務器時採用相應的動作;服務端負責接收、存儲數據,並負責數據項的超時過期;
3. 各服務器間彼此無視:不在服務器間進行數據同步;
4. O(1)的執行效率
5. 清理超期數據:默認情況下,Memcached是一個LRU緩存,同時,它按事先預訂的時長清理超期數據;memcached不會刪除任何已緩存數據,只是在其過期之後不再爲客戶所見;而且,memcached也不會真正按期限清理緩存,而僅是當get命令到達時檢查其時長;
官網下載地址:http://www.memcached.org/
安裝:
l Nginx源碼安裝:
編譯安裝nginx需要事先需要安裝開發包組"Development Tools"和 "Development Libraries"。同時,還需要專門安裝pcre-devel包:
首先添加用戶nginx,實現以之運行nginx服務進程:
# groupadd -r nginx # useradd -r -g nginx nginx 接着開始編譯和安裝: # ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/local/nginx/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --user=nginx \ --group=nginx \ --with-http_ssl_module \ --with-http_flv_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/tmp/nginx/client/ \ --http-proxy-temp-path=/var/tmp/nginx/proxy/ \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ --http-scgi-temp-path=/var/tmp/nginx/scgi \ --with-pcre # make && make install
l 工作於fastcgi模式的php的安裝
# yum -y groupinstall "X Software Development" 如果想讓編譯的php支持mcrypt、mhash擴展和libevent,此處還需要如下幾個rpm包並安裝之: libmcrypt-2.5.8-4.el5.centos.i386.rpm libmcrypt-devel-2.5.8-4.el5.centos.i386.rpm mhash-0.9.9-1.el5.centos.i386.rpm mhash-devel-0.9.9-1.el5.centos.i386.rpm mcrypt-2.6.8-1.el5.i386.rpm # tar xf php-5.4.4.tar.bz2 # cd php-5.4.4 # ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-curl
實驗步驟:
一、配置nginx
1、配置nginx提供虛擬主機
server { listen 80; server_name www.a.com; # root /www/a.com; location ~\.php$ { fastcgi_pass 172.16.20.61:9000; root /web; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; include fastcgi_params; fastcgi_cache fcgi; fastcgi_cache_valid 200 10m; fastcgi_cache_valid 301 302 3m; fastcgi_cache_valid any 1m; } location ~*/(status|ping){-----------可以查看php—fpm狀態信息 # root /www/a.com; fastcgi_pass 172.16.20.61:9000; fastcgi_param SCRIPT_FILENAME $fastcgi_script_name; include fastcgi_params; }
2、測試nginx和php的結合是否成功運行
後端php監聽端口已開啓
[root@My1 ~]# ss -tunlp tcp LISTEN 0 128 172.16.20.61:9000 *:* users:(("php-fpm",2148,7),("php-fpm",2149,0),("php-fpm",2150,0))
二、memcached服務器的配置
1、安裝啓動memcached
[root@My2 ~]# yum install memcached [root@My1 ~]# memcached -u memcached [root@My1 ~]# ss -tunlp udp UNCONN 0 0 :::11211 :::* users:(("memcached",2428,29)) tcp LISTEN 0 128 :::11211 :::* users:(("memcached",2428,27)) tcp LISTEN 0 128 *:11211 *:* users:(("memcached",2428,26)) tcp LISTEN 0 128 :::111 :::*
2、查看memcached詳細信息
[root@My2 ~]# memcached -u memcached -vv 3、slab class 1: chunk size 96 perslab 10922 4、slab class 2: chunk size 120 perslab 8738 5、slab class 3: chunk size 152 perslab 6898 6、slab class 4: chunk size 192 perslab 5461 7、slab class 5: chunk size 240 perslab 4369 8、slab class 6: chunk size 304 perslab 3449 9、slab class 7: chunk size 384 perslab 2730 10、slab class 8: chunk size 480 perslab 2184 11、slab class 9: chunk size 600 perslab 1747
3、使用telnet連接查看memcached信息
Memcached提供一組基本命令用於基於命令行調用其服務或查看服務器狀態等。
[root@My2 ~]# telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. Stats------------------鍵入stats查看詳情 STAT pid 2480 STAT uptime 46 STAT time 1398506695 STAT version 1.4.4 STAT pointer_size 64 STAT rusage_user 0.003999 STAT rusage_system 0.000000 STAT curr_connections 10 STAT total_connections 12 add xuxu 0 50 12 hello xuxuxu STORED get xuxu VALUE xuxu 0 12 hello xuxuxu END
三、安裝memcachephp擴展,讓php連接測試memcached
程序員在開發的時候,自行調用了memcached的API,memcached的功能才能生效,而且要想使用還需要安裝php和memcached 的擴展。可以去php官網下載memcache擴展包
在php所在的主機安裝
[root@My1 ~]# cd memcache-2.2.7 [root@My1 memcache-2.2.7]# /usr/local/php/bin/ph phar phar.phar php php-cgi php-config phpize [root@My1 memcache-2.2.7]# /usr/local/php/bin/phpize Configuring for: PHP Api Version: 20100412 Zend Module Api No: 20100525 Zend Extension Api No: 220100525 [root@My1 memcache-2.2.7]# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache [root@My1 memcache-2.2.7]# make && make install
安裝完成的時候會生成一個memcache.so模塊的路徑,記得把這個路徑記下來寫到php的配置文件中。
編輯/usr/local/php/lib/php.ini,在“動態模塊”相關的位置添加如下一行來載入memcache擴展:
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/memcache.so
然後就可以寫一個測試頁面,來測試php是否能與後端緩存服務器聯繫了。
[root@My1 php]# vim /web/testmem.php <?php $mem = new Memcache; $mem->connect("172.16.20.62", 11211) or die("Could not connect"); 寫上你的緩存服務器的ip地址。 $version = $mem->getVersion(); echo "Server's version: ".$version."<br/>\n"; $mem->set('hellokey', 'Hello World', 0, 600) or die("Failed to save data at the memcached server"); echo "Store data in the cache (data will expire in 600 seconds)<br/>\n"; $get_result = $mem->get('hellokey'); echo "$get_result is from memcached server."; ?>
Ok.打開瀏覽器測試吧。
刷新可見此值變大
四、好用的查看memcached服務器工作情況的工具的安裝使用
1.直接解壓各種memcache管理類工具到頁面目錄下,修改連接的緩存服務器ip即可
2、好用的中文節目緩存服務器查看工具admin-master
統計信息
參數 | 值 | 描述 |
---|---|---|
pid | 8337 | memcache服務器進程ID |
uptime | 6536 | 服務器已運行秒數 |
time | 1398023613 | 服務器當前Unix時間戳 |
version | 1.4.4 | memcache版本 |
pointer_size | 64 | 操作系統指針大小 |
rusage_user | 0.070989 | 進程累計用戶時間 |
rusage_system | 0.378942 | 進程累計系統時間 |
curr_connections | 11 | 當前連接數量 |
total_connections | 164 | Memcached運行以來連接總數 |
connection_structures | 12 | Memcached分配的連接結構數量 |
cmd_get | 60 | get命令請求次數 |
cmd_set | 59 | set命令請求次數 |
cmd_flush | 3 | flush命令請求次數 |
get_hits | 59 | get命令命中次數 |
get_misses | 1 | get命令未命中次數 |
delete_misses | 0 | delete命令未命中次數 |
delete_hits | 0 | delete命令命中次數 |
incr_misses | 0 | incr命令未命中次數 |
incr_hits | 0 | incr命令命中次數 |
decr_misses | 0 | decr命令未命中次數 |
decr_hits | 0 | decr命令命中次數 |
cas_misses | 0 | cas命令未命中次數 |
cas_hits | 0 | cas命令命中次數 |
cas_badval | 0 | 使用擦拭次數 |
auth_cmds | 0 | 認證命令處理的次數 |
auth_errors | 0 | 認證失敗數目 |
bytes_read | 4337 | 讀取總字節數 |
bytes_written | 74120 | 發送總字節數 |
limit_maxbytes | 67108864 | 分配的內存總大小(字節) |
accepting_conns | 1 | 接受新的連接 |
listen_disabled_num | 0 | 失效的監聽數 |
threads | 4 | 當前線程數 |
conn_yields | 0 | 連接操作主動放棄數目 |
bytes | 0 | 當前存儲佔用的字節數 |
curr_items | 0 | 當前存儲的數據總數 |
total_items | 59 | 啓動以來存儲的數據總數 |
evictions | 0 | LRU釋放的對象數目 |
參數 | 值 | 描述 |
---|---|---|
maxbytes | 67108864 | 最大字節數限制(0無限制) |
maxconns | 1024 | 允許最大連接數 |
tcpport | 11211 | TCP端口 |
udpport | 11211 | UDP端口 |
inter | NULL | IP地址 |
verbosity | 0 | 日誌(0=none,1=som,2=lots) |
oldest | 3397 | 最老對象過期時間 |
evictions | on | LRU可用(on/off) |
domain_socket | NULL | Socketpath |
umask | 700 | 創建Socket的掩碼 |
growth_factor | 1.25 | 增長因子 |
chunk_size | 48 | chunk大小(key+value+flags) |
num_threads | 4 | 線程數(默認4,可通過-t參數設置) |
stat_key_prefix | : | stats分隔符 |
detail_enabled | no | 顯示stats細節信息(yes/no) |
reqs_per_event | 20 | 最大IO吞吐量(每event) |
cas_enabled | yes | 是否啓用CAS(yes/no,-C禁用) |
tcp_backlog | 1024 | TCP監控日誌 |
binding_protocol | auto-negotiate | 綁定協議 |
auth_enabled_sasl | no | 是否啓用SASL驗證(yes/no) |
item_size_max | 1048576 | 數據最大尺寸 |