Installing Nginx With PHP5 And MySQL Support On Debian Squeeze

Want to support HowtoForge? Become a subscriber!
 
Submitted by falko (Contact Author) (Forums) on Sun, 2011-02-27 20:29. :: Debian | Web Server | nginx

Installing Nginx With PHP5 And MySQL Support On Debian Squeeze

Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>
Follow me on Twitter
Last edited 02/24/2011

Nginx (pronounced "engine x") is a free, open-source, high-performance HTTP server. Nginx is known for its stability, rich feature set, simple configuration, and low resource consumption. This tutorial shows how you can install Nginx on a Debian Squeeze server with PHP5 support (through FastCGI) and MySQL support.

I do not issue any guarantee that this will work for you!

 

1 Preliminary Note

In this tutorial I use the hostname server1.example.com with the IP address 192.168.0.100. These settings might differ for you, so you have to replace them where appropriate.

 

2 Installing MySQL 5

In order to install MySQL, we run

apt-get install mysql-server mysql-client

You will be asked to provide a password for the MySQL root user - this password is valid for the user root@localhost as well as root@server1.example.com, so we don't have to specify a MySQL root password manually later on:

New password for the MySQL "root" user: <-- yourrootsqlpassword
Repeat password for the MySQL "root" user: <-- yourrootsqlpassword

 

3 Installing Nginx

Nginx is available as a package for Debian Squeeze which we can install as follows:

apt-get install nginx

Start nginx afterwards:

/etc/init.d/nginx start

The default nginx document root is /var/www which does not exist yet; therefore we must create it as follows:

mkdir /var/www
chown www-data:www-data /var/www

Type in your web server's IP address or hostname into a browser (e.g. http://192.168.0.100), and you should see the following page:

You get a 403 forbidden error because there's no index page in /var/www.

 

4 Installing PHP5

We can make PHP5 work in nginx through FastCGI. Fortunately, Debian Squeeze provides a FastCGI-enabled PHP5 package which we install like this (together with some PHP5 modules like php5-mysql which you need if you want to use MySQL from your PHP scripts):

apt-get install php5-cgi php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

Then open /etc/php5/cgi/php.ini and uncomment the line cgi.fix_pathinfo=1:

vi /etc/php5/cgi/php.ini

[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=1
[...]

There's no standalone FastCGI daemon package for Debian Squeeze, therefore we use the spawn-fcgi program from lighttpd. We install lighttpd as follows:

apt-get install lighttpd

You will see an error message saying that lighttpd can't start because port 80 is already in use:

Starting web server: lighttpd2011-02-24 01:43:18: (network.c.358) can't bind to port:  80 Address already in use
 failed!
invoke-rc.d: initscript lighttpd, action "start" failed.

That's how it's supposed to be because nginx is already listening on port 80. Run

update-rc.d -f lighttpd remove

so that lighttpd will not start at boot time.

We've installed lighttpd because we need just one program that comes with the package, /usr/bin/spawn-fcgi, which we can use to start FastCGI processes. Take a look at

spawn-fcgi --help

to learn more about it.

To start a PHP FastCGI daemon listening on port 9000 on localhost and running as the user and group www-data, we run the following command:

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid

Of course, you don't want to type in that command manually whenever you boot the system, so to have the system execute the command automatically at boot time, open /etc/rc.local...

vi /etc/rc.local

... and add the command at the end of the file (before the exit line):

[...]
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
[...]

 

5 Configuring nginx

The nginx configuration is in /etc/nginx/nginx.conf which we open now:

vi /etc/nginx/nginx.conf

The configuration is easy to understand (you can learn more about it here: http://wiki.codemongers.com/NginxFullExample and here: http://wiki.codemongers.com/NginxFullExample2)

First (this is optional) increase the number of worker processes and set the keepalive_timeout to a reasonable value:

[...]
worker_processes  5;
[...]
    keepalive_timeout   2;
[...]

The virtual hosts are defined in server {} containers. The default vhost is defined in the file /etc/nginx/sites-available/default - let's modify it as follows:

vi /etc/nginx/sites-available/default

[...]
server {
        listen   80; ## listen for ipv4
        listen   [::]:80 default ipv6only=on; ## listen for ipv6
        server_name  _;
        access_log  /var/log/nginx/localhost.access.log;
        location / {
                root   /var/www;
                index  index.php index.html index.htm;
        }
        location /doc {
                root   /usr/share;
                autoindex on;
                allow 127.0.0.1;
                deny all;
        }
        location /images {
                root   /usr/share;
                autoindex on;
        }
        #error_page  404  /404.html;
        # redirect server error pages to the static page /50x.html
        #
        #error_page   500 502 503 504  /50x.html;
        #location = /50x.html {
        #       root   /var/www/nginx-default;
        #}
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
                #proxy_pass   http://127.0.0.1;
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
                include         fastcgi_params;
        }
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny  all;
        }
}
[...]

