將 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學習者快速成長!