Installazione software · 11 min read · Oct 04, 2025

Come installare Nginx con PHP e MySQL (LEMP Stack) su CentOS 7.6

Questo tutorial mostra come puoi installare Nginx su un server CentOS 7 con supporto PHP (tramite PHP-FPM) e supporto MySQL (MariaDB).

Cos’è LEMP?

Nginx (pronunciato “engine x”) è un server HTTP gratuito, open-source e ad alte prestazioni. Nginx è noto per la sua stabilità, ricco set di funzionalità, configurazione semplice e basso consumo di risorse.

Requisiti preliminari LEMP

In questo tutorial, utilizzerò il nome host server1.example.com con l’indirizzo IP 192.168.1.100. Queste impostazioni potrebbero differire per te, quindi devi sostituirle dove appropriato.

Utilizzerò l’editor nano in questo tutorial per modificare i file di configurazione. Nano può essere installato in questo modo.

yum -y install nano

Ti consiglio di avere un firewall installato. Se non hai ancora installato firewalld e desideri utilizzare un firewall, installalo con questi comandi:

yum -y install firewalld

avvia il firewall e abilitalo per essere avviato all’avvio del sistema.

systemctl start firewalld.service  
systemctl enable firewalld.service

Successivamente, apri la tua porta SSH per assicurarti di poter connetterti al server tramite SSH.

firewall-cmd --permanent --zone=public --add-service=ssh  
firewall-cmd --reload

Abilitare i repository aggiuntivi di CentOS

L’ultima versione di Nginx non è disponibile nei repository ufficiali di CentOS, quindi includiamo il repository del progetto Nginx per installarlo:

nano /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Installazione di MySQL (MariaDB)

Per prima cosa, installiamo MariaDB come sostituto di MySQL. MariaDB è un fork gratuito di MySQL. Esegui questo comando nella shell per installare il server di database MariaDB:

yum -y install mariadb mariadb-server net-tools

Poi creiamo i collegamenti di avvio del sistema per MariaDB (in modo che si avvii automaticamente ogni volta che il sistema si avvia) e avviamo il server MariaDB:

systemctl enable mariadb.service  
systemctl start mariadb.service

Ora controlla che la rete sia abilitata. Si prega di notare che il servizio MraiDB è chiamato mysql poiché è un server di database compatibile. Esegui

netstat -tap | grep mysql

Dovrebbe mostrare qualcosa di simile:

[root@server1 ~]# netstat -tap | grep mysql  
tcp 0 0 0.0.0.0:mysql 0.0.0.0:* LISTEN 19842/mysqld 

Esegui:

mysql_secure_installation

per impostare una password per l’utente root (altrimenti, chiunque può accedere al tuo database MySQL!):

[root@example ~]# mysql_secure_installation  
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found
NOTA: È RACCOMANDATO ESEGUIRE TUTTE LE PARTI DI QUESTO SCRIPT PER TUTTI I SERVER MariaDB IN USO IN PRODUZIONE! SI PREGA DI LEGGERE ATTENTAMENTE OGNI PASSO!
Per accedere a MariaDB per metterlo in sicurezza, avremo bisogno della password attuale per l'utente root. Se hai appena installato MariaDB e non hai ancora impostato la password root, la password sarà vuota, quindi dovresti semplicemente premere invio qui.
Inserisci la password attuale per root (premi invio per nessuna):  
OK, password utilizzata con successo, procedendo...
Impostare la password root garantisce che nessuno possa accedere all'utente root di MariaDB senza la corretta autorizzazione.
Impostare la password root? [Y/n] <-- ENTRA  
Nuova password: <-- yourrootsqlpassword  
Reinserisci la nuova password: <-- yourrootsqlpassword  
Password aggiornata con successo!  
Ricaricamento delle tabelle di privilegio..  
... Successo!
Per impostazione predefinita, un'installazione di MariaDB ha un utente anonimo, che consente a chiunque di accedere a MariaDB senza dover avere un account utente creato per loro. Questo è inteso solo per test e per rendere l'installazione un po' più fluida. Dovresti rimuoverli prima di passare a un ambiente di produzione.
Rimuovere gli utenti anonimi? [Y/n] <-- ENTRA  
... Successo!
Normalmente, root dovrebbe essere autorizzato a connettersi solo da 'localhost'. Questo garantisce che qualcuno non possa indovinare la password root dalla rete.
Negare l'accesso remoto a root? [Y/n] <-- ENTRA  
... Successo!
Per impostazione predefinita, MariaDB viene fornito con un database chiamato 'test' a cui chiunque può accedere. Questo è anche inteso solo per test e dovrebbe essere rimosso prima di passare a un ambiente di produzione.
Rimuovere il database di test e l'accesso ad esso? [Y/n] <-- ENTRA  
- Eliminazione del database di test...  
... Successo!  
- Rimozione dei privilegi sul database di test...  
... Successo!
Ricaricare le tabelle di privilegio garantirà che tutte le modifiche apportate finora abbiano effetto immediato.
Ricaricare le tabelle di privilegio ora? [Y/n] <-- ENTRA  
... Successo!
Pulizia...
Tutto fatto! Se hai completato tutti i passaggi sopra, la tua installazione di MariaDB dovrebbe ora essere sicura.
Grazie per aver utilizzato MariaDB!  
[root@example ~]#

