Nginx

Nginx + PHP - 沒有為 1 個伺服器塊指定輸入文件。其他伺服器塊工作正常

  • December 20, 2012

我正在使用 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.com``127.0.0.1

我的網路文件都儲存在/www.

從上面的設置中,如果我訪問test.com/phpinfo.phpand test.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$for 的塊testapp.com,那麼 nginx 會向我發送一個包含 PHP 程式碼的 bin 文件。這意味著在 nginx 方面,一切都很好。

問題是在將文件傳遞給 PHP-FPM 時必須有一些東西破壞了文件路徑。

話雖如此,很奇怪default_serverv-host 工作正常,因為它的 root 是/www,而對於testapp.comv-host 因為 root 是/www/app/www.

問題解決了。

在我的php.ini中,我有:

doc_root = /www;

這意味著所有 php 請求都會/www添加到文件的開頭,這會導致問題。我也已經註釋掉了,chroot因為它們也會在文件路徑的開頭添加額外的位。chdir``php-fpm.conf

到目前為止,一切正常,但是,我將做更多的研究以獲得chrootchdir努力確保安裝。

因此,對於 test.com,您將訪問第一個具有 /www/app/www 文件根的伺服器塊。

對於 testapp.com,你點擊 /www,然後希望 FPM 發現你想去 /www/www/app/www/index.php

這不會發生。你能分享你的 fpm 配置的細節嗎?特別是 chroot 和 chdir 部分?

引用自:https://serverfault.com/questions/459237