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 nanoTi consiglio di avere un firewall installato. Se non hai ancora installato firewalld e desideri utilizzare un firewall, installalo con questi comandi:
yum -y install firewalldavvia il firewall e abilitalo per essere avviato all’avvio del sistema.
systemctl start firewalld.service
systemctl enable firewalld.serviceSuccessivamente, apri la tua porta SSH per assicurarti di poter connetterti al server tramite SSH.
firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --reloadAbilitare 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=1Installazione 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-toolsPoi 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.serviceOra 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 mysqlDovrebbe 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_installationper 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 foundNOTA: È 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 nginxPoi creiamo i collegamenti di avvio del sistema per nginx e lo avviamo:
systemctl enable nginx.service
systemctl start nginx.serviceCi 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.servicePoi prova a riavviare Nginx.
systemctl start nginx.serviceApri 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 --reloadL’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:

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-soapAPC è 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.soalla 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.servicePHP-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.confPer 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.serviceOra crea il seguente file PHP nella root del documento /usr/share/nginx/html…
nano /usr/share/nginx/html/info.phpOra chiamiamo quel file in un browser (ad es. http://192.168.1.100/info.php):

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:

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.serviceSuccessivamente, 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.serviceScarica 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
- nginx: http://nginx.org/
- wiki di nginx: http://wiki.nginx.org/
- PHP: http://www.php.net/
- PHP-FPM: http://php-fpm.org/
- MySQL: http://www.mysql.com/
- CentOS: http://www.centos.org/
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.