≡ Menu

Debian + Nginx + FastCGI + PHP5 + MySQL

Sedan några dagar tillbaka har jag gått över från Apache2 till Nginx (Engine-X) som är ett riktigt bra alternativ. Nginx är en otroligt resursnål webbserver och är dessutom mycket snabb jämfört med Apache när det gäller statiskt innehåll. Till mina hemsidor använder jag mig av WordPress, därför behöver jag köra PHP och MySQL.

På min server (VPS) kör jag Debian 5 Lenny och det är egentligen inga större svårigheter att komma igång med Nginx och köra PHP med FastCGI med en MySQL-server. Nginx blir populärare för varje dag som går tack vare dess driftsäkerhet, snabbhet och låga resursbehov. Nginx är som sagt även lätt att konfigurera och den dokumentation som finns är lätt att förstå.

Nedan tänkte jag i några steg beskriva hur du går tillväga för att komma igång med Nginx, FastCGI, PHP5 och MySQL5 på en server med Debian 5 Lenny.

Steg 1 – Installera MySQL 5

Börja med att köra följande kommando för att installera MySQL 5:

apt-get install mysql-server mysql-client

Under installationen kommer du få ange ett lösenord för root-användaren på din server.

New password for the MySQL "root" user: <--- ange_ditt_lösenord
Repeat password for the MySQL "root" user: <--- ange_ditt_lösenord

Steg 2 – Installera Nginx

Nginx finns som färdigt paket och installeras med följande kommando:

apt-get install Nginx

Efter installationen, starta nginx med följande kommando:

/etc/init.d/nginx start

För att bekräfta att Nginx körs kan du nu öppna din webbläsare och surfa in på din ip-adress. Du bör nu mötas av en sida med texten “Welcome to nginx!

Steg 3 – Installera PHP5

För att köra PHP med Nginx använder vi oss av FastCGI, dessa processer startas inte upp automatiskt av Nginx utan vi måste själva göra ett script som startar upp några processer av FastCGI. För att kunna  köra PHP och MySQL med Nginx skall du installera följande paket med detta kommando:

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

Efter installationen, öppna /etc/php5/cgi/php.ini och lägg till följande linje i slutet av filen, cgi.fix_pathinfo = 1.

Du öppnar filen med följande kommando:

nano /etc/php5/cgi/php.ini

Filen skall se ut enligt följande:

[...]
cgi.fix_pathinfo = 1

För att starta upp processer av FastCGI måste vi nu skapa ett script enligt följande:

#!/bin/bash
BIND=127.0.0.1:9000
USER=www-data
PHP_FCGI_CHILDREN=15
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: "
      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=$?
      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

Detta script startar upp 15 FastCGI-processer med användaren www-data på 127.0.0.1:9000. Scriptet skall sparas till /etc/init.d/php-fcgi.

För att göra detta, kör följande kommando:

nano /etc/init.d/php-fcgi

Klistra nu in scriptet och avsluta redigeraren med ctrl + x, tryck “y” för att spara, sedan “enter“. Du måste även göra skriptet körbart:

chmod +x /etc/init.d/php-fastcgi

Installera nu scriptet så att det körs när du startar din server:

update-rc.d php-fcgi defaults

Steg 4 – Konfigurera Nginx

Du hittar konfigurationsfilen för Nginx på /etc/nginx/nginx.conf och vi öppnar den med följande kommando:

nano /etc/nginx/nginx.conf

Följande värden kan vara intressanta att ändra:

[...]
worker_processes  5;
[...]
keepalive_timeout   60;
[...]
server_names_hash_bucket_size 128;
[...]

Enligt Nginxs dokumentation bör du köra en process per kärna, i mitt fall 5. Timeout för keep alive har jag valt till 60 (Läs kommentaren efter artikeln som Emil har lämnat, tack!). Default för server_names_hash_bucket_size kan vara för lågt om du använder dig av virutal hosts och nginx kommer i det fallet inte att starta, därför har jag valt värdet 128.

Du kan konfigurera virtual hosts genom att lägga till fler konfigurationsfiler i /etc/nginx/sites-available/ och sedan göra symboliska länkar till dessa i /etc/nginx/sites-enabled/. Exempel på en konfigurationsfil är:

