首页 后端开发 php教程 将 PHP (Laravel) 应用程序部署到 Amazon ECS 部分

将 PHP (Laravel) 应用程序部署到 Amazon ECS 部分

Oct 20, 2024 am 06:07 AM

在教程系列的第一部分中,我们将逐步完成将 PHP (Laravel) 应用程序部署到 Amazon ECS 的步骤。我们将首先创建一个 Docker 映像,将其推送到 Amazon ECR,创建一个 ECS 任务定义、一个 ECS 集群、一个 ECS 服务并将域名连接到该服务。

使用 Docker 和 ECR

创建 Dockerfile 和 nginx 配置

在 git 存储库的根目录中,创建一个包含以下内容的 Dockerfile:

# Use the official PHP-FPM image as the base
FROM public.ecr.aws/docker/library/php:fpm

# Define a user variable
ARG user=www-data

# Install system dependencies and PHP extensions
RUN apt-get update && apt-get install -y \
    git curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip unzip libzip-dev \
    nginx \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && docker-php-ext-install \
        pdo_mysql \
        mbstring \
        exif \
        pcntl \
        bcmath \
        gd \
        zip

# Install Composer
COPY --from=public.ecr.aws/composer/composer:latest-bin /usr/bin/composer /usr/bin/composer

# Create a system user for running Composer and Artisan commands
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Copy Nginx configuration and entrypoint script
COPY ./docker/default.conf /etc/nginx/sites-enabled/default
COPY ./docker/entrypoint.sh /etc/entrypoint.sh

# Make the entrypoint script executable
RUN chmod +x /etc/entrypoint.sh

# Set the working directory
WORKDIR /var/www

# Copy the application code
COPY --chown=www-data:www-data . /var/www

# Install PHP dependencies
RUN composer install

# Expose port 80
EXPOSE 80

# Define the entrypoint
ENTRYPOINT ["/etc/entrypoint.sh"]
登录后复制

新建一个名为 docker 的文件夹,并将以下两个文件放入其中。

  • docker/entrypoint.sh
#!/usr/bin/env bash

# Start Nginx service
service nginx start

# Run Laravel migrations
php artisan migrate --force

# Create symbolic link for storage
php artisan storage:link

# Clear and optimize the application cache
php artisan optimize:clear
php artisan optimize

# Start PHP-FPM
php-fpm
登录后复制
  • docker/default.conf
server {
    listen 80 default_server;
    index index.php index.html;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_hide_header X-Powered-By;

        # Tells PHP we're using a reverse proxy with TLS termination
        fastcgi_param HTTPS on;
        fastcgi_param HTTP_X_FORWARDED_PROTO $scheme;
        fastcgi_param HTTP_X_FORWARDED_SSL on;
        add_header Content-Security-Policy "upgrade-insecure-requests" always;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}
登录后复制

并通过运行 chmod x docker/entrypoint.sh 使entrypoint.sh可执行。

将图像推送到 Amazon ECR

第一步是将镜像推送到 ECR。您需要先手动执行此步骤,然后才能继续将应用程序部署到 ECS。

创建 ECR 存储库

通过前往 Amazon ECR 控制台,单击 创建存储库,然后输入存储库名称来创建 ECR 存储库。对于此示例,我们将使用 demo-app。

Part  Deploying a PHP (Laravel) application to Amazon ECS

创建后,复制存储库的 URI。稍后您将需要此 URI。

将镜像推送至ECR

选择您刚刚创建的存储库,单击查看推送命令,然后在终端中运行命令。命令将如下所示(确保选择正确的区域并使用正确的帐户 ID):

aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
docker build -t demo-app .
docker tag demo-app:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/demo-app:latest
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/demo-app:latest
登录后复制

命令成功运行后,返回Amazon ECR 控制台,进入存储库,并确认镜像已成功推送,标签为latest。

Part  Deploying a PHP (Laravel) application to Amazon ECS

使用 Amazon ECS

创建 ECS 任务定义

下一步是使用我们刚刚推送到 ECR 的 Docker 映像创建 ECS 任务定义。
首先前往 Amazon ECS 控制台,在 任务定义 下,单击 创建新任务定义

为任务定义选择一个唯一的名称(我们将使用 demo-app),并确保选择 Fargate 作为启动类型。暂时不要更改此部分中的任何其他内容。

向下滚动到 Container - 1 部分,然后输入以下值:

  • 名称:演示应用程序
  • 图片:123456789012.dkr.ecr.us-east-1.amazonaws.com/demo-app:latest(替换为我们之前复制的您自己的 ECR URI)

稍后,您可能需要根据您的应用程序调整内存和 CPU 设置。如果需要,您还可以在此处添加环境变量和 EFS 卷。我们将在单独的教程中介绍它。

Part  Deploying a PHP (Laravel) application to Amazon ECS

暂时不要更改此部分中的任何其他内容。向下滚动到底部并单击创建

创建ECS集群

我们现在需要创建一个 ECS 集群。集群是我们运行刚刚创建的任务定义中定义的服务的地方。

前往 Amazon ECS 控制台,在 集群 下,单击 创建集群,输入集群名称,并确保选择 AWS Fargate(无服务器) 作为基础设施:

Part  Deploying a PHP (Laravel) application to Amazon ECS

创建集群需要几分钟时间。集群创建偶尔会失败,特别是对于新帐户;只需等待几分钟,然后重试,选择不同的集群名称。

创建ECS服务

打开刚刚创建的集群,向下滚动到 Services 表,单击 创建,然后输入以下值:

  • 家庭:演示应用程序
  • 修订:1(保持原样)
  • 服务名称:demo-app

Part  Deploying a PHP (Laravel) application to Amazon ECS

