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

在教程系列的第一部分中,我们将逐步完成将 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
使用数据库存储会话的优点是什么?使用数据库存储会话的优点是什么?Apr 24, 2025 am 12:16 AM

使用数据库存储会话的主要优势包括持久性、可扩展性和安全性。1.持久性:即使服务器重启,会话数据也能保持不变。2.可扩展性:适用于分布式系统,确保会话数据在多服务器间同步。3.安全性:数据库提供加密存储,保护敏感信息。

您如何在PHP中实现自定义会话处理?您如何在PHP中实现自定义会话处理?Apr 24, 2025 am 12:16 AM

在PHP中实现自定义会话处理可以通过实现SessionHandlerInterface接口来完成。具体步骤包括:1)创建实现SessionHandlerInterface的类,如CustomSessionHandler;2)重写接口中的方法(如open,close,read,write,destroy,gc)来定义会话数据的生命周期和存储方式;3)在PHP脚本中注册自定义会话处理器并启动会话。这样可以将数据存储在MySQL、Redis等介质中,提升性能、安全性和可扩展性。

什么是会话ID?什么是会话ID?Apr 24, 2025 am 12:13 AM

SessionID是网络应用程序中用来跟踪用户会话状态的机制。1.它是一个随机生成的字符串,用于在用户与服务器之间的多次交互中保持用户的身份信息。2.服务器生成并通过cookie或URL参数发送给客户端,帮助在用户的多次请求中识别和关联这些请求。3.生成通常使用随机算法保证唯一性和不可预测性。4.在实际开发中,可以使用内存数据库如Redis来存储session数据,提升性能和安全性。

您如何在无状态环境(例如API)中处理会议?您如何在无状态环境(例如API)中处理会议?Apr 24, 2025 am 12:12 AM

在无状态环境如API中管理会话可以通过使用JWT或cookies来实现。1.JWT适合无状态和可扩展性,但大数据时体积大。2.Cookies更传统且易实现,但需谨慎配置以确保安全性。

您如何防止与会议有关的跨站点脚本(XSS)攻击?您如何防止与会议有关的跨站点脚本(XSS)攻击?Apr 23, 2025 am 12:16 AM

要保护应用免受与会话相关的XSS攻击,需采取以下措施:1.设置HttpOnly和Secure标志保护会话cookie。2.对所有用户输入进行输出编码。3.实施内容安全策略(CSP)限制脚本来源。通过这些策略,可以有效防护会话相关的XSS攻击,确保用户数据安全。

您如何优化PHP会话性能?您如何优化PHP会话性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显着提升应用在高并发环境下的效率。

什么是session.gc_maxlifetime配置设置?什么是session.gc_maxlifetime配置设置?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceIsiseededeedeedeedeedeedeedto to to avoidperformance andununununununexpectedLogOgouts.3)

您如何在PHP中配置会话名?您如何在PHP中配置会话名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函数配置会话名称。具体步骤如下:1.使用session_name()函数设置会话名称,例如session_name("my_session")。2.在设置会话名称后,调用session_start()启动会话。配置会话名称可以避免多应用间的会话数据冲突,并增强安全性,但需注意会话名称的唯一性、安全性、长度和设置时机。

See all articles

热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

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

热工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。