27

I am trying to set a config for Nginx and am facing some issues.

In my sites-available there is default file which contains the below code:

server {
    server_name www.test.com test.com;
    access_log /sites/test/logs/access.log;
    error_log /sites/test/logs/error.log;
    root /sites/test;

 location ~ / {
    
index index.php
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Above code works perfectly when I write URL

www.test.com/service/public/

when I write

www.test.com/service/public/testservice (testservice is folder within public) it says No input file specified.

How can this be fixed?

I tried below, but no luck

http://nginxlibrary.com/resolving-no-input-file-specified-error/
http://blog.martinfjordvald.com/2011/01/no-input-file-specified-with-php-and-nginx/
Paulo Boaventura
  • 1,365
  • 1
  • 9
  • 29
Poonam Bhatt
  • 10,154
  • 16
  • 53
  • 72

20 Answers20

35

You must add "include fastcgi.conf" in

location ~ \.$php{
  #......
  include fastcgi.conf;
}
ang yao
  • 451
  • 4
  • 5
  • 3
    Thanks! i had the same problem (after upgrading nginx 1.2 to 1.6), and i changed: **include fastcgi_params;** to: **include fastcgi.conf;** and start working again!!! cheers! – mzalazar Mar 29 '15 at 17:09
  • I tried that, I got the same result. Here is my configuration : https://jsfiddle.net/bheng/t6jepya5/ . Any hints will be much appreciated ! – code-8 Jan 22 '16 at 17:02
  • you have a `$` in wrong place - it shoul be `location ~ \.php$ {` – Mike Jun 22 '20 at 04:17
23

Resolving "No input file specified" error

If you are using nginx with php-cgi and have followed the standard procedure to set it up, you might often get the “No input file specified” error. This error basically occurs when the php-cgi daemon cannot find a .php file to execute using the SCRIPT_FILENAME parameter that was supplied to it. I’ll discuss about the common causes of the error and it’s solutions. Wrong path is sent to the php-cgi daemon

More often than not, a wrong path (SCRIPT_FILENAME) is sent to the fastCGI daemon. In many of the cases, this is due to a misconfiguration. Some of the setups I have seen are configured like this :

server {
    listen   [::]:80;
    server_name  example.com www.example.com;
    access_log  /var/www/logs/example.com.access.log;  

    location / {
        root   /var/www/example.com;
        index  index.html index.htm index.pl;
    }

    location /images {
        autoindex on;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com$fastcgi_script_name;
        include fastcgi_params;
    }
}

Now, there are many things wrong with this configuration. An obvious and glaring issue is the root directive in the location / block. When the root is defined inside the location block, it is available/defined for that block only. Here, the location /images block will not match for any request because it does not have any $document _root defined and we will have to redundantly define root again for it. Obviously, the root directive should be moved out of the location / block and defined in the server block. This way, the location blocks will inherit the value defined in the parental server block. Of course, if you want to define a different $document_root for a location, you can put a root directive in a location block.

Another issue is that the value of the fastCGI parameter SCRIPT_FILENAME is hard-coded. If we change the value of the root directive and move our files somewhere else in the directory chain, php-cgi will return a “No input file specified” error because will not be able to find the file in the hard-coded location which didn’t change when the $document_root was changed. So, we should set SCRIPT_FILENAME as below :

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

We should keep in mind that the root directive should be in the server block or else, only the $fastcgi_script_name will get passed as the SCRIPT_FILENAME and we will get the “No input file specified” error.

source(Resolving "No input file specified" error)

Bikal Basnet
  • 1,639
  • 1
  • 21
  • 31
evergreen
  • 7,771
  • 2
  • 17
  • 25
12

Simply restarting my php-fpm solved the issue. As i understand it's mostly a php-fpm issue than nginx.

Sam Najian
  • 376
  • 3
  • 3
4

Same problem.

Cause : My root wasn't specified in open_basedir.
Fix : Adding my site root directory in :

/etc/php5/fpm/pool.d/mysite.conf<br>

by adding this directive :

php_value[open_basedir] = /my/root/site/dir:/other/directory/allowed
3

I solved it by replacing

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

$document_root with C:\MyWebSite\www\

fastcgi_param SCRIPT_FILENAME C:\MyWebSite\www\$fastcgi_script_name;
Fresco
  • 289
  • 3
  • 13
3

I tried all the settings above but this fixed my problem. You have to define nginx to check if the php file actually exists in that location. I found try_files $uri = 404; solving that problem.

location ~ \.php$ {
        try_files  $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock; 
        include fastcgi_params;
        fastcgi_index index.php;
}
3

This answers did not help me, my php adminer showed me "No input file specified" error anyway. But I knew I changed php-version before. So, I found the reason: it is not nginx, it is php.ini doc_root parameter! I found

doc_root =

in php.ini and changed it to

;doc_root =

After this patch my adminer work good.

Verter
  • 181
  • 2
  • 11
2

This is likely because with the trailing slash, NGinx tries to find the default index file which is probably index.html without configuration. Without the trailing slash it tries to match the file testservice which he can't find. Either this and/or you don't have any default index file in the testservice folder.

Try adding this line to your server configuration :

index  index.php index.html index.htm; // Or in the correct priority order for you

Hope this helps!

Edit

My answer is not very clear, see this example to understand what I mean

listen 80;

    server_name glo4000.mydomain.com www.glo4000.mydomain.com;


    access_log  /var/log/nginx/glo-4000.access.log;
    error_log /var/log/nginx/glo-4000.error_log;

    location / {
        root   /home/ul/glo-4000/;
        index  index.php index.html index.htm;
    }

    location ~ \.php$ {

        include fastcgi_params;
        fastcgi_pass   unix:/tmp/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /home/ul/glo-4000/$fastcgi_script_name;
    }
}
ddoor
  • 5,819
  • 9
  • 34
  • 41
Johnride
  • 8,476
  • 5
  • 29
  • 39
  • sorry...not helpful....I tried adding above line in server and removed trailing / as well...this is ZF2 modules which are call from this url which don't have index in it...plz help – Poonam Bhatt Jan 27 '14 at 13:13
  • Okay this is some important info. Have you seen this : http://stackoverflow.com/questions/19731555/how-to-make-zend-framework-2-work-with-nginx – Johnride Jan 27 '14 at 13:16
  • Have you had a different error code? What exactly are you trying? Have you tried useing a socket instead of `127.0.0.1:9000` Have you tried declaring your root in a `location /` statement with the `try files` command ? Do you have any error in your PHP-CGI logs? Do you have more verbose errors in your NGinx logs? – Johnride Jan 27 '14 at 13:38
  • i can't use socket as i didn't find socket file. yes I added root in `location / ` with `try_files $uri $uri/ /index.php;`. what my access.log says `'"GET /webvalue-services/public/testservice/ HTTP/1.1" 404 36 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36"'` . I dont know how to check Nginx and php-cgi logs? – Poonam Bhatt Jan 28 '14 at 05:02
  • You're not supposed to have the root directive in a location block: http://nginxlibrary.com/resolving-no-input-file-specified-error/ – djthoms Apr 11 '16 at 20:11
  • The php location block cannot access the root directive of sibling. The root should be in parent or within location block of php – Agnel Vishal May 30 '20 at 14:55
2

I tried all the options mentioned above, but found finally the solution. On my server the .php file was set to be readable by everyone, but it worked when I set the php-fpm to run under same user as nginx. I changed it in /etc/php/7.2/fpm/pool.d/www.conf and in the configuration file I set

user = nginx group = nginx

and then reloaded the php-fpm process Hope this helps

Jimbo
  • 21
  • 2
1
server {
    server_name www.test.com test.com;
    access_log /sites/test/logs/access.log;
    error_log /sites/test/logs/error.log;
    root /sites/test;

 location ~ / {

index index.php
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME `$document_root/service/public$fastcgi_script_name`;
}
Thomas Ward
  • 2,714
  • 7
  • 36
  • 51
Poonam Bhatt
  • 10,154
  • 16
  • 53
  • 72
  • Try adding /service/public to your `root` declaration. It is what this declaration is made for. If you have php/html/css/js files directly in the `/sites/test` folder, it has to be your root but it is not normal that you have to add stuff to your `document_root` to fit your `SCRIPT_FILENAME`. Also, your logs should not be there, they belong in a subfolder of /var/log/ like all the logs of your system daemons. My two cents. – Johnride Jan 28 '14 at 13:10
  • 1
    Glad you found your issue though, I had almost the same problem the first time I set NGinx, did not thought about it when I tried to help you. – Johnride Jan 28 '14 at 13:13
1

Same problem.

Reason old open_basedir settings copied with a rogue user.ini file in a backup

Solution delete it

ᴍᴇʜᴏᴠ
  • 4,804
  • 4
  • 44
  • 57
1

Okay, I assume you using php7.2 (or higher) on Ubuntu 16 or higher

if none of this worked, you must know nginx-fastCGI uses different pid and .sock for different sites hosted on the same server.

To troubleshoot 'No input file specified' problem, you must tell the nginx yoursite.conf file which one of the sock file to use.

  1. Uncomment the default fastcgi_pass unix:/var/run/php7.2-fpm.sock Make sure you have the following directives in place on the conf file,

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ \.php$ {
            try_files $uri /index.php =404;
            #fastcgi_pass unix:/var/run/php7.2-fpm.sock;
            fastcgi_pass unix:/var/php-nginx/158521651519246.sock/socket;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
    }
    
  2. have a look at the list of sock and pid files using ls -la /var/php-nginx/(if you have recently added the file, it should be the last one on the list)

3.copy the filename of the .sock file (usually a 15 digit number) and paste it to your location ~ \.php directive

fastcgi_pass unix:/var/php-nginx/{15digitNumber}.sock/socket;

and restart nginx. Let me know if it worked.

Arun Panneerselvam
  • 2,263
  • 1
  • 17
  • 24
0

I had the same Error and my Problem was, that I had my php-file in my encrypted home-directory. And I run my fpm with the www-data user and this user can't read the php-files even if the permissions on the file were right. The solutioin was that I run fpm with the user who owns the home-directory. This can be changed in folowing file:

/etc/php5/fpm/pool.d/www.conf

hope this will help you :)

FireGnome
  • 130
  • 4
0

My case: SELinux was enabled and denying php-fpm from executing my scripts.

Diagnosis: Temporarilly disable SELinux and see if the problem goes away.

$ sudo setenforce permissive
### see if PHP scripts work ###
$ sudo setenforce enforcing

Solution: Put the PHP directory in the httpd_sys_content_t context. You can use chcon or make the change persistent via semanage:

$ sudo semanage fcontext -a -t httpd_sys_content_t "/srv/myapp(/.*)?"
$ sudo restorecon -R -F /srv/myapp

You can use the context httpd_sys_rw_content_t where write permissions are needed.

sffc
  • 6,186
  • 3
  • 44
  • 68
0

use in windows

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

wasn't putting -b

php-cgi.exe -b 127.0.0.1:9000
Rishit Dagli
  • 1,000
  • 8
  • 20
0

For localhost - I forgot to write in C:\Windows\System32\drivers\etc\hosts

127.0.0.1 localhost

Also removed proxy_pass http://127.0.0.1; from other server in ngnix.conf

Vitalicus
  • 1,188
  • 13
  • 15
0

Alright I'm a noob but just to share what I encountered.

I set up Laravel Forge with Linode to run a static website from my github repo.

SSH into my Linode and verified that my html was updated however, upon visiting the public ip of my linode I saw the error msg 'No input file specified.

Went to Nginx configuration file in my forge and deleted the word 'public' so now its

root /home/forge/default;

restarted nginx server within forge and deployed again and now it can be accessed.

Bruce Tong
  • 1,366
  • 15
  • 14
0

It is possible that PHP-FPM service is not started or is listening on some other port than 9000.

hljubic
  • 89
  • 1
  • 3
0

Check the error log file. On windows, I checked and saw that the document root I specified in nginx.conf was using the back slash path separator "C:\nginx..." instead of the forward shash "C:/nginx...". So I suggest you check the error log file when you get "No input file specified" on your site to get a clue.

ekene
  • 111
  • 8
-1

If someone is still having trouble with it ... I solved it by correcting it this way:

Inside the site conf file (example: /etc/nginx/conf.d/SITEEXAMPLE.conf) I have the following line:

fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;

The error occurs because my site is NOT in the "/usr/share/nginx/html" folder but in the folder: /var/www/html/SITE/

So, change that part, leaving the code as below. Note: For those who use the site standard in /var/www/html/YOUR_SITE/

fastcgi_param  SCRIPT_FILENAME  /var/www/html/YOUR_SITE/$fastcgi_script_name;
Ru Chern Chong
  • 3,692
  • 13
  • 33
  • 43
Horodenko
  • 1
  • 1