我知道这个问题已经被回答过多次了,但答案几乎都不同,而且有点令人困惑。我试过很多答案,但都不起作用。我遵循这个问题的答案(在 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 个工作器,这会更容易)。观察它尝试打开的路径,然后确定它们是否存在。
我发现您的配置有两个可能的错误(或可能的错误)。
我看到 fcgi://localhost/var/www/nextcloud/ 可能将 /var/www/nextcloud 添加到完整路径的前缀。这是错误的。您的 proxy_path_match 中不应包含路径。请参阅下面的配置示例。
您可能在 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>