Förhindra att PHP-FPM sänker din server

Igår kväll hade jag problem med att en av våra servrar höll på att gå under, vi har nyligen satt igång ett ganska prestandakrävande script på maskinen, och av någon anledning så verkar det ha hängt sig. Eftersom jag inte är skaparen av scriptet så låter jag det förbli osagt varför.

För att förhindra att PHP-FPM sänker din server så finns det en inbyggd funktion för att sätta max_execution_time, PHP har en egen variabel för det i php.ini, men om den inte funkar så kommer FPM döda workern åt dig. Det finns också en fin funktion som loggar vilka phpscript som kör för länge, på så sätt kan man hålla utkik och enkelt felsöka sina applikationer.

request_terminate_timeout = 30m
; The timeout for serving a single request after which a PHP backtrace will be
; dumped to the 'slowlog' file. A value of '0s' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
request_slowlog_timeout = 5s

; The log file for slow requests
; Default Value: /var/log/php5-fpm.log.slow
slowlog = /var/log/php5-fpm.log.slow

Jag väljer att ha 30minuters gräns för hur länge ett script får lov att köra, och det loggas i php5-fpm.log.slow efter 5s, på så sätt får jag snabbt information om ifall det är något som gått snett. Glöm inte starta om php5-fpm för att ändringarna ska slå igenom.


					

php5-fpm och “Short open tag”

I php så kan man tydligen fuska med taggarna, detta var inget jag visste sedan tidigare, men David visste. Så när han byggde www.ngweb.se så använda han sig av sådana taggar, dvs <? och ?>.

När vi sedan migrerade från apache2 till Nginx och php5-fpm så slutade dessa funka, ingen av oss visste riktigt varför men det visade sig efter att jag kollat igeom php.ini för php5-fpm att det är ett val i konfigurationen som stänger av eller slår på detta. Nu hade David redan fixat det här i koden, men det är värt att skriva ner ifall jag eller någon annan stöter på det igen. I konfigurationen för php5-fpm(och troligen all annan php) finns ett val som heter “short_open_tag” detta kan vara On eller Off, mer läsning om short_open_tag kan du hitta på: http://php.net/short-open-tag och www.cmsdirekt.se.

Installera Nginx med PHP5

Nginx är en snabb och effektiv webbserver med många användningsområden, den kan agera som gateway, lastbalanserare mm.
Jag ska installera den tillsammans med PHP5-FPM och  konfigurera upp en standardwebbsite. Det här gör jag på en maskin som kör debian stable/Debian Lenny. Många använder fastcgi för att köra php, men det finns ett bättre sätt; PHP5-FPM.

Vi börjar med att lägga till Dotdeb som källa för apt, detta gör att debian ännu så länge inte har php5-fpm paketerat.

sudo echo "deb http://php53.dotdeb.org stable all" >> /etc/apt/sources.list

Uppdatera nu paketförråden med apt-get update och installera sedan Nginx och php5-cli.

apt-get install nginx php5-cli php5-common php5-suhosin

Installera därefter php5-fpm.

apt-get install php5-fpm php5-cgi

Nu ska vi konfigurera en Virtuell Host i Nginx som kommer att använda php5. Jag utgår från Nginx default/exempel konfig som finns i /etc/nginx/sites-available/default

server {
        listen   80;
        server_name  localhost;
      access_log  /var/log/nginx/localhost.access.log;
        error_log   /var/log/nginx/localhost.error.log debug;

            location / {
                root   /var/www/nginx-default;
                index  index.html;
             }
          location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;
                include fastcgi_params;
            }
            location ~ /\.ht {
               deny  all;
            }

  }

Nu är det bara att skapa en fil i mappen /var/www/nginx/default med innehåller <?php phpinfo(); ?> och köra /etc/init.d/php5-fpm restart så ska det fungera och du bör se en text som liknar den nedan!

php5-fpm