如何为 Laravel 应用程序设置 Cloudfront CDN?

Kri*_*hna 3 php content-delivery-network amazon-cloudfront laravel

我们开发了一个运行良好的 Laravel 应用程序。一旦我们启用了 CDN(Amazon Cloudfront),它就停止了所有形式的工作。无论哪里有表单提交,如登录、联系我们等。它根本不起作用。

我们已经确定应该对 Laravel 应用程序进行一些更改,我们正在寻求一些已成功使用 CDN 配置 Laravel 应用程序的专家的帮助。

我们使用的是 PHP 7.1.20 和 Laravel 5.4 版本。

Dwi*_*ght 5

我认为您误解了将 CloudFront 用作 CDN 或与此相关的任何 CDN。

您不会将它放在整个站点的前面 - 它不会为您的站点提供服务。它用作静态资产的缓存:媒体、样式表和脚本。其他一切仍然直接从您的 PHP 应用程序提供。

您可以ASSET_URL为您的应用程序设置环境变量,当您使用asset()mix()帮助程序时,Laravel 将使用它来指向您的资产。


Tod*_*vic 5

与公认的答案相反,您可以而且通常应该将 CloudFront 放在应用程序前面,而不仅仅是放在静态文件前面。

为了澄清这一点,我正在讨论的设置是:

example.com -> CDN -> origin  (ALB, API Gateway, S3 ...)
Run Code Online (Sandbox Code Playgroud)

为什么要这么做?

1、性能原因

1.1 TLS 终止

您可以使用 CloudFront 终止 TLS,这意味着您的用户将与 CloudFront 建立安全连接,然后 CloudFront 将通过纯 HTTP 与源进行通信。

这有什么帮助?您的澳大利亚用户不会与您在德国的服务器进行 3 次握手,而是通过 Cloudfront 关闭可能在梅尔本的 PoP 来完成此操作。您可以看到这如何降低延迟。您可能想知道是否可以通过纯 HTTP 将数据从 CloudFront 传输到源。AWS 仍会加密您的数据:

通过 AWS 全球网络跨 AWS 区域流动的所有数据在离开 AWS 安全设施之前都会在物理层自动加密。

他们只是在第一个 OSI 层上执行此操作,而不是在 TLS 发生的第 4 层上执行此操作。这对你来说够了吗?如果您不与监管机构或高度敏感的数据打交道,可能是的。如果 AWS 安全措施失败并且有人能够欺骗 AWS 数据中心内的流量 - 您可能不是攻击者的目标。

1.2 从 PoP 到 Origin 的连接复用

引用 Cloudfront 常见问题解答:

对于未缓存在边缘站点和区域边缘缓存的文件,Amazon CloudFront 会与源服务器保持持久连接,以便可以尽快从源服务器获取这些文件。

他们的意思是,当用户与 CloudFront 建立连接时,CloudFront 将与源建立连接(如果尚未打开且文件未缓存),并保持该连接处于活动状态。这意味着来自任何用户的任何后续(未缓存)请求都将体验到较低的延迟,因为 CloudFront 将重用从 CloudFront 到源的相同 TCP 连接。

1.3 AWS骨干网的使用

使用优化的 AWS 全球网络从 PoP 到源点进行通信,而不是通过慢速互联网。AWS 文档

2. 安全原因

Cloudfront(或 Cloudflare 等其他 CDN 提供商)可以帮助您吸收一些 DDOS 攻击请求并保护您,特别是在您打开AWS WAFAWS Shield Advanced 的情况下。

概括

即使对于不可缓存的路由/文件,您也可以从 Cloudfront 中受益。我的首选缓存设置如下。我缓存/img/*/css/*路由/js/*以及所有其他内容,我只是通过 HTTP 代理到源。

您可能意识到可缓存内容的性能提升。因此,我在这里分享应用程序前面有或没有 CloudFront 的不可缓存请求(一直到 Laravel 的请求)的结果:

左侧是未通过 CDN 代理的页面的结果。 请注意 SSL/TLS 延迟的差异

请注意 SSL/TLS 延迟的减少。 响应时间只是全球平均水平。距离越远的位置,性能提升越高。例如,对于相同的请求,我们仅通过将 Cloudfront 置于其前面,就将来自悉尼的延迟从 1.3 秒降低到 0.6 秒!

为了回答您的问题, 和ASSET_URLAPP_URL相同的,我们将指向 CDN 分发的域并稍微研究一下缓存策略。