當(dāng)準(zhǔn)備將 Laravel 應(yīng)用程序部署到生產(chǎn)環(huán)境時(shí),有一些關(guān)鍵步驟可以幫助確保應(yīng)用程序高效穩(wěn)定地運(yùn)行。在本文中,我們將介紹一些最佳實(shí)踐,幫助大家成功部署 Laravel 應(yīng)用程序。
一、Laravel對(duì)服務(wù)器要求
Laravel 框架對(duì)服務(wù)器環(huán)境有一些基本要求。請(qǐng)確保 Web 服務(wù)器滿足以下最低 PHP 版本和擴(kuò)展要求:
- PHP >= 8.2
- Ctype PHP 擴(kuò)展
- cURL PHP 擴(kuò)展
- DOM PHP 擴(kuò)展
- Fileinfo PHP 擴(kuò)展
- Filter PHP 擴(kuò)展
- Hash PHP 擴(kuò)展
- Mbstring PHP 擴(kuò)展
- OpenSSL PHP 擴(kuò)展
- PCRE PHP 擴(kuò)展
- PDO PHP 擴(kuò)展
- Session PHP 擴(kuò)展
- Tokenizer PHP 擴(kuò)展
- XML PHP 擴(kuò)展
二、服務(wù)器配置
1、Nginx配置
如果將應(yīng)用程序部署到運(yùn)行 Nginx 的服務(wù)器上,可以參考以下配置文件。這份配置文件可能需要根據(jù)實(shí)際情況進(jìn)行調(diào)整。若希望更輕松地管理服務(wù)器,建議使用 Laravel 官方的部署和服務(wù)器管理工具——Laravel Forge。
確保配置文件中的所有請(qǐng)求都指向應(yīng)用程序的 “public/index.php” 文件。絕對(duì)不要將 “index.php” 移動(dòng)到項(xiàng)目的根目錄,因?yàn)閷⑵浔┞对诟夸浵驴赡軙?huì)使應(yīng)用程序的許多敏感配置文件暴露給外界。
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 ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } }
2、使用FrankenPHP運(yùn)行Laravel應(yīng)用
也可以使用 FrankenPHP 來(lái)運(yùn)行 Laravel 應(yīng)用。FrankenPHP 是一個(gè)由 Go 語(yǔ)言編寫的現(xiàn)代 PHP 應(yīng)用服務(wù)器。要使用 FrankenPHP 服務(wù) Laravel 應(yīng)用,只需運(yùn)行以下命令:
frankenphp php-server -r public/
通過(guò) FrankenPHP,還可以利用其與 Laravel Octane 的集成、HTTP/3 支持、現(xiàn)代壓縮技術(shù)以及將 Laravel 應(yīng)用打包為獨(dú)立二進(jìn)制文件的功能。有關(guān)更多信息,請(qǐng)查閱 FrankenPHP 的 Laravel 文檔。
3、目錄權(quán)限
Laravel 需要對(duì) “bootstrap/cache” 和 “storage” 目錄具有寫權(quán)限。確保 Web 服務(wù)器進(jìn)程有權(quán)寫入這些目錄,以避免權(quán)限問(wèn)題。
三、優(yōu)化
在將應(yīng)用程序部署到生產(chǎn)環(huán)境時(shí),應(yīng)該緩存多個(gè)文件來(lái)提高性能。Laravel 提供了一個(gè) “optimize” Artisan 命令,能將各種文件緩存起來(lái)。一般來(lái)說(shuō),應(yīng)該在部署過(guò)程中運(yùn)行該命令:
php artisan optimize
如果需要清除緩存,可以使用 “optimize:clear” 命令:
php artisan optimize:clear
下面是 Laravel 提供的一些具體優(yōu)化命令:
1、配置緩存
運(yùn)行 “config:cache” 命令將所有配置文件合并為一個(gè)緩存文件,這樣可以大大減少框架加載配置時(shí)的文件系統(tǒng)訪問(wèn)次數(shù)。部署過(guò)程中必須運(yùn)行此命令:
php artisan config:cache
警告:在執(zhí)行 “config:cache” 命令時(shí),請(qǐng)確保只從配置文件中調(diào)用 “env” 函數(shù)。一旦配置被緩存,”.env” 文件將不會(huì)被加載,所有對(duì) “.env” 變量的 “env” 函數(shù)調(diào)用都會(huì)返回 “null”。
2、事件緩存
為了提高性能,應(yīng)在部署過(guò)程中緩存應(yīng)用程序的自動(dòng)發(fā)現(xiàn)事件和監(jiān)聽(tīng)器映射??梢允褂靡韵旅顏?lái)實(shí)現(xiàn):
php artisan event:cache
3、路由緩存
對(duì)于包含大量路由的應(yīng)用程序,部署時(shí)應(yīng)運(yùn)行 “route:cache” 命令。此命令將所有路由注冊(cè)轉(zhuǎn)換為一個(gè)緩存文件,能顯著提高路由注冊(cè)的性能。
php artisan route:cache
4、視圖緩存
為了提高視圖渲染的性能,可以通過(guò)以下命令預(yù)編譯所有的 Blade 視圖:
php artisan view:cache
會(huì)確保視圖不會(huì)在每個(gè)請(qǐng)求時(shí)動(dòng)態(tài)編譯,從而提高應(yīng)用響應(yīng)速度。
5、調(diào)試模式
在生產(chǎn)環(huán)境中,”config/app.php” 配置文件中的 “debug” 設(shè)置決定了向用戶顯示的錯(cuò)誤信息的詳細(xì)程度。默認(rèn)情況下,”debug” 設(shè)置為 “true”,并且依賴于 “.env” 文件中的 “APP_DEBUG” 環(huán)境變量。
注意:在生產(chǎn)環(huán)境中,”APP_DEBUG” 必須設(shè)置為 “false”。 如果在生產(chǎn)環(huán)境中將其設(shè)置為 “true”,可能會(huì)泄露敏感配置給終端用戶,造成安全風(fēng)險(xiǎn)。
四、健康檢查路由
Laravel 提供了內(nèi)置的健康檢查路由,用于監(jiān)控應(yīng)用程序的運(yùn)行狀態(tài)。在生產(chǎn)環(huán)境中,可以通過(guò)該路由將應(yīng)用的健康狀態(tài)報(bào)告給負(fù)載均衡器、Kubernetes 或其他監(jiān)控系統(tǒng)。
默認(rèn)情況下,健康檢查路由位于 “/up”,如果應(yīng)用正常運(yùn)行,將返回 HTTP 200 響應(yīng);如果應(yīng)用出現(xiàn)問(wèn)題,將返回 HTTP 500 響應(yīng)??梢栽趹?yīng)用的 “bootstrap/app” 文件中配置此路由的 URI:
->withRouting( web: __DIR__.'/../routes/web.php', commands: __DIR__.'/../routes/console.php', health: '/up', // [tl! remove] health: '/status', // [tl! add] )
當(dāng)訪問(wèn)該路由時(shí),Laravel 會(huì)觸發(fā) “Illuminate\Foundation\Events\DiagnosingHealth” 事件,允許執(zhí)行其他健康檢查,比如檢查數(shù)據(jù)庫(kù)或緩存狀態(tài)。如果檢測(cè)到問(wèn)題,可以在監(jiān)聽(tīng)器中拋出異常。
五、使用Laravel Forge/Vapor部署
1、Laravel Forge
如果不想自行管理服務(wù)器配置,或者不熟悉如何配置和運(yùn)行 Laravel 應(yīng)用,Laravel Forge 是一個(gè)非常好的選擇。
Laravel Forge 可以幫助在各種云服務(wù)提供商(如 DigitalOcean、Linode、AWS)上創(chuàng)建服務(wù)器,并自動(dòng)安裝和管理 Laravel 所需的各種服務(wù),如 Nginx、MySQL、Redis 等。
2、Laravel Vapor
如果希望完全無(wú)服務(wù)器、自動(dòng)擴(kuò)展的部署平臺(tái),Laravel Vapor 是一個(gè)理想的選擇。Vapor 是一個(gè)由 AWS 支持的無(wú)服務(wù)器平臺(tái),專為 Laravel 設(shè)計(jì),可以讓在無(wú)需管理服務(wù)器的情況下部署應(yīng)用。
Vapor 與 Laravel 無(wú)縫集成,提供了無(wú)服務(wù)器架構(gòu)的強(qiáng)大功能,可以輕松擴(kuò)展應(yīng)用,同時(shí)繼續(xù)像平時(shí)一樣編寫 Laravel 代碼。