Nginx + PHP - No input file specified for 1 server block. Other server block works fine
Posted
by
F21
on Server Fault
See other posts from Server Fault
or by F21
Published on 2012-12-19T05:03:31Z
Indexed on
2012/12/20
5:04 UTC
Read the original article
Hit count: 413
I am running Ubuntu Desktop 12.04 with nginx 1.2.6. PHP is PHP-FPM 5.4.9.
This is the relevant part of my 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;
}
}
}
Relevant bits from 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
In my hosts file, I redirect 2 domains: testapp.com
and test.com
to 127.0.0.1
.
My web files are all stored in /www
.
From the above settings, if I visit test.com/phpinfo.php
and test.com/app/www
, everything works as expected and I get output from PHP.
However, if I visit testapp.com
, I get the dreaded No input file specified.
error.
So, at this point, I pull out the log files and have a look:
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"
This baffles me because I have checked again and again and /www/app/www/index.php
definitely exists! This is also validated by the fact that test.com/app/www/index.php
works which means the file exists and the permissions are correct.
Why is this happening and what are the root causes of things breaking for just the testapp.com
v-host?
Just an update to my investigation:
I have commented out chroot
and chdir
in php-fpm.conf
to narrow down the problem
If I remove the location ~ \.php$
block for testapp.com
, then nginx will send me a bin file which contains the PHP code. This means that on nginx's side, things are fine.
The problem is that something must be mangling the file paths when passing it to PHP-FPM.
Having said that, it is quite strange that the default_server
v-host works fine because its root is /www
, where as things just won't work for the testapp.com
v-host because the root is /www/app/www
.
© Server Fault or respective owner