A mai napon az Ubuntu maintainerek frissítették a php5-fpm csomagot. A frissítés valamennyi támogatott szerververziót érinti, azaz 10.04-től 14.04-ig valamennyi Ubuntu szerver érintett. Csak egy nagyon apró javításról van szó, de mégis érdemes most kicsit jobban odafigyelni a frissítésre. A rutinszerű „apt-get dist-upgrade” után a PHP5 alapú lapok helyén könnyen 500/502 hibaoldalak jelenhetnek meg.
A probléma kiváltó oka
A szokásos beállítások szerint egy unix socketen (/var/run/php5-fpm.sock) keresztül zajlik a kommunkáció a webszerverek (Apache, Nginx, stb.) és a php5-fpm között. A php5-fpm csomagban található konfigurációs állományban (/etc/php5/fpm/pool.d/www.conf) állíthatóak be ennek socketnek a jogai. A konfigurációs fájl kommentjei szerint a futtató user/group érvényesül, és alapértelmezetten 0660 jogokat kap a socket. Ezt sugallják a kikommentezett, alapértelmezettnek tűnő értékek is.
; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. user = www-data group = www-data ; Set permissions for unix socket, if one is used. In Linux, read/write ; permissions must be set in order to allow connections from a web server. Many ; BSD-derived systems allow connections regardless of permissions. ; Default Values: user and group are set as the running user ; mode is set to 0660 ;listen.owner = www-data ;listen.group = www-data ;listen.mode = 0660
A probléma az, hogy a fenti beállítások mellett a socket root/root tulajdonossal és csoporttal jön létre. A 0660 jogok pedig nem teszik lehetővé, hogy a szokásosan www-data felhasználói jogokkal futtatott webszerverek olvashassák és írhassák ezt a socketet.
root@www:~# ls -l /var/run/php5-fpm.sock srw-rw---- 1 root root 0 Jun 23 22:41 /var/run/php5-fpm.sock
Miért csak mostani, szinte bagatell frissítés után jelentkezik a probléma? Egyszerű, a jogok eddig 0666 értéken voltak, azaz bárki írhatta, olvashatta a socketet. Ezt a biztonsági problémát szerették volna foltozni, csakhogy ezzel sok webszerver működésébe is beleszólt a frissítésük.
A probléma esetén az Apache error.log ilyesmit mutat:
[Mon Jun 23 20:00:01.837023 2014] [fastcgi:error] [pid 1800:tid 140664380520192] (13)Permission denied: [client 192.168.2.22:59586] FastCGI: failed to connect to server "/usr/lib/cgi-bin/php5-fcgi": connect() failed
Az Nginx kicsit értelmesebb (ebben is), ott az error.log ehhez hasonló sorokat tartalmaz:
2014/06/23 20:00:01 [crit] 1405#0: *4632 connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.2.22, server: www.example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "www.example.com"
A probléma megoldása
Nem kell nagy varázslatra gondolni, csupán érvényesítenünk kell az /etc/php5/fpm/pool.d/www.conf fájl vonatkozó, alapértelmezettnek hitt sorait. Ezt célszerű még a frissítés előtt megtenni, majd az állományt nem felülíratni a frissítés során. Néhány pontosvessző eltávolítása csodákra képes.
listen.owner = www-data listen.group = www-data
Remélem, hogy segítettem néhány embernek, hogy egy 2 percesnek gondolt frissítés ne éles weblapok leállásával járó hibakeresésbe torkolljon.