Назад | Перейти на главную страницу

Nginx + PHP - для 1 серверного блока не указан входной файл. Другой серверный блок работает нормально

Я запускаю 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 часть?