| 
      昨天学习配置了nginx中但我在配置好proxy_cache后,发现在缓存目录中不能生成缓存文件哦,后来找了很多种解决办法与关于proxy_cache缓存的一些常见问题总结。
 
	proxy_cache方式跟memcached内存级别的缓存还是不能比拟,但nginx目前还不能做memcached的write动作,所以简单配置proxy_cache也能抵挡不少鸭梨。 
	没有配置好proxy_cache 
	但在网络上搜索几篇文章以后,发现大家写的很模糊,很多文章都是抄袭复制品。所以按照网络上的教程,我一开始是这么配置的: 
	在http段增加: 
	
		
			| 
				 代码如下 | 
			
				复制代码 | 
		 
		
			| 
				 
					proxy_cache_path  /tmp/qttc_cache levels=1:2 keys_zone=qttc:200m inactive=1d max_size=10g; 
			 | 
		 
	
 
	然后在server中找到你要缓存的location,增加: 
	
		
			| 
				 代码如下 | 
			
				复制代码 | 
		 
		
			| 
				 
					proxy_cache qttc; 
			 | 
		 
	
 
	意思表示开启这个location的缓存,但是我重启nginx以后,重新访问站点发现在缓存目录下并没有生成缓存文件。于是,我首先这么做: 
	一、会不会是浏览器有缓存,于是我清空浏览器,甚至使用其它浏览器访问站点,并且按狂刷。结果还是没有生成静态文件。 
	二、会不会是nginx自动判断我的内容,太少就不会缓存。于是我赋值了一大堆字符串到一个文件中,然后使用浏览器狂访问那个文件,结果还是没有生成静态文件。 
	于是到网上搜索,结果也没有搜索到有用的信息。难道我安装的nginx有问题?重新从官网下载编译安装,还是没有解决问题。 
	原来是这样工作的 
	后来不断的摸索,仔细研究。发现还要添加以下两条才能让proxy_cache工作, 
	proxy_cache_valid  200 304 302 24h; 
	指定各个状态码下缓存的时间,200是很重要的,如果有其它的要缓存可以在后边加上 
	
		
			| 
				 代码如下 | 
			
				复制代码 | 
		 
		
			| 
				 
					proxy_pass http://www.php100.com; 
			 | 
		 
	
 
	指定获取静态内容的地址,其实proxy_cache的原理就是从一个你指定的地址获取内容,然后缓存。当下次你访问时,nginx会自动判断有没有缓存文件?如果有的话缓存文件是不是已经过期(缓存文件的有效期就是第一条设置的)?如果前面两条任何一条成立就会从proxy_pass的地址重新获取页面信息。 
	于是经过配置以后,终于能生成缓存文件了: 
	
		
			| 
				 代码如下 | 
			
				复制代码 | 
		 
		
			| 
				 
					[root@lee qttc_cache]# ll 
					总用量 24 
					drwx------ 3 www www 4096 7月  19 08:55 4 
					drwx------ 5 www www 4096 7月  19 08:55 8 
					drwx------ 3 www www 4096 7月  19 08:55 a 
					drwx------ 3 www www 4096 7月  19 08:55 c 
					drwx------ 3 www www 4096 7月  19 08:55 d 
					drwx------ 3 www www 4096 7月  19 08:55 e 
			 | 
		 
	
 
	  
	可惜,如果你要清空缓存,可以在后台加一个功能使用后端语言删除,或者使用一个Purge插件通过IP加端口访问的方式来清楚缓存文件。 
	PS. 
	如果你要清楚某一个url的缓存文件,就比较悲催了。但也不是不能做到。因为nginx生成url文件的时候,存放的目录以及生成的哈希文件名都是固定的,你也可以使用proxy_cache_key来指定生成的key的字段内容。 
	如果你掌握它的生成规则,你就可以写一个管理器来快速清空单个url缓存。最烂的方法也可以把缓存目录清空,接着访问你要需要单独清空的url,然后再到缓存目录里看看生成的缓存目录与文件名,再你需要单独清空这个url的缓存时直接把文件干掉就好。 
	因为proxy_cache需要proxy_pass配置才能生成缓存内容,而目前一般的站点配置中,比如PHP站点都是把php页面proxy_pass到后台PHP程序处理,所以你可以在处理php的location里加上proxy_cache把php动态语言生成的内容结果缓存。对于那些静态文件其实也不需要什么proxy_cache来缓存,因为静态文件跟proxy_cache最终生成的缓存文件一样都是在磁盘上的一个文件。 
	因此正确的描述是:它是一个重定向,反向代理的缓存功能,不是根据url生成缓存静态文件的功能 
	 
	下面我把我的全部配置代码拿出来 
	proxy_cache是nginx自带的内置缓存模块,配置一下就可以用了,看下面的配置 
	vi /usr/local/nginx/conf/nginx.conf 
	
		
			| 
				 代码如下 | 
			
				复制代码 | 
		 
		
			| 
				 
					user  zhangy users; 
					worker_processes 10; 
					error_log  /var/vlogs/nginx_error.log  crit; 
					pid        /var/vlogs/nginx.pid; 
					#Specifies the value for maximum file descriptors that can be opened by this process. 
					worker_rlimit_nofile 65535; 
					events 
					{ 
					 use epoll; 
					 worker_connections 65535; 
					} 
					http 
					{ 
					 include       mime.types; 
					 default_type  application/octet-stream; 
					 #charset  gb2312; 
					 server_names_hash_bucket_size 128; 
					 client_header_buffer_size 32k; 
					 large_client_header_buffers 4 32k; 
					 client_max_body_size 8m; 
					 sendfile on; 
					 tcp_nopush     on; 
					 keepalive_timeout 60; 
				
					 tcp_nodelay on; 
				
					 fastcgi_connect_timeout 300; 
					 fastcgi_send_timeout 300; 
					 fastcgi_read_timeout 300; 
					 fastcgi_buffer_size 64k; 
					 fastcgi_buffers 4 64k; 
					 fastcgi_busy_buffers_size 128k; 
					 fastcgi_temp_file_write_size 128k; 
					//============ 
					 client_body_buffer_size  512k; 
					 proxy_connect_timeout    5; 
					 proxy_read_timeout       60; 
					 proxy_send_timeout       5; 
					 proxy_buffer_size        16k; 
					 proxy_buffers            4 64k; 
					 proxy_busy_buffers_size 128k; 
					 proxy_temp_file_write_size 128k; 
					 proxy_temp_path   /usr/local/nginx/proxy_temp; 
					/*levels设置目录层次 
					keys_zone设置缓存名字和共享内存大小 
					inactive在指定时间内没人访问则被删除在这里是1天 
					max_size最大缓存空间*/ 
					proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=content:20m inactive=1d max_size=100m; 
					//============等号中间要加的,关键只要加上proxy_cache_path 
				
					 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; 
				
					 upstream myselfxtajmd { 
					 server 127.0.0.1:10002; 
					 server 127.0.0.1:10001 weight=5; 
					 } 
				
					 server 
					 { 
					 listen       10000; 
					 server_name  localhost; 
					 index index.html index.htm index.php; 
					 log_format  access  '$remote_addr - $remote_user [$time_local] "$request" ' 
					 '$status $body_bytes_sent "$http_referer" ' 
					 '"$http_user_agent" $http_x_forwarded_for'; 
					 access_log  /var/log/test.log  access; 
				
					 location / 
					 { 
					 proxy_cache content; //根keys_zone后的内容对应 
					 proxy_cache_valid  200 304 301 302 10d;   //哪些状态缓存多长时间 
					 proxy_cache_valid  any 1d;    //其他的缓存多长时间 
					 proxy_cache_key $host$uri$is_args$args;   //通过key来hash,定义KEY的值 
				
					 proxy_pass http://myselfxtajmd; 
					 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; 
					 } 
				
					//动态的放过 
					 location ~ .*.(php|jsp|cgi)?$ 
					 { 
					 proxy_set_header Host  $host; 
					 proxy_set_header X-Forwarded-For  $remote_addr; 
					 proxy_pass http://www.php100.com; 
					 } 
					 } 
					} 
			 | 
		 
	
 
	 
	设置proxy_cache缓存与取消缓存 
	在配置文件的server{}内,添加这么一句即可: 
	
		
			| 
				 代码如下 | 
			
				复制代码 | 
		 
		
			
				  
				location ~ .*/.(css|js)$ { 
				    add_header Cache-Control 'no-store'; 
				} | 
		 
	
 
	  
	 
	在nginx.conf里的http块加入以下代码 
	#proxy_temp_path和proxy_cache_path指定的路径必须在同一分区 
	proxy_temp_path   /tmp/proxy_temp_dir; 
	#设置名称为nginx_cache,内存缓存空间大小为500MB,30天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。 
	
		
			| 
				 代码如下 | 
			
				复制代码 | 
		 
		
			| 
				proxy_cache_path  /tmp/proxy_cache_dir  levels=1:2   keys_zone=nginx_cache:200m inactive=3d max_size=30g; | 
		 
	
 
	 
	在server加入以下代码 
	  
	
		
			| 
				 代码如下 | 
			
				复制代码 | 
		 
		
			| 
				 
					  
					location / { 
					        proxy_cache nginx_cache; 
					        proxy_cache_key $host$uri$is_args$args; 
					        proxy_set_header Host  $host; 
					        proxy_set_header X-Forwarded-For  $remote_addr; 
					        expires  30d; 
					} 
					  
			 | 
		 
	
 
	重启Ngnix 
	  
	
		
			| 
				 代码如下 | 
			
				复制代码 | 
		 
		
			| 
				/usr/local/nginx/sbin/nginx -s reload | 
		 
	
 
 
 
 
      (责任编辑:IT) |