server {
	listen   80;
	server_name  exempel.se www.exempel.se;

	access_log  /var/log/nginx/localhost.access.log;

	location / {
		root   /var/www/nginx-default;
		index  index.html index.php;
	}

	# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
	#
	location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
		fastcgi_param  SCRIPT_FILENAME /var/www/nginx-default$fastcgi_script_name;
		fastcgi_index  index.php;
                include        fastcgi_params;
	}
}

Förserver_name anger du din domän(er) med subdomäner som du vill koppla till den konfigurationsfilen. I location anger du med root sökvägen till din virtual host och med index vilka filtyper som skall öppnas som default då URL:en avslutas med ett “/”.

För att köra PHP måste vi ange att alla PHP-filer skall köras med FastCGI varav vissa parametrar för detta måste anges. I exemplet skickas PHP-scripts till FastCGI-servern på 127.0.0.1:9000. Vi inkluderar även konfigurationsfilen “fastcgi_params”.

När du gjort dina önskade förändringar så starta om nginx:

/etc/init.d/nginx restart

För att kontrollera att PHP fungerar som det skall så skapa en PHP-fil för att köra phpinfo().

nano /var/www/nginx-default/info.php

Skriv in följande men börja med “<” och avsluta med “>”:

?php
phpinfo();
?

Gå nu till din ip-adress/serverdomän och öppna info.php, http://exempel.se/info.php. Du bör nu kunna se PHP-info och allt bör fungera som det ska!

Det är säker mycket som är oklart efter denna genomgång så ställ frågor så ska vi nog kunna lösa ditt problem om det uppstår något.

{ 6 comments… add one }
  • Emil Vikström 08/06/2010, 3:17 pm

    Nginx är sjukt resurssnålt när det gäller hanteringen av öppna uppkopplingar, så att sätta KeepAlive till ett lågt värde som du gjort förstör halva nöjet med att kasta ut Apache.
    För att öka upplevelsen rekommenderar jag att du skruvar upp värdet ordentligt, minst en minut men det skadar inte att sätta den på ett mycket högre värde (t.ex. en kvart).

    Gränsen på antalet samtidiga uppkopplingar (det man riskerar att slå i taket med när man har KeepAlive) är inte webbservern,som i fallet med Apache, utan operativsystemet. Det finns flaggor till kärnan så att du utan problem klarar hundratusentals samtidiga uppkopplingar i Linux; ifall du skulle behöva öka på standardvärdena rekommenderar jag denna artikel (läs framförallt avsnitten 4.2 – 4.4.2 där det finns inställningar för TCP/IP):
    http://www.stdlib.net/~colmmacc/Apachecon-EU2005/scaling-apache-handout.pdf

    Bra guide för övrigt, ska spara den som referens.

  • J.Backlund 09/06/2010, 7:05 am

    Tack för tipsen Emil! Antar att jag tänkt på samma sätt som med Apache, ska genast justera upp KeepAlive!

  • Tomas 01/12/2010, 10:38 am

    Guiden rakt av från enn anna site antar jag?

    menadade dock inte att gnälla men läs:
    http://wiki.nginx.org/Pitfalls

    du kommer se att du med den confen du har i howton så har du stort förbättringsutrymme..

  • J.Backlund 08/12/2010, 11:16 pm

    Tjena,

    Informationen kommer från ett flertal exempel. Tack för länken, finns lite att göra!

  • joakim 31/10/2011, 4:43 pm

    För andra som följer den här guiden kan det vara bra att veta att kommandot för att installera php innehåller en massa komponenter som det inte alls är säkert att du behöver, php5-memcache, php5-sqlite och php5-tidy är t.ex. ganska speciella paket.

  • carnosine eye drops 13/01/2013, 10:26 am

    nginx ifall du bygger en lite större site med belastning. Jag kör faktiskt uppsättningen att jag kör nginx som frontend. alla statiska filer serverar jag direkt med nginx. Om filen inte finns eller heter .php så reverseproxyar jag till apache som då bara kör php.

Leave a Comment