68

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

17 回答 17

89

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

fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
于 2013-07-23T15:17:26.290 回答
51

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

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;
    }
}

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

于 2014-04-07T19:18:48.470 回答
12

可能现在回答为时已晚,但有几件事,因为这是一个非常烦人的错误。以下解决方案适用于 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
于 2015-07-12T03:21:10.387 回答
11

我一直有同样的问题,在我的测试中,我遇到了这两个问题:

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 证书

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

于 2019-05-02T20:37:00.970 回答
3

我只花了大约 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 之后,它就恢复了正常。

希望这可以帮助。

于 2016-04-01T15:23:28.737 回答
2

就我而言,PHP 脚本本身返回 404 代码。与nginx无关。

于 2015-02-05T16:08:27.113 回答
2

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

sudo chmod -R 755 htmlfoldername

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

于 2015-05-04T23:12:36.740 回答
2

错误消息“主脚本未知或在您的情况下是找不到文件。” 几乎总是与 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.conf、 从更改user 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

愿这些信息有很大帮助

于 2020-05-04T08:42:53.710 回答
1

我也有这个错误。就我而言,这是因为有另一个虚拟主机指向同一个根目录。

于 2015-03-20T03:19:13.417 回答
1

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

于 2018-11-21T13:00:04.877 回答
0

该网站将显示“未找到文件”错误。

在此处输入图像描述

您应该检查此配置文件:/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/
于 2021-08-16T02:56:08.650 回答
0

试试这个命令

sudo chmod 755 -R htdocs/
于 2020-03-16T09:10:40.357 回答
0

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

root /var/www/claims/web;
于 2019-02-11T08:07:44.187 回答
0

我已经在 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;
        }
于 2021-09-21T19:21:19.547 回答
0

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

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

于 2019-12-02T04:24:06.903 回答
0

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

也许首先要检查这种问题

是项目的路径。

于 2016-11-20T08:13:03.767 回答
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;
于 2020-05-06T09:54:19.980 回答