%20%E5%88%AA%E9%99%A4%E6%88%96%E5%81%9C%E7%94%A8%20Apache%20PHP%20%E6%A8%A1%E7%B5%84.png)
Apache 在生產環境中運作緩慢。在尋找答案一段時間後,我終於進入了 #apache IRC 頻道,專業人士讓我使用以下命令檢查 apache 模式:
sudo apachectl -V
並驚訝地發現伺服器MPM是預叉。他們強調說不要在生產伺服器上使用 PREFORK。事實證明,Ubuntu 軟體包(大概是從 Debian 繼承的?)堅持以 prefork 模式運行 apache,儘管事實上使用 Apache 運行 PHP 的建議方法明確推薦 proxy_fcgi 和 php-fpm,然後是 fcgid,最後說你不應該使用 prefork:
為什麼你不應該再將 mod_php 與 prefork mpm 一起使用
- mod_php 始終載入到每個 httpd 進程中。即使 httpd 正在提供靜態/非 php 內容,該記憶體也會被使用。
- mod_php 不是線程安全的,並迫使您堅持使用 prefork mpm(多進程,無線程),這是最慢的配置
該頁面還包含一些PHP-FPM 的詳細信息但這似乎有點複雜和不清楚,似乎涉及大量手動配置。我感到失望和驚訝的是 Ubuntu 16 沒有 fastCGI 模式或其他模式的軟體包選項。
我嘗試將 apache 切換到事件模式使用 a2enmod ,當我嘗試啟動 apache 備份時,出現錯誤:
Apache 正在運行線程 MPM,但您的 PHP 模組未編譯為線程安全的。需要重新編譯PHP
無論如何,我想知道是否有人有一些最小的分步說明,可以讓 fastCGI 模式在帶有 PHP 7.0 的 Ubuntu 16 上運行盡可能依賴軟體包安裝程式。我目前正在查看許多解釋不清、模糊的說明,我擔心糟糕的決策會破壞我的生產環境。
另外,有人應該添加 mpm-event 作為標籤選項。這就是 #apache IRC 的人所推薦的。
答案1
埃茲拉-S提出了一種很好的方法,但它不包含一些可能會讓依賴套件管理器的人感到困惑的細節。筆記: 我不確定這些步驟是否準確。如果有人遇到麻煩或發現問題,請告訴我,我將更新這篇文章。
首先,在撰寫本文時,如果您想安裝 PHP,Ubuntu 的 apache2 軟體包堅持使用 prefork。不過,別失望,因為您仍然可以使用套件安裝程式來安裝和更新 PHP和apache2 並且仍然讓您的配置與 Apache 一起使用事件使用 PHP-FPM 的模式作為Apache wiki 推薦並在中更詳細地描述使用 mod_proxy_fcgi 和 php-fpm 在 apache httpd 2.4.x 上實現高效能 PHP。基本概念是 apache2 和 PHP-FPM 透過套接字進行通信,而不是作為 Apache 模組運行的 PHP。
1) 刪除或停用 Apache PHP 模組
因為 Ubuntu 軟體包在安裝 PHP 時堅持預先派生 Apache,所以我們必須將它們分開。我透過使用 apt 卸載 libapache2-mod-php7.0 來做到這一點,因為我不再需要該套件:
sudo apt-get remove libapache2-mod-php7.0
或者,您可以停用 php7.0 Apache 模組,但這不會從您的系統中刪除 apt 軟體包,從而留下煩人的系統問題。
sudo a2dismod php7.0
2)將Apache切換到事件模式並啟用fcgid
我相信這些命令應該可以解決問題:
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi
3)安裝PHP-FPM
我已經安裝了 PHP 7 及其各種模組,因此我只需使用以下命令安裝 PHP-FPM:
sudo apt-get install php7.0-fpm
4) 編輯 VirtualHost 設定以使用 PHP-FPM 處理 PHP 檔案:
就我而言,我編輯了預設的 SSL 主機,/etc/apache2/sites-available/default-ssl.conf,並在頂部附近添加了這一行:
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/html/
重要的這指示 Apache 使用 PHP-FPRM 和該指令中的路徑處理 PHP 檔案請求 (/run/php/php7.0-fpm.sock) 必須與指定的路徑匹配聽文件中的指令/etc/php/7.0/fpm/pool.d/www.conf
5)重新啟動阿帕契
sudo service apache2 restart
若要檢查事件模式是否已啟用,請使用下列命令:
sudo apachectl -V
在輸出中,您應該看到以下內容:
Server MPM: event
嘗試建立一個 phpinfo 頁面並在瀏覽器中存取它。您應該Server API: FPM/FastCGI
在輸出中看到。
答案2
為了方便起見,發行版提供了“mod_php”方法。
雖然最高效的方法是 apache w/event + mod_proxy_fcgi -> php-fpm。
也許他們應該與時俱進,但是當如此多的框架以一種「即插即用」的方式附帶 .htaccess mod_php 配置時,這對他們來說很難。最後,管理員是唯一負責正確管理和配置其網站的人。
如果您在生產中,我建議您使用測試伺服器來練習升級和更改。
關於維基,我更喜歡或建議您使用“處理程序”方法。 https://wiki.apache.org/httpd/PHP-FPM#Proxy_via_handler。
也就是說,將 php-fpm 配置為準備好套接字並具有足夠的權限,以便 Apache 使用者向其發送請求並配置 Apache 以使用它。
一個簡單的例子:
# needed modules for reverse proxying to php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
<Virtualhost *:443>
ServerName whatever.example.com
#other typical directives here
<Directory /var/www/php-app>
<FilesMatch \.php>
SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
<FilesMatch>
</Directory>
</VirtualHost>
編輯:
透過這種方式,您使用哪個 PHP 版本並不重要,因為 Apache 並不關心,它只會將適當的請求反向代理到 php-fpm。
另外,不要忘記卸載 mod_php 才能使用 mpm_event。
編輯2:
根據請求,您不需要從 debian/ubuntu 卸載 mod_php 軟體包,Apache 只關心其配置,因此卸載模組即可。