[lnmp环境搭建]LNMP提示Nginx PHP “No input file specified”错误

时间:2020-08-25  来源:nginx  阅读:

昨天因为服务器到期把网站迁移到另一台服务器,使用的LNMP架构,网站各部分迁移完成后发现了一个蛋疼的问题:很多网页打开都提示”No input file specified”,甚至直接404,而且时好时坏。
去网上搜了下资料,大概意思如下:

任何对.php文件的请求,都简单地交给php-cgi去处理,但没有验证该php文件是否存在。PHP文件不存在,没办法返回普通的404错误,它返回 一个404,并带上一句”No input file specified”
另外,还可能跟 路径或者 权限有关系,或者SCRIPT_FILENAME 变量没有被正确的设置(这在nginx是最常见的原因)。

因为Nginx的PATHINFO设置是直接复制的之前服务器的设置,所以这点肯定不会有错,那就检查PHP配置文件。
一、把cgi.fix_pathinfo=0改为cgi.fix_pathinfo=1
二、把;cgi.force_redirect=1改为cgi.force_redirect=0

然后重启LNMP,发现还不好,就随便试了下:
# cd /home/wwwroot
# chown -R www:www ./*
# chmod -R 755 ./*
# lnmp restart
然后。。就好了。。。。搞半天居然是简单的权限的问题,晕了~~~
记录下,以后有朋友遇到同样的问题不访试试看是不是权限不对。(By the way,我用的是网上的LNMP一键安装包1.2版本,所以有lnmp这个命令,自己编译安装LNMP或者是LAMP的自行参考重新Nginx和PHP的命令)

另一种情况

配置 nginx + php + mysql 后,加一个站点:

server {
        listen       80;
        server_name  www.111cn.net;
        root /www/wei.abc.com/;
        index  index.html index.htm index.php;
 
#       if (!-f $request_filename) {
#               rewrite ^/(.*)$ /f.php last;
#       }
 
        location / {
        }
 
        location ~ \.php$ {
            root           /www/wei.abc.com;
                fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
                fastcgi_index index.php;
                include fastcgi.conf;
        }
}

死活访问都是 no input file specified,打开 /etc/php/php-fpm.conf,找到 access_log 打开,access_format打开,发现文件路径也正确,配出 nginx 配置问题

后发现 /etc/php.ini 中对 php 的路径做了限制:

open_basedir 中巴网站路径加上即可,或者直接注释掉也行(安全起见,还是加一个目录比较好)。

 

问题情况三

刚装好Nginx,马上加了个 PHPINFO

1. 2.phpinfo();
3.?>
然后在游览器下运行 结果是

No input file specified.

以下内容为网络收集

FastCGI模式下访问php文件时,出现No input file specified.错误
查看access.log 发现是 404

原因分析:
任何对.php文件的请求,都简单地交给php-cgi去处理,但没有验证该php文件是否存在。PHP文件不存在,没办法返回普通的404错误,它返回一个404,并带上一句”No input file specified”

另外,还可能跟 路径或者 权限有关系,或者SCRIPT_FILENAME 变量没有被正确的设置(这在nginx是最常见的原因)

1)如果html也出现404错误,那么就是document root 设置的有问题
2)检查脚本文件的权限, 可能PHP或者web server不能读取它
3)SCRIPT_FILENAME设置错误

可以使用
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
必须保证 $document_root 在配置文件中,在astcgi_param SCRIPT_FILENAME前面被用到过一次, 后面有解释为什么。

或者
修改/etc/php5/cgi/php.ini中cgi.fix_pathinfo=1
这样也可让php-cgi正常使用SCRIPT_FILENAME这个变量

有人说,这样改也行
fastcgi_param SCRIPT_NAME /home/gavin/nginx/$fastcgi_script_name;

让我们看看PHP对这两个变量是怎么解释的吧
SCRIPT_NAME
SCRIPT_FILENAME
据说,必须指定正确的SCRIPT_FILENAME, PHP-CGI会忽略SCRIPT_NAME(即使它的值设置的是正确的)
或者指定特殊的php.ini, 设置doc_root, discard path, fix pathinfo等等

script_filename 只是被用做一种快捷方式。 如果fix_pathinfo设置打开,init函数将它用来决定真实的路径

因为配置文件会改变 nginx的变量$fastcgi_script_name

fastcgi_param SCRIPT_NAME /home/gavin/nginx/$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;

fastcgi_param SCRIPT_FILENAME /home/gavin/nginx/$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;

这两种配置都是可以的


fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
也是可以的,但必须保证 $document_root 被正确设置过

‘SCRIPT_FILENAME’
当前执行脚本的绝对路径名(pathname)
‘SCRIPT_NAME’
含有当前脚本的路径。当页面需要指向他们自己时,有用. __FILE__ 常量包含路径和文件名

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP’s
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix it’s paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; cgi.fix_pathinfo=0

主要跟CGI标准的
PATH_INFO
PATH_TRANSLATED
SCRIPT_NAME
有关系
修修改了好多
最终主要修改的

把 NGINX DEFAULT 那个文件中的

fastcgi_param SCRIPT_NAME $fastcgi_script_name;

改成实际的路径

今天我是这种情况

我的是fastcgi_param SCRIPT_NAME /var/www/nginx-default/$fastcgi_script_name;

[lnmp环境搭建]LNMP提示Nginx PHP “No input file specified”错误

http://m.bbyears.com/caozuoxitong/94721.html

推荐访问:lnmp建站教程 lnmp架构
相关阅读 猜你喜欢
本类排行 本类最新