server_name _; makes this a default catchall vhost (of course, you can as well specify a hostname here like www.example.com).

In the location / part, I've added index.php to the index line. root /var/www; means that the document root is the directory /var/www.

The important part for PHP is the location ~ \.php$ {} stanza. Uncomment it to enable it. Please make sure that you change the fastcgi_param line to fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; (replace /var/www with your vhost's document root) because otherwise the PHP interpreter won't find the PHP script that you call in your browser.

Make sure that there are some spaces between include and fastcgi_params; - in the default file this is written as one word which is a bug.

Now save the file and restart nginx:

/etc/init.d/nginx restart

Now create the following PHP file in the document root /var/www:

vi /var/www/info.php

<?php
phpinfo();
?>

Now we call that file in a browser (e.g. http://192.168.0.100/info.php):

As you see, PHP5 is working, and it's working through FastCGI, as shown in the Server API line. If you scroll further down, you will see all modules that are already enabled in PHP5, including the MySQL module:

 

6 Links

 

About The Author

Falko Timme is the owner of Boost Your Site mit Timme Hosting - ultra-schnelles nginx-WebhostingTimme Hosting (ultra-fast nginx web hosting). He is the lead maintainer of HowtoForge (since 2005) and one of the core developers of ISPConfig (since 2000). He has also contributed to the O'Reilly book "Linux System Administration".


Please do not use the comment function to ask for help! If you need help, please use our forum.
Comments will be published after administrator approval.
Submitted by Pareen (not registered) on Mon, 2013-03-18 22:54.
With regards to my previous comment.

 

Found something here: http://www.raspberrypi.org/phpBB3/viewtopic.php?t=17390&p=174866

 Cannot understand what it is.

Submitted by Pareen (not registered) on Mon, 2013-03-18 22:48.
When I run

"update-rc.d -f lighttpd remove" command, I get an error "update-rc.d: using dependency based boot sequencing".

Everything else goes fine. When I am trying to install "apt-get install php-apc" from your Drupal tutorial, I get the port 80 error again.

Any idea why this must be happening?
Submitted by Donna (not registered) on Sun, 2012-11-25 19:00.

I read that setting cgi.fix_pathinfo=1 opens your webserver to exploits. According to this blog you should set it to false ie 0:

https://github.com/jyr/MNPP/issues/17

Submitted by synth3tk (not registered) on Wed, 2012-09-19 00:38.
This was one of the most extremely helpful tutorials I've seen on nginx for Debian. Now I have PHP and MySQL up and running successfully. Thank you!!!
Submitted by Tiberiu (not registered) on Thu, 2012-06-07 15:21.

Hey,

I've used this article to install nginx&php, but then I read another one which points that there's no need to install fast-cgi because php5-cgi processes can be started and run. So you can skip the step with lighttpd in this tutorial... which is a good start, btw.

Read this for further info: http://tomasz.sterna.tv/2009/04/php-fastcgi-with-nginx-on-ubuntu/

Submitted by Joe Mighty (not registered) on Sat, 2012-04-28 15:31.
.. miss out removing apache2 completely (if debian 6 comes with it). Your resources WILL be depleted if apache2 is left on server, with nginx.
Submitted by BigR (not registered) on Tue, 2012-04-24 16:15.
hey there. If try i two times now and i don't get it don. the server it self works fine but the php5 not!
i am a noob yes right ;)
 
 please can SB tell me how i can install that thing on 6.0.1 64 BIT? 
 after i create the info.php i get the 404 error not found!
 maybe you can told me how to edit the host file so that it works in any way! ;)

