Jakiś czas temu przygotowałem poradnik dotyczący przygotowania i konfiguracji serwera WWW (Apache2 + PHP + MySQL + phpMyAdmin) dla np. serwera VPS opartego na systemie Linux Debian (konkretnie jego wersji przeznaczonej dla Raspberry Pi – Raspbian).
Po statystykach, komentarzach, jak i ilości „linków zwrotnych” widzę, że temat dla wielu z Was istotny – dlatego dziś będzie jego kontynuacja, a dokładniej modyfikacja niektórych aspektów pracy związanych w większości z obsługą plików PHP…
Spis treści w artykule
Apache2 MPM-Worker (Worker MPM) + PHP(5)-FPM
Zmiana ta ma głównie (choć nie tylko) na celu przyspieszenie działania bardziej rozbudowanych stron, pisanych w PHP – np. WordPress, i należy niniejszą konfiguracje traktować jako „alternatywną” dla opisanej wcześniej.
Instalacja serwera Apache2 + PHP(5)-FPM
Instalację zaczynamy od aktualizacji, po czym:
sudo apt-get install apache2 apache2-utils
sudo apt-get install apache2-mpm-worker
Następnie:
sudo apt-get install php5 php5-fpm php5-imap php5-common php5-curl php5-mcrypt php5-gd
(tu można część modułów odjąć, inne dodać – zależnie od potrzeb)
Raspbian (Raspberry Pi) i libapache2-mod-fastcgi
W przypadku Raspberry Pi i systemu Raspbian (Debian) prawdopodobnie instalacja zostanie przerwana m.in. z powodu braku pakietu „libapache2-mod-fastcgi”, dlatego w powyższej komendzie należy go pominąć:
sudo apt-get install php5 php5-fpm php5-imap php5-common php5-curl php5-mcrypt php5-gd
Modyfikujemy – jeśli jeszcze tak nie macie – plik sources.list zgodnie z tym wpisem, i następnie aktualizujemy system:
sudo apt-get update
sudo apt-get upgrade
Następnie:
sudo apt-get install debhelper dpatch libtool cdbs libapr1-dev apache2-threaded-dev
I instalujemy „libapache2-mod-fastcgi” ze źródeł:
sudo apt-get -b source libapache-mod-fastcgi
sudo dpkg -i libapache2-mod-fastcgi*.deb
Dalej działamy już standardowo, czyli:
Aktywacja modułu:
sudo a2enmod actions fastcgi alias
Konfiguracja PHP(5)-FPM
Dodajemy obsługę PHP-FPM do wszystkich vHostów (globalnie):
sudo nano /etc/apache2/conf.d/php5-fpm.conf
i wpisujemy:
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
</IfModule>
<IfModule mod_alias.c>
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
<Directory /var/www/cgi-bin/>
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
</IfModule>
<IfModule mod_actions.c>
Action application/x-httpd-php /cgi-bin/php5
</IfModule>
I restart serwera:
sudo service apache2 restart
Można też zrestartować moduł PHP5-FPM:
sudo /etc/init.d/php5-fpm restart
Konfiguracja PHP (php.ini) w tym wariancie znajduje się w pliku:
/etc/php5/fpm/php.ini
Dodatkowy plik konfiguracyjny – czasem i w nim trzeba coś zmienić:
/etc/php5/fpm/pool.d/www.conf
PHP Info – czyli sprawdzamy czy wszystko działa
Jeśli to czysta/nowa instalacja, to można założyć, że jak się wyświetlają strony HTML i PHP to na pewno działa… ;-)
Ale można sprawdzić to bardziej profesjonalnie, w tym celu tworzymy plik „phpinfo.php” o takiej zawartości:
<?php
phpinfo();
?>
I otwieramy go w przeglądarce – powinniśmy zobaczyć stronę z parametrami serwera:
Server API: FPM/FastCGI
Gdzie standardowo (Apache2/PHP-MOD) wygląda to jakoś tak:
Server API: Apache 2.0 Handler
Po teście skasujcie plik – po co kusić los… ;-)
Czy warto?
Można zaoszczędzić trochę pamięci RAM… Na pewno czas wykonywania operacji (głównie chodzi o PHP) będzie niższy o ok 20-50%, a czasem nawet więcej… Ale jeśli macie już postawiony serwer i wszystko działa Wam stabilnie, bez zadyszek – chyba nie ma co, bo zawsze jest ryzyko „usterki” przy tej operacji… Choć „podmiana” nie jest trudna, i jeśli macie chwile czasu… ;-)
Natomiast jeśli dopiero zaczynacie – zdecydowanie warto, tu nawet nie ma co się zastanawiać.
Szybki test – standardowa konfiguracja, rozbudowana strona na WordPressie:
Szybki test – Apache2 MPM-Worker + PHP(5)-FPM, ta sama strona na WordPressie:
Oba testy dzieli ok 8-10 minut, zostały zrobione na kopii tej strony przeniesionej na testowy serwer VPS (512MB RAM) w DigitalOcean (AMS2). Test był wykonywany z kolejnego testowego serwera – również w DigitalOcean, w tej samej lokalizacji – AMS2.
A dla miłośników „dobrego kina” – wersja wideo poradnika
Nijaki „P” i jego przygody opisane szerzej w komentarzach poniżej skłoniły mnie do nagrania w formie wideo poradnika niniejszego poradnika:
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01
witam,
podczas instalacji modulow wyskakuje mi taki problem
~ $ sudo apt-get install php5 php5-fpm libapache2-mod-fastcgi php5-imap php5-common libapache2-mod-php5 php5-curl php5-mcrypt php5-gd
Reading package lists… Done
Building dependency tree
Reading state information… Done
Package libapache2-mod-fastcgi is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'libapache2-mod-fastcgi’ has no installation candidate
A jaki system?
Sprawdź czy masz ustawione odpowiednie „źródła pakietów” w systemie:
Ja zazwyczaj dla aktualnego Debiana stosuje:
deb http://ftp.pl.debian.org/debian/ wheezy main non-free contrib
deb-src http://ftp.pl.debian.org/debian/ wheezy main non-free contrib
deb http://security.debian.org/ wheezy/updates main contrib non-free
deb-src http://security.debian.org/ wheezy/updates main contrib non-free
deb http://ftp.pl.debian.org/debian/ wheezy-updates main non-free contrib
deb-src http://ftp.pl.debian.org/debian/ wheezy-updates main non-free contrib
Pamiętaj tylko by po modyfikacji źródeł zaktualizować/odświeżyć listę pakietów w systemie:
Zamiast „apt-get” możesz ew. użyć „aptitude”.
mam zaktualizowany raspibian do 3.12.26+ #708
z aptitude:
~ $ sudo aptitude install php5 php5-fpm libapache2-mod-fastcgi php5-imap php5-common libapache2-mod-php5 php5-curl php5-mcrypt php5-gd
No candidate version found for libapache2-mod-fastcgi
No candidate version found for libapache2-mod-fastcgi
The following NEW packages will be installed:
apache2-mpm-prefork{ab} libapache2-mod-php5 libc-client2007e{a} libmcrypt4{a} libonig2{a} libqdbm14{a} lsof{a}
mlock{a} php5 php5-cli{a} php5-common php5-curl php5-fpm php5-gd php5-imap php5-mcrypt
0 packages upgraded, 16 newly installed, 0 to remove and 0 not upgraded.
Need to get 9,460 kB of archives. After unpacking 26.2 MB will be used.
The following packages have unmet dependencies:
apache2-mpm-prefork : Conflicts: apache2-mpm which is a virtual package.
apache2-mpm-worker : Conflicts: apache2-mpm which is a virtual package.
The following actions will resolve these dependencies:
Remove the following packages:
1) apache2-mpm-worker
Accept this solution? [Y/n/q/?] n
The following actions will resolve these dependencies:
Keep the following packages at their current version:
1) apache2-mpm-prefork [Not Installed]
2) libapache2-mod-php5 [Not Installed]
Accept this solution? [Y/n/q/?] n
*** No more solutions available ***
The following actions will resolve these dependencies:
Keep the following packages at their current version:
1) apache2-mpm-prefork [Not Installed]
2) libapache2-mod-php5 [Not Installed]
Accept this solution? [Y/n/q/?] q
Abandoning all efforts to resolve these dependencies.
Abort.
sources.list:
deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
No to już wszystko jasne – kluczowa informacja to ta, że jest to Raspbian i Raspberry Pi…
Zaktualizowałem wpis/poradnik o stosowne informacje, od razu też przetestowałem na jakiejś testowej sztuce – wszystko poszło OK, i działa…
próbuję według zmodyfikowanej metody i podczas instalacji modułów apt-get jak i aptitude cały czas wskazują ze zainstalują m.in. apache2-mpm-prefork. Czy tak powinno być? Aptitude dodatkowo chce usunąć apache2-mpm-worker.
Zainstaluj standardowo Apache2, następnie zainstaluj apache2-mpm-worker – co od razu podmieni/zastąpi „apache2-mpm-prefork”. Teraz PHP-FPM, ale z uwzględnieniem uwag dotyczących instalacji „libapache-mod-fastcgi” w przypadku Raspbian/Raspberry Pi… To trochę potrwa (instalacja libapache-mod-fastcgi ze źródeł), po czym działasz dalej wg opisu + ew. z opisu „podstawowego” phpMyAdmin i MySQL…
Specjalnie przy aktualizacji wpisu sprawdziłem na Raspberry Pi ze standardową instalacją Apache2 + to co w opisie (z uwzględnieniem dodatku dla Raspbiana), i zadziałało za pierwszym razem…
ps. dodalem wpis dot. deb-src w sources.list
~ $ sudo aptitude purge apache2 apache2-utils
The following packages will be REMOVED:
apache2{p} apache2-mpm-worker{u} apache2-utils{p} apache2.2-bin{u} apache2.2-common{u} libapr1{u} libaprutil1{u}
libaprutil1-dbd-sqlite3{u} libaprutil1-ldap{u}
0 packages upgraded, 0 newly installed, 9 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 4,825 kB will be freed.
Do you want to continue? [Y/n/?] y
…
~ $ sudo aptitude install apache2 php5 libapache2-mod-php5 php5-curl php5-mcrypt php5-gd
The following NEW packages will be installed:
apache2 apache2-mpm-prefork{ab} apache2-mpm-worker{ab} apache2-utils{a} apache2.2-bin{a} apache2.2-common{a}
libapache2-mod-php5 libapr1{a} libaprutil1{a} libaprutil1-dbd-sqlite3{a} libaprutil1-ldap{a} libmcrypt4{a} libonig2{a}
libqdbm14{a} lsof{a} php5 php5-cli{a} php5-common{a} php5-curl php5-gd php5-mcrypt
0 packages upgraded, 21 newly installed, 0 to remove and 0 not upgraded.
Need to get 7,364 kB/7,531 kB of archives. After unpacking 22.1 MB will be used.
The following packages have unmet dependencies:
apache2-mpm-prefork : Conflicts: apache2-mpm which is a virtual package.
apache2-mpm-worker : Conflicts: apache2-mpm which is a virtual package.
The following actions will resolve these dependencies:
Keep the following packages at their current version:
1) apache2-mpm-worker [Not Installed]
Accept this solution? [Y/n/q/?] y
The following NEW packages will be installed:
apache2 apache2-mpm-prefork{a} apache2-utils{a} apache2.2-bin{a} apache2.2-common{a} libapache2-mod-php5 libapr1{a}
libaprutil1{a} libaprutil1-dbd-sqlite3{a} libaprutil1-ldap{a} libmcrypt4{a} libonig2{a} libqdbm14{a} lsof{a} php5
php5-cli{a} php5-common{a} php5-curl php5-gd php5-mcrypt
0 packages upgraded, 20 newly installed, 0 to remove and 0 not upgraded.
Need to get 7,364 kB/7,528 kB of archives. After unpacking 22.1 MB will be used.
Do you want to continue? [Y/n/?] y
…
Processing triggers for libapache2-mod-php5 …
[….] Reloading web server config: apache2apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
. ok
~ $ sudo aptitude install apache2-mpm-worker
The following NEW packages will be installed:
apache2-mpm-worker{b}
0 packages upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/2,256 B of archives. After unpacking 56.3 kB will be used.
The following packages have unmet dependencies:
apache2-mpm-prefork : Conflicts: apache2-mpm which is a virtual package.
apache2-mpm-worker : Conflicts: apache2-mpm which is a virtual package.
The following actions will resolve these dependencies:
Remove the following packages:
1) apache2-mpm-prefork
2) libapache2-mod-php5
3) php5
Accept this solution? [Y/n/q/?] y
The following NEW packages will be installed:
apache2-mpm-worker
The following packages will be REMOVED:
apache2-mpm-prefork{a} libapache2-mod-php5{a} php5{a}
0 packages upgraded, 1 newly installed, 3 to remove and 0 not upgraded.
Need to get 0 B/2,256 B of archives. After unpacking 7,530 kB will be freed.
Do you want to continue? [Y/n/?] y
…
Setting up apache2-mpm-worker (2.2.22-13+deb7u3) …
[….] Starting web server: apache2apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
. ok
~ $ sudo aptitude install php5 php5-fpm php5-imap php5-common libapache2-mod-php5 php5-curl php5-mcrypt php5-gd
The following NEW packages will be installed:
apache2-mpm-prefork{ab} libapache2-mod-php5 libc-client2007e{a} mlock{a} php5 php5-fpm php5-imap
0 packages upgraded, 7 newly installed, 0 to remove and 0 not upgraded.
Need to get 3,265 kB/5,715 kB of archives. After unpacking 16.5 MB will be used.
The following packages have unmet dependencies:
apache2-mpm-prefork : Conflicts: apache2-mpm which is a virtual package.
apache2-mpm-worker : Conflicts: apache2-mpm which is a virtual package.
The following actions will resolve these dependencies:
Remove the following packages:
1) apache2-mpm-worker
Accept this solution? [Y/n/q/?]
Może zacznij od posprzątania pakietów (dezinstalacja), a później w kolejności jakiej pisałem w jednym z wcześniejszych komentarzy…
Nie instaluj „libapache2-mod-php5”, został tam „z rozpędu” – do korekty…
Specjalnie dziś na potrzeby 'uzupełnienia’ na jednej Malinie zmieniłem Apache2 + MOD-PHP na Apache2 + PHP-FPM, i wszystko poszło OK…
no wlasnie na poczatku posprzatalem,
pozniej instalacja apache wg 1 poradnika, czyli:
apache2 php5 libapache2-mod-php5 php5-curl php5-mcrypt php5-gd
nastepnie instalacja apache-mpm-worker
(tutaj odinstalowuja sie: apache2-mpm-prefork, libapache2-mod-php5 i php5)
teraz dodaje wg poradnika 2: php5 php5-fpm php5-imap php5-common libapache2-mod-php5 php5-curl php5-mcrypt php5-gd
i w tym miejscy chce mi odinstalowac apache2-mpm-worker
nie wiem w czym robie blad.
ok,
zainstalowalem wszystko od povczatku wg metody 2. nie instalowalem tylko modulu libapache2-mod-php5, bo podczas proby instalacji wyrzucalo niezgodnosc z apache2-mpm-worker i dezinstalacje tego.
i teraz mam kolejny problem z konfiguracja php(5)-fpm:
~ $ sudo nano /etc/apache2/conf.d/php5-fpm.conf (wypelniam zawartosc na podstawie tego poradnika)
~ $ sudo /etc/init.d/apache2 restart
Syntax error on line 6 of /etc/apache2/conf.d/php5-fpm.conf:
Invalid command 'Authorization’, perhaps misspelled or defined by a module not included in the server configuration
Action 'configtest’ failed.
The Apache error log may have more information.
failed!
Prawdopodobnie linijka:
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
rozbiła Ci się na 2 oddzielne, i stąd problem…
Ew. trzymaj gotowy plik (najlepiej prawym i „zapisz jako”, lub otwórz bezpośrednio w przeglądarce).
PS. Kosztujesz mnie czasu, aż nagrałem wideo z opisywaną zmianą… ;-)
ok, a zatem u mnie serwer tez teraz juz funka.
No to OK :-)
Na publikację czeka napisany już jakiś czas temu poradnik o kolejnym kroku, czyli zmiana duetu Apache2 + PHP-FPM na Nginx + PHP-FPM, więc jest chyba szansa, że jeszcze jakieś komentarze wymienimy ;-)
Pozdrawiam
Jest możliwość skonfigurowania dla każdego vhosta osobnego użytkownika
Obecnie jest to www-data, jednak ja chciałbym aby dla vhosta
xxx
użytkownikiem był xxx
dla yyy
użytkownik: yyy
Jest możliwe coś takiego osiągnąć.
Zauważyłem że zmiana użytkownika jest możliwa w pliku /etc/php5/fpm/pool.d/www.conf (chyba) czyli wychodzi na to że musiałbym utworzyć ten plik dla każdego vhosta osobno.
Możliwość oczywiście jest, choć… W przypadku Apache2 możesz zainteresować się „Apache 2 ITK MPM”:
Wtedy (po aktywacji modułu) dodajesz coś takiego do vHosta (w sekcji „VirtualHost *:80”):
[VirtualHost *:80]
...
[IfModule mpm_itk_module]
AssignUserId użytkownik grupa
[/IfModule]
...
[/VirtualHost]
(oczywiście w powyższym należy zamienić nawiasy kwadratowe na ostre)
W nowych wydaniach (2.4) jest jeszcze całkiem przyjemny dodatek „mod_privileges”, ale on z tego co pamiętam/kojarzę działa w Solarisach.
Jeśli chodzi o same PHP (skrypty) to można skorzystać – tak jak napisałeś – z plików w katalogu „pool.d”:
I w nim m.in./np.:
listen.owner = użytkownik
listen.group = grupa
listen.mode = 0660
user = użytkownik
group = grupa
Tylko pamiętaj, że PHP5-FPM zajmuje się przetwarzaniem żądań PHP/FastCGI…
Zapewne tym nie wyczerpujemy tematu, ale w większości są to już zagadnienia dla bardziej zaawansowanych, może kiedyś powstanie jakiś wpis na ten temat…
Mógłbyś podzielić się swoimi wartościami dla mpm_worker.conf?
Niestety nie mam jak, bo od wielu lat korzystam z Nginx zamiast Apache2.