摘要:粗线条一点根据的位置,一般会有浏览器,服务器,和应用服务器等。比如安全,解压缩功能对所有请求都是通用的,这是可以搞定的,它一般不会终结业务类的处理,而是将他们交给后面的应用服务器。一致性,因为是冗余的,各个节点间的失效时间是不同步的。
前言
大家都知道cache对于网站性能的重要性,提高用户响应速度,减轻后端压力,节省资源等等。一谈到cache其实是个很大话题,从前端浏览器到最终响应请求的服务器可能要经过很多次跳转,每次跳转经过的服务器都有机会提供cache。单从成本上而言,越靠近用户的cache越经济,实际情况中都需要根据当前线上的业务部署情况,开发成本收益比,可维护性等因素考虑采取在哪个地方cache,如何cache。粗线条一点根据cache的位置,一般会有浏览器,web服务器,CDN和应用服务器cache等。这里我结合最近自己完成的nginx服务器上的cache工作,谈一下nginx提供了哪些实用的cache服务。
Nginx承担反向代理服务器的工作,一般它处理的业务都是比较通用的处理,或者说一般不会处理很个性化的请求。比如安全,解压缩功能对所有请求都是通用的,这是nginx可以搞定的,它一般不会终结业务类的处理,而是将他们交给后面的应用服务器。正是因为Nginx的这种特性,如果在nginx节点上做cache,一般cache的是整个http请求的response。自然cache的key也一般从http请求的url和参数得来。目前我接触到两种nginx cache方式:
本地文件系统cache (proxy_cache )
集中的内存cache (srcache-nginx-module)
Proxy_cache这是Nginx原生的ngx_http_proxy_module自带的cache解决方案。http response的内容以文件的形式存在了本地的文件系统,同时开了一个share memory冗余存key值可以快速判断是否cache命中。一般会这么部署。
如何配置nginx使能proxy cache,可以参考NGINX CONTENT CACHING 和 A Guide to Caching with NGINX
因为这个方案是本地文件系统存cache,可以比较容易理解具有以下缺点:
cache冗余,不同的nginx node间分别存cache。
cache一致性,因为是冗余的,各个节点间cache的失效时间是不同步的。
cache访问速度慢,读磁盘自然会慢一些。
cache效率低,因为各个node各有自己的cache不共享,即使某个node cache里存了某个请求,如果另外的nginx node来处理请求还是cache miss。
基于上面的问题,有更好的方案,比如agentzhang的srcache-nginx-module模块。
srcache-nginx-module这个模块旨在构建一个cache中间层,cache的存储介质是集中的,一般使用memcached或者redis。这样解决了冗余,也就解决了上面的各种问题,同时速度也快很多。对比着,它是这样部署的。另外集中的cache存储可以选择redis或者memcached(memc-nginx-module提供API),memcached集群方案需要nginx配置配合解决。
顺便感谢agentzhang将Lua引入到nginx。nginx出色的扩展性已经很灵活了,lua-nginx-module将脚本语言处理文本的便捷性直接引入nginx,使得开发人员可以方便的在http request/response处理的各个阶段都能嵌入定制的功能。比如我可以很方便的使用lua模块在rewrite阶段根据url和args生成定制的cache key--刨除一些参数(比如不影响response结果的那些参数)。附上两篇不错的lua-nginx-module的资料:
lua-nginx-module
OpenResty最佳实践
使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制
另外附上自己的nginx.conf以备后查。
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; error_log logs/error.log info; pid logs/nginx.pid; events { worker_connections 1024; } 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; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # # cache server 1 upstream memcache1 { server 127.0.0.1:11211; #keepalive 512 single; } # cache server 2 #upstream memcache2 { # server 127.0.0.1:11211; #} upstream_list memcache_servers memcache1; server { listen 8080; server_name localhost; #memc-nginx-module location /memc { internal; memc_connect_timeout 100ms; memc_send_timeout 100ms; memc_read_timeout 100ms; set $memc_key $query_string; set $memc_exptime 30; set_hashed_upstream $backend memcache_servers $memc_key; memc_pass $backend; } location /s { # key gerneration for cache set $args_for_key ""; rewrite_by_lua " ngx.var.args_for_key = string.gsub(ngx.var.args, "queryid=%d+","queryid=0") "; #echo $args_for_key; srcache_fetch GET /memc $uri$args_for_key; srcache_store PUT /memc $uri$args_for_key; proxy_pass http://192.168.1.100:8000; } location / { root /var/www; index index.html index.htm index.php; } } server { listen 8081; location / { default_type text/html; content_by_lua " ngx.say("hello, world
") "; } } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/39291.html
摘要:粗线条一点根据的位置,一般会有浏览器,服务器,和应用服务器等。比如安全,解压缩功能对所有请求都是通用的,这是可以搞定的,它一般不会终结业务类的处理,而是将他们交给后面的应用服务器。一致性,因为是冗余的,各个节点间的失效时间是不同步的。 前言 大家都知道cache对于网站性能的重要性,提高用户响应速度,减轻后端压力,节省资源等等。一谈到cache其实是个很大话题,从前端浏览器到最终响应请...
摘要:初始化在终端中执行。首次执行初始化操作,会有较长的时间去获取中定义的信息,在第一次初始化后没有信息的变化,可以跳过初始化直接开始部署。执行部署命令时,会将的列出来展示给用户,并由用户确定执行。则删除由创建的容器。通过Terraform在本地运行docker nginx前置条件: 1. 安装好windows docker 2. 安装好terraform安装docker安装windows doc...
摘要:是一个注册在指定源和路径下的事件驱动。可以提供有效有效的离线体验,拦截网络请求。出于安全原因,要求必须在下才能运行。返回一个对象,的结果是对象值对象组成的数组。当事件的处理程序执行完毕后,可以认为安装完成了。 在前端越来越重的这个时代,页面加载速度成为了一个重要的指标。对于这个问题,业界也有一些解决方案。 浏览器缓存、协议缓存、强缓存 懒加载(首屏) CDN 多域名突破下载并发限制。...
摘要:是一个注册在指定源和路径下的事件驱动。可以提供有效有效的离线体验,拦截网络请求。出于安全原因,要求必须在下才能运行。返回一个对象,的结果是对象值对象组成的数组。当事件的处理程序执行完毕后,可以认为安装完成了。 在前端越来越重的这个时代,页面加载速度成为了一个重要的指标。对于这个问题,业界也有一些解决方案。 浏览器缓存、协议缓存、强缓存 懒加载(首屏) CDN 多域名突破下载并发限制。...
阅读 1523·2023-04-26 02:03
阅读 4707·2021-11-22 13:53
阅读 4579·2021-09-09 11:40
阅读 3782·2021-09-09 09:34
阅读 2125·2019-08-30 13:18
阅读 3501·2019-08-30 11:25
阅读 3295·2019-08-26 14:06
阅读 2545·2019-08-26 13:52