Jak zwiększyć wydajność apache w połączeniu z php?

Poniżej przedstawię Ci sposób, w którym zamienimy standardowy tryb obsługi połączeń dla apache. Dokonamy zmiany z trybu obsługi każdego połączenia per proces "mpm_prefork_module", na znacznie wydajniejszy  "mpm_event_module". Działa on z użyciem tworzenia procesów dla każdego połączenia. Same wątki są grupowane w jeden lub więcej procesów. Spowoduje to zwiększenie wydajności obsługi połączeń jak i zmniejszy zapotrzebowanie na pamięć ram. Dodatkowo pozwoli to zwiększyć szanse przetrwania ataku DDOS.

Pragnę tylko wspomnieć że samo przełączenie wymagać będzie, również zamiany konfiguracji obsługi naszych skryptów php z php-cli na php-fpm.

Poniższy przykład został utworzony z użyciem Oracle Linux 9.4.


Procedura:

Zamiana trybu mpm_prefork na mpm_event:

Na początku w pliku /etc/httpd/conf.modules.d00-mpm.conf musimy przełączyć ustawienia naszego serwera www z:

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_event_module modules/mod_mpm_event.so

na:

#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_event_module modules/mod_mpm_event.so

Przeniesienie konfiguracji sesji:

Teraz wszelką naszą konfigurację php np. dotyczącą sposobu przechowywania sesji  (która znajduje się w naszych virtualhostach), należy zakomentować.

# php_admin_value session.save_path db1:11211,db2:11211
# php_admin_value session.save_handler memcached

Po tym należy przenieść ją do samej usługi php-fpm. W tym przypadku do pliku /etc/php-fpm.d/www.conf:

php_value[session.save_handler] = memcached
php_value[session.save_path] = db1:11211,db2:11211

Zamiana php-cli na php-fpm:

Na początku doinstalujemy wymagany moduł:

yum install php-fpm

po czym w pliku /etc/httpd/conf.modules.d/15-php.conf dodajemy obsługę php. Zrobimy to po przez tcp/ip aby nasze strony były interpretowane.

<Proxy "fcgi://127.0.0.1:9000" timeout=30>
ProxySet disablereuse=on
</Proxy>

<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

*Upewnij się że korzystasz z php-fpm serwowanego przez TCP/IP, a nie przez socket uniksowy. Możesz to zrobić sprawdzając co znajduje się pod kluczem "listen" w pliku "/etc/php-fpm.d/www.conf".

Zwiększenie wydajności:

Możemy teraz ręcznie zarządzać limitami naszych zasobów. Poniższa konfiguracja została stworzona pod serwer z 8x cpu i 24GB RAM.

<IfModule mpm_event_module>
ServerLimit 32
StartServers 4
MinSpareThreads 64
MaxSpareThreads 128
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 800
MaxConnectionsPerChild 1000
</IfModule>

Po więcej zapraszam Cię do tej strony.

Restart usług:

Po wszystkim restartujemy nasze usługi:

systemctl restart php-fpm
systemctl restart httpd

Weryfikacja:

Po wszystkim należy sprawdzić czy korzystamy z FastCgi. Możemy to zrobić tworząc plik (np. info.php) w katalogu public naszego serwera.

<?php
phpinfo();
?>

Po wejściu przez przeglądarkę na powyższą stronę, powinniśmy otrzymać:

Server APIFPM/FastCGI

Następstwa:

Należy pamiętać że po każdej zmianie w kodach, gdy korzystamy z php-fpm wymagane jest zrestartowanie tej usługi przez systemd.

Kamil Mirończuk

I kiedy czegoś gorąco pragniesz, to cały wszechświat sprzyja potajemnie twojemu pragnieniu
~Paulo Coelho

Komentarze

Zostaw komentarz

Twój adres mailowy NIE zostanie opublikowany. W razie otrzymania zapytania, otrzymasz na niego odpowiedź.
Wymagane pola są oznaczone jako *