[root@server1 ~]# mysql_secure_installation

Installazione di Nginx

Nginx è disponibile come pacchetto da nginx.org che possiamo installare in questo modo:

yum -y install nginx

Poi creiamo i collegamenti di avvio del sistema per nginx e lo avviamo:

systemctl enable nginx.service  
systemctl start nginx.service

Ci sono possibilità che tu riceva un errore che la porta 80 è già in uso, il messaggio di errore sarà simile a questo:

[root@server1 ~]# service nginx start  
Avvio di nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)  
ginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)  
ginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)  
ginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)  
ginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)  
ginx: [emerg] still could not bind()  
                                                           [FALLITO]  
[root@server1 ~]#

Questo significa che un altro server web (probabilmente Apache) è già in esecuzione su questo server. Ferma il servizio Apache e poi avvia il servizio per NGINX:

systemctl stop httpd.service  
yum remove httpd  
systemctl disable httpd.service

Poi prova a riavviare Nginx.

systemctl start nginx.service

Apri le porte HTTP e HTTPS nel firewall

firewall-cmd --permanent --zone=public --add-service=http  
firewall-cmd --permanent --zone=public --add-service=https  
firewall-cmd --reload

L’output risultante sulla shell apparirà così:

[root@example ~]# firewall-cmd --permanent --zone=public --add-service=http  
success  
[root@example ~]# firewall-cmd --permanent --zone=public --add-service=https  
success  
[root@example ~]# firewall-cmd --reload  
success  
[root@example ~]#

