Я запускаю Ubuntu Desktop 12.04 с nginx 1.2.6. 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 отправит мне bin-файл, содержащий код PHP. Это означает, что со стороны nginx все в порядке.
Проблема в том, что что-то должно искажать пути к файлам при передаче в PHP-FPM.
Сказав это, довольно странно, что default_server
v-host отлично работает, потому что его корень /www
, где ничего не получится testapp.com
v-host, потому что корень /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 часть?