在教學系列的第一部分中,我們將逐步完成將 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中文網其他相關文章!