【问题标题】:File Not Found when running PHP with Nginx使用 Nginx 运行 PHP 时找不到文件
【发布时间】:2021-09-22 03:21:19
【问题描述】:

最近我安装了最新版本的 Nginx,看起来我很难用它运行 PHP。

这是我用于域的配置文件:

server {
listen       80;
server_name  localhost;

location / {
    root   /usr/share/nginx/html;
    index  index.php;
}

error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /usr/share/nginx/html;
}

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

}

这是我在错误日志文件中遇到的错误:

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

【问题讨论】:

  • 为什么 fastcgi_pass 在 fastcgi 设置之前?
  • 我不知道,这些是我第一次安装Nginx时得到的基本配置。
  • 在最后一个语句中切换它会改变什么吗?
  • fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 为什么是/scripts这个词?
  • 对我来说,它是指向旧版本的 php-fpm.sock 文件 /run/php5.6/php-fpm.sock 而不是 /run/php7.1/php-fpm.sock

标签: php nginx


【解决方案1】:

尝试另一个 *fastcgi_param* 类似的东西

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

【讨论】:

  • 或使用 $document_root 代替绝对路径,我认为在 wiki 中提到过
  • 如果您首先解释为什么会发生这种情况,我会给出+1
  • 在 1.6+ $document_root$fastcgi_script_name 似乎是正确的方式 AFAIK,但为什么呢?
  • 只是想知道如何调试它? (nginx error.log 中的消息并不是很有帮助,我在 php5-fpm.log 中什么也没有得到),谢谢。
【解决方案2】:

我遇到了“找不到文件”的问题,因此我将“根”定义上移到“服务器”括号中,以便为所有位置提供默认值。您始终可以通过为任何位置提供它自己的根来覆盖它。

server {
    root /usr/share/nginx/www;
    location / {
            #root /usr/share/nginx/www;
    }

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
    }
}

或者,我可以在我的两个位置都定义 root。

【讨论】:

  • 这是为我解决的问题,接受的答案没有。
  • 这样就解决了,如果以上方法都没有解决问题,请也试试这个
  • 非常感谢
  • 这为我解决了同样的问题 Ubuntu 18.04.2, nginx v1.16 php7.3-fpm
【解决方案3】:

我也遇到过同样的问题, 在我的测试中,我遇到了这两个问题:

1º:“找不到文件”

2º:404错误页面

我发现,就我而言:

我必须在 Nginx 卷和 PHP 卷上为我的公用文件夹安装卷。

如果它挂载在Nginx中并且没有挂载在PHP中,它会给出:“File not found

示例(将显示“文件未找到错误”):


services:
  php-fpm:
    build:
      context: ./docker/php-fpm
  nginx:
    build:
      context: ./docker/nginx
    volumes:
        #Nginx Global Configurations
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./docker/nginx/conf.d/:/etc/nginx/conf.d

        #Nginx Configurations for you Sites:

        # - Nginx Server block
      - ./sites/example.com/site.conf:/etc/nginx/sites-available/example.com.conf
        # - Copy Public Folder:
      - ./sites/example.com/root/public/:/var/www/example.com/public
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - php-fpm
    restart: always

如果在PHP中挂载,而在Nginx中没有挂载,则会报404 Page Not Found错误

示例(将抛出 404 Page Not Found 错误):

version: '3'

services:
  php-fpm:
    build:
      context: ./docker/php-fpm
    volumes:
      - ./sites/example.com/root/public/:/var/www/example.com/public
  nginx:
    build:
      context: ./docker/nginx
    volumes:
        #Nginx Global Configurations
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./docker/nginx/conf.d/:/etc/nginx/conf.d

        #Nginx Configurations for you Sites:

        # - Nginx Server block
      - ./sites/example.com/site.conf:/etc/nginx/sites-available/example.com.conf
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - php-fpm
    restart: always

而且这样就可以正常工作(两侧安装)(假设其他一切都已配置好并且您面临与我相同的问题):

version: '3'

