部署

簡介

準備好將 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;
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 ~ \.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 }
28 
29 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;
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 ~ \.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 }
28 
29 location ~ /\.(?!well-known).* {
30 deny all;
31 }
32}

最佳化

Autoloader 最佳化

部署到正式環境時,請確定有最佳化 Composer 的類別 Autoloader 映射,以讓 Composer 可快速找到某個類別對應的檔案:

1composer install --optimize-autoloader --no-dev
1composer install --optimize-autoloader --no-dev
lightbulb

除了最佳化 Autoloader 外,也應確保有將 composer.lock 檔案加到專案的版本控制儲存庫內。當有 composer.lock 檔時,專案的相依性套件可以安裝得更快。

最佳化設定檔的載入

在將專案部署到正式環境時,請確保部署流程中有執行 config:cache Artisan 指令:

1php artisan config:cache
1php artisan config:cache

該指令會將所有的 Laravel 設定檔合併為單一、經過快取的檔案。使用快取檔通常可以減少一些框架在載入設定值時讀取檔案系統的次數。

exclamation

若在部署流程中執行了 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… 等。

lightbulb

需要一篇使用 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 專案開發就好。

翻譯進度
100% 已翻譯
更新時間:
2024年6月30日 上午8:18:00 [世界標準時間]
翻譯人員:
  • cornch
幫我們翻譯此頁

留言

尚無留言

“Laravel” is a Trademark of Taylor Otwell.
The source documentation is released under MIT license. See laravel/docs on GitHub for details.
The translated documentations are released under MIT license. See cornch/laravel-docs-l10n on GitHub for details.