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