跳至內容

部署

簡介

當您準備好將 Laravel 應用程式部署到生產環境時,您可以採取一些重要步驟來確保應用程式以盡可能高的效率運行。在本文件中,我們將介紹一些確保 Laravel 應用程式正確部署的絕佳起點。

伺服器需求

Laravel 框架有一些系統需求。您應該確保您的網頁伺服器具有以下最低 PHP 版本和擴充功能

  • PHP >= 8.2
  • 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 的伺服器,您可以將以下設定檔作為設定網頁伺服器的起點。最有可能的是,這個檔案需要根據伺服器的設定進行自訂。如果您需要協助管理伺服器,請考慮使用第一方 Laravel 伺服器管理和部署服務,例如 Laravel Forge

請確保,如下面的設定所示,您的網頁伺服器將所有請求導向您應用程式的 public/index.php 檔案。您絕不應該嘗試將 index.php 檔案移動到專案的根目錄,因為從專案根目錄提供應用程式將會向公共網際網路公開許多敏感的設定檔案

server {
listen 80;
listen [::]:80;
server_name example.com;
root /srv/example.com/public;
 
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
 
index index.php;
 
charset utf-8;
 
location / {
try_files $uri $uri/ /index.php?$query_string;
}
 
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
 
error_page 404 /index.php;
 
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}
 
location ~ /\.(?!well-known).* {
deny all;
}
}

FrankenPHP

FrankenPHP 也可以用來為您的 Laravel 應用程式提供服務。FrankenPHP 是一個以 Go 編寫的現代 PHP 應用程式伺服器。要使用 FrankenPHP 為 Laravel PHP 應用程式提供服務,您只需調用其 php-server 命令

frankenphp php-server -r public/

要利用 FrankenPHP 支援的更強大的功能,例如其 Laravel Octane 整合、HTTP/3、現代壓縮或將 Laravel 應用程式打包為獨立二進制檔案的能力,請查閱 FrankenPHP 的 Laravel 文件

目錄權限

Laravel 需要寫入 bootstrap/cachestorage 目錄,因此您應該確保網頁伺服器處理程序擁有者具有寫入這些目錄的權限。

最佳化

當您將應用程式部署到生產環境時,有許多檔案應該被快取,包括您的設定、事件、路由和視圖。Laravel 提供了一個方便的 optimize Artisan 命令,可以快取所有這些檔案。此命令通常應作為應用程式部署程序的一部分調用

php artisan optimize

optimize:clear 方法可以用來移除 optimize 命令產生的所有快取檔案,以及預設快取驅動程式中的所有鍵

php artisan optimize:clear

在以下文件中,我們將討論由 optimize 命令執行的每個細微的最佳化命令。

快取設定

當您將應用程式部署到生產環境時,您應該確保在部署過程中執行 config:cache Artisan 命令

php artisan config:cache

此命令會將 Laravel 的所有設定檔案合併到單一快取檔案中,這大大減少了框架在載入設定值時必須對檔案系統進行的存取次數。

exclamation - Laravel 框架

如果您在部署過程中執行 config:cache 命令,您應該確保您只從設定檔案內呼叫 env 函數。設定快取後,將不會載入 .env 檔案,並且所有對 .env 變數的 env 函數呼叫都將傳回 null

快取事件

您應該在部署過程中快取應用程式自動探索到的事件到監聽器的對應關係。這可以透過在部署期間調用 event:cache Artisan 命令來完成

php artisan event:cache

快取路由

如果您正在建構一個具有許多路由的大型應用程式,您應該確保在部署過程中執行 route:cache Artisan 命令

php artisan route:cache

此命令會將您所有的路由註冊縮減為快取檔案中的單一方法呼叫,從而在註冊數百個路由時提高路由註冊的效能。

快取視圖

當您將應用程式部署到生產環境時,您應該確保在部署過程中執行 view:cache Artisan 命令

php artisan view:cache

此命令會預編譯您所有的 Blade 視圖,因此它們不會按需編譯,從而提高每個傳回視圖的請求的效能。

除錯模式

您的 config/app.php 設定檔中的除錯選項決定了實際向使用者顯示的錯誤資訊量。預設情況下,此選項設定為遵循 APP_DEBUG 環境變數的值,該變數儲存在應用程式的 .env 檔案中。

exclamation - Laravel 框架

在您的生產環境中,此值應始終為 false。如果 APP_DEBUG 變數在生產環境中設定為 true,您可能會將敏感的設定值暴露給應用程式的最終使用者。

健康檢查路由

Laravel 包含一個內建的健康檢查路由,可用來監控應用程式的狀態。在生產環境中,此路由可用來將應用程式的狀態報告給正常運行時間監控器、負載平衡器或協調系統,例如 Kubernetes。

預設情況下,健康檢查路由在 /up 提供服務,如果應用程式在沒有例外情況下啟動,將會傳回 200 HTTP 回應。否則,將會傳回 500 HTTP 回應。您可以在應用程式的 bootstrap/app 檔案中設定此路由的 URI

->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
health: '/status',
)

當對此路由發出 HTTP 請求時,Laravel 也會發送 Illuminate\Foundation\Events\DiagnosingHealth 事件,讓您可以執行與您的應用程式相關的其他健康檢查。在該事件的監聽器中,您可以檢查應用程式的資料庫或快取狀態。如果您偵測到應用程式有問題,您只需從監聽器拋出例外情況即可。

使用 Forge / Vapor 輕鬆部署

Laravel Forge

如果您還沒有準備好管理自己的伺服器設定,或者不熟悉設定執行健全的 Laravel 應用程式所需的所有各種服務,那麼 Laravel Forge 是一個絕佳的替代方案。

Laravel Forge 可以在各種基礎架構供應商上建立伺服器,例如 DigitalOcean、Linode、AWS 等。此外,Forge 還會安裝和管理建構穩健 Laravel 應用程式所需的所有工具,例如 Nginx、MySQL、Redis、Memcached、Beanstalk 等。

lightbulb - Laravel 框架

想要完整了解如何使用 Laravel Forge 部署嗎?請查看 Laravel Bootcamp 和 Laracasts 上提供的 Forge 影片系列

Laravel Vapor

如果您想要一個完全無伺服器、自動擴展且專為 Laravel 調校的部署平台,請查看 Laravel Vapor。Laravel Vapor 是一個以 AWS 為基礎的 Laravel 無伺服器部署平台。在 Vapor 上啟動您的 Laravel 基礎架構,並愛上無伺服器的可擴展簡潔性。Laravel Vapor 由 Laravel 的創建者進行微調,可與框架無縫協作,讓您能夠像平常一樣撰寫您的 Laravel 應用程式。