如果使用的是第三方模块ngx_http_upstream_consistent_hash,则在模块添加成功后如下配置upstream组:
upstream memcached { consistent_hash consistent; server 127.0.0.1:11211; server 127.0.0.1:11212; server 127.0.0.1:11213; server 127.0.0.1:11214; } 2 nginx自带的缓存功能nginx的ngx_http_proxy_module自带了缓存功能。有几种缓存:网页内容缓存,日志缓存,打开文件缓存,fastcgi缓存。fastcgi缓存功能应慎用,因为动态程序的前后逻辑可能改变了,缓存后的结果可能并非实际所需结果。
在说明nginx自带的缓存功能之前,需说明其缺陷。nginx的缓存功能主要用于缓存体积较小的页面资源,当数据较大时很容易出现瓶颈。在页面资源的缓存功能上,它属于业余玩家。而squid是科班出身,功能最全面,可以缓存大量数据,但架构太老,性能一般。varnish则是此类缓存的新贵,架构较新,内存管理完全交由操作系统内核,性能是squid的几倍之强,但缓存的内容不足squid。
本节所讲的主要是nginx自带缓存的网页内容缓存。当实现网页内容缓存时,作为web服务程序,它可以缓存自身返回给客户端的数据,包括读取的图片、文件等;作为代理,它可以缓存来自后端的数据。缓存后的数据在内存中有,也会放在设定的目录下。这样以后客户端继续请求相同资源时,可以直接从内存中或者自身的磁盘中获取并返回给客户端。当缓存超出指定的空间大小时,将会有一个专门的线程cache_manager来清理缓存。
定义的相关指令主要有3个:proxy_cache_path、proxy_cache、proxy_cache_valid。
proxy_cache_path:它的语法比较复杂,但用起来很简单。 proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
其中proxy_cache_path path [levels=levels] keys_zone=name:size [max_size=size]这几项是一般使用的选项和必需项。以下为一示例。
proxy_cache_path /usr/local/nginx/cache_dir levels=1:2 keys_zone=cache_one:20m max_size=1g;其中:
path:定义缓存放在磁盘的哪个目录下。此处表示定义在/usr/local/nginx/cache_dir目录下。目录不存在会自动创建。
levels:定义缓存目录的级别,同时定义缓存目录名称的字符数。例如levels=1:2:2表示3级目录,且第一级目录名1个字符,第二级目录2个字符,第三级目录2个字符。目录最多3级,目录名最多为2个字符。例如上例中"levels=1:2"产生的缓存文件路径可能是这样的"/usr/local/nginx/cache_dir/d/f1/50a3269acaa7774c02d4da0968124f1d",注意其中加粗的字体。
keys_zone:定义缓存标识名称和内存中缓存的最大空间。name部分必须唯一,在后面会引用name来表示使用该缓存方法。
max_size:定义磁盘中缓存目录的最大空间。即path定义的文件最大空间。
该指令定义后只是定义了一种缓存方法,并非开启了缓存。
proxy_cache:定义要使用哪个缓存方法。使用proxy_cache_path中的name来引用。
例如引用上例定义的cache_one。
proxy_cache cache_cache;proxy_cache_valid:根据状态码来指定缓存有效期。
例如,下面的表示状态码为200和302的状态缓存1小时,状态码为404时即page not found的缓存只有1分钟,防止客户端请求一直错误,状态码为其他的则缓存5分钟。
proxy_cache_valid 200 302 1h; proxy_cache_valid 404 1m; proxy_cache_valid any 5m;如果不指定状态码,只指定时间,则默认只缓存状态码200、301、302各5分钟,其他的状态码不缓存。
以下是代理服务器192.168.100.29上定义的缓存示例。
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream web_group { server 192.168.100.28 weight=2 max_fails=2 fail_timeout=2s; server 192.168.100.30 weight=1 max_fails=2 fail_timeout=2s; server 127.0.0.1:80 backup; } proxy_cache_path /usr/local/nginx/cache_dir levels=1:2 keys_zone=cache_one:20m max_size=1g; server { listen 127.0.0.1:80; root /www/longshuai/; index index.html; } server { listen 80; server_name ; # 在响应报文中添加缓存首部字段 add_header X-Cache "$upstream_cache_status from $server_addr"; location / { proxy_pass ; proxy_cache cache_one; proxy_cache_valid 200 1h; proxy_cache_valid 404 1m; proxy_cache_valid any 5m; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }