Apache-2.4

在 Ubuntu 16 中將 apache 從 prefork 切換到 event,讓 php 7 工作

  • April 13, 2018

Apache 在生產中執行緩慢。在尋找了一段時間的答案後,我終於去了#apache IRC頻道,專業人士讓我用這個命令檢查了apache模式:

sudo apachectl -V

並驚恐地發現Server MPMprefork。他們強調**不要在生產伺服器上使用 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。但是不要絕望,因為您仍然可以使用包安裝程序來安裝和更新 PHPapache2,並且仍然可以使用Apache wiki 推薦的PHP-FPM在事件模式下使用 Apache 進行配置,並在High-中進行了更詳細的描述。使用 mod_proxy_fcgi 和 php-fpm 在 apache httpd 2.4.x 上性能 PHP。基本思想是 apache2 和 PHP-FPM 通過套接字而不是作為 Apache 模組執行的 PHP 進行通信。

  1. 移除或禁用 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
  1. 將 Apache 切換到事件模式並啟用 fcgid ============================

我相信這些命令應該可以解決問題:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi
  1. 安裝 PHP-FPM =============

我已經安裝了 PHP 7 及其各種模組,所以我只需使用以下命令安裝 PHP-FPM:

sudo apt-get install php7.0-fpm
  1. 編輯您的 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在輸出中看到。

引用自:https://serverfault.com/questions/904065