
我將 php7.0-fpm 配置為在 Ubuntu 16.04 上與 apache 一起使用,但不確定它是否配置正確且正常工作。
據我了解,安裝和設定後,php 資訊檔案的輸出應顯示“Server API --> FPM/FastCGI”,但它仍然顯示“Server API --> Apache 2.0 Handler”。
這就是我安裝和設定 php7.0-fpm 的方式:
sudo apt-get install libapache2-mod-fastcgi php7.0-fpm
sudo a2enmod actions fastcgi alias
sudo a2enconf php7.0-fpm
sudo service php7.0-fpm restart
sudo systemctl status php7.0-fpm
sudo systemctl restart apache2.service
以下是 sudo systemctl status php7.0-fpm 的輸出:
php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2017-11-25 11:57:33 UTC; 23h ago
Process: 1149 ExecStartPre=/usr/lib/php/php7.0-fpm-checkconf (code=exited, status=0/SUCCESS)
Main PID: 1336 (php-fpm7.0)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3
Memory: 37.8M
CPU: 3.089s
CGroup: /system.slice/php7.0-fpm.service
├─1336 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
├─1340 php-fpm: pool www
└─1341 php-fpm: pool www
Nov 25 11:57:33 ip-10-0-0-126 systemd[1]: Starting The PHP 7.0 FastCGI Process Manager...
Nov 25 11:57:33 ip-10-0-0-126 systemd[1]: Started The PHP 7.0 FastCGI Process Manager.
我究竟做錯了什麼?希望得到一些幫助和建議嗎?
/etc/apache2/conf-enabled/php7.0-fpm.conf
以下是我的文件的內容:
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
<IfModule mod_fastcgi.c>
AddHandler php7-fcgi .php
Action php7-fcgi /php7-fcgi
Alias /php7-fcgi /usr/lib/cgi-bin/php7-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization
</IfModule>
答案1
您需要啟用該proxy_fcgi
模組並停用mod_php7
,以使庫存php7.0-fpm
設定檔生效。
如果你看一下/etc/apache2/conf-enabled/php7.0-fpm.conf
,你會在頂部看到這個:
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
答案2
我按照以下指示成功地使其正常工作,沒有太多問題Koen Reiniers 的開發博客。我幾乎完全按照說明進行操作,除了部落格文章評論中指出的一個例外之外,它運行得非常完美。你會需要mod_fastcgi,以及其他幾個模組。本秘籍將使您能夠設定多個虛擬主機,每個虛擬主機都使用獨立的 php7 fpm 配置。請注意,除非phpinfo()如果顯示「FPM/FastCGI」伺服器 API,那麼您就錯過了重點。這是對堆疊是否正常運作的嚴峻考驗。作為檢查,我還執行了“<?php touch('/tmp/fpmtest');”檢查為我的虛擬主機啟動的進程是否作為指定的使用者/群組執行(它們是)。
這個食譜是從 Koen 的部落格複製過來的,並做了一些修改,這要歸功於他清晰有效的指導。
除了其中與安全相關的節可能例外,您可以不是想要啟用 Apache confphp7.0-fpm如果你使用這個食譜。唯一需要全域執行的程式碼是:
<Directory "/usr/lib/cgi-bin">
Require all granted
</Directory>
如果您的 Apache2 設定啟用mod_cgi.c那麼這可能已經在模組的預設conf 檔案中處理。否則,如果該模組(或mod_cgid.c) 尚未啟用,可以將其新增至 Apache2 啟動時執行的任何 conf 檔案中,不過,根據您的伺服器環境,僅將其新增至 PHP-FPM 所在的每個 <VirtualHost> 可能更安全已啟用。安全相關代碼來自php7.0-fpm.conf也可以複製到相同位置,或全域啟用。
本指南假設您在 Ubuntu 伺服器上執行 PHP 7.0.* 以及 Apache(有虛擬主機)。另外,如果沒有適當的備份,請不要在生產環境中嘗試此操作。
首先確定php7.0-fpm已安裝在您的系統上:
$ sudo apt-get install php7.0-fpm
安裝後,如果服務沒有自動啟動,請啟動服務,並驗證是否正在執行:
$ sudo service php7.0-fpm start && ps aux | grep php-fpm
要為每個虛擬主機使用PHP-FPM,您必須將其拆分為多個資源池,每個資源池對應每個單獨的<VirtualHost> 用戶,這意味著如果您將多個主機分配給一個用戶,您將只擁有為該使用者建立一個資源池。
PHP-FPM 池配置的預設位置是:
/etc/php/7.0/fpm/pool.d/
要為您的使用者之一建立新配置,只需建立一個新的 .conf 檔案。我使用使用者的使用者名稱作為設定檔的名稱:
$ sudo vim /etc/php/7.0/fpm/pool.d/username.conf
並將其用作您的配置(將“用戶名”替換為您的用戶的實際名稱):
[username]
user = username
group = username
listen = /run/php/php7.0-fpm.username.sock
listen.owner = username
listen.group = username
listen.mode = 0666
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
前七行是最重要的。確保它們與 Apache 虛擬主機使用者相同。最後五行是進程管理器的預設設定。為了簡單起見,將它們保留原樣,但您可以根據自己的喜好更改它們。您可以在位於以下位置的預設設定檔中閱讀有關這些設定的更多資訊:
/etc/php/7.0/fpm/pool.d/www.conf
剩下的唯一一件事就是告訴 Apache 使用 PHP-FPM 而不是 mod_php。首先,請確保您已啟用 mod_actions 和 mod_fastcgi:
$ sudo a2enmod actions fastcgi
$ sudo service apache2 restart
將 PHP-FPM fastcgi 處理程序新增至 Apache。您必須為您希望能夠使用 PHP-FPM 的每個使用者執行此操作。編輯使用者名稱的每個虛擬主機文件,通常位於:
/etc/apache2/sites-available/username.conf
在頂部添加以下內容:
<IfModule mod_fastcgi.c>
AddHandler php7-fcgi-username .php
Action php7-fcgi-username /php7-fcgi-username
Alias /php7-fcgi-username /usr/lib/cgi-bin/php7-fcgi-username
FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-username -socket /run/php/php7.0-fpm.username.sock -pass-header Authorization
</IfModule>
再次,將「使用者名稱」替換為虛擬主機使用者的實際名稱。
您必須告訴您的虛擬主機實際上將其用於 .php 文件,因此在同一個文件中的 <VirtualHost> 指令中,添加以下行:
<IfModule mod_fastcgi.c>
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
SetHandler php7-fcgi-username
</FilesMatch>
</IfModule>
再次將“使用者名稱”替換為實際虛擬主機使用者的名稱並儲存檔案。它是很重要SetHandler 指令應使用 Apache 條件檔案系統容器標記的子集 <Location>、<LocationMatch>、<Files> 或 <FilesMatch> 進行包裝。省略此項將導致 SetHandler 被忽略。 <Directory> 標籤顯然無法解決這個問題。
如果您想利用 PHP-FPM 的「狀態」和「ping」功能,並在每個虛擬主機池檔案中將它們開啟/etc/php/7.0/fpm/pool.d目錄(參見/etc/php/7.0/fpm/pool.d/www.conf有關詳細資訊)您需要對 Apache2 設定進行兩項額外的修改。這行動per-vhost .conf 檔案頂部的指令必須以「virtual」結尾,因此:
Action php7-fcgi-username /php7-fcgi-username virtual
此外,您的 SetHandler 包裝器必須指定包含這些虛擬檔案的正規表示式。我使用以下內容:
<LocationMatch ".+\.ph(p[3457]?|t|tml)|/(ping|status)$">
SetHandler ....
</LocationMatch>
現在剩下的就是讓 Apache 重新載入其設定檔:
$ sudo service apache2 reload
要查看您的變更是否生效,請在網站的公共目錄中建立 phpinfo.php 檔案並在瀏覽器中存取它:
<?php phpinfo();
頁面頂部附近顯示的伺服器 API 應顯示「FPM/FastCGI」。
要完成該過程,您應該對每個虛擬主機重複這些步驟。當你完全確定時mod_php不再使用您可以透過以下方式停用它:
$ sudo a2dismod php7.0
在您完成此操作之前,Apache 仍將為每個請求包含一個 PHP 進程,這意味著記憶體使用量將保持不變,甚至可能更高。