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,从而导致文件未找到。

AI Web Designer
AI Web Designer

AI网页设计师,快速生成个性化的网站设计

下载

解决方案

解决此问题的关键是确保Nginx的root指令与PHP-FPM的php_value[doc_root](如果存在)保持一致,或者干脆不设置PHP-FPM的doc_root。

方案一:精确匹配 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服务器时,理解这两个根目录指令的交互至关重要。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

245

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

519

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

587

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

243

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

607

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3608

2024.08.07

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

53

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

67

2026.01.13

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

6

2026.02.28

热门下载

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

精品课程

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

共137课时 | 12.7万人学习

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

共6课时 | 11.3万人学习

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

共13课时 | 1.0万人学习

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

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