【问题标题】:FPM/Nginx: unable to open primary scriptFPM/Nginx:无法打开主脚本
【发布时间】:2014-09-22 22:08:27
【问题描述】:

我正在努力让 NGINX 和 PHP-FPM 有效地交谈。我的 NGINX 配置文件包含以下api 偏移量的定义:

    location /api {
        try_files $uri /api/index.php$is_args$args;
        gzip    off;
        fastcgi_pass    PHP:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_keep_conn off; 
        include         fastcgi_params;
    }

在我的 PHP 机器上,我有以下池配置:

[api]
listen = 9000
user = www-data
group = www-data
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.status_path = /status

然后我跟踪 NGINX 服务器的日志文件,并在访问网络服务器时使用:

http://localhost/api
# or 
http://localhost/api/index.php
# or ...
http://localhost/api/resources.json

我可以从 NGINX 服务器日志中看到 NGINX 正确匹配 /api 模式,但我收到以下错误:

[error] 14#0: *1 FastCGI sent in stderr: "Unable to open primary script: /app/html/websites/couchbase/api/index.php (No such file or directory)"

PHP 机器上的根目录是/app/html/websites/couchbase。我完全不知道这个错误的真正含义,或者更重要的是如何从这里调试它。任何帮助将不胜感激。

附言我尝试将 fast_cgi_param 中的 $document_root 引用替换为硬编码值,看看它是否有所作为。从某种意义上说,如果我将它指向一个不正确的目录,它会给我 No input file specified. 错误。我得到错误的唯一地方是它似乎指向正确的地方。


添加这个以防它有助于澄清...这是 PHP/FPM 机器上/app/html/websites/couchbase/api 的文件系统。

我创建了test.php 文件,该文件基本上只是回显“Ok”,但这并不比运行index.php 的主要目标更好。

注意:我不确定执行权限是否重要——如您所见,test.php 没有在图片中设置它们——但我已经尝试了两种方式,似乎没有任何区别。

【问题讨论】:

    标签: nginx fastcgi php


    【解决方案1】:

    错误是抱怨在根目录中找不到 index.php 文件。是在...couchbase/api 下还是在.../couchbase 下?在第二种情况下,您可以通过重定向来解决此问题。

    我认为您可以将try_files 移到location 块之外。我从来没有在这种重定向中使用过$is_args$args,我还没有测试过,但恕我直言,我认为你可以删除它。

    我认为您可以使用此配置解决此问题:

    root /app/html/websites/couchbase;
    
    try_files $uri /api/index.php$is_args$args;
    
    location /api {
        rewrite /api/(.*) $1 break;
        gzip    off;
        fastcgi_pass    PHP:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_keep_conn off; 
        include         fastcgi_params;
    }
    

    如果您包含以下指令,您可以拥有一个更干净的配置文件:

        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_keep_conn off; 
    

    fastcgi_params 文件中。

    【讨论】:

    • try_files 仅适用于 /api 模式,因此不适合将其移出位置块。 $is_args 和 $args 是非常有用的一对。它们允许您将要指定为参数的 URL 的任何剩余部分添加到主脚本。在这种情况下,所有对/api/some/other/place 的调用都将调用/api/index.php 并将some/other/place 作为参数传入。我已经在 OSX 上按原样工作了,现在在 Ubuntu 上只是行为不端。 :(
    • 关于couchbase/api 或只是couchbase 的位置的问题......它是前者。我在描述中添加了一张图片来显示该目录的文件内容(以防有什么跳出来)。
    • 非常非常奇怪。如果可以,尝试以运行 nginx 的用户身份登录(或使用su)。如果您在ls -l 命令中复制并粘贴错误日志中test.php 的路径,您会看到该文件吗?
    • 我以 root 身份登录——因为我在 Docker 中的容器中——我可以运行 PHP:php /app/html/websites/couchbase/api/test.php,我可以看到带有ls -l 的文件(这是屏幕截图上面的目录,但它也适用于文件)。
    • 它清楚地连接和辨别“现有”与“不存在”文件,但随后它会给出一条错误消息,表明它看不到该文件。不过,如果我要求一个不存在的文件,它的反应会有所不同。
    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    相关资源
    最近更新 更多