一、Nginx是什麼 Nginx (engine x) 是一個 高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器 。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。 ...
一、Nginx是什麼
Nginx (engine x) 是一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。
其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。
Nginx是一款輕量級的Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。其特點是占有記憶體少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
目前淘寶在nginx做了二次開發:tengine(見下文)。
二、Nginx實現反向代理
2.1 正向代理和反向代理
正向代理:是一個位於客戶端和目標伺服器之間的伺服器,為了從目標伺服器取得內容,客戶端向代理髮送一個請求並指定目標(目標伺服器),然後代理向目標伺服器轉交請求並將獲得的內容返回給客戶端。
簡單來說:
我是一個用戶,我訪問不了某網站,但是我能訪問一個代理伺服器;
這個代理伺服器呢,他能訪問那個我不能訪問的網站;
於是我先連上代理伺服器,告訴他我需要那個無法訪問網站的內容;
代理伺服器去取回來,然後返回給我;
從網站的角度,只在代理伺服器來取內容的時候有一次記錄;
有時候並不知道是用戶的請求,也隱藏了用戶的資料,這取決於代理告不告訴網站。
反向代理:對於客戶端而言它就像是目標伺服器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接著反向代理將判斷向何處(目標伺服器)轉交請求,並將獲得的內容返回給客戶端,就像這些內容原本就是它自己的一樣。
簡單來說,
用戶訪問 http://ooxx.me/readme;
但ooxx.me上並不存在readme頁面;
他是偷偷從另外一臺伺服器上取回來,然後作為自己的內容吐給用戶;
但用戶並不知情┐(゚~゚)┌
這裡所提到的 ooxx.me 這個功能變數名稱對應的伺服器就設置了反向代理功能;
正向代理和反向代理的區別:
(1)從用途上來講:
正向代理的典型用途是為在防火牆內的區域網客戶端提供訪問Internet的途徑。正向代理還可以使用緩衝特性減少網路使用率。反向代理的典型用途是將防火牆後面的伺服器提供給Internet用戶訪問。反向代理還可以為後端的多台伺服器提供負載平衡,或為後端較慢的伺服器提供緩衝服務。
另外,反向代理還可以啟用高級URL策略和管理技術,從而使處於不同web伺服器系統的web頁面同時存在於同一個URL空間下。
(2)從安全性來講:
正向代理允許客戶端通過它訪問任意網站並且隱藏客戶端自身,因此你必須採取安全措施以確保僅為經過授權的客戶端提供服務。
反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。
2.2 nginx實現反向代理
nigix代理是基於ngx_http_proxy
模塊實現的。該模塊有很多配置選項,如:
proxy_pass
指定將請求代理至server的URL路徑。
proxy_set_header
將發送至server的報文的某首部進行重寫。
proxy_send_timeout
在連接斷開之前兩次發送到server的最大間隔時長;過了這麼長時間後端還是沒有收到數據,連接會被關閉。
proxy_read_timeout
是從後端讀取數據的超時時間,兩次讀取操作的時間間隔如果大於這個值,和後端的連接會被關閉。
proxy_connect_timeout
是和後端建立連接的超時時間。
接下來,我們就來仔細說說重點的配置選項:
2.2.1 proxy_pass
配置
1)替換uri
常用於頁面很固定的時候。比如雙十一的大促主頁面。
語法如下:
location /uri {
proxy_pass http://ip:port/newuri/; //location的/uri將被替換為/newuri
}
舉例如下:
location /mobi {
proxy_pass http://172.17.251.66/mobile/; //將/mobi 的請求跳轉到新伺服器上/mobile目錄下
}
在這裡,我們需要註意的是,http://ip:port/newuri;
,這個地方最後面加不加/
意義是不同的。
如上文,我們就加上了/
,則意味著全部替換。
如果我們不加/
,則是將新路徑當做其上級目錄,訪問的是新路徑下的原路徑。舉例如下:
location /mobi {
proxy_pass http://172.17.251.66/mobile; //將/mobi 的請求跳轉到新伺服器上/mobile/mobi目錄下
}
2)轉換url
相當於分流,基於url來分流,把一類的請求發送到一個機器(一個集群)中,具體操作看機器的設置。
如果location的URI是通過模式匹配定義的,其URI將直接被傳遞,而不能為其指定轉換的另一個URI。
舉例如下:
location ~ ^/mobile {
proxy_pass http://172.17.251.66;
}
這段代碼的意思是,只要有/mobile
的網址,會直接轉到http://172.17.251.66/mobile
下。
3)URL重定向
也就是整個url的重定向。比如兩個網站合併或者更換功能變數名稱時,原先的功能變數名稱已經不用了,但是有些頁面還在訪問,就可以通過這種方法來整個重定向,重定向到新的功能變數名稱中。
如果在location中使用的URL重定向,那麼nginx將使用重定向後的URI處理請求,而不再考慮之前定義的URI。
location /youxi{
rewrite ^(.*)$ /mobile/$1 break;
proxy_pass http://172.17.251.66;
}
這段代碼的意思就是,只要你訪問的是帶/youxi
的頁面,就會自動重定向到http://172.16.100.1/mobile/$1
上。$1
指的是^(.*)$
中括弧內的部分。這樣就實現了整個url的重定向。
在這裡,我們也來詳細說說ngx_http_rewrite_module
模塊,這是一個非常好用的模塊。
2.2.1.1ngx_http_rewrite_module
模塊
1)rewrite 用法
將用戶請求的URI基於regex所描述的模式進行檢查,匹配到時將其替換為replacement指定的新的URI。
其語法是:
rewrite regex replacement [flag]
註意:如果在同一級配置塊中存在多個rewrite規則,那麼會自下而下逐個檢查;被某條件規則替換完成後,會重新一輪的替換檢查。
隱含有迴圈機制,但不超過10次;如果超過,提示500響應碼, [flag]
所表示的標誌位用於控制此迴圈機制。
如果replacement是以http://或https://開頭,則替換結果會直接以重向返回給客戶端。
下麵我們來說一說flag
的具體選項:
[flag]
:
last
:重寫完成後停止對當前URI在當前location中後續的其它重寫操作,而後對新的URI啟動新一輪(從第一個開始)重寫檢查;提前重啟新一輪迴圈。
break
:重寫完成後停止對當前URI在當前location中後續的其它重寫操作,而後直接跳轉至重寫規則配置塊之後的其它配置;結束迴圈,建議在location中使用。
redirect
:臨時重定向,重寫完成後以臨時重定向方式直接返回重寫後生成的新URI給客戶端,由客戶端重新發起請求;不能以http://或https://開頭 ,使用相對路徑,狀態碼: 302。
permanent
:重寫完成後以永久重定向方式直接返回重寫後生成的新URI給客戶端,由客戶端重新發起請求,狀態碼:301。
由下圖我們可以更清楚的看出跳轉到的位置:
2)return用法
return的用法語法如下:
return code [text];
return code URL;
return URL;
停止處理,並返回給客戶端指定的響應碼。
2.2.2 proxy_set_header
配置
proxy_set_header
用於將發送至server的報文的某首部進行重寫。常用於nginx做負載均衡時, 獲取客戶端IP時, 添加forward頭部。
語法如下:
proxy_set_header Host $host; //目的主機地址
proxy_set_header X-REMOTE-IP $remote_addr; //上一跳地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; //客戶端主機地址
原有請求報文中如果存在X-Forwared-For
首部, 則將client_addr
以逗號分隔補原有值後, 否則則直接添加此首部;
2.3 nginx實現負載均衡
nginx負載均衡是ngx_http_upstream_module
模塊的功能, 需要在配置文件http塊
上下文中定義upstream塊
, 指定一組負載均衡的後端伺服器, 然後在上面講到的proxy_pass
中引用, 就可以反向代理時實現負載均衡了。
需要註意的是:ngx_http_upstream
段要在server
段前面,要定義在http
段中。
語法如下:
server address [parameters];
接著,我們來看一看選項:
paramerters
:
weight
: 負載均衡策略權重, 預設為1;
max_fails
: 在一定時間內(這個時間在fail_timeout參數中設置) 檢查這個伺服器是否可用時產生的最多失敗請求數
fail_timeout
: 在經歷了max_fails
次失敗後, 暫停服務的時間。max_fails
可以和fail_timeout
一起使用, 進行對後端伺服器的健康狀態檢查;
backup
: 當所有後端伺服器都宕機時, 可以指定代理伺服器自身作為備份, 對外提供維護提示頁面;
down
: 永久不可用。
需要註意一下的是:max_fails
和fail_timeout
是配對使用的,前者是定義在一定時間內檢查這個伺服器是否連接可用時產生的最多失敗請求的次數,後者是規定這個時間,並且這個時間也是在經過前者的失敗次數後,暫停服務的時間。
示例:
max_fails=3
fail_timeout=10s
意思就是 10秒內失敗3次,則暫停服務10秒。
舉例:
upstream dynamic {
server backend1.example.com weight=5;
server backend2.example.com:8080 max_fails=3; fail_timeout=5s ;
server 192.0.2.1 max_fails=3;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
當然,我們還有一個專業的健康檢測模塊 nginx_upstream_check_module-master
,可以根據需要使用。
upstream
塊里可以用多個server
選項配置多個後端伺服器,同時還可配置對後端伺服器的健康狀態檢查,可以在server
後面加上max_fails
(
proxy_next_upstream指定檢查策略,預設為返回超時為失敗)和fail_timeout
參數實現;也可以用health_check
選項來實現,health_check
可以指定的參數較多, 不過需要定義在location
上下文中。
另外, 可以指定代理伺服器自身作為備份server
, 當所有後端伺服器都宕機時, 對外提供維護提示頁面。
還可以指定負載均衡策略: 主要有round_robin
(加權輪詢, 預設) 、hash
、ip_hash
、least_conn
(最少連接)和least_time
(最少響應時間,商業版本),策略定義在upstream
上下文即可。
具體實例參照tengine
實現動靜分離(見下文)。
三、tengine
Tengine是由淘寶網發起的Web伺服器項目。它在Nginx的基礎上,針對大訪問量網站的需求,添加了很多高級功能和特性。Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等得到了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。
從2011年12月開始,Tengine成為一個開源項目,Tengine團隊在積極地開發和維護著它。Tengine團隊的核心成員來自於淘寶、搜狗等互聯網企業。Tengine是社區合作的成果,我們歡迎大家參與其中,貢獻自己的力量。
tengine
實現動靜分離
1、下載並解壓安裝包
進入官網下載安裝包,
這裡附上官網網址:tengine.taobao.org
小編下載的是2.2.1
版本。大家可以根據自己的需要來下載。接著,我們使用rz
命令上傳至虛擬機。
上傳完成後,我們來解壓:
tar xvf tengine-2.1.1.tar.gz
2、編譯安裝tengine
首先,我們要安裝依賴的包和包組:
yum install pcre-devel openssl-devel -y
yum groupinstall "development tools" -y
安裝完成後,我們進入這個目錄:
cd tengine-2.1.1
然後,我們就可以進行編譯安裝了:
./configure --prefix=/usr/local/tengine
make && make install
3、修改配置文件
我們的需求是讓這台機器充當調度器,坐到動靜分離,所以我們需要在配置文件中添加下麵這些:
配置文件為/usr/local/tengine/conf/nginx.conf
。
http
段,添加如下內容:
upstream server-cluster{
server 172.17.77.77:80;
server 172.17.252.111:80;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
upstream staticsrvs{
server 172.17.22.22:80;
server 172.17.1.7:80;
check interval=3000 rise=2 fall=5 timeout=1000 type=http;
check_http_send "HEAD / HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server
段,添加如下內容:
location /stats {
check_status; //定義一個web監聽頁面
}
//以下部分用來實現動靜分離
location ~* .jpg|.png|.gif|.jpeg$ {
proxy_pass http://staticsrvs;
}
location ~* .css|.js|.html|.xml$ {
proxy_pass http://staticsrvs;
}
location / {
proxy_pass http://server-cluster;
}
如果有下麵這一段,我們需要把它註釋掉:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
這樣,我們的配置文件就修改完成了。
在我們啟動服務前,如果我們的機器開啟了nginx
服務或者http
服務,要記得把服務關閉,因為tengine
服務使用的也是80埠。
我們來啟動服務:
cd /usr/local/tengine/sbin
./nginx -t //檢查配置文件語法錯誤
./nginx //啟動服務
./nginx -s reload //重新載入服務
當然,我們也可以直接把這個服務寫到我們的啟動腳本里,這樣,以後我們通過service
或者systemctl
就可以控制了。
centos7里的啟動腳本在/usr/lib/systemd/system/nginx.service
在centos6中,我們如果之前使用yum
安裝過nginx
,我們就可以複製一個nginx
的服務腳本,改名為tengine
,並設置開機自啟,具體操作如下:
cp /etc/init.d/nginx /etc/init.d/tengine
vim /etc/init.d/tengine
4、測試
由於我們在配置文件中定義了一個web的監聽頁面,所以我們可以去訪問一下:
上圖中就是我們的監聽頁面,如果某一伺服器出現故障,則會標紅提示。
我們的網站也是可以正常訪問的:
接著,我們來測試一下我們的動靜分離實現情況,我們把兩台靜態的伺服器的nginx
服務down掉:
systemctl stop nginx
然後我們來看看我們的監聽頁面,需要刷新幾次:
我們可以看到,掛掉的兩台伺服器已經標紅了。接著我們來訪問一下我們的網站:
可以看到,所有的靜態文件,包括圖片
和css
、js
等文件都沒有顯示了,我們的動靜分離實驗圓滿完成。
四、nginx實現緩存
4.1 為什麼需要緩存
緩存的最根本的目的是為了提高網站性能,減輕頻繁訪問數據,而給資料庫帶來的壓力。合理的緩存,還會減輕程式運算時,對CPU帶來的壓力。在電腦現代結構中,操作記憶體中的數據比操作存放在硬碟上的數據是要快N個數量級的,操作簡單的文本結構的數據,比操作資料庫中的數據快N個數量級 。
例如:每次用戶訪問網站,都必須從資料庫讀取網站的標題,每讀一次需要15毫秒的時間,如果有100個用戶(先不考慮同一時間訪問),每小時訪問10次,那麼就需要讀取資料庫1000次,需要時間15000毫秒。如果把頁面直接變成頁面緩存,則每次訪問就不需要去資料庫讀取,大大提升了網站性能。
4.2 緩存服務的工作原理
緩存的工作原理可以很清楚的從上圖中看出來。通過緩存,我們就可以減少大量的重覆讀取過程,從而節省我們的資源,提升網站的性能。
緩存數據分為兩部分(索引,數據):
1、存儲數據的索引,存放在記憶體中;
2、存儲緩存數據,存放在磁碟空間中;
4.3 nginx緩存模塊
Nginx實現緩存是通過代理緩存pxory_cache
, 這也是ngx_http_proxy_module
模塊提供的功能, 這裡配置選項較多, 常用的選項有: proxy_cache_path
、 proxy_cache
和proxy_cache_valid
。
4.3.1 proxy_cache_path
proxy_cache_path定義一個完整的緩存空間,指定緩存數據的磁碟路徑、索引存放的記憶體空間以及一些其他參數,如緩存刪除策略。
註意:該選項只能定義在http塊上下文中。
如:
proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10; //緩存數據存儲在/data/cache目錄中
下麵我們來看看具體的選項:
levels
:配置在該目錄下再分兩層目錄,一層1個隨機字元作為名稱,二層2個隨機字元作為名稱,levels最多三層,每層最多兩個字元,這是為了加快訪問文件的速度;最後使用代理url的哈希值作為關鍵字與文件名,一個緩存數據如下:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
;
keys_zone
:用來為這個緩存區起名,並設置大小。上面的例子就是指定名稱為web,這個名稱後面proxy_cache需要引用;而10m就是記憶體空間的大小;
max_size
:指定最大緩存數據磁碟空間的大小;
inactive
:在inactive指定的時間內,未被訪問的緩存數據將從緩存中刪除。
4.3.2 proxy_cache
proxy_cache
用來引用上面proxy_cache_path
定義的緩存空間, 現時打開緩存功能, 如下:
proxy_cache web; //引用上面定義上的緩存空間, 同一緩存空間可以在幾個地方使用
4.3.3 proxy_cache_valid
proxy_cache_valid
設置不同響應代碼的緩存時間, 如:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
4.4 配置nginx緩存實例
先配置proxy_cache_path
,再配置proxy_cache
引用、打開緩存空間,接著配置兩個proxy_cache_valid
;為方便調試測試,我們可以通過add_header
給請求響應增加一個頭部信息,表示從伺服器上返回的cache
狀態怎麼樣(有沒有命中),主要配置如下:
定義一個完整的緩存空間;緩存數據存儲在/data/cache目錄中;配置在該目錄下再分兩層目錄;名稱為web(proxy_cache引用);10m記憶體空間大小;最大緩存數據磁碟空間的大小;10分鐘未被訪問的緩存數據將從緩存中刪除
http {
proxy_cache_path /data/cache levels=1:2 keys_zone=web:10m max_size=1G inactive=10m;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
add_header Magedu-Cache "$upstream_cache_status form $server_addr"; //給請求響應增加一個頭部信息,表示從伺服器上返回的cache狀態怎麼樣(有沒有命中)
location / {
proxy_pass http://webserver; //引用上面定義的upstream負載均衡組
proxy_cache web; //引用上面定義上的緩存空間,同一緩存空間可以在幾個地方使用
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m; //對代碼200和302的響應設置10分鐘的緩存,對代碼404的響應設置為1分鐘;
}
}
}
五、memcached
5.1 memcached是什麼
Memcached
是一個自由開源的,高性能,分散式記憶體對象緩存系統。它是一種基於記憶體的key-value
存儲,用來存儲小塊的任意數據(字元串、對象)。這些數據可以是資料庫調用、API調用或者是頁面渲染的結果。
Memcached
簡潔而強大。它的簡潔設計便於快速開發,減輕開發難度,解決了大數據量緩存的很多問題。它的API相容大部分流行的開發語言。本質上,它是一個簡潔的key-value存儲系統。
一般的使用目的是,通過緩存資料庫查詢結果,減少資料庫訪問次數,以提高動態Web應用的速度、提高可擴展性。
5.2 安裝配置memcached
5.2.1 安裝
直接使用yum
安裝即可。
yum install memcached -y
5.2.2 配置文件
memcached
的配置文件與我們常見服務的配置文件不同,他的配置文件非常簡單,配置文件為/etc/sysconfig/memcached
。我們來看一下裡面的東西:
PORT="11211" #埠
USER="memcached" #啟動用戶
MAXCONN="1024" #最大連接
CACHESIZE="64" #緩存空間大小
配置文件里只有常用的一些設置,我們可以直接通過修改文件來更改配置,也可以等到我們啟動服務的時候添加下麵的選項來更改配置:
-d
指定memcached進程作為一個守護進程啟動
-m <num>
指定分配給memcached使用的記憶體,單位是MB,預設為64;
-u <username>
運行memcached的用戶
-l <ip_addr>
監聽的伺服器IP地址,如果有多個地址的話,使用逗號分隔,格式可以為“IP地址:埠號”,例如:-l
指定192.168.0.184:19830,192.168.0.195:13542;埠號也可以通過-p
選項指定
-p <num>
Listen on TCP port, the default is port 11211.
-c <num>
設置最大運行的併發連接數,預設是1024
-R <num>
為避免客戶端餓死(starvation),對連續達到的客戶端請求數設置一個限額,如果超過該設置,會選擇另一個連接來處理請求,預設為20
-k
設置鎖定所有分頁的記憶體,對於大緩存應用場景,謹慎使用該選項
-P
保存memcached進程的pid文件
-s <file>
指定Memcached用於監聽的UNIX socket文件
-a <perms>
設置-s選項指定的UNIX socket文件的許可權
-U <num>
Listen on UDP port, the default is port 11211, 0 is off.
我們來開啟服務:
systemctl start memcached.service
如果我們想要連接memcached
,需要用到telnet
工具,如果沒有安裝的話,直接yum
安裝即可。我們來連接一下:
[root@rs01 ~]# telnet 172.17.77.77 11211
Trying 172.17.77.77...
Connected to 172.17.77.77.
Escape character is '^]'.
stats //查看狀態
STAT pid 15480
STAT uptime 304
STAT time 1510475514
STAT version 1.4.15
STAT libevent 2.0.21-stable
STAT pointer_size 64
STAT rusage_user 0.027883
STAT rusage_system 0.074357
STAT curr_connections 10
STAT total_connections 11
STAT connection_structures 11
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0 //總命中次數
STAT get_misses 0 //總未命中次數
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 7
STAT bytes_written 0
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
END
一般我們衡量一個緩存的性能好壞,一方面是看速度,還有就是看它的命中率。如果一個緩存的命中率很低,就沒有太多存在的必要。所以,我們的緩存策略也是很重要的。
接著,我們就來看看在memcached
中去插入數據的命令:
命令為set
,語法如下:
set key flags exptime bytes [noreply]
value
我們來看看各個選項的意思:
key
是通過被存儲在Memcached的數據並從memcached獲取鍵(key)的名稱。
flags
是32位無符號整數,該項目被檢索時用的數據(由用戶提供),並沿數據返回伺服器存儲。
exptime
以秒為單位的過期時間,0表示沒有延遲,如果exptime大於30天,Memcached將使用它作為UNIX時間戳過期。
bytes
是在數據塊中,需要被存儲的位元組數。基本上,這是一個需要存儲在memcached的數據的長度。
noreply
(可選) 參數告知伺服器不發送回覆
value
是一個需要存儲的數據。數據需要與上述選項執行命令後,將通過新的一行。
我們來依照上述語法添加一條進去:
set name 1 1800 4
keer
STORED //表明存上了
現在我們可以來查看一下:
get name
VALUE name 1 4
keer
END
可以看出,我們剛剛添加的內容已經添加上了,我們再來查看一下狀態:
stats
……
STAT get_hits 1 //總命中次數
STAT get_misses 0 //總未命中次數
……
發現我們的總命中次數多了一次,就是因為我們剛剛執行了get
命令,並且是成功的,我們現在來嘗試一下get
一個不存在的內容:
get age
END
然後再來看一下狀態:
stats
……
STAT get_hits 1 //總命中次數
STAT get_misses 1 //總未命中次數
……
因為我們去獲取了一個不存在的內容,所以miss數+1。
當然,這隻是我們做的演示,真正的生產環境是不允許我們這麼玩的0.0會被玩壞=。=
我們還需要記住的一點是,只要我們的機器斷電了,或或者系統重啟了,memcached
裡面的數據就全部沒有了。因為我們的memcached
是存放在記憶體中的非關係型資料庫,是完全工作在記憶體中的,所以只要一斷電就徹底玩完了╮(╯﹏╰)╭
但是我們的nginx數據是存在磁碟中的,只有索引放在記憶體中,所以即使掉電了,因為磁碟中的數據還在,索引也可以根據數據重新生成。
所以,這樣就要涉及到一個選擇問題了,看你是追求性能,還是追求安全。我們可以根據不同的需求來選擇不同的方式存儲數據。
5.2.3 memcached
測試腳本
在我們的生產環境,我們是可以使用程式來調用的。比如我們可以使用php
客戶端連過來來調用memcached
。
為了使我們的php
連接上memcache
的客戶端,我們需要安裝一個包——php-memcache
。我們直接使用yum
安裝即可:
yum install php-memcache
安裝完成後,我們需要重啟一下php-fpm
服務:
systemctl restart php-fpm
我們之前在/data/web/
下創建過一個phpinfo.php
文件,我們可以來通過瀏覽器查看一下:
可以看出我們的memcache
已經和php
建立了連接。
接下來,給大家提供一個簡單的php
測試memcache
的小腳本:
vim /data/web/memcached.php
<?php
$mem = new Memcache;
$mem->connect("172.17.77.77", 11211); #連接Memcached,ip是你做實驗機器的ip
$version = $mem->getVersion();
echo "Server's version: ".$version."<br/>\n"; #輸出Memcached版本信息
$mem->set('magedu', 'Hello World', 0, 600); #向Memcached存儲數據'Hello World',時間為600s
echo "Store data in the cache (data will expire in 600 seconds)<br/>\n";
$get_result = $mem->get('magedu'); #獲取testkey的值
echo "$get_result is from memcached server.";
?>
然後我們就可以去訪問了:
bing~我們的測試已經成功啦~
以上~如果有不足之處還請大家多多指教喏٩(๑>◡<๑)۶