在教程系列的第一部分中,我们将逐步完成将 PHP (Laravel) 应用程序部署到 Amazon ECS 的步骤。我们将首先创建一个 Docker 映像,将其推送到 Amazon ECR,创建一个 ECS 任务定义、一个 ECS 集群、一个 ECS 服务并将域名连接到该服务。
在 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 的文件夹,并将以下两个文件放入其中。
#!/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
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可执行。
第一步是将镜像推送到 ECR。您需要先手动执行此步骤,然后才能继续将应用程序部署到 ECS。
通过前往 Amazon ECR 控制台,单击 创建存储库,然后输入存储库名称来创建 ECR 存储库。对于此示例,我们将使用 demo-app。
创建后,复制存储库的 URI。稍后您将需要此 URI。
选择您刚刚创建的存储库,单击查看推送命令,然后在终端中运行命令。命令将如下所示(确保选择正确的区域并使用正确的帐户 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。
下一步是使用我们刚刚推送到 ECR 的 Docker 映像创建 ECS 任务定义。
首先前往 Amazon ECS 控制台,在 任务定义 下,单击 创建新任务定义。
为任务定义选择一个唯一的名称(我们将使用 demo-app),并确保选择 Fargate 作为启动类型。暂时不要更改此部分中的任何其他内容。
向下滚动到 Container - 1 部分,然后输入以下值:
稍后,您可能需要根据您的应用程序调整内存和 CPU 设置。如果需要,您还可以在此处添加环境变量和 EFS 卷。我们将在单独的教程中介绍它。
暂时不要更改此部分中的任何其他内容。向下滚动到底部并单击创建。
我们现在需要创建一个 ECS 集群。集群是我们运行刚刚创建的任务定义中定义的服务的地方。
前往 Amazon ECS 控制台,在 集群 下,单击 创建集群,输入集群名称,并确保选择 AWS Fargate(无服务器) 作为基础设施:
创建集群需要几分钟时间。集群创建偶尔会失败,特别是对于新帐户;只需等待几分钟,然后重试,选择不同的集群名称。
打开刚刚创建的集群,向下滚动到 Services 表,单击 创建,然后输入以下值:
暂时不要点击创建。
由于我们可能通过 HTTPS 为应用程序提供服务,因此我们需要添加一个负载均衡器。您以后不能再这样做。
向下滚动到网络部分,然后选择要将服务部署到的 VPC。确保 VPC 具有 公共子网,并附加有 Internet 网关。如果您没有 VPC,您可以通过单击创建新 VPC 并按照向导操作来创建一个 VPC。
选择 VPC 后,请继续阅读。
向下滚动到负载均衡部分,选择应用程序负载均衡器,然后选择选项创建新的负载均衡器。
如果此选项不可用,则您可能在上一步中没有选择 VPC。
调整以下值:
在 Listener 部分下,保持选中 创建新监听器 选项,但调整值以使用端口 443 和 HTTPS 协议。要确认此选择,您需要您要使用的域的 ACM 证书;有关如何获取的更多信息,请参阅 AWS 文档。
在目标组部分下,调整以下值:
点击创建。
服务可能需要几分钟时间才会显示在服务 表中。如果您没有立即看到新服务,请稍等一下,然后刷新页面。
如果一切顺利,您应该会看到 服务 表中列出的服务,其状态为 活动 和 部署和任务 显示 1/1正在运行任务。
部署错误显示如下:
要调试部署错误,请打开服务,然后单击部署选项卡;向下滚动到 Events 部分,然后单击最近启动的任务的 ID。任务执行的日志部分将向您显示有关出错原因的更多详细信息。
Laravel 通常会抱怨存储文件夹结构不完整(例如,缺少框架、缓存、会话之一)。我们将在单独的教程中了解如何将 EFS 卷附加到任务定义来解决此问题。
您可能想要将域名连接到我们刚刚部署的服务。在前面的步骤中,我们已经创建了一个应用程序负载均衡器,它是负责将互联网流量路由到服务的 AWS 组件。
我们还已经配置了 ACM 证书,用于加密最终用户和负载均衡器之间的流量。
要完成该过程并使您的应用程序能够通过 HTTPS 从公共互联网访问,您需要创建一条 DNS 记录,将您的域名指向负载均衡器。此过程会有所不同,具体取决于您使用的 DNS 提供商;请参阅他们的文档以获取更多信息。
首先获取应用程序负载均衡器的 DNS 名称。导航到 AWS 控制台中的搜索栏(macOS 上的选项 S),输入负载均衡器,然后选择 负载均衡器(EC2 功能)。您将看到一个表格,其中包含我们需要将域名连接到的负载均衡器:
复制负载均衡器的 DNS 名称。
如果您使用 53 号公路,请按照以下说明操作:
如果您不使用 53 号公路:
请参阅您的 DNS 提供商的文档以了解更多信息。您可能需要创建一条 CNAME 记录,将负载均衡器的 DNS 名称作为其目标/值。
创建 DNS 记录后,等待几分钟让它传播,然后尝试通过域名访问您的应用程序。
恭喜!您现已成功将 PHP (Laravel) 应用程序部署到 AWS ECS。
以上是将 PHP (Laravel) 应用程序部署到 Amazon ECS 部分的详细内容。更多信息请关注PHP中文网其他相关文章!