Nginx + PHP - 未为 1 个服务器块指定输入文件。其他服务器块运行正常

Nginx + PHP - 未为 1 个服务器块指定输入文件。其他服务器块运行正常

我正在运行带有 nginx 1.2.6 的 Ubuntu Desktop 12.04。PHP 是 PHP-FPM 5.4.9。

这是我的相关部分nginx.conf

http {
    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

       server_name testapp.com;
       root /www/app/www/;
       index index.php index.html index.htm;

       location ~ \.php$ {

        fastcgi_intercept_errors on;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
       }
    }

    server {
        listen       80  default_server;
        root /www
        index index.html index.php;

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

相关内容来自php-fpm.conf

; Chroot to this directory at the start. This value must be defined as an
; absolute path. When this value is not set, chroot is not used.
; Note: you can prefix with '$prefix' to chroot to the pool prefix or one
; of its subdirectories. If the pool prefix is not set, the global prefix
; will be used instead.
; Note: chrooting is a great security feature and should be used whenever 
;       possible. However, all PHP paths will be relative to the chroot
;       (error_log, sessions.save_path, ...).
; Default Value: not set
;chroot = 

; Chdir to this directory at the start.
; Note: relative path can be used.
; Default Value: current directory or / when chroot
chdir = /www

在我的 hosts 文件中,我将 2 个域:testapp.com和重定向test.com127.0.0.1

我的网络文件全部存储在 中/www

根据上述设置,如果我访问test.com/phpinfo.phptest.com/app/www,一切都将按预期工作,并且我可以获得 PHP 的输出。

但是,如果我访问testapp.com,我就会看到可怕的No input file specified.错误。

因此,此时,我拉出日志文件并查看一下:

2012/12/19 16:00:53 [error] 12183#0: *17 FastCGI sent in stderr: "Unable to open primary script: /www/app/www/index.php (No such file or directory)" while reading response header from upstream, client: 127.0.0.1, server: testapp.com, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "testapp.com"

这让我很困惑,因为我检查了一遍又一遍,发现它/www/app/www/index.php确实存在!这也被“有效”的事实所验证,test.com/app/www/index.php这意味着文件存在,权限正确。

testapp.com为什么会发生这种情况? v-host出现故障的根本原因是什么?


我的调查刚刚有了更新:

我已经注释掉chrootchdir缩小php-fpm.conf了问题的范围

如果我删除location ~ \.php$的阻止testapp.com,则 nginx 将向我发送一个包含 PHP 代码的 bin 文件。这意味着在 nginx 方面,一切正常。

问题在于,在将文件路径传递给 PHP-FPM 时,某些东西一定会破坏文件路径。

话虽如此,但奇怪的是,default_server由于根是,因此 v-host 可以正常工作,而由于根是,因此 v-host/www无法正常工作。testapp.com/www/app/www

答案1

问题解决了。

在我的 中php.ini,我有:

doc_root = /www;

这意味着所有 php 请求都会/www添加到文件开头,这会导致问题。我还注释掉了它们chrootchdir因为php-fpm.conf它们还会在文件路径开头添加额外的位。

到目前为止一切顺利,然而,我将做更多的研究来获取chrootchdir努力确保安装的安全。

答案2

因此,对于 test.com,您将访问具有 /www/app/www 的文档根目录的第一个服务器块。

对于 testapp.com,您要访问 /www,然后希望 FPM 确定您要访问 /www/www/app/www/index.php

这不会发生。您能分享一下您的 fpm 配置的具体信息吗?特别是 chroot 和 chdir 部分?

相关内容