部署
簡介
準備好將 Laravel 專案部署到正式環境時,還有一些影響網站效能的重點要注意。在本文中,我們會討論一些正確部署 Laravel 專案的要點。
伺服器需求
Laravel Framework 有一些系統需求。請確保網頁伺服器有達到下列最小 PHP 版本需求與擴充套件需求:
- PHP >= 8.1
- Ctype PHP 擴充套件
- cURL PHP 擴充套件
- DOM PHP Extension
- Fileinfo PHP 擴充套件
- Filter PHP 擴充套件
- Hash PHP 擴充套件
- Mbstring PHP 擴充套件
- OpenSSL PHP 擴充套件
- PCRE PHP Extension
- PDO PHP 擴充套件
- Session PHP 擴充套件
- Tokenizer PHP 擴充套件
- XML PHP 擴充套件
伺服器設定
Nginx
若將專案部署到執行 Nginx 的伺服器上,則應使用下列設定檔來開始設定網頁伺服器。當然,還需要根據伺服器來調整該檔案中的設定。若需要協助管理伺服器,請參考使用 Laravel 官方的伺服器管理與部署服務,如 Laravel Forge。
像下列設定檔一樣,請確保網頁伺服器有將所有連入網站的請求重新導向到 public/index.php
檔案上。請絕對不要嘗試將 index.php
檔案移到專案根目錄上,因為以專案根目錄來開放網站可能導致一些機敏設定檔被暴露到公開的網際網路上:
1server {2 listen 80;3 listen [::]:80;4 server_name example.com;5 root /srv/example.com/public;67 add_header X-Frame-Options "SAMEORIGIN";8 add_header X-Content-Type-Options "nosniff";910 index index.php;1112 charset utf-8;1314 location / {15 try_files $uri $uri/ /index.php?$query_string;16 }1718 location = /favicon.ico { access_log off; log_not_found off; }19 location = /robots.txt { access_log off; log_not_found off; }2021 error_page 404 /index.php;2223 location ~ \.php$ {24 fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;25 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;26 include fastcgi_params;27 }2829 location ~ /\.(?!well-known).* {30 deny all;31 }32}
1server {2 listen 80;3 listen [::]:80;4 server_name example.com;5 root /srv/example.com/public;67 add_header X-Frame-Options "SAMEORIGIN";8 add_header X-Content-Type-Options "nosniff";910 index index.php;1112 charset utf-8;1314 location / {15 try_files $uri $uri/ /index.php?$query_string;16 }1718 location = /favicon.ico { access_log off; log_not_found off; }19 location = /robots.txt { access_log off; log_not_found off; }2021 error_page 404 /index.php;2223 location ~ \.php$ {24 fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;25 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;26 include fastcgi_params;27 }2829 location ~ /\.(?!well-known).* {30 deny all;31 }32}
最佳化
Autoloader 最佳化
部署到正式環境時,請確定有最佳化 Composer 的類別 Autoloader 映射,以讓 Composer 可快速找到某個類別對應的檔案:
1composer install --optimize-autoloader --no-dev
1composer install --optimize-autoloader --no-dev
除了最佳化 Autoloader 外,也應確保有將 composer.lock
檔案加到專案的版本控制儲存庫內。當有 composer.lock
檔時,專案的相依性套件可以安裝得更快。
最佳化設定檔的載入
在將專案部署到正式環境時,請確保部署流程中有執行 config:cache
Artisan 指令:
1php artisan config:cache
1php artisan config:cache
該指令會將所有的 Laravel 設定檔合併為單一、經過快取的檔案。使用快取檔通常可以減少一些框架在載入設定值時讀取檔案系統的次數。
若在部署流程中執行了 config:cache
指令,應確保只有在設定檔中呼叫 env
函式。設定檔被快取後,就不會再載入 .env
檔了。所有 env
函式查詢 .env
變數的呼叫都會回傳 null
。
最佳化路由載入
若正在建立有許多路由的大型專案,請確保在部署過程中有執行 route:cache
Artisan 指令:
1php artisan route:cache
1php artisan route:cache
該指令可將所有的路由註冊減少為快取檔案內的單一方法呼叫,在註冊上百個路由時,可藉此提升路由註冊的效能。
最佳化 View 載入
在將專案部署到正式環境時,請確保有在部署流程內執行 view:cache
Artisan 指令:
1php artisan view:cache
1php artisan view:cache
該指令會預先編譯所有的 Blade View,這樣一來這些 View 就不會只在有需要的時候才進行編譯,可藉此提升每個有回傳 View 的請求效能。
偵錯模式
config/app.php 設定檔中的 debug 選項用來判斷錯誤在實際顯示給使用者時要包含多少資訊。預設情況下,這個選項被設為依照 APP_DEBUG
環境變數值,該環境變數儲存於專案的 .env
檔內。
在正式環境上,這個值一定要是 false
。若在正式環境上將 APP_DEBUG
變數設為 true
,則會有將機敏設定值暴露給應用程式終端使用者的風險。
使用 Forge /Vapor 來部署
Laravel Forge
若你還未準備好自行管理伺服器設定,或不擅長設定各種執行大型 Laravel 專案所需要的設定,則 Laravel Forge 是一個不錯的選擇。
Laravel Forge 可以在如 DigitalOcean, Linode, AWS… 等各種基礎建設提供商上建立伺服器。此外,Forge 還可以負責安裝並管理各種執行大型 Laravel 專案所需的工具,如 Nginx, MySQL, Redis, Memcached, Beanstalk… 等。
需要一篇使用 Laravel Forge 來部署網站的完整教學嗎?請參考 Laravel Bootcamp (英語) 以及 Laracasts 上的 Forge 影片系列 (英語)。
Laravel Vapor
若想試試完全為 Laravel 最佳化、Auto-Scaling 的 Serverless 部署平台,請參考看看 Laravel Vapor。Laravel Vapor 是一個為 Laravel 設計的 Serverless 部署平台,由 AWS 驅動。使用 Vapor 來發佈你的 Laravel 基礎建設,你會愛上 Serverless 這種能簡單擴充的架構。Laravel Vapor 已由 Laravel 的作者們精心最佳化,以讓 Vapor 能完美配合 Laravel 使用,並讓你能像往常在 Laravel 專案開發就好。