下面來到各位介紹一篇章nginx cache靜態化+tmpfs 高性能cdn方案,如果各位對于高性能的服務器有興趣可了解此文章.
匹配不同URL訪問不同后端
如果想通過訪問不同類別URL分配到不同的后端通過nginx實現,首先舉個例子,將需求場景進行描述:
域名為:www.xxx.com (本機IP為192.168.12.63)
域名下有3個目錄product、cart、goods,這3個目錄分別為不同業務,那么我們打算訪問3個不同目錄下的內容時分別分配到不同的后端進行處理,如訪問www.xxx.com/product/xxx.html,那么我們預設是下面3類情況:
訪問product下的資源時分配到127.0.0.1:8081和127.0.0.1:8082
訪問cart下的資源時分配到127.0.0.1:8083和127.0.0.1:8084
訪問goods下的資源時分配到192.168.12.34:8081和192.168.12.34:8082
如果要滿足上述需求,那么我們就需要用到nginx的upstream模塊和rewrite的if模塊配合,首先我們需要配置3個后端,分別滿足3種不同業務分配,配置如下:
- #product業務的后端
- upstream product_tomcats{
- server 127.0.0.1:8081 weight=10;
- server 127.0.0.1:8082 weight=10;
- } --Vevb.com
- #cart 業務的后端
- upstream cart_tomcats{
- server 127.0.0.1:8083 weight=10;
- server 127.0.0.1:8084 weight=10;
- }
- #goods 業務的后端
- upstream goods_tomcats{
- server 192.168.12.34:8081 weight=10;
- server 192.168.12.34:8082 weight=10;
- }
配置好upstream后,我們配置匹配不同目錄訪問不同后端的內容,通過if語法來實現根據不同請求的url進程正則匹配,然后滿足條件的分配到指定的后端,if語句用來實現判斷不同URL分配后端配置的功能,具體配置如下:
注:$request變量是獲取 http method(GET POST)瀏覽器訪問URL HTTP協議,代碼如下:
- GET /goods/2222.html HTTP/1.1
- location / {
- proxy_cache cache_one;
- proxy_cache_key "$host:$server_port$request_uri";
- proxy_cache_valid 200 304 20m;
- rewrite /product/([0-9]+)\.html /index.jsp?id=$1 last;
- rewrite /cart/([0-9]+)\.html /index1.jsp?id=$1 last;
- rewrite /goods/([0-9]+)\.html /index2.jsp?id=$1 last;
- #判斷是否匹配product通過正則,如果匹配將請求轉發到product_tomcats集群上
- if ($request ~* .*/product/(.*)){
- proxy_pass http://product_tomcats;
- }
- #判斷是否匹配cart通過正則,如果匹配將請求轉發到cart _tomcats集群上
- if ($request ~* .*/cart/(.*)){
- proxy_pass http://cart_tomcats;
- }
- #判斷是否匹配goods通過正則,如果匹配將請求轉發到goods _tomcats集群上
- if ($request ~* .*/goods/(.*)){
- proxy_pass http://goods_tomcats;
- } --Vevb.com
- proxy_set_header Host $host;
- proxy_set_header X-Forwarded-For $remote_addr;
- add_header X-Cache '$upstream_cache_status from $host';
- }
這樣通過upstream配置不同的后端集群組,然后通過if語法的正則匹配URL來分配到不同的集群組上來實現不同種類的URL 匹配訪問不同后端處理.
Nginx cache 掛載內存文件系統,我們采用tmpfs內存文件系統,來做緩存文件系統,這樣可以讓系統不經過I/O提高效率.
掛載tmpfs:mount tmpfs自定義名稱 掛載位置 -t tmpfs -o size=分配空間大小.
例,代碼如下:
- mkdir /tmpfs
- mount my_tmpfs /tmpfs -t tmpfs -o size=500m
動態調整tmpfs空間大小:
mount 掛載位置 -o remount,size=重新分配空間大小
例:mount /tmpfs -o remount,size=1024m
卸載已掛載的tmpfs:umount /tmpfs
配置nginx cache,Nginx cache狀態,代碼如下:
MISS
EXPIRED - expired,請求被傳送到后端。
UPDATING - expired,由于proxy/fastcgi_cache_use_stale正在更新,將使用舊的應答.
STALE - expired,由于proxy/fastcgi_cache_use_stale,后端將得到過期的應答.
HIT:proxy_cache_key 可采用2種配法,根據需求來定義:
1.通過瀏覽器獲取的URL做KEY
域名:端口 瀏覽器完整地址(包括動態參數,如:www.xxx.com:80/goods/1.html).
proxy_cache_key "$host:$server_port$request_uri";
1.通過真實的URL地址做KEY
域名:端口 真實請求地址(不是rewrite后的)? 參數
(如www.xxx.com:80/index.jsp?id=111)
proxy_cache_key "$host:$server_port$uri$is_args$args";
建議采用第一種.
下面是對緩存內容進行的配置,代碼如下:
- #日志配置
- # $upstream_addr 請求后端的地址
- # $upstream_status 請求后端響應狀態
- # $upstream_cache_status 緩存狀態
- log_format main '$remote_addr - $remote_user [$time_local] '
- "$request" $status $bytes_sent'
- '"$http_referer""$http_user_agent"'
- '"$gzip_ratio"'
- '"addr:$upstream_addr-status:$upstream_status- cachestatus:$upstream_cache_status"';
- #緩沖代理請求,proxy_temp_path需要和proxy_cache_path在一個分區下
- proxy_temp_path /tmpfs_cache/proxy_temp_path;
- #緩存地址為/tmpfs_cache/proxy_cache_path,緩存目錄級別分為2級,
- #cache名稱為cache_one,內存緩存空間大小為500M,自動清除超過1天未訪問的緩存數據,緩存硬盤空間為15G
- proxy_cache_path /tmpfs_cache/proxy_cache_path levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=15g;
- server {
- listen 80;
- server_name www.xxx.com;
- charset utf-8;
- access_log logs/cache_test.access.log main;
- error_log logs/cache_test.error.log warn;
- autoindex on;
- index index.html;
- location / {
- #使用緩存cache_one上面proxy_cache_path中定義的key_zone=cache_one;
- proxy_cache cache_one;
- #緩存key拼接規則:域名:端口 獲取瀏覽器請求的URL完整地址
- proxy_cache_key "$host:$server_port$request_uri";
- #對HTTP狀態碼200和304的緩存20分鐘
- proxy_cache_valid 200 304 20m;
- #獲取proxy的真實域名
- proxy_set_header Host $host;
- proxy_set_header X-Forwarded-For $remote_addr;
- #設置瀏覽器中的header可查看該頁面的緩存狀態
- add_header X-Cache '$upstream_cache_status from $host';
- }
proxy cache配置詳細內容:
proxy_cache_key
語法:proxy_cache_key line;
默認值:$scheme$proxy_host$request_uri;
使用字段:http,server,location
指令指定了包含在緩存中的緩存關鍵字.
proxy_cache_key "$host$request_uri$cookie_user";
注意默認情況下服務器的主機名并沒有包含到緩存關鍵字中,如果你為你的站點在不同的location中使用二級域,你可能需要在緩存關鍵字中包換主機名:
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_methods
語法:proxy_cache_methods [GET HEAD POST];
默認值:proxy_cache_methods GET HEAD;
使用字段:http, server, location
GET/HEAD用來裝飾語句,即你無法禁用GET/HEAD即使你只使用下列語句設置:
- proxy_cache_methods POST;
- proxy_cache_min_uses
語法:proxy_cache_min_uses the_number;
默認值:proxy_cache_min_uses 1;
使用字段:http, server, location
多少次請求后應答將被緩存,默認1.
proxy_cache_path
語法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];
默認值:None
使用字段:http
指令指定緩存的路徑和一些其他參數,緩存的數據存儲在文件中,并且使用代理url的哈希值作為關鍵字與文件名,levels參數指定緩存的子目錄數,例如:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;
文件名類似于:/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
可以使用任意的1位或2位數字作為目錄結構,如 X,X:X,或X:X:X e.g.: “2”,“2:2”, “1:1:2”,但是最多只能是三級目錄,所有活動的key和元數據存儲在共享的內存池中,這個區域用keys_zone參數指定,注意每一個定義的內存池必須是不重復的路徑,例如:
- proxy_cache_path /data/nginx/cache/one levels=1 keys_zone=one:10m;
- proxy_cache_path /data/nginx/cache/two levels=2:2 keys_zone=two:100m; --Vevb.com
- proxy_cache_path /data/nginx/cache/three levels=1:1:2 keys_zone=three:1000m;
如果在inactive參數指定的時間內緩存的數據沒有被請求則被刪除,默認inactive為10分鐘,一個名為cache manager的進程控制磁盤的緩存大小,它被用來刪除不活動的緩存和控制緩存大小,這些都在max_size參數中定義,當目前緩存的值超出max_size指定的值之后,超過其大小后最少使用數據(LRU替換算法)將被刪除.
內存池的大小按照緩存頁面數的比例進行設置,一個頁面(文件)的元數據大小按照操作系統來定,FreeBSD/i386下為64字節,FreeBSD/amd64下為128字節。
proxy_cache_path和proxy_temp_path應該使用在相同的文件系統上。
proxy_cache_valid
語法:proxy_cache_valid reply_code [reply_code …] time;
默認值:None
使用字段:http, server, location
為不同的應答設置不同的緩存時間,例如:
- proxy_cache_valid 200 302 10m;
- proxy_cache_valid 404 1m;
為應答代碼為200和302的設置緩存時間為10分鐘,404代碼緩存1分鐘,如果只定義時間:
proxy_cache_valid 5m;
那么只對代碼為200, 301和302的應答進行緩存,同樣可以使用any參數任何應答.
- proxy_cache_valid 200 302 10m;
- proxy_cache_valid 301 1h;
- proxy_cache_valid any 1m;
新聞熱點
疑難解答