您的位置:首页 > 运维架构 > Tomcat

nginx+tomcat+ngx_cache_purge配置

2013-12-14 15:31 591 查看
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,本配置文件,nginx与tomcat是处于两台电脑。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; } #用于清除缓存,假设一个URL为http://hudong.yeezhao.com/css/load.gif,通过访问http://hudong.yeezhao.com/purge/css/load.gif就可以清除该URL的缓存。location ~/purge(/.*){#设置只允许指定的IP或IP段才可以清除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,单独访问图片

2,清除缓存

如果没有缓存,则会报404错误


四,查看命中的缓存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 OKDate: Mon, 22 Apr 2013 02:10:02 GMTServer: nginxContent-Type: image/jpegContent-Length: 23560Last-Modified: Thu, 18 Apr 2013 11:05:43 GMTNginx-Cache: HITAccept-Ranges: bytesVary: User-Agent$upstream_cache_status包含以下几种状态:・MISS 未命中,请求被传送到后端・HIT 缓存命中・EXPIRED 缓存已经过期请求被传送到后端・UPDATING 正在更新缓存,将使用旧的应答・STALE 后端将得到过期的应答2、nginx 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谷歌浏览器查看


五,nginx缓存文件路径计算和缓存清理方法先看proxy_cache_path 配置proxy_cache_path /var/tmp/nginx/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;1,nginx反向代理缓存的目录为/var/tmp/nginx/cache2,缓存文件的key和其它信息放在一个10M的共享内存中,命名为one3,缓存文件最大占用1G磁盘空间4,level=1:2
比如有一个URL是http://www.libertyvps.com/1.png,那么这个图片如果被缓存那他的路径就是/var/tmp/nginx/cache/9/ad/e0bd86606797639426a92306b1b98ad9
计算方法:
1) nginx先把请求地址/1.png用md5进行哈希,得到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_path和proxy_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

此文有些是摘自linuxtone,附上链接http://bbs.linuxtone.org/forum.php?mod=viewthread&tid=24357
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: