Apache-2.2

‘文件未找到。‘切換到 php fpm (apache, ubuntu server 18.04 LTS) 後

  • February 27, 2019

我知道這個問題已經被回答過多次,但答案幾乎都是不同的,而且有點令人困惑。我嘗試了很多答案,但沒有一個有效。我按照這個問題的答案(在 Ubuntu 16 中將 apache 從 prefork 切換到 event,讓 php 7 工作)並且工作正常。但後來我做了一些事情(不記得是什麼..哎呀)它壞了,給了我以下錯誤:

File not found.

虛擬主機文件:

#ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.2-fpm.sock|fcgi://localhost/var/www/nextcloud/
#ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.2-fpm.sock|fcgi://127.0.0.1:9000


LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so



<IfModule mod_headers.c>
 Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:443>
   ServerAdmin [[..]]@icloud.com
   ServerName [[..]].me
   ServerAlias www.[[..]].me
   DocumentRoot /var/www/nextcloud
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.[[..]].me/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.[[..]].me/privkey.pem

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.2-fpm.sock|fcgi://localhost/var/www/nextcloud/

#        <FilesMatch \.php>
#            SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost/var/www/nextcloud/"
#        <FilesMatch>

</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:80>
   ServerAdmin [[..]]@icloud.com
   ServerName [[..]].me
   ServerAlias www.[[..]].me
   DocumentRoot /var/www/nextcloud
   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
Redirect permanent / https://[[..]].me/
# Some rewrite rules in this file were disabled on your HTTPS site,
# because they have the potential to create redirection loops.
# RewriteCond %{SERVER_NAME} =www.[[..]].me [OR]
# RewriteCond %{SERVER_NAME} =[[..]].me
# RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
#        <FilesMatch \.php>
#            SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost/"
#        <FilesMatch>

</VirtualHost>
</IfModule>
<Directory /var/www/nextcloud>
        AllowOverride All
</Directory>

另外,我是 PHP 的初學者。我很抱歉再次問這個問題。我知道它是重複的,但我就是無法解決它。

非常感謝!

您沒有包括重要的 php-fpm 配置。如何定義你的池很重要(見下文)。

FastCGI 只是一種將請求發送到 PHP(FastCGI 守護程序)的通信協議。該輸出是 PHP 守護程序無法找到傳遞給它的文件。

如果沒有,最簡單的解決方案是將strace其安裝並附加到您的池工作人員(如果您只有 1-2 個工作人員,這會更容易)。觀察它試圖打開的路徑,然後確定它們是否存在。

我在您的配置中看到錯誤(或可能看到錯誤)的兩件事。

  1. 我看到 fcgi://localhost/var/www/nextcloud/ 可能是 /var/www/nextcloud 的前綴到完整路徑。這是錯誤的。您的 proxy_path_match 中不應有路徑。請參閱下面的配置範例。
  2. 您可能在 FastCGI 的池定義中使用了一些 chroot/prefix 參數。不幸的是,chroot 被 php-fpm/apache 破壞並且已經存在很多年了(錯誤報告:https ://bugs.php.net/bug.php?id=62279 )。如果您正在使用它,請將其關閉。

有了這兩個修復程序,你應該沒問題。

作為記錄,我的 apache 配置只有一個與 FastCGI/PHP 相關的節(如下)。這就是 PHP-FPM 所需的全部內容。根據您的喜好,在全域範圍內或在虛擬主機內。

 <FilesMatch     \.php$>
 <If "-f %{REQUEST_FILENAME}">
   SetHandler      "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost/"
 </If>
 </FilesMatch>

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