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 API
從 Apache 2.0 Handler
變成 FPM/FastCGI
就是成功了。