Perché anche se diversamente indicato in PHP Setting, il TimeOut in Plesk arriva prima?

Tabella dei Contenuti

Quando usiamo Plesk per un CMS complesso come PrestaShop o WordPress e sono richieste operazioni massive, si riceve un messaggio di errore di Time-out. Questo malgrado che nelle direttive PHP abbiamo indicato valore di max_execution_time e max_input_time più elevato. Anche intervenendo sul settaggio di NGINX impostando valori più elevati per il time-out per il proxy e fastcgi, il time-out arriverà molto prima, esattamente 45s nelle configurazioni di default di Plesk.

La direttiva FcgidIOTimeout

Il problema è dovuto alla direttiva FcgidIOTimeout che di default è impostata a 40/45s, di conseguenza qualsiasi script PHP sarà cessato entro quel tempo limite. Infatti, FcgidIOTimeout è una direttiva di configurazione del modulo Apache mod_fcgid, che gestisce le applicazioni CGI veloci (FastCGI). Questa direttiva specifica il tempo massimo, in secondi, che il server Apache attende per l’input/output di un processo FastCGI prima di terminare la connessione.

Questo tempo limite risulta molto riduttivo in molte casistiche dove sono richiesti tempi maggiori per eseguire determinate operazioni e quindi possiamo modificare questo valore tranquillamente a 120s (2 minuti) o 180s (3 minuti), senza correre particolari rischi.

Note: se usiamo Cloudflare per le richieste HTTP il time-out sarà di 100s, comunque sempre più elevato di quello impostato nativamente in Plesk, in questa casistica aumentare il valore di FcgidIOTimeout oltre i 100s ha senso solo se il nostro script PHP lo richiamiamo in modo diretto attraverso l’IP del server, bypassando il proxy di Cloudflare

Un buon compromesso è impostarlo a 120s, per la maggioranza degli ecommerce in PrestaShop, nel caso però il negozio abbia necessità di sincronizzarsi con gestionali, marketplace o cataloghi dei fornitori può rendersi necessario superare questo valore e impostare il time-out a 300s (5 minuti). Andare oltre è sconsigliato. Inteso che è sempre consigliabile lavorare per ottimizzare le funzioni massive e sincronizzazioni al fine di ridurre il tempo necessario, per esempio l’uso di bach mode di MySql per importate i dati nel database da file CSV può ridurrei i tempi da diversi minuti a una manciata di secondi.

Purtroppo non tutti gli sviluppatori sono attenti a questa problematica, quindi spesso l’unica alternativa è aumentare i valori di time-out, vediamo come fare:

Configurazione di Apache & nginx

Plesk permette di usare Nginx come reverse proxy, configurazione ideale per PrestaShop, vediamo come configurarlo per aumentare il valore di time-out e non ricevere più errori 502, 503 e 504.

Additional directives for HTTPS e HTTP

Il primo passo è modificare Additional Apache directives, sia in Additional directives for HTTP che Additional directives for HTTPS. Inseriamo in entrambi i campi quanto segue:

FcgidBusyTimeout 120
FcgidIOTimeout 120

Additional nginx directives

In Additional nginx directives andremo a inserire quanto segue:

proxy_connect_timeout 120s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
fastcgi_send_timeout 120s;
fastcgi_read_timeout 120s;

Se vogliamo più tempo per l’esecuzione dei nostri script possiamo aumentare ulteriormente i valori. Ricordiamoci però che valori elevati richiederanno molte risorse e riducono la sicurezza, quindi una volta cambiati i valori si dovrà monitorare il server e controllarne i log. Se per esempio uno script che impiega 5 minuti è accessibile da chiunque acceda al nostro sito, potrebbe causare un down del server se richiamato contemporaneamente da più utenti o anche più volte da un solo utente.

Impostiamo PHP Setting

Non rimane che impostare i valori max_execution_time e max_input_time alla voce Performance and security settings, della configurazione di PHP. Impostiamo 120 per entrambi i valori e salviamo.

Si tratta proprio di quei valori che spesso ci vengono richiesti dagli sviluppatori dei moduli per sincronizzarci con Ebay, Amazon, Trovaprezzi o il nostro gestionale. Purtroppo senza intervenire sul reverse proxy e sulla direttiva FcgidIOTimeout, anche se PrestaShop rileverà che il time-out è a 120s o 300s secondo le nostre impostazioni, nella realtà Apache cesserà l’esecuzione dopo 45s.

Conclusioni

Abbiamo visto come aumentare il time-out nelle configurazioni di Plesk per il nostro dominio, è possibile farlo anche a livello globale, ma è preferibile intervenire per ogni singolo vHost presente sul nostro server, in questo modo possiamo impostare valori personalizzati e intervenire in caso di problematiche in modalità più selettiva.

Ricordo però che nello sviluppo sarebbe importante tenerne conto, ricercando soluzioni che evitino esecuzioni così lunghe su un web server. Migliorare dunque le prestazioni, ottimizzando gli indici delle tabelle del database, usando ove possibile la modalità bach e ricorrendo ad ajax. Nel caso non sia possibile si può pensare di effettuare operazioni massive attraverso script lato server per esempio con Python. Sono consapevole che queste tecniche richiedono molto tempo in più nello sviluppo, ma aumentare troppo il time-out riduce la sicurezza.