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

免备案CDN_徐汇企业网站建设_怎么样

小七 141 0

去年11月,我们宣布与Fastly合作,为新的HashiCorp发布服务提供动力。从那时起,我们将Fastly的使用范围扩大到所有静态站点。你可能已经注意到我们不同网站的前端和后端细微的变化-这篇文章详细介绍了我们将静态网站迁移到Fastly的步骤。概述在较高的层次上,我们新的静态站点架构被建模为:Atlas负责建立静态站点并上传到S3。Fastly被配置为从S3 bucket中提取作为源,并动态重写URL路径以支持同一bucket中的多个站点。缓存时间被设置为一年,我们在部署期间使用代理键清除缓存的特定子集。作为额外的奖励,我们预热缓存和检查断开的链接,以确保最好的体验可能!什么是静态站点?在HashiCorp,我们相信重要的设计和用户体验是项目成功的关键因素。我们不仅在命令行界面、错误消息和输出上投入了大量的时间和精力,而且每个项目都有自己独特的标识和网站。每个项目的网站都使用Middleman,这是一个用Ruby编写的静态网站生成器。以下是一些静态站点:https://www.vagrantup.com/https://www.terraform.io/https://www.hashicorp.com/HashiCorp静态站点在历史上一直是使用带有一系列定制构建包的PaaS来托管的。这个过程提出了几个关键问题。首先,所有对静态站点的请求都会命中Ruby web服务器,然后服务器从磁盘加载一个预构建的文件。这导致性能低于最佳,并使全局缓存变得困难且成本高昂。来自客户的一个常见抱怨是,我们的静态网站速度慢,或者从世界各地无法访问。预构建的文件是在每个部署上构建的,这会导致偶尔的部署问题,比如Ruby版本冲突、推送暂停或网站部署不完整。编译静态站点虽然静态站点以前是由PaaS构建和服务的,但作为这项工作的一部分,我们必须将构建阶段与部署阶段分开。由于我们熟悉,我们选择使用Atlas构建静态站点,并使用流行的s3cmd工具将静态站点部署到amazons3上。在Atlas中,我们使用打包机模板配置所有内容。在静态站点的情况下,我们使用一个简单的打包器模板来启动Docker容器,构建静态站点,并将静态站点上传到S3。有关完整的示例,请参阅用于构建Terraform静态站点的打包器模板。Packer模板还调用我们的自定义bash脚本,该脚本使用s3cmd将静态站点上载到S3。该命令如下所示:s3cmd公司\--安静\--删除已删除\--猜测mime类型\--没有哑剧魔术\--acl公共\--递归的\--add header="缓存控制:最大年龄=31536000"\--add header="x-amz-meta-surrogate-key:站点-$PROJECT"\同步"$DIR/build/"s3://<;bucket>;/$PROJECT/latest/"--quiet告诉s3cmd禁止非错误输出。--delete removed告诉s3cmd删除不再跟踪的旧文件(同步的一部分)。--guess mime type告诉s3cmd从文件扩展名猜测mime类型,而不是使用python魔术(这是非常不准确的)。--non-mime magic告诉s3cmd完全禁用python magic mime检测。--acl public告诉s3cmd以只读方式公开资源。--recursive告诉s3cmd递归到子目录和文件夹中。第一个--add header调用将资源的缓存控制设置为一年。第二个--add header调用设置代理项键。$PROJECT是一个变量,由Atlas填充当前站点的名称(比如"terraform")。需要特别注意的是代理键字段和缓存计时器。正如您稍后将看到的,我们告诉Fastly将我们的内容一次缓存一年。我们在部署时使用代理项键清除缓存。您可以在Fastly文档中阅读有关Fastly代理键的更多信息,以便通过代理键清除。这一点很快就会明朗。部署脚本的下一部分对静态站点的代理项密钥执行软清除。这是我们用curl发出的一个简单的HTTP请求:卷曲\--失败\--沉默\--输出/dev/null\--请求"发布"\--标题"Accept:application/json"\--header"Fastly Key:$Fastly_API_密钥"\--标题"Fastly Soft Purge:1"\"https://api.fastly.com/service/$FASTLY_服务_ID/purge/site-$PROJECT"执行脚本时,Atlas会自动填充环境变量。注意,URL包含site-$PROJECT-这与我们在资源中设置的代理项关键字头的值相同。我们使用此代理项只清除特定静态站点的内容。最后,我们预热新的缓存。Fastly没有直接执行此操作的机制,因此我们改用wget:wget公司\--递归的\--在之后删除\--级别0\--安静\"https://$PROJECT_URL/"这将递归地爬行所有页面和资产,触发一个未命中和一个原点查找,Fastly将在回程中缓存这些内容。这项技术还为我们提供了一些围绕静态站点的持续集成,因为它会捕获断开的内部链接并使构建失败。使用Fastly自定义VCL进行缓存因为Amazon限制了每个帐户的存储桶数,所以我们决定将所有静态网站放在同一个S3存储桶中。经过一番讨论和研究,我们决定采用以下结构:\_\_例如,Terraform的部署如下所示:\_地形\_最新在将来,我们计划对文档进行版本控制,因此将创建"最新"子文件夹。但是因为我们所有的站点都配置在同一个bucket中,所以我们需要编写定制的Varnish配置,根据传入的域动态地将请求重写到后端。配置块如下所示:如果(请求http.host~ "地形.io") {设置请求http.host=".s3-website-us-east-1。亚马逊网站";设置请求url="/地形/最新"请求url;返回(查找);}此片段位于vcl\U fetch中,它执行以下操作:基于请求主机的有条件筛选。动态地将后端请求重写到S3端点。在请求url前面加上bucket路径。 地形.io/(.*)=>.s3-website-us-east-1。amazonaws.com/terraform/latest/1美元当后端执行重定向时,这种方法遇到了一个障碍。由于后端知道它的请求URL是/terraform/latest,所以重定向将包含该前缀,从而导致客户端被重定向到terraform.io/terraform/latest/. 经过一番尝试和错误之后,我们确定绕过此问题的最佳方法是重写任何后端响应重定向,如下所示:如果(贝雷斯普状态==301 | |死者身份==302){设置beresp.http.位置=正则表达式(beresp.http.位置,"^/(.+)/最新/","/");}另外,我们发现有些AWS元数据是不必要的,因此我们在将响应发送到客户端之前去掉这些头:未设置贝雷斯普.http.x-amz-id-2;未设置贝雷斯普.http.x-amz-request-id;未设置贝雷斯普.http.x-amz-meta-s3cmd-attrs;未设置beresp.http.服务器;强制www和TLS传统上,我们的静态网站可以在非TLS、TLS、非www和www变体上使用。这对于缓存来说是有问题的,因为它需要缓存站点的四个不同版本。相反,我们为表单中的每个站点实现了一个规范的URLhttps://www.PROJECT和为所有其他表单建立正确的重定向。Fastly通过内置的对强制SSL的支持以及编写我们自己定制的清漆的功能,使这一过程变得非常简单。在将请求传递到后端之前,我们首先检查主机是否以www前缀开头:如果(请求http.host!~"^www\..+"){设置请求http.host="www."请求http.host;设置请求http.x-varnish-redirect="https://"请求http.host请求url;错误750请求http.x-清漆-重定向;}注意以下几点很重要:如果且仅当标头不是以"www"开头时,我们将重写原始主机标头并在其前缀中加上"www"。如果您正在托管存在于非www域上的其他站点,则需要将它们从该检查中排除。我们也在这里强制TLS重定向,即使最初的请求是通过非TLS的。这样就避免了向用户发出多个重定向。我们通过附加原始请求url来保留原始请求和查询字符串。我们返回一个带有自定义错误代码的错误,并将结果(它是要重定向到的完整URL)传递到错误调用。"750"是我们的自定义错误代码。默认情况下,Varnish不允许在recv或fetch期间执行重定向。相反,通常接受的执行重定向的方法是使用自定义错误代码,然后在vcl\u error函数中设置正确的标头。在本例中,此自定义重定向如下所示:如果(目标状态==750){设置obj.http.位置= 客观反应;设置obj.http.Strict-Transport Security="max age=31536000;includeSubdomains;preload;";设置目标状态=301;退货(交货);}这里还有几点需要注意的事项:我们显式地检查我们的自定义错误代码,否则我们允许vcl\u error函数的其余部分发生。我们将httplocation头设置为传递给error函数(重定向位置)的值。我们在重定向时设置了HSTS头(稍后将在文章中对此进行更多介绍)。我们显式地将HTTP状态代码设置为301,以告诉客户机跟踪location头作为永久重定向。使用Varnish启用TLS可能会有点棘手,因为它不可能检查传入的协议,但谢天谢地,fast包含了一个用于强制SSL的易于使用的宏:如果(!请求http.Fastly-SSL){错误801"强制SSL";}在本例中,"Fastly SSL"是一个定制的头,"801"是Fastly用于在请求上强制SSL的特殊错误代码。注意,为了减少重定向的数量,我们把它放在所有其他重定向之后

上一篇:没有了

下一篇:金山云_百度云胖_好用