THX
Submitted by Emanuel (not registered) on Tue, 2012-09-18 01:04.

You must probably add one line in ~ \.php$ location:

location ~ \.php$ { root /var/www; try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; include fastcgi_params; }
Submitted by Anonymous (not registered) on Thu, 2012-11-22 17:39.
Thx for your comment. I'm using a different document root than /var/www. Without the try_files it worked according to the howto. However with try_files, I got an 404. After adding the root statement it works again :)
Submitted by seno (not registered) on Wed, 2012-03-28 13:14.
Help me, followed the tutorial but in the end when i try to open in Firefox got 502 Bad Gateway
Submitted by vistad (registered user) on Sat, 2012-03-10 16:17.
Great tutorial! Thank you Falko! I would just suggest that you use bigger code areas to eliminate scroll bars. Keep good work!
Submitted by Jean-Bruno (not registered) on Sun, 2012-03-04 21:48.

A absolutely perfect tutorial. Many thank. Special ovation to the "Make sure that there are some spaces between  include and fastcgi_params;  - in the default file this is written as one word which is a bug." wow !

Submitted by hjubal (not registered) on Sun, 2011-11-27 10:09.
It works like a charm! :)
Submitted by Jimmie Hansson (not registered) on Thu, 2011-11-10 18:06.

Absolutely brilliant!

 Thanks for the informative and well-structured tutorial on this setup! You've made my day.

 Keep up the good work.

Submitted by Edson Bassani (not registered) on Sat, 2011-08-06 17:26.

Hey Falko, I have no words to thank you for your tutorial. I was able to get my VPS up and running in less than 1 hour with LNMP thanks your very good and clear explanation. The unique thing I needed to was reboot the container because I had a 503 Bad Gateway, maybe because I forgot to start spawn-fcgi from console. Did it and everything is running like a charm. Thanks again!

 

Submitted by urza (not registered) on Wed, 2011-07-20 17:15.

Thanks for your useful article.

Just an integration: in location ~ \.php$ stanza, you should add the following directive:

root /var/www;

otherwise, the DOCUMENT_ROOT php variable is set to an obscure /usr/local/nginx/html, perhaps rooted in the source code :-).

 It is weird, since such directive it is already declared in the stanza above...

 

Submitted by Anonymous (not registered) on Sun, 2011-05-22 05:33.

Thank you so much !!

it worked and am very happy after trying too much tutorials with no way to get this working 

Submitted by Anonymous (not registered) on Sun, 2011-04-17 17:26.

Looks like some competition who will make more articles for squeeze by CTRL+C , CTRL+V from LENNY tutorials.

  just apt-get install spawn-fcgi is all you need for  spawn-fcgi , no need to install lighttpd

with all dep.
Submitted by Larsen (not registered) on Tue, 2011-03-29 15:15.

Very nice howto. Thx a lot!

Instead of restarting nginx I would simply reload it after having changed the config:

/etc/init.d/nginx reload

Submitted by wilo (not registered) on Sat, 2011-03-12 05:49.

Why 

apt-get install lighttpd

and 

update-rc.d -f lighttpd remove

instead of

apt-get install spawn-fcgi

is there any reason?

Submitted by GarfieldWTF (not registered) on Sun, 2011-03-20 05:25.

I think the author make this tutorial suitable to be use in Debian Lenny as well.

Coz during Debian Lenny time, there is no such package "spawn-fcgi".

The standalone "spawn-fcgi" is only added into the repo start from Squeeze

Submitted by neoselen (not registered) on Thu, 2014-01-23 14:11.

there is another package wich is now a standalone working daemon:
php5-fdm.
So I can skip the lighttpd step :)

 Done on raspbian wheezy :)