No input file specified 记一次令人绝望的后端环境部署问题

本文记录了一次在LNMP环境下部署Laravel项目遇到的PHP文件404问题排查及解决过程,涉及Nginx配置、php-fpm配置及PHP.ini配置等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景
从别人那接手一个项目, 基于laravel的, 开发环境用的是LNMP, 现在要将这个项目部署到自己的服务器.
使用LNMP一键安装包, 在服务器配置lnmp环境, 然后将接手的项目解压到目录(/home/wwwroot/), 配置nginx的server块后, 用浏览器访问测试发现错误

No input file specified.

此时Chrome的开发者工具中显示请求返回码404

* 解决方案可直接参考博文


问题分析

  • 凭经验, 首先确认nginx的index指令配置. 检查发现index指令正确配置
  • 此时在网站根目录下新建index.html, 访问正常. 由此认为nginx配置正确、php-fpm配置出错.
  • 检查php-fpm是否正常启动
    由于nginx里将php代理转发到9000端口, 所以正常情况下php-fpm应启动并监听900端口
    检查结果是php-fpm正常启动. 此时在网站根目录下新建test.php, 请求test.php, 问题依旧

No input file specified

  test.php内容对laravel框架无依赖, 可排除laravel框架出问题的可能.

<?php
//test.php
 phpinfo();
?>
  • 搜索发现, 多篇文章指出fastcgi的参数(fastcgi_param ) SCRIPT_FILENAME设置出错会造成php请求响应404的问题. 在nginx.conf中添加日志格式用以打印变量SCRIPT_FILENAME, 打印日志, 检查发现该变量正常无误
  • 猜测可能是目录权限问题. 修改www用户为可登录 (php-fpm的运行时用户配置为www, 关于后台应用程序及其用户权限配置建议, 可参考这篇博文), 切换当前用户为www
su www

  测试结果为www用户可正常读取根目录下所有php文件.

  • 偶然发现lnmp工具建立的默认server是可以正常响应php请求的, 检查正常server块和异常server块, 基本排除配置问题.
  • 尝试性将网站根目录改为当前设置(public)的上一级目录并把test.php放在新的网站根目录下. 发现此时可正常请求该文件.
  • 将test.php放置于网站任一非原设置(public目录)下, 均可通过url正常请求
  • 此时判定, 仅限public目录下PHP文件不能正常响应请求. 据此搜索禁止指定目录执行php. 查阅多篇文章, 大多思路为通过nginx的deny指令匹配请求并进行限制. 检查nginx配置, 并未发现有相关过滤配置, 且由于之前使用多个不同url访问同一文件均出错, 基本可排除nginx请求限制问题
  • 尝试性修改目录名为 pub ,依然无法正常请求. 基本排除nginx或php中设置了目录黑名单的可能.
  • 考虑到这里, 怀疑public下有特定文件限制访问, 使用
ls -ahl

  此时发现存在.htaccess和web.config, 但此两文件均不被nginx支持

  • 尝试性新建public目录, 并将原有public目录下文件全部复制到新public中, 并将test.php放入其中
cp -R pub/* public/

  尝试请求新public下的test.php, 可正常响应请求! 访问index.php, 亦可正常响应!

  • 修改网站根目录为public, 问题解决
  • 备份现有项目文件, 删除测试文件, 备份问题文件待研究
  • 在桌面机(Windows 10)上打开文件, 发现原public目录下存在.user.ini文件. 凭文件后缀名.ini可知其大概率为php的配置文件. 搜索之

问题解决

参考博文
从.user.ini的文档中可以知道, 这个相当于分布在各目录中的 php.ini, 可用于针对某目录单独配置php-fpm特定配置项, 可实现部分.htaccess文件的功能.

打开原有项目文件中的.user.ini, 发现其指定了open_basedir且与我的服务器的路径不一致, 因此造成php-fpm拒绝执行该目录下php的情况.

另外, 在复制原public目录下文件到新public目录时, 并未将.user.ini复制到新目录(这一点我很奇怪), 所以可以正常响应请求

问题总结

其实本来已经定位到问题的关键点了, 但是在使用shell时却没有注意到.user.ini这么一个异常文件. 由于在Windows中不隐藏.user.ini且将.ini文件作为配置文件(这样它的图标就会不同), 才注意到这个特殊的文件.

另外, 对php的配置不清楚导致此问题迟迟无法发现.

自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果。

若在之前配置php能仔细阅读PHP手册的话, 想必对此问题能快速解决吧.


### PHPStudy中‘No input file specified’错误解决方案 ‘No input file specified’ 错误通常出现在PHP运行环境中,当服务器无法找到或正确解析请求的PHP文件时会发生该问题。以下是一些常见的解决方法: #### 1. 检查伪静态规则 如果使用的是Nginx作为Web服务器,可能是伪静态规则配置不正确导致的。例如,在引用[2]中提到的Nginx配置中,伪静态规则可能未正确设置。可以尝试修改`location /`部分的伪静态规则如下: ```nginx location / { index index.html index.htm index.php; if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } } ``` 此规则确保所有未匹配到实际文件的请求都会被重定向到`index.php`进行处理[^2]。 #### 2. 检查fastcgi配置 在PHPStudy中,FastCGI配置可能导致此问题。需要确保PHP-FPM和Nginx之间的通信正常。可以在Nginx配置文件中检查以下参数是否正确: ```nginx fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; ``` 如果缺少上述参数,可能会导致Nginx无法正确传递PHP文件路径给PHP-FPM[^2]。 #### 3. 修改.htaccess文件(适用于Apache) 如果使用的是Apache服务器,可以参考引用[1]中的解决办法。打开项目根目录下的`.htaccess`文件,确保其内容类似于以下形式: ```apache <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] </IfModule> ``` 此配置确保所有未匹配到实际文件或目录的请求都被重定向到`index.php`[^1]。 #### 4. 检查PHP环境变量 有时,PHP环境变量未正确配置也会导致此问题。可以通过在PHP配置文件中添加以下代码来验证: ```php <?php phpinfo(); ?> ``` 将此文件保存为`info.php`并访问它,检查`SCRIPT_FILENAME`是否指向正确的PHP文件路径。如果不是,则需要调整Nginx或Apache的配置文件[^2]。 #### 5. 确保文件权限正确 文件权限问题也可能导致‘No input file specified’错误。确保Web服务器用户(如`www-data`)对PHP文件具有读取权限。可以使用以下命令更改文件权限: ```bash chmod -R 755 /path/to/your/project chown -R www-data:www-data /path/to/your/project ``` #### 6. 检查PHPStudy的虚拟主机配置 如果使用PHPStudy的虚拟主机功能,需确保虚拟主机配置文件中的`root`路径正确,并且`index.php`已包含在`index`指令中。例如: ```nginx server { listen 80; server_name www.example.com; root "D:/phpStudyProjects/example"; index index.html index.htm index.php; } ``` ### 示例代码 以下是一个完整的Nginx配置示例,适用于解决‘No input file specified问题: ```nginx server { listen 80; server_name www.example.com; root "D:/phpStudyProjects/example"; index index.html index.htm index.php; location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值