cambia apache da prefork ad evento in Ubuntu 16, fai funzionare php 7


11

Apache stava rallentando la produzione. Dopo aver cercato le risposte per qualche tempo, sono finalmente passato al canale IRC #apache e i professionisti mi hanno fatto controllare la modalità apache con questo comando:

sudo apachectl -V

e siamo stati allarmati di scoprire che Server MPM è prefork . Hanno detto con enfasi: NON UTILIZZARE LA PREFORK SU UN SERVER DI PRODUZIONE. A quanto pare, i pacchetti Ubuntu (presumibilmente ereditati da Debian?) Insistono sull'esecuzione di apache in modalità prefork nonostante il fatto che il metodo raccomandato per eseguire PHP con Apache raccomanda chiaramente proxy_fcgi e php-fpm, quindi fcgid e alla fine dice che non dovresti usa prefork:

Perché non dovresti più usare mod_php con prefork mpm

  • mod_php viene caricato in ogni processo httpd in ogni momento. Anche quando httpd serve contenuto statico / non php, quella memoria è in uso.
  • mod_php non è thread-safe e ti obbliga a rimanere con prefork mpm (multi process, no thread), che è la configurazione più lenta possibile

Quella pagina contiene anche alcuni dettagli su PHP-FPM, ma questo sembra un po 'elaborato e poco chiaro e sembra comportare molta configurazione manuale. Sono deluso e sorpreso che Ubuntu 16 non abbia opzioni di pacchetto per la modalità fastCGI o qualcosa del genere.

Ho provato a passare apache in modalità evento utilizzando a2enmod e quando ho provato a eseguire il backup di apache, ho ricevuto un errore:

Apache esegue un MPM con thread, ma il tuo modulo PHP non è compilato per essere thread-safe. Devi ricompilare PHP

Ad ogni modo, mi chiedevo se qualcuno avesse alcune istruzioni minime e dettagliate per far funzionare la modalità fastCGI su Ubuntu 16 con PHP 7.0 facendo affidamento il più possibile sugli installatori di pacchetti. Attualmente sto esaminando molte istruzioni vaghe e poco spiegate e sono preoccupato di confondere il mio ambiente di produzione con decisioni sbagliate.

Inoltre, qualcuno dovrebbe aggiungere mpm-event come opzione tag. Questo è ciò che i ragazzi di #apache IRC hanno raccomandato.


L'ultimo errore è dovuto al fatto che sei passato all'evento, ma stai ancora utilizzando mod_php. Disabilita mod_php e passa a php-fpm e andrà via. E posso raccomandare nginx?
Michael Hampton,

@MichaelHampton il titolo dovrebbe menzionare PHP. Non è difficile cambiare apache all'evento. È difficile cambiare apache all'evento E far funzionare php 7.
S. Imp

1
@MichaelHampton sicuramente ti rendi conto che sono confuso su come "disabilitare mod_php e passare a php-fpm". Non è proprio la domanda che faccio nel mio post? Inoltre, la domanda non riguarda nginx, che presenta l'ennesimo regno dell'apprendimento. Il passaggio a nginx non è pratico per questo progetto perché sto lavorando con un team.
S. Imp

Non ho menzionato come disabilitare i moduli Apache perché hai dimostrato di sapere già come farlo. Per quanto riguarda l'abilitazione di php-fpm, vedi le risposte a questa domanda, tutorial online, ecc.
Michael Hampton,

Risposte:


15

ezra-s suggerisce un buon approccio ma non include alcuni dettagli che potrebbero essere fonte di confusione per le persone che si affidano ai gestori di pacchetti. NOTA : non sono sicuro che questi passaggi siano esatti. Se qualcuno incontra problemi o vede problemi, fammelo sapere e aggiornerò questo post.

In primo luogo, al momento della stesura di questo documento, i pacchetti apache2 di Ubuntu insistono su prefork se si desidera installare PHP. Non disperare, tuttavia, perché è ancora possibile utilizzare i programmi di installazione dei pacchetti per installare e aggiornare PHP e apache2 e continuare a far funzionare la configurazione con Apache in modalità evento utilizzando PHP-FPM come raccomandato dal wiki di Apache e descritto più dettagliatamente in High- performance PHP su apache httpd 2.4.x usando mod_proxy_fcgi e php-fpm . L'idea di base è che apache2 e PHP-FPM comunicano tramite socket anziché PHP in esecuzione come modulo Apache.

1) Rimuovere o disabilitare il modulo PHP di Apache

Poiché i pacchetti Ubuntu insistono sul prefork Apache durante l'installazione di PHP, dobbiamo separarli. L'ho fatto usando apt per disinstallare libapache2-mod-php7.0 perché non ho più bisogno del pacchetto:

sudo apt-get remove libapache2-mod-php7.0

In alternativa, è possibile disabilitare invece il modulo Apache php7.0, ma ciò non rimuoverà il pacchetto apt dal proprio sistema, il che lascia dietro di sé una fastidiosa sequenza di sistema.

sudo a2dismod php7.0

2) Passa ad Apache in modalità evento e abilita fcgid

Credo che questi comandi dovrebbero fare il trucco:

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo a2enmod proxy_fcgi

3) Installa PHP-FPM

Ho già installato PHP 7 con i suoi vari moduli, quindi installo PHP-FPM con questo comando:

sudo apt-get install php7.0-fpm

4) Modifica la configurazione di VirtualHost per gestire i file PHP con PHP-FPM:

