【问题标题】:NGINX - No input file specified. - php Fast/CGINGINX - 没有指定输入文件。 - php 快速/CGI
【发布时间】:2014-02-18 01:59:05
【问题描述】:

您好,我在为 nginx 设置配置方面需要帮助。我是 NGINX 新手,遇到了一些问题。

在我的sites-available 中有default 文件

它包含以下代码

server {
    server_name www.test.com test.com;
    access_log /sites/test/logs/access.log;
    error_log /sites/test/logs/error.log;
    root /sites/test;

 location ~ / {

index index.php
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

当我编写 URL 时,上面的代码完美运行

www.test.com/service/public/

当我写作时

www.test.com/service/public/testservice(testservice 是公共文件夹)上面写着No input file specified.

如何解决。 提前致谢。

我在下面尝试过,但没有运气

http://nginxlibrary.com/resolving-no-input-file-specified-error/
http://blog.martinfjordvald.com/2011/01/no-input-file-specified-with-php-and-nginx/

【问题讨论】:

  • 不确定它是否有帮助,但我遇到了同样的事情,在使用 chmod 更改站点目录的权限后它再次工作
  • 你把它改成什么了?
  • 这能回答你的问题吗? No input file specified

标签: nginx


【解决方案1】:

您必须在

中添加“include fastcgi.conf”
location ~ \.$php{
  #......
  include fastcgi.conf;
}

【讨论】:

  • 谢谢!我遇到了同样的问题(在将 nginx 1.2 升级到 1.6 之后),我将:include fastcgi_params; 更改为:include fastcgi.conf; 并重新开始工作!!!干杯!
  • 我试过了,我得到了同样的结果。这是我的配置:jsfiddle.net/bheng/t6jepya5。任何提示将不胜感激!
  • 你有一个 $ 在错误的地方 - 它应该是 location ~ \.php$ {
【解决方案2】:

解决“未指定输入文件”错误

如果您使用 nginx 和 php-cgi 并按照标准程序进行设置,您可能经常会收到“未指定输入文件”错误。当 php-cgi 守护程序使用提供给它的 SCRIPT_FILENAME 参数找不到要执行的 .php 文件时,基本上会发生此错误。我将讨论错误的常见原因及其解决方案。 错误的路径被发送到 php-cgi 守护进程

通常,错误的路径 (SCRIPT_FILENAME) 被发送到 fastCGI 守护程序。在许多情况下,这是由于配置错误造成的。我见过的一些设置是这样配置的:

server {
    listen   [::]:80;
    server_name  example.com www.example.com;
    access_log  /var/www/logs/example.com.access.log;  

    location / {
        root   /var/www/example.com;
        index  index.html index.htm index.pl;
    }

    location /images {
        autoindex on;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com$fastcgi_script_name;
        include fastcgi_params;
    }
}

现在,这个配置有很多问题。一个明显而明显的问题是 location / 块中的根指令。当根在位置块内定义时,它仅适用于该块/定义。在这里,位置 /images 块将不匹配任何请求,因为它没有定义任何 $document _root ,我们将不得不为它再次冗余定义 root 。显然,root 指令应该移出 location / 块并在 server 块中定义。这样,位置块将继承父服务器块中定义的值。当然,如果你想为一个位置定义一个不同的 $document_root,你可以在一个位置块中放置一个根指令。

另一个问题是 fastCGI 参数 SCRIPT_FILENAME 的值是硬编码的。如果我们更改 root 指令的值并将我们的文件移动到目录链中的其他位置,php-cgi 将返回“未指定输入文件”错误,因为将无法在硬编码位置找到文件'当 $document_root 改变时不改变。因此,我们应该将 SCRIPT_FILENAME 设置如下:

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

我们应该记住,根指令应该在服务器块中,否则只有 $fastcgi_script_name 将作为 SCRIPT_FILENAME 传递,我们将收到“未指定输入文件”错误。

source(Resolving "No input file specified" error)

【讨论】:

  • 在文件 /etc/php-fpm.d/www.conf 中更改用户:nginx 组:nginx
【解决方案3】:

只需重新启动我的 php-fpm 即可解决问题。据我了解,这主要是 php-fpm 问题,而不是 nginx。

【讨论】:

    【解决方案4】:

    同样的问题。

    原因open_basedir中没有指定我的根目录。
    修复:添加我的站点根目录位于:

    /etc/php5/fpm/pool.d/mysite.conf<br>
    

    通过添加此指令:

    php_value[open_basedir] = /my/root/site/dir:/other/directory/allowed
    

    【讨论】:

      【解决方案5】:

      这很可能是因为带有斜杠,NGinx 试图找到默认的索引文件,它可能是 index.html 没有配置。如果没有尾部斜杠,它会尝试匹配他找不到的 file 测试服务。这个和/或您在testservice 文件夹中没有任何默认索引文件。

      尝试将此行添加到您的 server 配置中:

      index  index.php index.html index.htm; // Or in the correct priority order for you
      

      希望这会有所帮助!

      编辑

      我的回答不是很清楚,看这个例子就明白我的意思了

      listen 80;
      
          server_name glo4000.mydomain.com www.glo4000.mydomain.com;
      
      
          access_log  /var/log/nginx/glo-4000.access.log;
          error_log /var/log/nginx/glo-4000.error_log;
      
          location / {
              root   /home/ul/glo-4000/;
              index  index.php index.html index.htm;
          }
      
          location ~ \.php$ {
      
              include fastcgi_params;
              fastcgi_pass   unix:/tmp/php5-fpm.sock;
              fastcgi_index  index.php;
              fastcgi_param  SCRIPT_FILENAME /home/ul/glo-4000/$fastcgi_script_name;
          }
      }
      

      【讨论】:

      • 对不起...没有帮助...我尝试在服务器中添加上面的行并删除尾随 / 以及...这是 ZF2 模块,它是从这个没有索引的 url 调用的在里面...请帮助
      • 好的,这是一些重要信息。你见过吗:stackoverflow.com/questions/19731555/…
      • 您有不同的错误代码吗?你到底在尝试什么?您是否尝试过使用套接字而不是127.0.0.1:9000 您是否尝试使用try files 命令在location / 语句中声明您的根?您的 PHP-CGI 日志中有任何错误吗?您的 NGinx 日志中有更详细的错误吗?
      • 我无法使用套接字,因为我没有找到套接字文件。是的,我在location / try_files $uri $uri/ /index.php; 中添加了root。我的 access.log 说的 '"GET /webvalue-services/public/testservice/ HTTP/1.1" 404 36 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36"' 。我不知道如何查看 Nginx 和 php-cgi 日志?
      • 你不应该在位置块中有根指令:nginxlibrary.com/resolving-no-input-file-specified-error
      【解决方案6】:

      我通过替换解决了它

      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      

      $document_root 与 C:\MyWebSite\www\

      fastcgi_param SCRIPT_FILENAME C:\MyWebSite\www\$fastcgi_script_name;
      

      【讨论】:

        【解决方案7】:

        这个答案对我没有帮助,我的 php 管理员向我显示“没有指定输入文件”错误。 但我知道我之前更改了 php-version。 于是,我找到了原因:不是nginx,是php.ini doc_root参数! 我找到了

        doc_root =

        在 php.ini 中改成

        ;doc_root =

        在这个补丁之后,我的管理员工作正常。

        【讨论】:

          【解决方案8】:
          server {
              server_name www.test.com test.com;
              access_log /sites/test/logs/access.log;
              error_log /sites/test/logs/error.log;
              root /sites/test;
          
           location ~ / {
          
          index index.php
              include /etc/nginx/fastcgi_params;
              fastcgi_pass  127.0.0.1:9000;
              fastcgi_index index.php;
              fastcgi_param SCRIPT_FILENAME `$document_root/service/public$fastcgi_script_name`;
          }
          

          【讨论】:

          • 尝试将 /service/public 添加到您的 root 声明中。这就是这个声明的目的。如果您在 /sites/test 文件夹中直接有 php/html/css/js 文件,则它必须是您的根目录,但您必须将内容添加到您的 document_root 以适应您的 SCRIPT_FILENAME 是不正常的。此外,您的日志不应该在那里,它们属于 /var/log/ 的子文件夹,就像系统守护程序的所有日志一样。我的两分钱。
          • 很高兴你发现了你的问题,我第一次设置 NGinx 时遇到了几乎同样的问题,当我试图帮助你时没有考虑。
          【解决方案9】:

          我尝试了上述所有设置,但这解决了我的问题。 您必须定义 nginx 以检查 php 文件是否实际存在于该位置。我发现try_files $uri = 404; 解决了这个问题。

          location ~ \.php$ {
                  try_files  $uri =404;
                  fastcgi_split_path_info ^(.+\.php)(/.+)$;
                  fastcgi_pass unix:/var/run/php5-fpm.sock; 
                  include fastcgi_params;
                  fastcgi_index index.php;
          }
          

          【讨论】:

          • 这与现有答案有何不同?
          • try_files $uri = 404;
          • 您应该将该信息放入您的答案中。如果它解释了为什么它与其他答案不同/更好,那么答案将是最有帮助的。
          • 此解决方案实际上将 php-fpm 响应“未指定输入文件”替换为标准 nginx 404 响应。这正是我想要的!
          【解决方案10】:

          同样的问题。

          原因使用备份中的恶意 user.ini 文件复制旧的 open_basedir 设置

          解决方法删除

          【讨论】:

            【解决方案11】:

            我尝试了上面提到的所有选项,但最终找到了解决方案。 在我的服务器上,.php 文件被设置为每个人都可以读取,但是当我将 php-fpm 设置为在与 nginx 相同的用户下运行时,它就起作用了。我在/etc/php/7.2/fpm/pool.d/www.conf 和我设置的配置文件中更改了它

            user = nginx group = nginx

            然后重新加载php-fpm进程 希望这会有所帮助

            【讨论】:

              【解决方案12】:

              我有同样的错误,我的问题是,我的 php 文件在我的加密主目录中。我使用 www-data 用户运行我的 fpm,即使文件的权限正确,该用户也无法读取 php 文件。解决方案是我与拥有主目录的用户一起运行 fpm。这可以在以下文件中更改:

              /etc/php5/fpm/pool.d/www.conf

              希望对你有帮助:)

              【讨论】:

                【解决方案13】:

                我的情况: SELinux 已启用并拒绝 php-fpm 执行我的脚本。

                诊断:暂时禁用 SELinux,看看问题是否消失。

                $ sudo setenforce permissive
                ### see if PHP scripts work ###
                $ sudo setenforce enforcing
                

                解决方案: 将 PHP 目录放在 httpd_sys_content_t 上下文中。您可以使用chcon 或通过semanage 使更改持久化:

                $ sudo semanage fcontext -a -t httpd_sys_content_t "/srv/myapp(/.*)?"
                $ sudo restorecon -R -F /srv/myapp
                

                您可以在需要写权限的地方使用上下文httpd_sys_rw_content_t

                【讨论】:

                  【解决方案14】:

                  好的, 我假设您在 Ubuntu 16 或更高版本上使用 php7.2(或更高版本)

                  如果这些都不起作用,您必须知道 nginx-fastCGI 对托管在同一服务器上的不同站点使用不同的 pid 和 .sock。

                  要解决“未指定输入文件”问题,您必须告诉 nginx yoursite.conf 文件使用哪个 sock 文件。

                  1. 取消注释默认 fastcgi_pass unix:/var/run/php7.2-fpm.sock 确保您在 conf 文件中有以下指令,

                    location / {
                        try_files $uri $uri/ /index.php$is_args$args;
                    }
                    location ~ \.php$ {
                            try_files $uri /index.php =404;
                            #fastcgi_pass unix:/var/run/php7.2-fpm.sock;
                            fastcgi_pass unix:/var/php-nginx/158521651519246.sock/socket;
                            fastcgi_index index.php;
                            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                            include fastcgi_params;
                    }
                    
                  2. 使用ls -la /var/php-nginx/查看 sock 和 pid 文件列表(如果您最近添加了文件,它应该是列表中的最后一个)

                  3. 复制 .​​sock 文件的文件名(通常是 15 位数字)并将其粘贴到您的 location ~ \.php 指令中

                  fastcgi_pass unix:/var/php-nginx/{15digitNumber}.sock/socket;

                  然后重启 nginx。 让我知道它是否有效。

                  【讨论】:

                    【解决方案15】:

                    在窗口中使用

                    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    

                    没有放-b

                    php-cgi.exe -b 127.0.0.1:9000
                    

                    【讨论】:

                      【解决方案16】:

                      对于本地主机 - 我忘了写 C:\Windows\System32\drivers\etc\hosts

                      127.0.0.1 localhost
                      

                      还从 ngnix.conf 中的其他服务器中删除了 proxy_pass http://127.0.0.1;

                      【讨论】:

                        【解决方案17】:

                        好吧,我是菜鸟,但我只是分享一下我遇到的事情。

                        我使用 Linode 设置 Laravel Forge 以从我的 github 存储库运行静态网站。

                        SSH 到我的 Linode 并验证我的 html 已更新但是,在访问我的 linode 的公共 ip 时,我看到了错误消息“未指定输入文件。

                        在我的 Forge 中访问 Nginx 配置文件并删除了“public”这个词,所以现在它

                        root /home/forge/default;
                        

                        在forge中重新启动nginx服务器并再次部署,现在可以访问了。

                        【讨论】:

                          【解决方案18】:

                          如果有人仍然遇到问题......我通过以下方式解决了它:

                          在站点 conf 文件中(例如:/etc/nginx/conf.d/SITEEXAMPLE.conf)我有以下行:

                          fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
                          

                          发生错误是因为我的网站不在“/usr/share/nginx/html”文件夹中,而是在文件夹中:/var/www/html/SITE/

                          所以,改变那部分,留下如下代码。注意:对于那些使用/var/www/html/YOUR_SITE/网站标准的人

                          fastcgi_param  SCRIPT_FILENAME  /var/www/html/YOUR_SITE/$fastcgi_script_name;
                          

                          【讨论】:

                            猜你喜欢
                            • 2020-03-09
                            • 1970-01-01
                            • 2018-02-12
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2018-10-11
                            相关资源
                            最近更新 更多