与此同时,当后面的应用服务器无法提供服务时(如宕机),Nginx服务器上的缓存资源还能够回应相关的用户请求,提高了后面应用服务器的鲁棒性(健壮性)。
优势商业成本无。Nginx是开源的,无需商业付费。
技术迭代成本低。现有的Web体系大多采用Nginx,进行技术迭代时,在Nginx只需要增加一个新的模块即可。
可定制。可以根据需要,对指定路径,指定资源等进行定制化的缓存策略。
缺点需要对Nginx的缓存模块进行一定的认识与学习。毕竟很多人使用Nginx都只是CV一下配置。
需要根据业务需要与技术特点,进行缓存策略的调整。如果缺乏经验与足够的认识,可能会指定出不恰当的缓存技术规范(如哪些数据该走Nginx缓存模块等)。
基本认识 缓存文件位置设置通过proxy_cache_path参数指定。proxy_cache_path有两个必填参数:
第一个参数为缓存目录。
第二个keys_zone参数指定缓存名称和占用内存空间的大小。
指定特定请求被缓存Nginx默认会缓存所有get和head方法的请求结果,缓存的key默认使用请求字符串
自定义key。如proxy_cache_key "$host$request_uri$cookie_user";
指定请求至少被发送了多少次以上才被缓存,从而避免低频请求被缓存。如proxy_cache_min_uses 5;
指定哪些方法的请求被缓存。如proxy_cache_methods GET HEAD POST;
缓存有效期默认情况下,缓存内容是长期留存,除非缓存的容量超出谁知的限制。也可以自定义设置有效时间。如:
响应状态码为200 302时,10分钟有效期限:proxy_cache_valid 200 302 10m;
对任何状态码,5分钟有效期限:proxy_cache_valid any 5m;
部分请求跳过缓存通过proxy_cache_bypass指令,明确请求对应的响应来自原始数据,而不是缓存。
例如(该示例来自网易云课堂) proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
表示:如果任何一个参数不为空,或者不等于0,nginx就不会查找缓存,直接进行代理转发。
扩展网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private,no-cache,max-age,must-revalidate等,默认为private。详见下表:
Squid缓存服务器其实Squid缓存服务器与Nginx缓存十分类似(毕竟Nginx的缓存就是仿照Squid的),所以这里只是表示有这么个选择,不做深入。
Lua扩展Nginx是C语言开发(这也是Nginx高性能的根本原因之一),并且Nginx模块需要用C开发,并且需要符合一系列复杂的规则,还需要熟悉Nginx源码。
ngx_lua模块所以Nginx提供了ngx_lua模块,通过lua解释器集成进Nginx。而ngx_lua模块具备以下特性:
高并发,非阻塞地处理各种请求。
Lua内建协程(可对比golang),从而将异步回调转换成顺序调用的形式。
每个协程都有一个独立的全局环境(变量空间),继承于全局共享的,只读的“comman data”。
上述只是简单提一下Lua扩展,感兴趣的可以查询相关资料。
这里继续阐述Lua扩展,实现缓存功能。
实际应用为了帮助大家理解,先说一下实际应用。
Nginx针对HTTP请求处理,有十一个阶段。与之相对的,ngx_lua模块的执行指令都包含在了上述的十一个阶段。这里只说一下其中的content_by_lua指令,针对的是Nginx的content阶段,可以在location,location if范围内使用,主要作为内容处理器,接收请求处理并输出响应。
具体配置如下:
这样配置后,直接浏览器访问本地ip(或者通过curl命令),可以看到“Hello,world”。