nginx + php – przepis na kompilację

php-logoJak zapewne wiecie nie lubię mówić oczywistych-oczywistości. Ale kolejny raz spotykam „admina”, który uznaje wyłącznie oprogramowanie z pakietów.

W ogólności to dobre podejście, uznaje się że oprogramowanie dystrybuowane przez system pakietów w Linuksie jest sprawdzone, stabilne i bezpieczne.

Niestety system wydawniczy pakietów nie zawsze nadąża za rzeczywistością, lub nie przystaje do naszych specyficznych warunków.

Tym bardziej dotyczy to PHP oraz nginx. PHP ze względu na swój plan wydawniczy oraz specyfikę samego projektu. W wydaniach dystrybucyjnych najczęściej wszelkie dodatkowe moduły (np. PDO) są instalowane jako zewn. moduły, co wpływa na wydajność całego silnika. Dlatego najlepiej używane przez nas moduły od razu skompilować w core, a dodatki które są standardowo włączane – wyłączyć.
Natomiast nginx to mimo wszystko młody projekt, który dość prężnie się rozwija, ale zdarzają się również spore wpadki. W maju 2013 roku okazało się, że wersje nginx 1.1.4-1.2.8, 1.3.9-1.4.0 posiadają sporą lukę bezpieczeństwa.

Zatem do dzieła. Pierwsza kompilacja środowiska może Wam trochę zająć, ale już kolejne aktualizacje (wczoraj ukazała się wersja PHP 5.4.17) zajmują około 5-10 minut.

Najpierw musimy pamiętać, aby nasz system operacyjny posiadał odpowiednie biblioteki, które są potrzebne do kompilacji poszczególnych aplikacji. W naszym przykładzie jest to Debian 6.0. Instalacja wymaganych zależności:

Następnie ściągamy źródła PHP – http://php.net/downloads.php. Poniższe parametry konfiguracyjne powinny działać dla PHP 5.3/5.4/5.5 bez problemu.

Po rozpakowaniu źródeł w ichniejszym katalogu tworzymy sobie skrypt compile_php o zawartości:

Pierwsza linijka wyczyści nam projekt z poprzednich kompilacji. Następne to konfiguracja i kompilacja php (z obsługą php-fpm, php-cli, PDO, MySQL, GD, JPEG/PNG, mbstring, Exif, PEAR oraz kilka innych modułów).

Polecam zakomentować 2 ostatnie linijki, aby móc sprawdzić czy configure przebiegł poprawnie. Po make install nasza instancja PHP znajdzie się w /usr/local/php.

Konfiguracja i instalacja nginx jest o wiele prostsza. Stabilną wersję ściągamy z http://nginx.org/en/download.html i rozpakowujemy. Następnie tworzymy w nim plik compile_nginx, który później możemy wykorzystywać przy zmianie wersji:

Od razu do nginx-u wrzucamy obsługę SSL (https). I to wszystko. Mamy już w naszym systemie aktualny nginx i PHP (wraz z php-fpm).

Jeśli nie instalujemy PHP 5.5, które posiada opcode cache warto od razu zainstalować APC (pecl install apc-beta) i oczywiście skonfigurować PHP do korzystania z sesji opartych na memcached.
Jutro postaram się opublikować małe przykłady konfiguracji takiego zestawu.