切换到 php fpm(apache,ubuntu server 18.04 LTS)后出现“找不到文件。”

切换到 php fpm(apache,ubuntu server 18.04 LTS)后出现“找不到文件。”

我知道这个问题已经被回答过多次了,但答案几乎都不同,而且有点令人困惑。我试过很多答案,但都不起作用。我遵循这个问题的答案(在 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 完全是新手。很抱歉再次提出这个问题。我知道这是重复的,但我就是无法理解。

太感谢了!

答案1

您没有包含 php-fpm 配置,这很重要。如何定义池很重要(见下文)。

FastCGI 只是一种将请求发送到 FastCGI 守护进程 PHP 的通信协议。输出是 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>

相关内容