跳到主要內容

部署

📝 此頁面為 Laravel 官方文檔的繁體中文翻譯。查看原始英文版本

部署

簡介

當您準備將 Laravel 應用程式部署到生產環境時,您可以做一些重要的事情來確保應用程式以盡可能高效的方式運行。在本文檔中,我們將介紹一些確保 Laravel 應用程式正確部署的良好起點。

伺服器需求

Laravel 框架有一些系統需求。您應該確保您的 Web 伺服器具有以下最低 PHP 版本和擴充套件:

  • PHP >= 8.3
  • Ctype PHP Extension
  • cURL PHP Extension
  • DOM PHP Extension
  • Fileinfo PHP Extension
  • Filter PHP Extension
  • Hash PHP Extension
  • Mbstring PHP Extension
  • OpenSSL PHP Extension
  • PCRE PHP Extension
  • PDO PHP Extension
  • Session PHP Extension
  • Tokenizer PHP Extension
  • XML PHP Extension

伺服器配置

Nginx

如果您正在將應用程式部署到運行 Nginx 的伺服器,您可以使用以下配置檔案作為配置 Web 伺服器的起點。大多數情況下,此檔案需要根據您伺服器的配置進行自訂。如果您需要協助管理伺服器,請考慮使用像 Laravel Cloud 這樣的全託管 Laravel 平台。

請確保像下面的配置一樣,您的 Web 伺服器將所有請求導向應用程式的 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.3-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 目錄,因此您應該確保 Web 伺服器程序所有者具有寫入這些目錄的權限。

優化

將應用程式部署到生產環境時,有多種檔案應該被快取,包括配置、事件、路由和視圖。Laravel 提供了一個單一、便利的 optimize Artisan 命令,它將快取所有這些檔案。此命令通常應作為應用程式部署過程的一部分來調用:

php artisan optimize

optimize:clear 方法可用於移除 optimize 命令生成的所有快取檔案以及預設快取驅動程式中的所有金鑰:

php artisan optimize:clear

在以下文檔中,我們將討論 optimize 命令執行的每個細粒度優化命令。

快取配置

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

php artisan config:cache

此命令將 Laravel 的所有配置檔案合併到一個快取檔案中,大大減少了框架在載入配置值時必須對檔案系統進行的訪問次數。

[!WARNING] 如果您在部署過程中執行 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 視圖,這樣它們就不會按需編譯,從而提高每個返回視圖的請求的效能。

重新載入服務

[!NOTE] 部署到 Laravel Cloud 時,不需要使用 reload 命令,因為所有服務的優雅重新載入會自動處理。

部署應用程式的新版本後,任何長時間運行的服務(如佇列工作者、Laravel Reverb 或 Laravel Octane)都應重新載入/重新啟動以使用新程式碼。Laravel 提供了一個單一的 reload Artisan 命令來終止這些服務:

php artisan reload

如果您沒有使用 Laravel Cloud,您應該手動配置一個程序監控器,以便偵測可重新載入程序何時退出並自動重新啟動它們。

除錯模式

config/app.php 配置檔案中的除錯選項決定實際向使用者顯示多少錯誤資訊。預設情況下,此選項設定為尊重應用程式 .env 檔案中儲存的 APP_DEBUG 環境變數的值。

[!WARNING] 在生產環境中,此值應始終為 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', // [tl! remove]
    health: '/status', // [tl! add]
)

當對此路由發出 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 等。