doc:appunti:linux:sa:apache_php_optimization
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
doc:appunti:linux:sa:apache_php_optimization [2025/02/28 12:01] – [proxy_fcgi e php-fpm] niccolo | doc:appunti:linux:sa:apache_php_optimization [2025/03/31 10:42] (current) – [Metodo chroot] niccolo | ||
---|---|---|---|
Line 8: | Line 8: | ||
</ | </ | ||
- | ===== MPM prefork ===== | + | I moduli disponibili installati dal pacchetto **apache2** sono **event**, **prefork** e **worker**. |
+ | |||
+ | Per una configurazione Apache + PHP-FPM, il modulo MPM event è la scelta preferita. Offre migliori prestazioni, | ||
+ | |||
+ | ===== Modulo | ||
Con una installazione standard Debian di Apache e PHP è probabile che sia in uso il modulo **[[https:// | Con una installazione standard Debian di Apache e PHP è probabile che sia in uso il modulo **[[https:// | ||
Line 17: | Line 21: | ||
* **/ | * **/ | ||
- | In questo modo il modulo PHP viene caricato in ogni processo Apache, anche se il server deve fornire pagine statiche senza PHP. Inoltre il fatto che PHP sia //not thread safe//, costringe ad usare il MPM // | + | In questo modo il modulo PHP viene caricato in ogni istanza del processo Apache, anche se il server deve fornire pagine statiche senza PHP. Inoltre il fatto che PHP sia //not thread safe//, costringe ad usare il MPM // |
+ | |||
+ | La configurazione del modulo è in **/ | ||
+ | |||
+ | < | ||
+ | StartServers | ||
+ | MinSpareServers | ||
+ | MaxSpareServers | ||
+ | MaxRequestWorkers | ||
+ | MaxConnectionsPerChild | ||
+ | </ | ||
- | ===== proxy_fcgi e php-fpm ===== | + | ===== Modulo MPM event, |
Secono le **[[https:// | Secono le **[[https:// | ||
Line 59: | Line 73: | ||
systemctl status php8.2-fpm | systemctl status php8.2-fpm | ||
</ | </ | ||
+ | |||
+ | Infine si cambia il modulo MPM da prefork a event: | ||
+ | |||
+ | < | ||
+ | a2dismod mpm_prefork | ||
+ | a2enmod mpm_event | ||
+ | systemctl restart apache2.service | ||
+ | </ | ||
+ | |||
+ | Controllare che le pagine PHP siano correttamente interpretate e che il modulo MPM event sia effettivamente in uso: | ||
+ | |||
+ | < | ||
+ | apachectl -V | grep ' | ||
+ | Server MPM: event | ||
+ | </ | ||
+ | |||
=== Altri moduli Apache consigliati === | === Altri moduli Apache consigliati === | ||
Line 135: | Line 165: | ||
</ | </ | ||
</ | </ | ||
+ | |||
+ | ===== Segregazione VirtualHost ===== | ||
+ | |||
+ | Su un host che ospita più di un VirtualHost potrebbe essere desiderabile isolare il PHP di un VirtualHost dai file degli altri VirtualHost ed anche dai file dell' | ||
+ | |||
+ | Essenzialmente si può agire con un **chroot** per processo PHP oppure con la direttiva **open_basedir** del PHP. | ||
+ | |||
+ | Il primo metodo è quello formalmente più corretto e sicuro, in quanto il processo PHP sarebbe effettivamente in esecuzione in un ambiente chroot e sarebbe il sistema operativo stesso a impedirgli di accedere fuori dalla propria DocumentRoot. Tuttavia questo metodo comporta **notevoli problemi** perché ad esempio impedisce l' | ||
+ | |||
+ | Il metodo che utilizza la direttiva **open_basedir** invece è più flessibile, ma affida la sicurezza all' | ||
+ | |||
+ | ==== Metodo chroot ==== | ||
+ | |||
+ | Supponiamo che la DocumentRoot di un sito sia **/ | ||
+ | |||
+ | < | ||
+ | [site.example.org] | ||
+ | user = site-example-org | ||
+ | group = site-example-org | ||
+ | |||
+ | ; This PHP-FPM instance is chrooted. | ||
+ | chroot = / | ||
+ | chdir = /www | ||
+ | ; Values set here with php_admin_value belong to this pool only. | ||
+ | ; doc_root: (without chroot would be empty or the Apache DocumentRoot). | ||
+ | php_admin_value[doc_root] = /www | ||
+ | ; cgi.fix_pathinfo: | ||
+ | ; See https:// | ||
+ | php_admin_value[cgi.fix_pathinfo] = 0 | ||
+ | </ | ||
+ | |||
+ | In questo modo si ha un processo **php-fpm** che gira con le credenziali di //user// e //group// indicate e che è chrooted nella directory indicata. | ||
+ | |||
+ | Purtroppo questa soluzione impedisce il corretto funzionamento delle librerie PHP, ad esempio il pacchetto **php-mail** installa i propri file in **/ | ||
+ | |||
+ | Vedere la discussione **[[https:// | ||
+ | |||
+ | ==== Metodo open_basedir ==== | ||
+ | |||
+ | Con la direttiva PHP **open_basedir** si pone un limite a tutte le funzioni PHP che aprono file dal filesystem (ad esempio '' | ||
+ | |||
+ | Ecco quindi come configurare l' | ||
+ | |||
+ | < | ||
+ | [site.example.org] | ||
+ | user = site-example-org | ||
+ | group = site-example-org | ||
+ | php_admin_value[open_basedir] = / | ||
+ | </ | ||
+ | |||
+ | Come si vede è necessario avere l' | ||
===== Web Resources ===== | ===== Web Resources ===== | ||
* **[[https:// | * **[[https:// | ||
+ | * **[[https:// | ||
+ | * **[[https:// | ||
* **[[https:// | * **[[https:// | ||
* **[[https:// | * **[[https:// | ||
doc/appunti/linux/sa/apache_php_optimization.1740740515.txt.gz · Last modified: 2025/02/28 12:01 by niccolo