1

Right, sorry for the previous, recent questions I've asked about nginx, this is just doing my head in.

I've enabled PHP using fastcgi_php and it works just fine, however, when I access to a PHP file, e.g.

http://domain.com/info.php

(which applies to var/www/domain.com/www/info.php)

Which includes the phpinfo() and nginx throws an 404 error... if I access to a normal file, e.g.

http://domain.com/index.html

It seems fine... how come nginx won't process with the PHP files?

This is the etc/nginx/sites-enabled/domain.com.

server { listen 80; server_name domain.com *.domain.com; access_log /var/www/domain.com/logs/nginx_access.log; error_log /var/www/domain.com/logs/nginx_error.log; root /var/www/domain.com/www/; location / { index index.html index.htm index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /var/www/nginx-default; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } # Enable PHP include /etc/nginx/fastcgi_php; } 

I have no clue what to do further...

EDIT:

My /etc/nginx/fastcgi_php

location ~ \.php$ { fastcgi_pass unix:/var/run/php-fastcgi/php.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; } 
1
  • What does error log say? Commented Sep 30, 2011 at 17:04

2 Answers 2

1

First make sure you have installed php-cgi apt-get install php5-cgi. Next create a startup script for fastCGI PHP.

Create the file /etc/init.d/fastcgi-php with the following content:

#!/bin/bash BIND_DIR=/var/run/php-fastcgi BIND="$BIND_DIR/php.sock" USER=www-data PHP_FCGI_CHILDREN=8 PHP_FCGI_MAX_REQUESTS=1000 PHP_CGI=/usr/bin/php-cgi PHP_CGI_NAME=`basename $PHP_CGI` PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND" RETVAL=0 start() { echo -n "Starting PHP FastCGI: " mkdir $BIND_DIR chown -R $USER $BIND_DIR start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS RETVAL=$? echo "$PHP_CGI_NAME." } stop() { echo -n "Stopping PHP FastCGI: " killall -q -w -u $USER $PHP_CGI RETVAL=$? rm -rf $BIND_DIR echo "$PHP_CGI_NAME." } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Usage: php-fastcgi {start|stop|restart}" exit 1 ;; esac exit $RETVAL 

Finally run the following commands (all as root if in Debian, or with sudo if in Ubuntu)

chmod 755 /etc/init.d/fastcgi-php update-rc.d fastcgi-php defaults /etc/init.d/fastcgi-php start 

and

/etc/init.d/nginx reload 

Now check if the info.php file shows up correctly.

Otherwise please post the output of the domains error log and access log.

12
  • It works! However, I got two errors when doing your steps update-rc.d: warning: /etc/init.d/fastcgi-php missing LSB information and - /etc/init.d/fastcgi-php: line 1: !#/bin/bash: No such file or directory. Is there anything to worry about? Commented Sep 30, 2011 at 16:37
  • One another thing, if access to a PHP file that doesn't exist, I get this output in my browser: No input file specified. Commented Sep 30, 2011 at 16:39
  • Sorry my fault: The first line should be #!/bin/bash instead of !#/bin/bash I also corrected it in my answer. Commented Sep 30, 2011 at 16:41
  • Regarding the No input file specified try adding error_page 404 /404.html; above error_page 500 502 503 504 /50x.html; in your /etc/nginx/sites-enabled/domain.com` file and restart nginx. Commented Sep 30, 2011 at 16:46
  • I did that, didn't prevent the No input file specified error. The file also exists in /var/www/domain.com/www/404.html. Commented Sep 30, 2011 at 17:00
1

You have fundamentally misunderstood how PHP works with Nginx. Your assumption that Apache == Nginx is incorrect. Nginx does not embed PHP within itself so if you try to access a PHP file then it's PHP throwing the 404 and not Nginx.

Sadly you have hidden your PHP configuration with include /etc/nginx/fastcgi_php; so I can't actually tell you if you've configured Nginx correctly, so please do provide your full configuration.

Meanwhile, you can verify that PHP is actually throwing the 404 by checking the returned headers and checking if you have X-Powered-By: PHP/5.3.8. If this is present then you need to verify that you're sending PHP the proper file path via the SCRIPT_FILENAME fastcgi_param. If that one is correct then PHP cannot read the file due to improper permissions, this can either be read access on the file itself or execute access on any of the parent directories.

4
  • Updated my post, sorry for not including the configuration file. Commented Sep 30, 2011 at 13:56
  • Remove the trailing slash from your root directive as $fastcgi_script_name; already starts with a /. Other than that the last paragraph with file permissions still apply. Commented Sep 30, 2011 at 14:14
  • I'm sorry, could you clarify that part? Commented Sep 30, 2011 at 14:16
  • I don't see which trailing slash apart from \. one and the file directories. Commented Sep 30, 2011 at 14:30

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.