云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

云服务器_苏州网站开发建设_超低折扣

小七 141 0

利用Cloudflare工人和工人KV改善RubyDocs

以下是来自柏林的web开发人员、企业家、rubyonrails爱好者manuelmeurer的客座帖子。2010年,他创建了Kraut Computing,作为一家个人网络开发商店,并于2015年在德国推出了一个IT专家网络Uplink。RubyDocs是一个开源服务,可以为任何Ruby项目生成和托管"花哨的文档",尤其是Ruby语言本身和最流行的Ruby框架Rails。有趣的是,文档可以为项目的任何版本生成 - - 所以假设您正在开发一个仍然使用3.2.22版本(2015年6月16日发布)的旧Rails应用程序,那么您可以真正受益于访问特定版本的文档,因为很多方法、类,而当前Rails版本(撰写本文时为5.2.1)的概念在旧版本中并不存在版本。刮擦an itchI早在2013年就建立了RubyDocs来解决我自己的问题——我多年来使用的一些类似服务已经消失或没有定期更新。在启动并运行RubyDocs的初始工作之后,多年来我继续改进了一些小事情,比如更新依赖项和添加用户提交的新项目。但总的来说,这个网站是(现在)自动运行的,从GitHub标签自动更新每个项目的版本列表,并根据用户的要求生成新文档。我一直想做的一件事就是把托管的文档从子域中移走(docs.rubydocs.org)到主域上的子路径(例如。,rubydocs.org/docs). 我把它们放在子域中,以便能够使用过期时间较长的CDN,因为这些文档大多是静态的HTML和CSS,并添加了一些JavaScript。但是出于SEO的原因(AFAIK最好还是把所有的东西都放在主域上),为了在使用站点时获得更连贯的体验,我希望所有的东西都在一个域上。但我始终无法在上面运行RubyDocs应用程序(当然是用Rails构建的)rubydocs.org网站在子路径上仍然可以获得CDN的所有优势……请输入CloudflareFast,直到2017年9月,当我第一次读到关于Cloudflare工人的文章时。我已经是Cloudflare在DNS、CDN和DDoS缓解方面的主要用户,并且一直对他们免费提供的高质量服务感到惊讶。现在他们基本上在上面增加了一个无服务器平台,每月5美元?你真的很佩服他们的奉献精神,让尽可能多的人以尽可能低的价格买到他们的东西可能。因为几个月来,我一直在想我可以用Workers来做什么,直到我突然想到,它们可能是将请求从子路径代理到子域的完美工具!我根本不需要更改RubyDocs服务器/CDN设置,只需添加一个执行代理的Worker和一个页面规则,将所有流量从子域重定向到新的子路径。我联系了Cloudflare的支持人员,以确认这确实是可能的(以及对他们的工人的适当使用),而且由于RubyDocs是开源的,他们甚至提出赞助这些工人!我们开始工作吧!当我在处理Worker时(无意双关语),RubyDocs GitHub repo中出现了一个问题 - - 原来我无意中用错误的regex破坏了几个url,这个问题很快得到了修复(Worker脚本可以在Cloudflare后端进行编辑,保存后,实时站点将在几秒钟内更新)。但这一期的作者也提到,显然有人为RubyDocs创造了一个DuckDuckGo爆炸。亲爱的,我甚至不知道他们的存在!为了让这个爆炸真正有用,必须有一个URL,它总是指向项目文档的最新版本,例如rubydocs.org/d/ruby-最新/(现在可以使用),并在新版本发布时自动更新。好吧,我心想,如果这对一个工人来说不是另一个完美的用例的话!但是等等,工人怎么知道哪个版本是最新的?我们可以在Worker脚本中包含数据并定期更新它,但是随着RubyDocs上项目数量的增长,脚本也会增长 - - 可能不会增长到无法管理的大小,但它仍然感觉不到一个干净的解决方案。在处理请求时,Worker还可以发出一个快速的子请求,向RubyDocs Rails主应用程序请求最新版本,但这意味着要设置一个API并监视端点的性能,这很可能会严重降低这些"最新版本"的速度请求。输入Cloudflare,又好像Cloudflare有人他们一直在等待我思考这个问题,于是他们推出了Cloudflare KV,这是一个可以通过Cloudflare API写入并从工人内部读取的键值存储。我被这个巧合吓得目瞪口呆。很明显,这是解决我问题的最好方法 - 每次检测到新版本时,从RubyDocs Rails应用程序存储每个项目的最新版本,并在"最新"请求到来时从Worker脚本中读取它英寸长故事简介:这是经过一点修改(主要是在GitHub上)得到的Worker脚本由于我对JavaScript缺乏经验),一切都很顺利。addEventListener('fetch',事件=>{事件响应(手柄请求(事件请求))})异步函数handleRequest(请求){常数匹配=请求.url.match(/\/d\/([^?)?]+)(\?.+)?/);让可得;如果(匹配){让doc=match[1];let query=match[2]| |'';//如有必要,重定向至"最新"。最晚匹配=文档匹配(/^([^/]+)-最新/);if(最新匹配){const latest=等待最新.get(最新匹配[1]);让newUrl=请求.url.replace(/[^/]+-最新/,最新);返回响应.重定向(新网址,302);}//如有必要,重定向到带有斜杠的URL。如果(!文件包括('/')) {让newUrl=请求.url.replace(doc,doc+'/');返回响应.重定向(新网址,301);}如果(endsWith博士('/'))文件+='索引.html';可获取=`${doc}${query}`;}其他{可获取请求;}const response=等待获取(可获取);返回响应;}注意:LATEST是作者的KV名称空间的名称,不是Workers KV的默认名称我已经向DuckDuckGo提交了一个请求,以使用新的"最新"URL!鲁比多克和!rb砰砰的一声,但到目前为止,他们仍然向前一个更老版本。很多感谢Cloudflare对RubyDocs的支持,更重要的是,它为我们所有人构建了一个更好的互联网!