Kategória: Linux a sieť

Zmenené: 1. október 2011

Nginx a PHP vo Wheeze

Už je to nejaký čas, čo som tu zverejnil postup ako nastaviť odľahčený webový server Nginx. Priznám sa, že som ho nepoužíval, ale vyvstala mi potreba použiť zase niečo ľahké, tak som sa znova rozhodol pre tento server a neoľutoval som.

Tip

V popise predpokladám, že server Nginx je už nainštalovaný a obsluhuje statické stránky. Vzhľadom na to, že toto mi fungovalo hneď po inštalácii, ani sa tým zaoberať nebudem.

Inštalácia PHP

Inštalácia sa skladá z dvoch krokov, najprv potrebné minimum:

aptitude install php5-cli php5-common php5-suhosin php5-fpm php5-cgi

Pravdepodobne budete potrebovať (chcieť) aj ďalšie moduly PHP, v závislosti na tom, čo chcete používať (curl, mcrypt, ldap, snmpa podobne), takže si nainštalujte, čo potrebujete. Môžete skúsiť túto sadu balíkov:

aptitude install php-apc php-auth php-net-smtp php-net-socket php-pear php5-adodb \
        php5-curl php5-gd php5-imagick php5-imap php5-ldap php5-mcrypt \
        php5-mysql php5-pspell php5-sqlite php5-xmlrpc php5-xsl

Tento zoznam balíkov nie je žiadna dogma, ani odporúčanie, je to len príklad.

Nastavenie PHP5 FPM

FPM je skratka, ktorá označuje Fast Process Manager a slúži ako démon, ktorý obsluhuje požiadavky FastCGI. V Debiane je toto riešenie dostupné v balíku php5-fpm, jeho nastavenie je v adresári /etc/php5/fpm a predvolené nastavenie je postačujúce, možno však budete chcieť nahradiť riadok (/etc/php5/fpm/pool.d/www.conf):

listen=127.0.0.1:9000

riadkom:

listen=/dev/shm/php-fpm.socket

Táto zmena sa postará o to, že rozhranie FastCGI nebude vytvárať TCP spojenie (na adrese 127.0.01:9000), ale vytvorí unixový soket v zadanom súbore. Podľa toho, ktorý spôsob si vyberiete je potom treba upraviť konfiguráciu Nginx. Po zmene nastavenia ostáva FPM reštartovať:

invoke-rc.d php5-fpm restart

Nastavenie Nginx

V predvolenom stave je server Nginx nastavený na spracovanie statických stránok HTML. Aby dokázal spracovať aj skripty PHP je potrebných niekoľko úprav. Najprv nastavenie indexovej stránky, pričom východzí stav (/etc/nginx/sites-available/default) vyzerá takto:

server {
  index index.html index.htm;
}

Do toho treba pridať aj (alebo len) index.php, takže výsledok môže vyzerať takto (mením aj koreňový adresár, pretože predvolený je /usr/share/nginx/www):

server {
  root /srv/www;
  index index.php index.html;
}

Predvolený virtuálny hostiteľ Nginx má konfiguráciu PHP pripravenú, stačí odkomentovať príslušné riadky, ale vzhľadom na to, že som nastavil FPM na unixový soket, je to potrebné v nastavení zmeniť hodnotu direktívy fastcgi_pass. Pridal som tiež zobrazenie štandardnej chybovej stránky v prípade, že požadovaný skript neexistuje:

server {
  ...
  location~ .php$ {
    try_files       $uri @404;
    #fastcgi_pass    127.0.0.1:9000;
    fastcgi_pass    unix:/dev/shm/php-fpm.socket;
    #fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include         fastcgi_params;
  }

  location @404 {
    return404;
}

Ostáva server reštartovať:

invoke-rc.d nginx restart

Testovacia stránka

Pre istotu tu ešte uvádzam testovaciu stránku, ktorú si môžete uložiť do koreňového adresára (tu /srv/www/index.php):

<?php phpinfo(); ?>

Niekoľko postrehov

Pri pokuse o prístup k neexistujúcim adresárom (i súborom) som v prehliadači dostal chybové hlásenie 500 (interná chyba servera) namiesto správneho 404 (súbor neexistuje). Pri pátraní po príčine som si všimol v zázname riadky:

*1 rewriteor internal redirection cycle while internal redirect to "/kuk", client: 192.168.0.1,
    server: localhost, request: "GET /kuk H>P/1.1", host: "bridge.skk"

Po chvíľke pátrania na internete som našiel riešenie a pridal som do konfigurácie novú sekciu:

location/index.html {
  rewrite ^ /index.html break;
}

Záver

Od mojich posledných pokusov s webovým serverom Nginx v Debiane urobil správca balíkov veľký pokrok a to, čo poskytuje ako predvolenú konfiguráciu je funkčné riešenie ľahkého webového servera.