Install PHP-FPM on Apache

Ubuntu: 18.04

Apache: 2.4

PHP: 7.2

再開始之前,先解釋一下使用 PHP-FPM 的好處。

mod_php

一般來說,我們透過連上某一個 PHP 網頁時,在後端執行的順序是這樣:
httpd -> php_module -> SAPI -> PHP

SAPI: Server Application Programming Interface(伺服器應用程式設計介面),是 PHP 和應用層(Apache、Nginx、CLI)溝通的介面。

CGI
另外有一種架構,就是採用 CGI 模式,CGI 負責網頁伺服器與後端程式語言的溝通,它不與任何網頁伺服器綁在一起,成為獨立的第三方,讓網頁伺服器與程式語言脫勾。
靜態網頁運作方式:
client -> httpd -> index.html

動態網頁運作方式:
client -> httpd -> CGI process -> PHP

CGI: Common Gateway Interface(通用閘道器介面),是一種讓瀏覽器與 Http Server 溝通的標準。

以上的架構都有一樣的缺點,就是每一次的 Request 都要重新產生一個新的 Process,每一次都必須重新 Init 相關資源(Fork and Execute),只要 Request 量一多,很容易就倒站了。

FastCGI

為了解決這個問題,就產生了 FastCGI
FastCGI 會先建立一個 master,接著再由 master 建立大量的 worker。當遇到 Request 時,master 會將任務分派給 worker,任務做完之後並不會關閉,而是繼續等待下一個任務,因此可以省下大量 Init 所花費的系統資源和時間。

FastCGI: Fast Common Gateway Interface(快速通用閘道器介面)

PHP-FPM(FastCGI Process Manager) 就是一個 PHP 實作 FastCGI 的管理套件。

Install PHP-FPM

sudo apt install php-fpm

本篇文章以 Apache 介接為例。
啟用 Apache 相關的 modules

sudo a2enmod proxy_fcgi setenvif

啟用 Apache 中 php-fpm 的設定

sudo a2enconf php7.2-fpm

修改 Apache Sites 的設定檔,在想要的 VirtualHost 中 將 PHP Request 都導向 PHP-FPM

# or 000-default.conf
sudo vim /etc/apache2/sites-available/default-ssl.conf

# 如果是修改 default-ssl.conf,記得 ln 到 sites-enabled 目錄唷
<VirtualHost>
    # someting config
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
    </FilesMatch>    
</VirtualHost>

重新啟動 Apache 和 PHP-FPM

sudo systemctl restart apache2 php7.2-fpm

測試

可以寫一支 phpinfo() 的程式,透過網頁查詢。
Server APIApache 2.0 Handler 變成 FPM/FastCGI 就是成功了。