services:
  php-fpm:
    build:
      context: ./docker/php-fpm
    volumes:
      # Mount PHP for Public Folder
      - ./sites/example.com/root/public/:/var/www/example.com/public
  nginx:
    build:
      context: ./docker/nginx
    volumes:
        #Nginx Global Configurations
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./docker/nginx/conf.d/:/etc/nginx/conf.d

        #Nginx Configurations for you Sites:

        # - Nginx Server block
      - ./sites/example.com/site.conf:/etc/nginx/sites-available/example.com.conf
        # - Copy Public Folder:
      - ./sites/example.com/root/public/:/var/www/example.com/public
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - php-fpm
    restart: always

还有一个使用 Nginx/Php 的完整工作示例项目,用于为多个站点提供服务: https://github.com/Pablo-Camara/simple-multi-site-docker-compose-nginx-alpine-php-fpm-alpine-https-ssl-certificates

我希望这对某人有所帮助, 如果有人对此有更多了解,请告诉我, 谢谢!

【讨论】:

  • 我知道这是一个旧答案,但它帮助了我。我在撰写文件的 nginx 部分更改了路径,却忘记在 php-fpm 部分反映相同的更改。谢谢你指点我,我开始受够了!
  • @Antoine 我知道这是一个迟到的回应,但我最近遇到了同样的问题。上面的答案对我有用,我只是不明白为什么我们需要同时安装 Nginx 和 PHP ......你对此有见解吗?
  • @Dimitri 这仅仅是因为它们是两个不同的容器。必须有定义公共变量的方法,但说实话,我还不够了解!
【解决方案4】:

现在回答可能为时已晚,但有几件事,因为这是一个非常烦人的错误。以下解决方案适用于 Mac OS X Yosemite。

  1. 有就最好了

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

  1. 包含快速 cgi 参数的包含应超出该行。

  2. 你所有的目录到你正在执行的 PHP 文件(包括那个文件)都应该有a+x 权限,例如

sudo chmod a+x /Users/
sudo chmod a+x /Users/oleg/
sudo chmod a+x /Users/oleg/www/
sudo chmod a+x /Users/oleg/www/a.php

【讨论】:

  • 谢谢。在包含上方添加 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 对我来说在 Mac OS X Sierra 上起到了作用。
【解决方案5】:

我只花了大约 40 分钟尝试调试一个不工作的 /status :

$ SCRIPT_NAME=/status SCRIPT_FILENAME=/status QUERY_STRING= REQUEST_METHOD=GET cgi-fcgi -bind -connect /var/run/php5-fpm.sock

它只是产生了“找不到文件”错误,而实际的脚本(在文件系统上找到)工作得很好。

原来,我有几个孤立的 php5-fpm 进程。在我杀死所有东西并干净地重新启动php5-fpm之后,它就恢复了正常。

希望这会有所帮助。

【讨论】:

  • 这种通过 cgi-fcgi 调试 php-fpm 的技术非常有用,谢谢。
【解决方案6】:

在我的例子中,PHP 脚本本身返回 404 代码。与nginx无关。

