
本文探讨了nginx与php-fpm集成时,php-fpm无法从nginx `root`目录下的特定子目录(如magento的`pub`目录)读取php文件的问题。核心原因在于php-fpm配置中的`php_value[doc_root]`指令与nginx的`root`指令不匹配。文章提供了两种解决方案:一是将`php_value[doc_root]`精确指向nginx `root`所定义的目录;二是完全移除`php_value[doc_root]`配置,让php-fpm依赖nginx传递的`script_filename`。
在部署基于PHP的Web应用(如Magento 2)时,Nginx作为Web服务器,通常与PHP-FPM协同工作来处理PHP脚本。然而,开发者可能会遇到Nginx无法正常处理特定目录下(例如Magento的pub/目录)的PHP文件,导致浏览器显示“No input file specified.”或Nginx日志中出现“Unable to open primary script: ... (No such file or directory)”的错误。尽管index.php可能正常运行,但像get.php这样的辅助脚本却无法执行,这通常会导致图片占位符无法加载等问题。
当Nginx日志中出现类似以下错误时,表明PHP-FPM未能找到Nginx尝试执行的PHP脚本:
"Unable to open primary script: /home/goodprice/public_html/releases/current/pub/get.php (No such file or directory)"
同时,浏览器会显示“No input file specified.”。这通常发生在Nginx配置中指定了正确的root目录,且文件权限看似正常的情况下,但PHP-FPM仍然报告文件不存在。例如,即使pub/get.php文件存在于文件系统,并且index.php(位于同一pub/目录下)能够正常执行,其他PHP文件却不行。
以下是一个典型的Nginx配置片段,其中root指令指向了应用的pub目录:
立即学习“PHP免费学习笔记(深入)”;
server {
    listen 8088;
    server_name {{website name}}.com.au;
    set $MAGE_ROOT /home/goodprice/public_html/releases/current;
    index index.php;
    root $MAGE_ROOT/pub; # Nginx的根目录
    # ... 其他配置 ...
    location ~ (index|get|static|report|404|503|health_check|deploy_clear_opcache)\.php$ {
        try_files $uri =404;
        fastcgi_pass fastcgi_backend;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; # Nginx传递给PHP-FPM的脚本路径
        include        fastcgi_params;
        # ... 其他 fastcgi 参数 ...
    }
}从上述Nginx配置可以看出,root被设置为$MAGE_ROOT/pub,并且SCRIPT_FILENAME参数也是基于这个$document_root来构建的,理论上PHP-FPM应该能正确找到文件。
此问题的核心在于PHP-FPM的配置,特别是php_value[doc_root](或php_admin_value[doc_root])指令。当Nginx将请求传递给PHP-FPM时,它会通过SCRIPT_FILENAME参数告知PHP-FPM要执行的脚本的完整路径。然而,如果PHP-FPM的配置文件中同时设置了doc_root,PHP-FPM在处理请求时会尝试将SCRIPT_FILENAME与doc_root进行比较或基于doc_root来解析脚本路径。
在许多情况下,尤其是通过控制面板(如cPanel)管理PHP-FPM配置时,php_value[doc_root]可能被默认设置为网站的物理根目录(例如/home/goodprice/public_html/releases/current/),而不是Nginx实际服务的Web根目录(例如/home/goodprice/public_html/releases/current/pub/)。
当Nginx的root指令设置为$MAGE_ROOT/pub,并且将SCRIPT_FILENAME(例如/home/goodprice/public_html/releases/current/pub/get.php)传递给PHP-FPM时:
例如,Nginx传递/home/goodprice/public_html/releases/current/pub/get.php,而PHP-FPM的doc_root是/home/goodprice/public_html/releases/current/。PHP-FPM可能错误地认为脚本是pub/get.php,然后在其doc_root下寻找/home/goodprice/public_html/releases/current/pub/get.php,从而导致文件未找到。
解决此问题的关键是确保Nginx的root指令与PHP-FPM的php_value[doc_root](如果存在)保持一致,或者干脆不设置PHP-FPM的doc_root。
最直接的解决方案是将PHP-FPM配置文件中的php_value[doc_root]设置为与Nginx root指令完全相同的路径。
Nginx配置示例:
server {
    # ...
    set $MAGE_ROOT /home/goodprice/public_html/releases/current;
    root $MAGE_ROOT/pub; # Nginx的根目录
    # ...
    location ~ \.php$ {
        # ...
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        # ...
    }
}PHP-FPM配置示例 (通常在www.conf或特定站点的pool.conf中):
; /etc/php-fpm.d/www.conf 或 /etc/php-fpm.d/goodprice.conf [goodprice] user = goodprice group = goodprice listen.owner = goodprice listen.group = nobody listen.mode = 0660 ; ... php_value[doc_root] = "/home/goodprice/public_html/releases/current/pub/"
通过将php_value[doc_root]设置为/home/goodprice/public_html/releases/current/pub/,PHP-FPM将正确地在其预期的根目录下解析和执行Nginx传递的PHP脚本。
另一种有效的方法是完全移除PHP-FPM配置文件中的php_value[doc_root]指令。当doc_root未设置时,PHP-FPM会完全依赖Nginx通过fastcgi_param SCRIPT_FILENAME传递的脚本路径。这种方式通常更灵活,也更不容易出错。
PHP-FPM配置示例 (确保该行被注释或删除):
; /etc/php-fpm.d/www.conf 或 /etc/php-fpm.d/goodprice.conf [goodprice] user = goodprice group = goodprice listen.owner = goodprice listen.group = nobody listen.mode = 0660 ; ... ; php_value[doc_root] = "/home/goodprice/public_html/releases/current/" ; 移除或注释掉此行
在这种情况下,Nginx会直接告诉PHP-FPM脚本的完整路径,PHP-FPM将不再尝试通过其自身的doc_root来验证或修改这个路径。
sudo systemctl reload nginx sudo systemctl restart php-fpm # 或 php7.3-fpm
ls -la /home/goodprice/public_html/releases/current/pub/get.php
确认文件所有者和组与PHP-FPM配置中的user和group匹配,并且权限允许读取。
通过仔细检查和调整Nginx的root指令与PHP-FPM的php_value[doc_root]设置,可以有效解决Nginx与PHP-FPM在特定目录下无法读取PHP文件的问题,确保Web应用程序的正常运行。在配置Web服务器时,理解这两个根目录指令的交互至关重要。
以上就是Nginx与PHP-FPM在特定目录下无法读取PHP文件的解决方案的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号