使用Nginx运行PHP时找不到文件

时间:2013-07-23 11:22:02

标签: php nginx

最近我安装了最新版本的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

15 个答案:

答案 0 :(得分:64)

尝试另一个* fastcgi_param *类似

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

答案 1 :(得分:39)

我遇到了“找不到文件”问题,因此我将“根”定义移到“服务器”括号中,为所有位置提供默认值。你总是可以通过赋予它自己的根目录来覆盖它。

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。

答案 2 :(得分:11)

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

  1. 如果你有
  2. ,那就是最好的
      

    fastcgi_param SCRIPT_FILENAME $ document_root $ fastcgi_script_name;

    1. 快速cgi参数的包含应该高于该行。

    2. 您所执行的所有目录(包括该文件)都应具有a+x权限,例如

    3. 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
      

答案 3 :(得分:2)

在我的例子中,PHP脚本本身返回了404代码。和nginx没什么关系。

答案 4 :(得分:2)

就我而言,这是因为未正确设置根网站目录的权限。要执行此操作,您需要在终端中运行它时位于父文件夹中:

sudo chmod -R 755 htmlfoldername

这将chmod你的html文件夹中的所有文件,出于安全原因不建议用于生产,但是应该让你看到该文件夹​​中的文件,以确保在排除故障时不是问题。

答案 5 :(得分:2)

我花了40分钟尝试用以下方法调试非工作/状态:

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

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

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

希望这有帮助。

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

我一直遇到同样的问题, 在测试期间,我遇到了两个问题:

1º:“找不到文件”

2º:404错误页面

我发现,就我而言:

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

如果已安装在 Nginx 中,但未安装在 PHP 中,则会显示:“ 找不到文件

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


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未找到页面错误

示例(将引发404页面未找到错误):

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

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

答案 9 :(得分:0)

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

也许首先要检查这类问题

是项目的路径。

答案 10 :(得分:0)

在获取“找不到文件”时,我的问题是在ngix配置中指向此行的文件夹中没有符号链接:

root /var/www/claims/web;

答案 11 :(得分:0)

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

(如果我找到了真正的原因,并且记住了这个答案,我会对其进行更新)

答案 12 :(得分:0)

尝试此命令

sudo chmod 755 -R htdocs/

答案 13 :(得分:0)

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

就我而言,我使用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;

由于{-{1}}文件(来自https://www.linuxbabe.com/ubuntu/install-nginx-latest-version-ubuntu-18-04的Qoute文件)中可以看到,PHP-FPM进程的默认用户和组是www-data:

/etc/php/7.2/fpm/pool.d/www.conf

此信息对您有很大帮助

答案 14 :(得分:0)

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

       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;