Back

Laravel 佈署指南

相較於比較現代的程式語言(如 Golang 或 Nodejs),PHP 的佈署是相對麻煩許多的--這主要是因為 PHP 的執行環境需要綁定一個網頁伺服器。

PHP 官方主要支援兩種佈署方式:

  • Apache + PHP Module:較簡單,由 Apache 統一管理 PHP 的生命周期
  • PHP-FPM:能夠搭配大部份支援 FastCGI 協定的 Web Server

註:在大部份應用情境下,Apache + PHP Module 會比 Apache + PHP-FPM 慢上一些,尤其是當 Apache + PHP-FPM 時可以啟用 Event MPM,相較於傳統的 prefork MPM 而言可以快上 50%

Laravel 應用程式的佈署

Laravel 是當前 PHP 社群中最熱門的框架,這得益於其設計模式的應用及社群間的活躍程度。

與大部份的 PHP 應用程式類似,Laravel 的佈署仍然受限於 PHP 的佈署模型。只不過,為了實現某些進階功能(如 Cronjob 或 Queue),Laravel 的複雜度又更高了一些。

總結來說,一個 Laravel 應用程式的佈署需要以下三種功能:

  • Web:提供傳統的 HTTP Request 與 Response 的服務
  • Queue Worker:執行 Queue Job,用於處理耗時較高的任務或用於降低尖峰負載
  • Cronjob Worker:執行 Cronjob,用於處理定時任務

Web 的佈署設計

Nginx

礙於篇幅緣故,這邊不詳細列出 Nginx 的 Config,只要保持幾個注意事項即可:

  • Error Log 應該輸出到 /dev/stderr;Access log 應該輸出到 /dev/stdout
  • FastCGI 應該用 {fpm_container_name}:9000 的型式表現,這是因為 Container Runtime 會自動分配 Domain Name 給容器

可以參閱 Laravel 官方的 Nginx 設定檔改寫

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
FROM nginx:alpine

WORKDIR /app

COPY . .

# COPY nginx.conf /etc/nginx/nginx.conf
# COPY www.conf /etc/nginx/conf.d/www.conf

CMD ["nginx", "-g", "daemon off;"]
  • 可以利用 Multi-stage Build 的特性,先行編譯 Assets 資源,再 COPY 到 nginx image 之中
  • 記得使用適當的 Nginx Config

PHP-FPM

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
FROM composer AS builder

WORKDIR /code

COPY . . 

RUN composer install

FROM php:fpm-alpine

WORKDIR /app

COPY --from=builder /code .

# RUN apk update && apk upgrade && docker-php-ext-install bcmath opcache

CMD ["php-fpm", "--allow-to-run-as-root"]
  • composer install 時,可以加入一些優化參數
  • 在 Dockerfile 中可以自行加入一些 extensions
    • docker-php-ext-install 可以安裝 extensions,不過這會大幅降低 Image 建置的效率(因為需要另行編譯)
    • 不建議在 Dockerfile 中以 pecl install 安裝 PECL extensions(如 redis, swoole),可能會因為網路不穩導致 Image 建置失敗

Queue, Schedule Worker

事實上 Queue Worker 與 Schedule Worker 的 Image 是相同的,只不過它使用的指令不同。

  • Queue Worker:php artisan queue:work
  • Schedule Worker:php artisan schedule:work

根據 Laravel 的官方文件,Schedule Worker 應該使用 php artisan schedule:run 啟動,然而這個指令是一次性的(配合 cron,每分鐘執行一次),此處為了配合 Docker Compose 沒有提供 Cronjob 的機制,改用 php artisan schedule:work 的方式啟動常駐服務

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
FROM composer AS builder

WORKDIR /code

COPY . . 

RUN composer install

FROM php:alpine

WORKDIR /app

COPY --from=builder /code .

# RUN apk update && apk upgrade && docker-php-ext-install bcmath opcache
  • 事實上,可以直接把上述以 PHP-FPM 建置的 Dockerfile 修改啟動命令後直接拿來使用

補充資訊

2021 年 5 月,Laravel 官方發佈名為 Laravel Octane 的套件,採用 SwooleRoadrunner 作為沒有 Web Server 的 PHP 佈署解決方案。

這些解決方案會從根本上改變 PHP Runtime 的特性,許多生態系內的既有工具(如 XDebug 或一些 Profiler)都需要修改後才能使用,儘管它們(宣稱)可以提供令人驚豔的效能,但需要權衡其開發成本是否足以支應這樣的效能改善。

Built with Hugo
Theme Stack designed by Jimmy