Digita l’indirizzo IP o il nome host del tuo server web in un browser (ad es. http://192.168.1.100), e dovresti vedere la pagina di benvenuto di Nginx:

La pagina di benvenuto di Nginx.

Installazione di PHP

Possiamo far funzionare PHP 5 con Nginx tramite PHP-FPM (FastCGI Process Manager). PHP-FPM è un’implementazione alternativa di PHP FastCGI con alcune funzionalità aggiuntive utili per siti di qualsiasi dimensione, specialmente siti più trafficati. Possiamo installare php-fpm insieme a php-cli e alcuni moduli PHP5 come php-mysql di cui hai bisogno se vuoi utilizzare MySQL dai tuoi script PHP come segue:

yum -y install php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-mbstring php-xml php-xmlrpc php-mbstring php-snmp php-soap

APC è un cache opcode PHP gratuito e open per la memorizzazione nella cache e l’ottimizzazione del codice intermedio PHP. È simile ad altri cache opcode PHP, come eAccelerator e Xcache. È fortemente consigliato avere uno di questi installato per accelerare la tua pagina PHP.

Installerò APC dal repository PECL di PHP. PECL richiede che gli strumenti di sviluppo di Centos siano installati per compilare il pacchetto APC.

yum -y install php-devel  
yum -y groupinstall 'Development Tools'

e installa APC:

pecl install apc
[root@example ~]# pecl install apc  
downloading APC-3.1.13.tgz ...  
Inizio download APC-3.1.13.tgz (171,591 bytes)  
.................done: 171,591 bytes  
55 source files, building  
running: phpize  
Configuring for:  
PHP Api Version: 20100412  
Zend Module Api No: 20100525  
Zend Extension Api No: 220100525  
Enable internal debugging in APC [no] : <-- ENTRA  
Enable per request file info about files used from the APC cache [no] : <-- ENTRA  
Enable spin locks (EXPERIMENTAL) [no] : <-- ENTRA  
Enable memory protection (EXPERIMENTAL) [no] : <-- ENTRA  
Enable pthread mutexes (default) [no] : <-- ENTRA  
Enable pthread read/write locks (EXPERIMENTAL) [yes] : <-- ENTRA  
building in /var/tmp/pear-build-rootVrjsuq/APC-3.1.13  
......

Poi apri /etc/php.ini e imposta cgi.fix_pathinfo=0:

nano /etc/php.ini
[...]
; cgi.fix_pathinfo fornisce supporto *reale* per PATH_INFO/PATH_TRANSLATED per CGI.  Il comportamento precedente di PHP era impostare PATH_TRANSLATED su SCRIPT_FILENAME e non comprendere cosa sia PATH_INFO.  Per ulteriori informazioni su PATH_INFO, vedere le specifiche cgi.  Impostare questo su 1 farà sì che PHP CGI corregga i suoi percorsi per conformarsi alla specifica.  Un'impostazione di zero fa sì che PHP si comporti come prima.  Il valore predefinito è 1.  Dovresti correggere i tuoi script per utilizzare SCRIPT_FILENAME piuttosto che PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

(Per favore leggi http://wiki.nginx.org/Pitfalls per scoprire perché dovresti fare questo.)

e aggiungi la riga:

[...]
extension=apc.so

alla fine del file /etc/php.ini.

In aggiunta a ciò, per evitare errori di fuso orario come

[28-Giugno-2016 14:21:01] PHP Warning: phpinfo(): Non è sicuro fare affidamento sulle impostazioni del fuso orario del sistema. Sei *obbligato* a utilizzare l'impostazione date.timezone o la funzione date_default_timezone_set(). Nel caso tu abbia utilizzato uno di questi metodi e stai ancora ricevendo questo avviso, è molto probabile che tu abbia scritto male l'identificatore del fuso orario. Abbiamo selezionato 'Europe/Berlin' per 'CEST/2.0/DST' invece in /usr/share/nginx/html/info.php alla riga 2

… in /var/log/php-fpm/www-error.log quando chiami uno script PHP nel tuo browser, dovresti impostare date.timezone in /etc/php.ini:

[...]
[Date]
; Definisce il fuso orario predefinito utilizzato dalle funzioni di data
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Europe/Berlin"
[...]

Puoi scoprire il fuso orario corretto per il tuo sistema eseguendo:

cat /etc/sysconfig/clock

[root@server1 nginx]# cat /etc/sysconfig/clock
ZONE=”Europe/Berlin”
[root@server1 nginx]#

Successivamente, crea i collegamenti di avvio del sistema per php-fpm e avvialo:

systemctl enable php-fpm.service  
systemctl start php-fpm.service

PHP-FPM è un processo daemon (con lo script di init /etc/init.d/php-fpm) che esegue un server FastCGI sulla porta 9000.

Configurazione di Nginx

La configurazione di nginx si trova in /etc/nginx/nginx.conf che apriamo ora:

nano /etc/nginx/nginx.conf

Per prima cosa (questo è facoltativo) puoi aumentare il numero di processi worker e impostare il keepalive_timeout su un valore ragionevole:

[...]
worker_processes  4;
[...]
    keepalive_timeout  2;
[...]

Gli host virtuali sono definiti nei contenitori server {} nella directory /etc/nginx/conf.d. Modifichiamo il vhost predefinito (in /etc/nginx/conf.d/default.conf) come segue:

nano /etc/nginx/conf.d/default.conf
[...]
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
    }

    #error_page  404              /404.html;

    # reindirizza le pagine di errore del server alla pagina statica /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy gli script PHP ad Apache in ascolto su 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # passa gli script PHP al server FastCGI in ascolto su 127.0.0.1:9000
    #

    location ~ \.php$ {
        root           /usr/share/nginx/html;
        try_files $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
    
    # nega l'accesso ai file .htaccess, se la root del documento di Apache
    # coincide con quella di nginx
    #
    location ~ /\.ht {
        deny  all;
    }
}

servername ; rende questo un vhost catchall predefinito (ovviamente, puoi anche specificare un nome host qui come www.example.com).

Nella parte location / ho aggiunto index.php alla riga index. root /usr/share/nginx/html; significa che la root del documento è la directory /usr/share/nginx/html.

La parte importante per PHP è il blocco location ~ .php$ {}. Decommentalo per abilitarlo. Cambia la riga root nella root del documento del sito web (ad es. root /usr/share/nginx/html;). Si prega di notare che ho aggiunto la riga try_files $uri =404; per prevenire exploit zero-day (vedi http://wiki.nginx.org/Pitfalls#Passing_Uncontrolled_Requests_to_PHP e http://forum.nginx.org/read.php?2,88845,page=3). Assicurati di cambiare la riga fastcgi_param in fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; perché altrimenti, l’interprete PHP non troverà lo script PHP che chiami nel tuo browser ( $document_root si traduce in /usr/share/nginx/html perché è quello che abbiamo impostato come nostra root del documento).

PHP-FPM ascolta sulla porta 9000 su 127.0.0.1 per impostazione predefinita, quindi diciamo a Nginx di connettersi a 127.0.0.1:9000 con la riga fastcgi_pass 127.0.0.1:9000;. È anche possibile far utilizzare a PHP-FPM un socket Unix - descriverò questo nel capitolo 7.

Ora salva il file e ricarica Nginx:

systemctl restart nginx.service

Ora crea il seguente file PHP nella root del documento /usr/share/nginx/html…

nano /usr/share/nginx/html/info.php

Ora chiamiamo quel file in un browser (ad es. http://192.168.1.100/info.php):

Le informazioni PHP dal nostro server nginx.

Come vedi, PHP 5 sta funzionando, e sta funzionando tramite FPM/FastCGI, come mostrato nella riga Server API. Se scorri più in basso, vedrai tutti i moduli che sono già abilitati in PHP5, incluso il modulo MySQL:

Il driver MySQL è stato attivato in PHP.

Far utilizzare a PHP-FPM un socket Unix

Per impostazione predefinita, PHP-FPM ascolta sulla porta 9000 su 127.0.0.1. È anche possibile far utilizzare a PHP-FPM un socket Unix che evita l’overhead TCP. Per fare ciò, apri /etc/php-fpm.d/www.conf…

nano /etc/php-fpm.d/www.conf

… e fai in modo che la riga listen appaia come segue:

[...]
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php5-fpm.sock
[...]

Poi ricarica PHP-FPM:

systemctl restart php-fpm.service

Successivamente, passa attraverso la tua configurazione Nginx e tutti i tuoi vhosts e cambia la riga fastcgi_pass 127.0.0.1:9000; in fastcgi_pass unix:/tmp/php5-fpm.sock;, ad esempio in questo modo:

vi /etc/nginx/conf.d/default.conf
[...]
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        try_files $uri =404;
        fastcgi_pass   unix:/var/run/php-fpm/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
[...]

Infine, ricarica Nginx:

systemctl restart nginx.service

Scarica questo server CentOS 7 come macchina virtuale

Questa configurazione è disponibile come download di macchina virtuale in formato ova/ovf (compatibile con VMWare e Virtualbox) per gli abbonati di howtoforge.

Dettagli di accesso per la VM

  • La password di root è: howtoforge
  • La password dell’utente “administrator” è: howtoforge

Si prega di cambiare entrambe le password al primo accesso.

  • L’indirizzo IP della VM è 192.168.1.100

Link

Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.