在 Ubuntu 16 中將 apache 從 prefork 切換到 event,讓 php 7 工作
Apache 在生產中執行緩慢。在尋找了一段時間的答案後,我終於去了#apache IRC頻道,專業人士讓我用這個命令檢查了apache模式:
sudo apachectl -V
並驚恐地發現Server MPM是prefork。他們強調**不要在生產伺服器上使用 PREFORK。**事實證明,Ubuntu 軟體包(大概是從 Debian 繼承的?)堅持在 prefork 模式下執行 apache,儘管使用 Apache 執行 PHP 的推薦方法明確推薦 proxy_fcgi 和 php-fpm,然後是 fcgid 並最終說你不應該使用前叉:
為什麼你不應該再將 mod_php 與 prefork mpm 一起使用
- mod_php 一直被載入到每個 httpd 程序中。即使 httpd 提供靜態/非 php 內容,該記憶體也在使用中。
- mod_php 不是執行緒安全的,並迫使您堅持使用 prefork mpm(多程序,無執行緒),這是可能的最慢配置
該頁面還包含有關 PHP-FPM 的一些詳細資訊,但這似乎有點複雜且不清楚,並且似乎涉及大量手動配置。我很失望和驚訝 Ubuntu 16 沒有 fastCGI 模式或其他的包選項。
我嘗試使用 a2enmod 將 apache 切換到事件模式,當我嘗試重新啟動 apache 時,出現錯誤:
Apache 正在執行執行緒 MPM,但您的 PHP 模組未編譯為執行緒安全的。你需要重新編譯PHP
無論如何,我想知道是否有人有一些最小的分步說明,通過盡可能*依賴包安裝程序,在 Ubuntu 16 和 PHP 7.0 上執行 fastCGI 模式。*我目前正在查看許多解釋不清、含糊不清的說明,並且我擔心我的生產環境會因糟糕的決定而變得混亂。
此外,應該有人將 mpm-event 添加為標籤選項。這就是#apache IRC 人推薦的。
ezra-s提出了一個很好的方法,但它不包含一些可能會讓依賴包管理器的人感到困惑的細節。注意:我不確定這些步驟是否準確。如果有人遇到麻煩或看到問題,請告訴我,我會更新這篇文章。
首先,在撰寫本文時,如果您想安裝 PHP,Ubuntu 的 apache2 軟體包堅持使用 prefork。但是不要絕望,因為您仍然可以使用包安裝程序來安裝和更新 PHP和apache2,並且仍然可以使用Apache wiki 推薦的PHP-FPM在事件模式下使用 Apache 進行配置,並在High-中進行了更詳細的描述。使用 mod_proxy_fcgi 和 php-fpm 在 apache httpd 2.4.x 上性能 PHP。基本思想是 apache2 和 PHP-FPM 通過套接字而不是作為 Apache 模組執行的 PHP 進行通信。
- 移除或禁用 Apache PHP 模組 ======================
因為 Ubuntu 包在安裝 PHP 時堅持使用 prefork Apache,所以我們必須將它們分開。我通過使用 apt 解除安裝 libapache2-mod-php7.0 來做到這一點,因為我不再需要這個包:
sudo apt-get remove libapache2-mod-php7.0
或者,您可以禁用 php7.0 Apache 模組,但這不會從您的系統中刪除 apt 包,這會留下煩人的系統垃圾。
sudo a2dismod php7.0
- 將 Apache 切換到事件模式並啟用 fcgid ============================
我相信這些命令應該可以解決問題:
sudo a2dismod mpm_prefork sudo a2enmod mpm_event sudo a2enmod proxy_fcgi
- 安裝 PHP-FPM =============
我已經安裝了 PHP 7 及其各種模組,所以我只需使用以下命令安裝 PHP-FPM:
sudo apt-get install php7.0-fpm
- 編輯您的 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中的listen指令指定的路徑匹配/7.0/fpm/pool.d/www.conf**
5)重啟阿帕奇
sudo service apache2 restart
要檢查是否啟用了事件模式,請使用以下命令:
sudo apachectl -V
在輸出中,您應該看到:
Server MPM: event
嘗試創建一個 phpinfo 頁面並在瀏覽器中訪問它。您應該
Server API: FPM/FastCGI
在輸出中看到。