nginx+tomcat+ngx_cache_purge配置

nginx+tomcat+ngx_cache_purge配置

nginx與tomcat是分別在兩臺機器,nginx提供反代與緩存的作用

一,在原來編譯的基礎上再增加模塊

下載ngx_cache_purge最新版

[root@summba-dev5 nginx-1.5.7]# nginx -V 查看nginx之前的編譯參數

[root@summba-dev5 nginx-1.5.7]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --lock-path=/var/lock/nginx.lock --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_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/ --with-http_flv_module   --add-module=/cloud/packages/ngx_cache_purge-2.1/

[root@summba-dev5 nginx-1.5.7]# make 執行make 即可,如果沒生效最好需要重nginx,如果還不行,可能需要執行make install再重啓。

二,配置nginx,由於公司並無php,所有沒有配置fastcgi等模塊,tomcat自行配置就ok,本配置文件,nginxtomcat是處於兩臺電腦。

user  nginx;

worker_processes  8;

error_log /var/log/nginx/error.log  info;

#pid        logs/nginx.pid;

events {

    use epoll;

    worker_connections 51200;

}

http {

   include       mime.types;

   default_type  application/octet-stream;

   #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

   #                  '$status $body_bytes_sent "$http_referer" '

   #                  '"$http_user_agent" "$http_x_forwarded_for"';

   #access_log  logs/access.log  main;

   log_format  yeezhao.com  '$remote_addr - $remote_user [$time_local] $upstream_addr $upstream_status $request' '"$status" $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"';

   #access_log /var/log/nginx/yeezhao.com_access.log  yeezhao.com;

   sendfile        on;

   #tcp_nopush     on;

   #keepalive_timeout  0;

   keepalive_timeout  120;

   tcp_nodelay on;

  gzip  on;

  gzip_min_length 1k;

  gzip_buffers 4 16k;

  gzip_http_version 1.0;

  gzip_comp_level 2;

  gzip_types text/plain application/x-javascript text/css application/xml;

  gzip_vary on;

  proxy_hide_header Vary;

  server_names_hash_bucket_size 128;

  client_header_buffer_size 32k;

  large_client_header_buffers 4 64k;

  client_max_body_size     10m;

  client_body_buffer_size  128k;

  proxy_connect_timeout    600;

  proxy_read_timeout       600;

  proxy_send_timeout       600;

  proxy_buffer_size        16k;

  proxy_buffers            4 128k;

  proxy_busy_buffers_size  256k;

  proxy_temp_file_write_size 256k;

  proxy_temp_path /var/tmp/nginx/tmp;

  proxy_cache_path  /var/tmp/nginx/cache  levels=1:2   keys_zone=cache_one:200m inactive=1d max_size=30g;

  upstream hudong.yeezhao.com {

       server 192.168.1.10:38080;

#server 192.168.1.10;

#server 192.168.1.126:8870;

#jvm_route $cookie_JSESSIONID|sessionid reverse;

   }

server  

{  

listen       80;  

server_name  hudong.yeezhao.com;  

index index.html index.htm index.php index.jsp;  

access_log  /var/log/nginx/access_hudong.log  yeezhao.com;  

location /  

{  

proxy_next_upstream http_503 http_500  error timeout invalid_header;

proxy_redirect                      off;  

proxy_pass http://hudong.yeezhao.com;  

proxy_set_header   Host             $host;  

proxy_set_header   X-Real-IP        $remote_addr;  

proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;  

proxy_cache cache_one;

add_header  Nginx-Cache "$upstream_cache_status";

proxy_cache_valid  200 304 12h;  

proxy_cache_valid  301 302 1m;  

proxy_cache_valid  any 1m;  

proxy_cache_key $host$uri$is_args$args;  

}  

location ~.*\.(php|jsp|cgi)?$  

{  

proxy_set_header Host  $host;  

proxy_set_header X-Forwarded-For  $remote_addr;  

proxy_pass http://hudong.yeezhao.com;  

}  

#用於清除緩存,假設一個URLhttp://hudong.yeezhao.com/css/load.gif,通過訪問http://hudong.yeezhao.com/purge/css/load.gif就可以清除該URL的緩存。

location ~/purge(/.*)

{

#設置只允許指定的IPIP段纔可以清除URL緩存。

allow           127.0.0.1;

allow           192.168.1.0/24;

deny            all;

proxy_cache_purge    cache_one   $host$1$is_args$args;

}    

}

}

三,測試purge清除的情況

1,單獨訪問圖片

105302126.png

2,清除緩存

105321195.png

如果沒有緩存,則會報404錯誤

105431958.png


四,查看命中的緩存

1、在http header上增加命中顯示

nginx提供了$upstream_cache_status這個變量來顯示緩存的狀態,我們可以在配置中添加一個http頭來顯示這一狀態,達到類似squid的效果。

location  / {

       proxy_redirect          off;

       proxy_set_header        Host            $host;

       proxy_set_header        X-Real-IP       $remote_addr;

       proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

       proxy_connect_timeout   180;

       proxy_send_timeout      180;

       proxy_read_timeout      180;

       proxy_buffer_size       128k;

       proxy_buffers           4 128k;

       proxy_busy_buffers_size 128k;

       proxy_temp_file_write_size 128k;

       proxy_cache cache;

       proxy_cache_valid 200 304 1h;

       proxy_cache_valid 404 1m;

       proxy_cache_key $uri$is_args$args;

add_header  Nginx-Cache "$upstream_cache_status";  #添加這行可以查看緩存是否被命中

       proxy_pass http://backend;

   }


而通過curl或瀏覽器查看到的header如下:

HTTP/1.1 200 OK

Date: Mon, 22 Apr 2013 02:10:02 GMT

Server: nginx

Content-Type: p_w_picpath/jpeg

Content-Length: 23560

Last-Modified: Thu, 18 Apr 2013 11:05:43 GMT

Nginx-Cache: HIT

Accept-Ranges: bytes

Vary: User-Agent

$upstream_cache_status包含以下幾種狀態:

·MISS 未命中,請求被傳送到後端

·HIT 緩存命中

·EXPIRED 緩存已經過期請求被傳送到後端

·UPDATING 正在更新緩存,將使用舊的應答

·STALE 後端將得到過期的應答

2nginx cache命中率統計

即然nginx爲我們提供了$upstream_cache_status函數,自然可以將命中狀態寫入到日誌中。具體可以如下定義日誌格式:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                 '$status $body_bytes_sent "$http_referer" '

                 '"$http_user_agent" "$http_x_forwarded_for"'

                 '"$upstream_cache_status"';

命中率統計方法:用HIT的數量除以日誌總量得出緩存命中率:

awk '{if($NF=="\"HIT\"") hit++} END {printf "%.2f%",hit/NR}' access.log

瞭解了原理以後,也可以通過crontab腳本將每天的命中率統計到一個日誌中,以備查看。

# crontab -l1 0 * * * /opt/shell/nginx_cache_hit >>/usr/local/nginx/logs/hit

訪腳本的內容爲:

#!/bin/bashLOG_FILE='/usr/local/nginx/logs/access.log.1'LAST_DAY=$(date +%F -d "-1 day") awk '{if($NF=="\"HIT\"") hit++} END {printf "'$LAST_DAY': %d %d %.2f%\n", hit,NR,h

谷歌瀏覽器查看

105706876.png


五,nginx緩存文件路徑計算和緩存清理方法

先看proxy_cache_path 配置

proxy_cache_path  /var/tmp/nginx/cache  levels=1:2   keys_zone=cache_one:200m inactive=1d max_size=30g;

1nginx反向代理緩存的目錄爲/var/tmp/nginx/cache

2,緩存文件的key和其它信息放在一個10M的共享內存中,命名爲one

3,緩存文件最大佔用1G磁盤空間

4level=1:2
比如有一個URLhttp://www.libertyvps.com/1.png,那麼這個圖片如果被緩存那他的路徑就是/var/tmp/nginx/cache/9/ad/e0bd86606797639426a92306b1b98ad9
計算方法:
1) nginx先把請求地址/1.pngmd5進行哈希,得到e0bd86606797639426a92306b1b98ad9
2) level=1:2就是把最後一位數9拿出來建一個目錄,然後再把9前面的2建一個目錄,最後把剛纔得到的這個緩存文件放到9/ad目錄中。
同樣的方法推理,如果level=1:1,那麼緩存文件的路徑就是/var/tmp/nginx/cache/9/d/e0bd86606797639426a92306b1b98ad9

上面的例子只是最簡單的URL,如果帶參數呢?
比如http://www.libertyvps.com/1.png?v=1,那麼緩存路徑還是一樣嗎?
先對比下這個兩個配置

proxy_cache_key $uri;

proxy_cache_key $uri$is_args$args;
第一個配置只根據不帶參的$uri進行哈希,所以這時候加了參數和沒加參數是一樣的結果;
第二個配置就是把域名之後所有的內容(也就是$request_uri)都進行哈希。

說明:
1) MD5哈希過之後的路徑是十六進制的,對於nignx來說查詢速度更快;
2) level=1:2會比level=1:1建立更多的目錄,適合緩存海量文件,因爲單個目錄下的文件太多會降低IO性能;
3) 緩存會先被寫入寫入臨時文件,所以建議proxy_cache_pathproxy_temp_path放在同一個文件系統當中;
4) 雖然nginx有通過HTTP協議刪除緩存的第三方插件,但是我考慮之後覺得還是不用的好。nginx的緩存本來就不是很成熟,外加一個第三方插件就更不讓人放心了。

知道了緩存路徑的計算方法,我們就可以進行緩存清理了。此php適合懂php的,我不懂,所以執行沒成功也不知道問題在哪?等我python學好後,用python寫個……

#!/usr/bin/env php

<?php

$cache_dir = '/usr/local/nginx/cache/';

$request_uri = $argv[1];

$url_hash = md5($request_uri);

$dir1 = substr($url_hash,-1,1) . '/';

$dir2 = substr($url_hash,-3,2) . '/';

$cached_file = $cache_dir . $dir1 . $dir2 . $url_hash;

if (is_file($cached_file)) {

   if (unlink($cache_dir . $dir1 . $dir2 . $url_hash)) {

       echo $request_uri . " 緩存清除成功\n";

   } else {

       echo $request_uri . " 緩存清除失敗\n";

   }

} else {

   echo $request_uri . " 未被緩存\n";

}

六,最簡單的辦法就是每次部署完tomcat後,將/var/tmp/nginx/cache下的目錄刪除,這樣也能達到更新緩存的作用

[root@summba-dev5 ~]# rm -rf /var/tmp/nginx/cache/*

curl或谷歌瀏覽器查看,再次刷新將提示miss

105836816.png

此文有些是摘自linuxtone,附上鍊接http://bbs.linuxtone.org/forum.php?mod=viewthread&tid=24357


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章