暂时不要点击创建

添加负载均衡器

由于我们可能通过 HTTPS 为应用程序提供服务,因此我们需要添加一个负载均衡器。您以后不能再这样做。

向下滚动到网络部分,然后选择要将服务部署到的 VPC。确保 VPC 具有 公共子网,并附加有 Internet 网关。如果您没有 VPC,您可以通过单击创建新 VPC 并按照向导操作来创建一个 VPC。

选择 VPC 后,请继续阅读。

向下滚动到负载均衡部分,选择应用程序负载均衡器,然后选择选项创建新的负载均衡器

如果此选项不可用,则您可能在上一步中没有选择 VPC。

调整以下值:

  • 负载均衡器名称:demo-app-alb
  • 健康检查宽限期:300(我建议将其设置为 300 秒,即 5 分钟,以便您的应用程序启动并稳定)

Listener 部分下,保持选中 创建新监听器 选项,但调整值以使用端口 443 和 HTTPS 协议。要确认此选择,您需要您要使用的域的 ACM 证书;有关如何获取的更多信息,请参阅 AWS 文档。

Part  Deploying a PHP (Laravel) application to Amazon ECS

目标组部分下,调整以下值:

  • 协议:HTTP(这是默认值,请确保保留它,因为我们的 nginx 容器正在侦听端口 80)
  • 注销延迟:60(我建议将其设置为 60 秒,而不是默认的 5 分钟,以使部署更快一点)
  • 健康检查路径:/(我建议将其设置为您在应用程序中专门创建的路由,例如/healthcheck;您现在可以将其保留为默认值)

Part  Deploying a PHP (Laravel) application to Amazon ECS

点击创建

检查服务状态

服务可能需要几分钟时间才会显示在服务 表中。如果您没有立即看到新服务,请稍等一下,然后刷新页面。

如果一切顺利,您应该会看到 服务 表中列出的服务,其状态为 活动部署和任务 显示 1/1正在运行任务。

部署错误显示如下:

Part  Deploying a PHP (Laravel) application to Amazon ECS

要调试部署错误,请打开服务,然后单击部署选项卡;向下滚动到 Events 部分,然后单击最近启动的任务的 ID。任务执行的日志部分将向您显示有关出错原因的更多详细信息。

Laravel 通常会抱怨存储文件夹结构不完整(例如,缺少框架、缓存、会话之一)。我们将在单独的教程中了解如何将 EFS 卷附加到任务定义来解决此问题。

将域名连接到服务

您可能想要将域名连接到我们刚刚部署的服务。在前面的步骤中,我们已经创建了一个应用程序负载均衡器,它是负责将互联网流量路由到服务的 AWS 组件。

我们还已经配置了 ACM 证书,用于加密最终用户和负载均衡器之间的流量。

要完成该过程并使您的应用程序能够通过 HTTPS 从公共互联网访问,您需要创建一条 DNS 记录,将您的域名指向负载均衡器。此过程会有所不同,具体取决于您使用的 DNS 提供商;请参阅他们的文档以获取更多信息。

首先获取应用程序负载均衡器的 DNS 名称。导航到 AWS 控制台中的搜索栏(macOS 上的选项 S),输入负载均衡器,然后选择 负载均衡器(EC2 功能)。您将看到一个表格,其中包含我们需要将域名连接到的负载均衡器:

Part  Deploying a PHP (Laravel) application to Amazon ECS

复制负载均衡器的 DNS 名称。

如果您使用 53 号公路,请按照以下说明操作:

  • 导航到 Route 53 控制台,单击 托管区域,然后选择您的域名。
  • 点击创建记录按钮。
  • 将记录类型设置为A.
  • 选中别名选项。
  • 将流量路由到字段中,选择应用程序和经典负载均衡器的别名,然后选择负载均衡器的区域。
  • 选择负载均衡器下拉列表中,选择我们需要将域名连接到的负载均衡器。如果您有多个负载均衡器,请检查从下拉列表中选择的负载均衡器必须与我们之前复制的负载均衡器的 DNS 名称相匹配。
  • 关闭评估目标健康状况
  • 点击创建记录

如果您不使用 53 号公路:

请参阅您的 DNS 提供商的文档以了解更多信息。您可能需要创建一条 CNAME 记录,将负载均衡器的 DNS 名称作为其目标/值。

恭喜你

创建 DNS 记录后,等待几分钟让它传播,然后尝试通过域名访问您的应用程序。

恭喜!您现已成功将 PHP (Laravel) 应用程序部署到 AWS ECS。

本教程系列即将推出

  • 将 EFS 卷附加到任务定义以修复 Laravel 的存储文件夹结构问题
  • 使用 AWS CodePipeline 自动将新代码部署到服务
  • 使用 AWS CDK 自动化基础设施配置

以上是将 PHP (Laravel) 应用程序部署到 Amazon ECS 部分的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话如何劫持工作,如何在PHP中减轻它? 会话如何劫持工作,如何在PHP中减轻它? Apr 06, 2025 am 12:02 AM

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

描述扎实的原则及其如何应用于PHP的开发。 描述扎实的原则及其如何应用于PHP的开发。 Apr 03, 2025 am 12:04 AM

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试? 在PHPStorm中如何进行CLI模式的调试? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

框架安全功能:防止漏洞。 框架安全功能:防止漏洞。 Mar 28, 2025 pm 05:11 PM

文章讨论了框架中的基本安全功能,以防止漏洞,包括输入验证,身份验证和常规更新。

如何在系统重启后自动设置unixsocket的权限? 如何在系统重启后自动设置unixsocket的权限? Mar 31, 2025 pm 11:54 PM

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

See all articles