发布于 2026-01-06 0 阅读
0

使用 AWS、Bref 和 PHP 创建无服务器网站

使用 AWS、Bref 和 PHP 创建无服务器网站

先决条件

首先我想说明,我假设您已经熟悉AWS和以下主题。如果您还不熟悉,我建议您至少先了解这些主题的基础知识,然后再尝试跟随我的讲解。


介绍

在 AWS 上搭建无服务器网站已成为一种普遍现象。这并不令人意外,因为与使用虚拟服务器的传统网站托管方案相比,无服务器网站托管具有诸多优势,例如:更好的可扩展性、更低的成本和更低的延迟。

https://dashbird.io/blog/business-benefits-of-serverless/

大多数无服务器网站都依赖于静态网页技术,例如 JavaScript。这使得最简单的无服务器网站解决方案得以实现,如下图所示。

静态网站架构

我们试图解决的问题是,这种简单的架构不支持像 ASP.NET、JSP 或 PHP 这样的动态Web 技术,而这些技术至今仍被用于构建令人惊叹的网站,例如 Etsy、Facebook 和 Slack 等网站。

https://trio.dev/blog/companies-using-php

动态网站可以利用 AWS 实现无服务器托管。这只需要几个额外的步骤和一些额外的服务。让我们一起来看看一个可行的解决方案。


简而言之

在 PHP 领域,有一个名为Bref的出色项目,我们可以用它来简化配置。借助 Bref,我们可以将 PHP 网站运行在 Lambda 上,而无需依赖 EC2 等服务。

引用他们的文件内容:

Bref 是一个开源项目,它为 AWS Lambda 带来了对 PHP 及其框架的全面支持。

用法

最简单的实现方法是将我们的网站打包成容器镜像,最终部署到 Lambda 函数。为了让 Lambda 函数引用该镜像,我们需要先将镜像上传到 ECR。幸运的是,AWS 让与 ECR 的交互变得极其简单。让我们一步步来了解具体步骤。

  1. 创建 Dockerfile

    # reference bref as the base image
    FROM bref/php-74-fpm
    
    # install composer
    RUN curl -s https://getcomposer.org/installer | php
    
    # require bref
    RUN php composer.phar require bref/bref
    
    # copy contents into expected directory
    COPY . /var/task
    
    # set handler to our index
    CMD _HANDLER=index.php /opt/bootstrap
    

    https://docs.docker.com/engine/reference/builder/
    https://github.com/wheeleruniverse/cgc-aws-ml-recommendation-engine/blob/master/php-api/Dockerfile

  2. 向 ECR 进行身份验证

    aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com"
    

    https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html
    https://docs.docker.com/engine/reference/commandline/login/

  3. 构建 Docker 镜像

    docker build -t ${AWS_ECR_REPOSITORY} .
    

    https://docs.docker.com/engine/reference/commandline/build/

  4. 给你的 Docker 镜像打标签

    docker tag "${AWS_ECR_REPOSITORY}:latest" "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_ECR_REPOSITORY}:latest"
    

    https://docs.docker.com/engine/reference/commandline/tag/

  5. 推送您的 Docker 镜像

    docker push "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_ECR_REPOSITORY}:latest"
    

    https://docs.docker.com/engine/reference/commandline/push/

ECR命令

在 ECR 控制台中查找这些根据您的帐户定制的推送命令。


建筑学

现在我们的容器镜像已位于 ECR 中,我们可以创建一个引用它的 Lambda 函数。

ECR控制台Lambda 控制台

完成上述步骤后,我们需要使用 API 网关为我们的函数提供一个端点。

API 网关控制台

然后我们可以将该端点作为 CloudFront 源来提供我们的网站服务。

CloudFront OriginsCloudFront 行为

最后,我们可以通过将静态内容上传到 S3 并使用单独的源来提供该内容,从而优化此架构。

PHP图表


CI/CD

众所周知,网站会定期更新,因此我想简要介绍一下持续集成持续部署。我会实现一个流程,当代码变更推送到 Git 仓库时,在 ECR 和 Lambda 中构建并更新容器镜像。这对于保持环境与 Git 仓库同步至关重要,同时避免手动部署。手动部署容易出错,而且完全可以避免。当脚本中的源代码发生变更时,只需重复上述步骤即可轻松创建镜像并更新 ECR。按照这些步骤,再加上类似下面的操作,我们就可以自动更新 Lambda 函数。

aws lambda update-function-code \
--function-name ${AWS_LAMBDA_FUNCTION} \
--image-uri "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${AWS_ECR_REPOSITORY}:latest" \
--region ${AWS_REGION}
Enter fullscreen mode Exit fullscreen mode

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html

如果你是 CI/CD 新手,那么我推荐你参考这些优秀的入门资源。


结论

我们首先讨论了使用无服务器技术托管动态网站的问题。然后我们讨论了 Bref 和 Docker,它们都有助于托管无服务器版本的 PHP。接着,我们详细了解了所需的架构。我们将容器镜像推送到 ECR,并将 PHP 代码部署为 Lambda 函数。之后,我们创建了一个 API 网关端点,用于通过 HTTP 调用 Lambda 函数。最后,我们将静态内容上传到 S3,并将两个源都置于 CloudFront 分发之后。总而言之,我想重申,动态网站可以享受到无服务器技术的优势,我坚信这绝对值得付出努力。

请查看我开发的这个实时无服务器 PHP 网站,它就是一个生动的例子。

如果您喜欢这篇文章,或许您可以请我喝杯咖啡,或者在领英上与我联系

文章来源:https://dev.to/aws-builders/creating-serverless-websites-with-aws-bref-and-php-203j