我正在运行带有 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
和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出现故障的根本原因是什么?
我的调查刚刚有了更新:
我已经注释掉chroot
并chdir
缩小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
添加到文件开头,这会导致问题。我还注释掉了它们chroot
,chdir
因为php-fpm.conf
它们还会在文件路径开头添加额外的位。
到目前为止一切顺利,然而,我将做更多的研究来获取chroot
并chdir
努力确保安装的安全。
答案2
因此,对于 test.com,您将访问具有 /www/app/www 的文档根目录的第一个服务器块。
对于 testapp.com,您要访问 /www,然后希望 FPM 确定您要访问 /www/www/app/www/index.php
这不会发生。您能分享一下您的 fpm 配置的具体信息吗?特别是 chroot 和 chdir 部分?