欢迎来到全国社交动力网络科技有限公司
建站资讯

当前位置: 首页 > 建站资讯 > 建站教程 > PHP教程

Nginx与PHP-FPM在特定目录下无法读取PHP文件的解决方案

作者:网站优化公司 来源:php怎么学日期:2025-10-24

Nginx与PHP-FPM在特定目录下无法读取PHP文件的解决方案

本文探讨了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应该能正确找到文件。

根本原因分析:Nginx root 与 PHP-FPM doc_root 的不匹配

此问题的核心在于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时:

如果PHP-FPM的php_value[doc_root]被错误地设置为$MAGE_ROOT(即/home/goodprice/public_html/releases/current/),PHP-FPM会尝试在自己的doc_root下查找脚本。PHP-FPM会接收到Nginx传递的script_FILENAME,然后可能会将其与自身的doc_root进行比对或截断。如果script_FILENAME的路径前缀与PHP-FPM的doc_root不符,或者PHP-FPM内部逻辑错误地将script_FILENAME中的pub/部分剥离,导致它在错误的目录下寻找get.php,就会出现“No such file or directory”的错误。

例如,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。

英特尔AI工具 英特尔AI工具

英特尔AI与机器学习解决方案

英特尔AI工具70 查看详情 英特尔AI工具

方案一:精确匹配 php_value[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 = goodpricegroup = goodpricelisten.owner = goodpricelisten.group = nobodylisten.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_value[doc_root]

另一种有效的方法是完全移除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 = goodpricegroup = goodpricelisten.owner = goodpricelisten.group = nobodylisten.mode = 0660; ...; php_value[doc_root] = "/home/goodprice/public_html/releases/current/"  ; 移除或注释掉此行
登录后复制

在这种情况下,Nginx会直接告诉PHP-FPM脚本的完整路径,PHP-FPM将不再尝试通过其自身的doc_root来验证或修改这个路径。

注意事项与总结

重启服务: 无论采用哪种方案,修改Nginx或PHP-FPM配置后,务必重启相应的服务以使更改生效。
sudo systemctl reload nginxsudo systemctl restart php-fpm # 或 php7.3-fpm
登录后复制控制面板环境: 在使用cPanel等控制面板的环境中,PHP-FPM的配置可能由面板自动管理。修改时需要特别小心,确保更改不会被面板的自动配置覆盖。通常,面板会提供自定义PHP-FPM设置的接口,或者允许在用户级别的.user.ini文件中进行覆盖。文件权限: 尽管本问题并非直接由文件权限引起,但仍需确保Nginx和PHP-FPM运行的用户(通常是www-data、nginx或特定用户)对所有Web目录和文件具有足够的读取权限。
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对象循环依赖导致的无限循环实例化问题

推荐建站资讯

更多>