0

0

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

DDD

DDD

发布时间:2025-10-24 08:24:23

|

727人浏览过

|

来源于php中文网

原创

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

本文探讨了nginxphp-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时:

  1. 如果PHP-FPM的php_value[doc_root]被错误地设置为$MAGE_ROOT(即/home/goodprice/public_html/releases/current/),PHP-FPM会尝试在自己的doc_root下查找脚本。
  2. 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。

Interior AI
Interior AI

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 = 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_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 = 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来验证或修改这个路径。

注意事项与总结

  1. 重启服务: 无论采用哪种方案,修改Nginx或PHP-FPM配置后,务必重启相应的服务以使更改生效。
    sudo systemctl reload nginx
    sudo systemctl restart php-fpm # 或 php7.3-fpm
  2. 控制面板环境: 在使用cPanel等控制面板的环境中,PHP-FPM的配置可能由面板自动管理。修改时需要特别小心,确保更改不会被面板的自动配置覆盖。通常,面板会提供自定义PHP-FPM设置的接口,或者允许在用户级别的.user.ini文件中进行覆盖。
  3. 文件权限: 尽管本问题并非直接由文件权限引起,但仍需确保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服务器时,理解这两个根目录指令的交互至关重要。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2520

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1599

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1493

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1416

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.6万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号