部署
簡介
當您準備將 Laravel 應用程式部署到生產環境時,可以透過一些重要的操作來確保應用程式儘可能高效地執行。在本文件中,我們將涵蓋一些確保 Laravel 應用程式正確部署的絕佳起點。
伺服器要求
Laravel 框架有一些系統要求。您應確保您的 Web 伺服器具備以下最低 PHP 版本和擴充套件:
- PHP >= 8.3
- Ctype PHP 擴充套件
- cURL PHP 擴充套件
- DOM PHP 擴充套件
- Fileinfo PHP 擴充套件
- Filter PHP 擴充套件
- Hash PHP 擴充套件
- Mbstring PHP 擴充套件
- OpenSSL PHP 擴充套件
- PCRE PHP 擴充套件
- PDO PHP 擴充套件
- Session PHP 擴充套件
- Tokenizer PHP 擴充套件
- XML PHP 擴充套件
伺服器配置
Nginx
如果您將應用程式部署到執行 Nginx 的伺服器上,可以將以下配置檔案作為配置 Web 伺服器的起點。很可能需要根據您的伺服器配置對該檔案進行自定義。如果您需要管理伺服器方面的協助,請考慮使用 Laravel Cloud 等全託管的 Laravel 平臺。
請確保像下方的配置一樣,您的 Web 伺服器將所有請求指向應用程式的 public/index.php 檔案。切勿嘗試將 index.php 檔案移動到專案根目錄,因為從專案根目錄提供應用程式服務會將許多敏感的配置檔案暴露給公共網際網路。
1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com; 5 root /srv/example.com/public; 6 7 add_header X-Frame-Options "SAMEORIGIN"; 8 add_header X-Content-Type-Options "nosniff"; 9 10 index index.php;11 12 charset utf-8;13 14 location / {15 try_files $uri $uri/ /index.php?$query_string;16 }17 18 location = /favicon.ico { access_log off; log_not_found off; }19 location = /robots.txt { access_log off; log_not_found off; }20 21 error_page 404 /index.php;22 23 location ~ ^/index\.php(/|$) {24 fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;25 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;26 include fastcgi_params;27 fastcgi_hide_header X-Powered-By;28 }29 30 location ~ /\.(?!well-known).* {31 deny all;32 }33}
FrankenPHP
FrankenPHP 也可用於託管您的 Laravel 應用程式。FrankenPHP 是一個用 Go 編寫的現代 PHP 應用伺服器。要使用 FrankenPHP 託管 Laravel PHP 應用程式,只需呼叫其 php-server 命令即可。
1frankenphp php-server -r public/
要利用 FrankenPHP 支援的更強大功能(例如其 Laravel Octane 整合、HTTP/3、現代壓縮或將 Laravel 應用程式打包為獨立二進位制檔案的能力),請參閱 FrankenPHP 的 Laravel 文件。
目錄許可權
Laravel 需要對 bootstrap/cache 和 storage 目錄進行寫入操作,因此您應確保 Web 伺服器程序的所有者擁有這些目錄的寫入許可權。
最佳化
當將應用程式部署到生產環境時,有多種檔案應該被快取,包括配置、事件、路由和檢視。Laravel 提供了一個方便的 optimize Artisan 命令,可以快取所有這些檔案。該命令通常應作為應用程式部署過程的一部分來呼叫。
1php artisan optimize
optimize:clear 方法可用於刪除由 optimize 命令生成的所有快取檔案,以及預設快取驅動程式中的所有鍵。
1php artisan optimize:clear
在接下來的文件中,我們將討論 optimize 命令所執行的每一個細粒度最佳化命令。
快取配置
當將應用程式部署到生產環境時,請確保在部署過程中執行 config:cache Artisan 命令。
1php artisan config:cache
此命令會將 Laravel 的所有配置檔案合併到一個單一的快取檔案中,這大大減少了框架在載入配置值時對檔案系統的訪問次數。
如果您在部署過程中執行 config:cache 命令,請確保僅在配置檔案內部呼叫 env 函式。一旦配置被快取,.env 檔案將不會被載入,所有針對 .env 變數的 env 函式呼叫都將返回 null。
快取事件
您應該在部署過程中快取應用程式自動發現的事件到監聽器的對映。這可以透過在部署期間呼叫 event:cache Artisan 命令來完成。
1php artisan event:cache
快取路由
如果您正在構建一個擁有大量路由的大型應用程式,請確保在部署過程中執行 route:cache Artisan 命令。
1php artisan route:cache
此命令將您所有的路由註冊簡化為快取檔案中的單一方法呼叫,從而在註冊數百個路由時提高了路由註冊的效能。
快取檢視
當將應用程式部署到生產環境時,請確保在部署過程中執行 view:cache Artisan 命令。
1php artisan view:cache
此命令會預編譯所有 Blade 檢視,因此它們無需按需編譯,從而提高了每個返回檢視的請求的效能。
重啟服務
部署到 Laravel Cloud 時,無需使用 reload 命令,因為所有服務的平滑重啟會自動處理。
在部署新版本的應用程式後,任何長時間執行的服務(如佇列工作程序、Laravel Reverb 或 Laravel Octane)都應進行重啟,以便使用新程式碼。Laravel 提供了一個單一的 reload Artisan 命令來終止這些服務。
1php artisan reload
如果您沒有使用 Laravel Cloud,則應手動配置程序監控器,以便在可重啟程序退出時檢測並自動重啟它們。
除錯模式
config/app.php 配置檔案中的 debug 選項決定了實際向用戶顯示多少錯誤資訊。預設情況下,此選項設定為遵循 APP_DEBUG 環境變數的值,該值儲存在應用程式的 .env 檔案中。
在生產環境中,該值應始終為 false。如果生產環境中的 APP_DEBUG 變數設定為 true,您將面臨將敏感配置值暴露給應用程式終端使用者的風險。
健康檢查路由
Laravel 包含一個內建的健康檢查路由,可用於監控應用程式的狀態。在生產環境中,此路由可用於向正常執行時間監控器、負載均衡器或 Kubernetes 等編排系統報告應用程式的狀態。
預設情況下,健康檢查路由位於 /up,如果應用程式在沒有異常的情況下啟動,它將返回 200 HTTP 響應。否則,將返回 500 HTTP 響應。您可以在應用程式的 bootstrap/app 檔案中配置此路由的 URI。
1->withRouting(2 web: __DIR__.'/../routes/web.php',3 commands: __DIR__.'/../routes/console.php',4 health: '/up', 5 health: '/status', 6)
當向該路由傳送 HTTP 請求時,Laravel 還會分發一個 Illuminate\Foundation\Events\DiagnosingHealth 事件,允許您執行與應用程式相關的額外健康檢查。在該事件的 監聽器 中,您可以檢查應用程式的資料庫或快取狀態。如果您檢測到應用程式存在問題,只需在監聽器中丟擲異常即可。
使用 Laravel Cloud 或 Forge 進行部署
Laravel Cloud
如果您需要一個專為 Laravel 調優的全託管、自動伸縮的部署平臺,請檢視 Laravel Cloud。Laravel Cloud 是一個強大的 Laravel 部署平臺,提供託管計算、資料庫、快取和物件儲存服務。
在 Cloud 上啟動您的 Laravel 應用程式,並體驗其可擴充套件的簡潔性。Laravel Cloud 由 Laravel 的創始人精心調優,可與框架無縫協作,讓您可以按照習慣的方式繼續編寫 Laravel 應用程式。
Laravel Forge
如果您更喜歡自行管理伺服器,但又不擅長配置執行穩健的 Laravel 應用程式所需的各種服務,Laravel Forge 是一個專為 Laravel 應用程式打造的 VPS 伺服器管理平臺。
Laravel Forge 可以在 DigitalOcean、Linode、AWS 等各種基礎設施提供商上建立伺服器。此外,Forge 還會安裝並管理構建強大 Laravel 應用程式所需的所有工具,如 Nginx、MySQL、Redis、Memcached、Beanstalk 等。