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.com``127.0.0.1
我的網路文件都儲存在
/www
.從上面的設置中,如果我訪問
test.com/phpinfo.php
andtest.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出現問題的根本原因是什麼?只是對我的調查的更新:
我已經註釋掉
chroot
並chdir
縮小php-fpm.conf
問題範圍如果我刪除了
location ~ \.php$
for 的塊testapp.com
,那麼 nginx 會向我發送一個包含 PHP 程式碼的 bin 文件。這意味著在 nginx 方面,一切都很好。問題是在將文件傳遞給 PHP-FPM 時必須有一些東西破壞了文件路徑。
話雖如此,很奇怪
default_server
v-host 工作正常,因為它的 root 是/www
,而對於testapp.com
v-host 因為 root 是/www/app/www
.
問題解決了。
在我的
php.ini
中,我有:doc_root = /www;
這意味著所有 php 請求都會
/www
添加到文件的開頭,這會導致問題。我也已經註釋掉了,chroot
因為它們也會在文件路徑的開頭添加額外的位。chdir``php-fpm.conf
到目前為止,一切正常,但是,我將做更多的研究以獲得
chroot
併chdir
努力確保安裝。
因此,對於 test.com,您將訪問第一個具有 /www/app/www 文件根的伺服器塊。
對於 testapp.com,你點擊 /www,然後希望 FPM 發現你想去 /www/www/app/www/index.php
這不會發生。你能分享你的 fpm 配置的細節嗎?特別是 chroot 和 chdir 部分?