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.
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.
Tack för tipsen Emil! Antar att jag tänkt på samma sätt som med Apache, ska genast justera upp KeepAlive!
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..
Tjena,
Informationen kommer från ett flertal exempel. Tack för länken, finns lite att göra!
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.
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.
12shrh