在教學系列的第一部分中,我們將逐步完成將 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。
建立後,複製儲存庫的 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。
使用 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 磁碟區。我們將在單獨的教程中介紹它。
暫時不要更改此部分的任何其他內容。向下捲動到底部並點擊建立。
建立ECS集群
我們現在需要建立一個 ECS 叢集。叢集是我們執行剛剛建立的任務定義中定義的服務的地方。
前往Amazon ECS 控制台,在叢集 下,點選建立叢集,輸入叢集名稱,並確保選擇AWS Fargate(無伺服器) 作為基礎設施:
建立叢集需要幾分鐘。叢集建立偶爾會失敗,特別是對於新帳戶;只需等待幾分鐘,然後重試,選擇不同的叢集名稱。
創建ECS服務
開啟剛剛建立的集群,向下捲動至 Services 表,按一下 建立,然後輸入以下值:
- 家庭:演示應用程式
- 修訂:1(保持原樣)
- 服務名稱:demo-app
暫時不要點擊建立。
新增負載平衡器
由於我們可能透過 HTTPS 為應用程式提供服務,因此我們需要新增一個負載平衡器。您以後不能再做。
向下捲動至網路部分,然後選擇要將服務部署到的 VPC。確保 VPC 具有 公用子網路,並附加有 Internet 閘道。如果您沒有 VPC,您可以透過點擊建立新 VPC 並按照精靈操作來建立 VPC。
選擇 VPC 後,請繼續閱讀。
向下捲動至負載平衡部分,選擇應用程式負載平衡器,然後選擇選項建立新的負載平衡器。
如果此選項不可用,則您可能在上一個步驟中沒有選擇 VPC。
調整以下數值:
- 負載平衡器名稱:demo-app-alb
- 健康檢查寬限期:300(我建議將其設定為 300 秒,即 5 分鐘,以便您的應用程式啟動並穩定)
在 Listener 部分下,保持選取 建立新監聽器 選項,但調整值以使用連接埠 443 和 HTTPS 協定。要確認此選擇,您需要您要使用的網域的 ACM 憑證;有關如何取得的詳細信息,請參閱 AWS 文件。
在目標組部分下,調整以下值:
- 協定:HTTP(這是預設值,請確保保留它,因為我們的 nginx 容器正在偵聽連接埠 80)
- 註銷延遲:60(我建議將其設定為 60 秒,而不是預設的 5 分鐘,以使部署更快一點)
- 健康檢查路徑:/(我建議將其設定為您在應用程式中專門建立的路由,例如/healthcheck;您現在可以將其保留為預設值)
點選建立。
檢查服務狀態
服務可能需要幾分鐘才會顯示在服務 表中。如果您沒有立即看到新服務,請稍等一下,然後重新整理頁面。
如果一切順利,您應該會看到服務 表中列出的服務,其狀態為活動 和部署和任務 顯示1/1正在運行任務。
部署錯誤顯示如下:
要偵錯部署錯誤,請開啟服務,然後按部署標籤;向下捲動至 Events 部分,然後按一下最近啟動的任務的 ID。任務執行的日誌部分將向您顯示有關出錯原因的更多詳細資訊。
Laravel 通常會抱怨儲存資料夾結構不完整(例如,缺少框架、快取、會話之一)。我們將在單獨的教程中了解如何將 EFS 磁碟區附加到任務定義來解決此問題。
將網域連接到服務
您可能想要將網域連接到我們剛剛部署的服務。在前面的步驟中,我們已經建立了一個應用程式負載平衡器,它是負責將網路流量路由到服務的 AWS 元件。
我們也已經配置了 ACM 證書,用於加密最終用戶和負載平衡器之間的流量。
要完成該過程並使您的應用程式能夠透過 HTTPS 從公共互聯網訪問,您需要建立一條 DNS 記錄,將您的網域指向負載平衡器。此過程會有所不同,具體取決於您使用的 DNS 提供者;請參閱他們的文件以獲取更多資訊。
首先取得應用程式負載平衡器的 DNS 名稱。導覽至 AWS 控制台中的搜尋列(macOS 上的選項 S),輸入負載平衡器,然後選擇 負載平衡器(EC2 功能)。您將看到一個表格,其中包含我們需要將網域連接到的負載平衡器:
複製負載平衡器的 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中文網其他相關文章!

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

你應該關心DependencyInjection(DI),因為它能讓你的代碼更清晰、更易維護。 1)DI通過解耦類,使其更模塊化,2)提高了測試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關係,但要注意性能影響和循環依賴問題,4)最佳實踐是依賴於抽象接口,實現鬆散耦合。

是的,優化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)優化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,並避免使用

theKeyStrategiestosigantificallyBoostPhpaPplicationPerformenCeare:1)UseOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)優化AtabaseInteractionswithPreparedStateTementStatementStatementAndProperIndexing,3)配置

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3漢化版
中文版,非常好用

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)