Högtrafikerade webbsidor med Nginx och PHP-FPM

Nginx och PHP-FPM har blivit något av en standard för högtrafikerade webbsidor, kombinationen en lättviktig webbserver och en vertikalt skalbar scriptmotor med relativt litet avtryck gör att det är ett prisvärt och smidigt sätt att driva sin webbsida.

Av någon anledning så kommer dom flesta linuxdistributioner, och de programpaket som skeppas med en minimal konfiguration, vilket gör att man ganska snabbt stöter på problem och flaskhalsar på grund av lågt satta begränsningar i operativsystemet.

En av de begränsningar man stöter på är att antalet tillåtna file descriptors (FD) för användaren som webbservern och eller PHP-FPM körs som är för lågt satta. Debian 6 skeppas med 1024 file descriptors / användare, och maxantalet i systemet brukar vara runt 3 miljoner. Exakt vilket antal FD man bör ha på användaren är svårt att säga, men förutsatt att servern inte kör fler applikationer än Nginx och PHP-FPM så kan man ta i ganska rejält, på en stor installation jag jobbar med så har användaren en gräns på runt 300 000, men jag kan inte se något fel i att öka den ännu mer.

Att felsöka filedescriptors

Till att börja med så vill man veta hur många FDs som systemet får ha som mest.

# sysctl fs.file-max
fs.file-max = 70000

Nu vet vi att systemet som mest kan ha 70 000 FDs. Hur många FDs används då?

#sysctl fs.file-nr
fs.file-nr = 1020 0 70000

Där 1020 är antalet aktiva filer (file handles), 0 antalet allokerade men inaktiva filer, och 70 000 är max antal. För att ta reda på max antal FDs för en specifik annvändare, logga in som användaren och kör:

#ulimit -Sn
1024
#ulimit -Hn
1024

ulimit talar om för dig hur många FDs som användaren får lov att ha öppna, 1024 är lagom för de flesta, men har du högt trafikerade servrar så kommer du behöva höja, det gör du genom att ändra gränsen i /etc/security/limits.conf

abergman                soft    nofile          65535
abergman                hard    no file          65535

Det gör att min användare, abergman får lov att ha 65535 file descriptors, för att ändringen ska slå igenom så måste webbservern och PHP-FPM startas om.

Referenser för dig som vill läsa mer, även ett stort tack till Tom för att han pekade mig i rätt riktning vad gäller mod_limits i PAM.
http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html
http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/
http://research.cs.wisc.edu/condor/condorg/linux_scalability.html

  • http://stefanjson.se Stefan Johansson

    Vad bra att du skriver om det här. Har letat information om detta men inte hittat något som är så här tydligt.

  • http://www.abergman.se Andreas Bergman

    Det är ett ganska vanligt fel, men det är inte helt lätt att få till, framför allt inte hitta vart man ska leta. Av någon anledning så är många linuxdistar konfade för en server med samma prestanda som en mobiltelefon, vilket jag inte riktigt fattar.

  • Pingback: Linux är helt felpaketerat | Andreas Bergman