分类: 系统运维
2014-06-17 09:15:17
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
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
}
#用于清除缓存,假设一个URL为,通过访问就可以清除该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
}
而通过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 后端将得到过期的应答
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
谷歌浏览器查看
五,
先看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/cache
2,缓存文件的key和其它信息放在一个10M的共享内存中,命名为one
3,缓存文件最大占用1G磁盘空间
4,level=1:2
比如有一个URL是,那么这个图片如果被缓存那他的路径就是/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,如果带参数呢?
比如?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
$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,附上链接