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: image/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


本文出自 “smalldeng” 博客,请务必保留此出处http://smalldeng.blog.51cto.com/1038075/1339176