我对在单独的服务器上使用 FastCGI 运行 NGinx 和 PHP 进行了一些研究,并已在测试虚拟机上成功设置。我遇到了这些文章描述的问题...
...也就是说,为了使此设置正常工作,PHP 文件需要位于两个服务器上的同一目录中,即使运行 php-fpm 工作程序的机器实际上正在执行脚本。我自己已经测试过了;如果我在 NGinx 服务器上的文档根目录中删除文件“test.php”,它会抛出 404 或 403,即使该文件仍存在于 PHP-FPM 机器上。
我的问题是:没有办法解决这个问题吗?我知道使用运行 NFS 的中央存储是一种解决方案,但我想避免与此相关的性能问题。
如果有帮助的话,这里是我的配置文件:
/etc/nginx/sites-enabled/test-app.conf
upstream test-app {
server <php-fpm-server-ip>:9001;
}
server {
listen 80;
listen [::]:80;
server_name test.app.com;
root /var/www/html;
index index.php index.html index.htm;
location ~ \.php$ {
try_files $uri $uri/ =404;
fastcgi_pass test-app;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
答案1
如果您确实想这样做,请从 \.php 位置下的 nginx 中删除它:
try_files $uri $uri/ =404;
这就是导致它在将请求传递给 fcgi 上游之前检查文件系统的原因。另外,验证 fcgi 进程是否正确设置了根目录,这样它就无法读取随机的 php 文件,因为 nginx 无法进行存在性检查。
答案2
php 文件需要同时存在于“nginx 服务器”和“php-fpm”服务器上,否则,nginx 将返回 404 页面未找到
您需要同步本地 nginx 服务器(文件必须存在但内容可以为 0 字节)和后端 php 服务器(实际的 php 脚本)的所有文件
或者,您可以使用 SSHFS 在服务器之间共享文件,NFS 是另一种方式。您将 php 脚本放在本地文件夹(php-fpm 服务器)中,然后将此文件夹挂载到 nginx 服务器。在 nginx.conf 中,将文档根目录指向已挂载的文件夹就这样,无需同步文件