Nel mio caso, ho modificato l'host SSL predefinito, /etc/apache2/sites-available/default-ssl.conf e ho aggiunto questa riga proprio nella parte superiore:

ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php/php7.0-fpm.sock|fcgi://localhost/var/www/html/

IMPORTANTE Questo indica a Apache per gestire le richieste di file PHP con PHP-FPRM e il percorso in questa direttiva ( /run/php/php7.0-fpm.sock ) deve corrispondere al percorso specificato dalla ascoltare direttiva nel file / etc / php /7.0/fpm/pool.d/www.conf

5) Riavvia Apache

sudo service apache2 restart

Per verificare se la modalità evento è abilitata, utilizzare questo comando:

sudo apachectl -V

Nell'output, dovresti vedere questo:

Server MPM:     event

Prova a creare una pagina phpinfo e ad accedervi dal tuo browser. Dovresti vedere Server API: FPM/FastCGInell'output.


5
Suggerisco di non usare ProxyPassMatch, perché non permetterà di usare .htaccess nella directory. Usa questo invece: <FilesMatch \ .php $> SetHandler "proxy: unix: /run/php/php7.0-fpm.sock | fcgi: // localhost /" </FilesMatch>
waza123,


Cosa succederà se non tocco questo file diversamente da come mi hai detto di fare: /etc/apache2/sites-available/default-ssl.conf,? Il mio https e http funzionano entrambi bene
user5858

Ho seguito la risposta tranne ProxyPassMatch, ho aggiunto la riga Filesmatch dal commento di @ waza123 all'inizio di 000-default.conf e ho riavviato apache2 e tutto funziona perfettamente. Grazie a tutti e due il mio piccolo VPS sta risparmiando una tonnellata di memoria e CPU su mpm_prefork d
dw1

Non ho dovuto eseguire ProxyPass o modificare i file con Ubuntu Server 19.10. Dopo il passaggio 3 (installazione di PHP-FPM), l'ho appena fatto a2enconf /etc/apache2/conf-available/php7.3-fpm.conf; systemctl reload apachee quando ho creato un file phpinfo.php con <?php phpinfo();dentro, la riga API del server dice FPM / FastCGI. A proposito, ho installato php7.3 perché al momento della stesura di questo post, si dovrebbe almeno essere su quella versione, se non superiore, e i repository Ubuntu apt per Ubuntu Server 19.10 vanno su php7.3 attualmente.
ServerChecker

6

Le distro offrono il metodo "mod_php" per comodità.

Mentre il modo più performante è apache w / event + mod_proxy_fcgi -> php-fpm.

Forse dovrebbero aggiornarsi con i tempi, ma è difficile per loro quando così tanti framework arrivano con configurazioni .htaccess mod_php in una sorta di "plug & play". Alla fine, è l'amministratore l'unico responsabile ad amministrare e configurare correttamente il loro sito.

Se sei in produzione, ti suggerirei di utilizzare un server di prova per esercitarsi con l'aggiornamento e le modifiche.

A proposito del wiki preferisco o ti suggerirei il metodo "gestore". https://wiki.apache.org/httpd/PHP-FPM#Proxy_via_handler .

Cioè, configura php-fpm per avere un socket pronto e con sufficienti autorizzazioni per l'utente Apache per inviargli richieste e configurare Apache per usarlo.

Un rapido esempio:

# needed modules for reverse proxying to php-fpm
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so


<Virtualhost *:443>
    ServerName whatever.example.com
    #other typical directives here
    <Directory /var/www/php-app>
        <FilesMatch \.php>
            SetHandler "proxy:unix:/path/to/app.sock|fcgi://localhost/"
        <FilesMatch>
    </Directory>
</VirtualHost>

Modificare:

In questo modo non importa quale versione di PHP usi perché a Apache non importa, rovescerà semplicemente le richieste appropriate a php-fpm.

Inoltre, non dimenticare di scaricare mod_php per poter usare mpm_event.

Modifica 2:

Come da richiesta, non è necessario disinstallare i pacchetti mod_php da debian / ubuntu, Apache si preoccupa solo della sua configurazione, quindi lo scarico del modulo lo farà.


Grazie per la risposta. Ho fatto molte prove ed errori e questo è l'approccio che sembra funzionare attualmente. Il processo attuale è un po 'più complicato perché devi ottenere apache da prefork a evento, disinstallare libapache2-mod-php7.0 ecc. Spero di formulare qui una risposta più completa tra poco.
S. Imp

non è necessario "disinstallare" dal punto di vista httpd di apache, basta scaricare il modulo. Lo stesso con event / prefork, anche gli mpm sono moduli in 2.4, quindi si scarica prefork e si carica event.
ezra-s,

ok quindi forse non devi disinstallare il pacchetto, ma devi disabilitare almeno il modulo php per apache - e sono preoccupato per un aggiornamento apt-get che interrompe l'installazione. Questi dettagli mancano nella tua risposta. Sarei felice se li aggiungessi perché non sono particolarmente fiducioso nella mia capacità di ottenere i dettagli direttamente su ciò che ho fatto esattamente.
S. Imp

Forse li ho ipotizzati, Apache non si preoccupa neanche dei pacchetti debian, ma solo della sua configurazione funzionale.
ezra-s,

Apache si preoccuperà se un aggiornamento del pacchetto apt modifica la sua configurazione, il che è un problema che ho riscontrato ad un certo punto. Nello spirito del mio post originale, vorrei fornire istruzioni dettagliate per gli altri che fanno affidamento sui programmi di installazione dei pacchetti (e sugli aggiornamenti).
S. Imp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.