There is a new version of this tutorial available for Debian 11 (Bullseye).

Installing Nginx With PHP5 And MySQL Support On Debian Squeeze

Version 1.0
Author: Falko Timme
Follow me on Twitter

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 with the IP address 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 [email protected] as well as [email protected], 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., 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

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
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 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/

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 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/


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: and here:

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;
                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
        #location ~ \.php$ {
        # pass the PHP scripts to FastCGI server listening on
        location ~ \.php$ {
                try_files $uri =404;
                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

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

Now we call that file in a browser (e.g.

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:



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".

Share this page:

Suggested articles

22 Comment(s)

Add comment


By: wilo


apt-get install lighttpd


update-rc.d -f lighttpd remove

instead of

apt-get install spawn-fcgi

is there any reason?

By: GarfieldWTF

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

By: neoselen

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

 Done on raspbian wheezy :)

By: Larsen

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

By: Anonymous

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.

By: Anonymous

Thank you so much !!

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

By: urza

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...


By: Edson Bassani

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!


By: Jimmie Hansson

Absolutely brilliant!

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

 Keep up the good work.

By: hjubal

It works like a charm! :)

By: Jean-Bruno

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 !


Great tutorial! Thank you Falko! I would just suggest that you use bigger code areas to eliminate scroll bars. Keep good work!

By: seno

Help me, followed the tutorial but in the end when i try to open in Firefox got 502 Bad Gateway

By: BigR

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! ;)


By: Emanuel

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

location ~ \.php$ { root /var/www; try_files $uri =404; fastcgi_pass; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; include fastcgi_params; }

By: Anonymous

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 :)

By: Joe Mighty

.. miss out removing apache2 completely (if debian 6 comes with it). Your resources WILL be depleted if apache2 is left on server, with nginx.

By: Tiberiu


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:

By: synth3tk

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!!!

By: Donna

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:

By: Pareen

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?

By: Pareen

With regards to my previous comment.


Found something here:

 Cannot understand what it is.