【讨论】:

    【解决方案7】:

    在我的情况下,这是因为根 Web 目录的权限设置不正确。为此,您需要在终端中运行它时位于父文件夹中:

    sudo chmod -R 755 htmlfoldername
    

    这将对您的 html 文件夹中的所有文件进行 chmod,出于安全原因,不建议出于生产原因这样做,但应该让您查看该文件夹中的文件,以确保在故障排除时这不是问题。

    【讨论】:

      【解决方案8】:

      错误消息“主脚本未知或在您的情况下是找不到文件。”几乎总是与 Nginx fastcgi_param 指令中的 SCRIPT_FILENAME 行中的错误设置有关(引用自 https://serverfault.com/a/517327/560171)。

      就我而言,我使用的是 Nginx 1.17.10,我的配置是:

          location ~ \.php$ {
            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_read_timeout 600;
          }
      

      您只需将 $document_root 更改为 $realpath_root,因此无论您的根位置如何,例如 /var/www/html/project/,您都不需要在每次根更改时都写入 fastcgi_param SCRIPT_FILENAME /var/www/html/project$fastcgi_script_name;。这种配置更加灵活。愿这有帮助。

      ================================================ ====================================

      如需了解更多信息,如果您获得了unix:/run/php/php7.2-fpm.sock failed (13: Permission denied) while connecting to upstream,只需将/etc/nginx/nginx.confuser nginx; 更改为user www-data;

      因为 PHP-FPM 进程的默认用户和组是 www-data 可以在/etc/php/7.2/fpm/pool.d/www.conf 文件中看到(Qoute 来自https://www.linuxbabe.com/ubuntu/install-nginx-latest-version-ubuntu-18-04):

      user = www-data
      group = www-data
      

      希望这些信息能提供很大帮助

      【讨论】:

        【解决方案9】:

        我也有这个错误。在我的情况下,这是因为有另一个虚拟主机指向同一个根目录。

        【讨论】:

          【解决方案10】:

          升级到 PHP72 后,我们遇到了一个问题,即 php-fpm.d/www.conf 丢失了导致此错误的用户/组设置。如果您的设置涉及 php-fpm,请务必仔细检查。

          【讨论】:

            【解决方案11】:

            对我来说,问题是位置路径中的错字。

            也许首先要检查这种问题

            是项目的路径。

            【讨论】:

              【解决方案12】:

              当得到“找不到文件”时,我的问题是在 ngix config 中指向这一行的文件夹中没有符号链接:

              root /var/www/claims/web;
              

              【讨论】:

                【解决方案13】:

                如果它对某人有帮助,我的问题似乎只是因为我在我的主目录下使用了一个子文件夹,即使权限看起来是正确的并且我没有 SELinux 或类似的东西。 将其更改为 /var/www/something/something 使其工作。

                (如果我找到真正的原因,并记住这个答案,我会更新它)

                【讨论】:

                  【解决方案14】:

                  试试这个命令

                  sudo chmod 755 -R htdocs/
                  

                  【讨论】:

                    【解决方案15】:

                    我的情况:我使用了相对目录

                           location ~* \.(css|js)\.php$ {
                    
                                root ../dolibarr/htdocs;
                    
                                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    
                                fastcgi_param SCRIPT_NAME $fastcgi_script_name;
                                fastcgi_index index.php;
                    
                                 include /etc/nginx/fastcgi_params;
                           }
                    
                    

                    这条线也不起作用:fastcgi_param SCRIPT_FILENAME /vagrant/www/p1/../p2/htdocs/core/js/lib_head.js.php;

                    所以我发现fastcgi_param 不支持相对路径。

                    这行得通

                    fastcgi_param SCRIPT_FILENAME /vagrant/www/p2/htdocs/core/js/lib_head.js.php;
                    

                    【讨论】:

                      【解决方案16】:

                      网站会显示“File Not Found”错误。

                      您应该检查此配置文件:/etc/nginx/nginx.conf (error_log) 以获取 nginx webservice 日志位置。 然后查看 nginx 日志:/var/log/nginx/error.log 找出根本原因:

                      • 关键字:FastCGI 在标准错误中发送:“主脚本未知”
                      • 根本原因:php-fpm服务的账号:apache没有打开webapps目录的访问权限

                      第 0 步。 找到您的根目录: 打开/etc/nginx/nginx.conf文件找到root关键字

                      根目录:/var/lib/nginx/webapps/

                      第 1 步。确保 apache 帐户可以访问 ROOT 目录。

                      sudo -u apache ls -l /var/lib/nginx/webapps/
                      

                      第 2 步。 chmod a+x 对所有 ROOT 文件夹的权限

                      sudo chmod a+x /var/
                      sudo chmod a+x /var/lib/
                      sudo chmod a+x /var/lib/nginx/
                      sudo chmod a+x /var/lib/nginx/webapps/
                      

                      【讨论】:

                        【解决方案17】:

                        我已经在 nginx 版本中解决了这个问题:nginx/1.21.3 PHP 7.4.23 macOS Catalina 版本 10.15.7

                        nano /usr/local/etc/nginx/nginx.conf
                        
                        
                        location ~ \.php$ {
                                    root           html;
                                    include        fastcgi.conf; 
                                    fastcgi_pass   127.0.0.1:9000;
                                    fastcgi_index  index.php;
                                    #Comment bellow Line
                                    #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                                    #Add This line
                                    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                                    include        fastcgi_params;
                                }
                        

                        【讨论】:

                          猜你喜欢
                          • 2018-02-05
                          • 2017-09-05
                          • 1970-01-01
                          • 2014-08-04
                          • 2016-06-30
                          • 2021-11-16
                          • 1970-01-01
                          • 1970-01-01
                          • 2018-01-31
                          相关资源
                          最近更新 更多