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

DDD
发布: 2024-10-20 06:07:02
原创
171 人浏览过

在教程系列的第一部分中,我们将逐步完成将 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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!