Nginx (pronunciato "engine x") è un server HTTP gratuito, open source e ad alte prestazioni. Nginx è noto per la sua stabilità, il ricco set di funzionalità, la configurazione semplice e il basso consumo di risorse. Questo tutorial mostra come installare Nginx su un server CentOS 6.4 con supporto PHP5 (tramite PHP-FPM) e supporto MySQL.
Non garantisco che questo funzionerà per te!
1 Nota preliminare
In questo tutorial utilizzo l'hostname server1.example.com con l'indirizzo IP 192.168.0.100. Queste impostazioni potrebbero differire per te, quindi devi sostituirle dove appropriato.
2 Abilitazione di repository aggiuntivi
php-fpm non è disponibile dai repository CentOS ufficiali, ma dal repository RPM Remi che a sua volta dipende dal repository EPEL; possiamo abilitare entrambi i repository come segue:
rpm --import https://fedoraproject.org/static/0608B895.txt
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum install yum-priorities
Modifica /etc/yum.repos.d/epel.repo...
vi /etc/yum.repos.d/epel.repo
... e aggiungi la linea priority=10 alla sezione [epel]:
[epel] name=Extra Packages for Enterprise Linux 6 - $basearch #baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch failovermethod=priority enabled=1 priority=10 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 [...] |
Quindi fai lo stesso per la sezione [remi] in /etc/yum.repos.d/remi.repo, oltre a modificare abilitato a 1:
vi /etc/yum.repos.d/remi.repo
[remi] name=Les RPM de remi pour Enterprise Linux $releasever - $basearch #baseurl=http://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/ mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror enabled=1 priority=10 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi failovermethod=priority [remi-test] name=Les RPM de remi en test pour Enterprise Linux $releasever - $basearch #baseurl=http://rpms.famillecollet.com/enterprise/$releasever/test/$basearch/ mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/test/mirror enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi |
3 Installazione di MySQL 5
Per prima cosa installiamo MySQL 5 in questo modo:
yum install mysql mysql-server
Quindi creiamo i collegamenti di avvio del sistema per MySQL (in modo che MySQL si avvii automaticamente ogni volta che il sistema si avvia) e avviamo il server MySQL:
chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start
Ora controlla che la rete sia abilitata. Corri
netstat -tap | grep mysql
Dovrebbe mostrare qualcosa del genere:
[[email protected] ~]# netstat -tap | grep mysql
tcp 0 0 *:mysql *:* LISTEN 1799/mysqld
[[email protected] ~]#
In caso contrario, modifica /etc/my.cnf e commenta l'opzione skip-networking:
vi /etc/my.cnf
[...] #skip-networking [...] |
e riavvia il tuo server MySQL:
/etc/init.d/mysqld restart
Corri
mysql_secure_installation
per impostare una password per l'utente root (altrimenti chiunque può accedere al tuo database MySQL!):
[[email protected] ~]# mysql_secure_installation
NOTA: L'ESECUZIONE DI TUTTE LE PARTI DI QUESTO SCRIPT È CONSIGLIATA PER TUTTI MySQL
SERVER IN PRODUZIONE UTILIZZATA ! PER FAVORE, LEGGERE ATTENTAMENTE OGNI PASSAGGIO!
Per accedere a MySQL per proteggerlo, avremo necessità della password
corrente per l'utente root. Se hai appena installato MySQL e
non hai impostato la password root, la password sarà vuota,
quindi dovresti premere invio qui.
Entra password corrente per la radice (inserire per nessuno): <-- INVIO
OK, password utilizzata con successo, andando avanti...
L'impostazione della password di radice garantisce che nessuno possa accedere a MySQL
utente root senza l'autorizzazione appropriata.
Impostare la password root? [S/n] <-- ENTER
Nuova password: <-- yourrootsqlpassword
Reinserire nuova password: <-- yourrootsqlpassword
Password aggiornata con successo!
Ricaricamento delle tabelle dei privilegi. .
... Successo!
Per impostazione predefinita, un'installazione MySQL ha un utente anonimo, consentendo a chiunque
di accedere a MySQL senza deve avere un account utente creato per
loro. Questo è destinato solo a test e a rendere l'installazione
andare un po' più agevole. Dovresti rimuoverli prima di trasferirti in un
ambiente di produzione.
Rimuovere utenti anonimi? [S/n] <-- ENTER
... Successo!
Normalmente, root dovrebbe essere consentito solo di connettersi da 'localhost'. Questo
garantisce che qualcuno non riesca a indovinare la password root dalla rete.
Disattivare l'accesso root da remoto? [S/n] <-- ENTER
... Successo!
Per impostazione predefinita, MySQL viene con un database denominato 'test' a cui chiunque può
accedere. Questo è anche destinato solo a test, e dovrebbe essere rimosso
prima di trasferirsi in un ambiente di produzione.
Rimuovere database di test e accedere ad esso? [S/n] <-- ENTER
- Dropping database di test...
... Successo!
- Rimozione privilegi sul database di test...
... Successo !
Ricaricare le tabelle di privilegi garantirà che tutte le modifiche apportate finora
diventeranno immediatamente effettive.
Ricaricare le tabelle privilegi adesso? [S/n] <-- ENTER
... Successo!
Pulizia ...
Tutto fatto! Se hai completato tutti i passaggi precedenti, l'installazione di MySQL
dovrà essere protetta.
Grazie per aver utilizzato MySQL!
[[ email protetto] ~]#
4 Installazione di Nginx
Nginx è disponibile come pacchetto per CentOS 6.4 (da EPEL) che possiamo installare come segue:
yum install nginx
Quindi creiamo i collegamenti di avvio del sistema per nginx e lo avviamo:
chkconfig --levels 235 nginx on
/etc/init.d/nginx start
Digita l'indirizzo IP o il nome host del tuo server web in un browser (ad es. http://192.168.0.100) e dovresti vedere la pagina di benvenuto di nginx:
5 Installazione di PHP5
Possiamo far funzionare PHP5 in nginx tramite PHP-FPM (PHP-FPM (FastCGI Process Manager) è un'implementazione PHP FastCGI alternativa con alcune funzionalità aggiuntive utili per siti di qualsiasi dimensione, in particolare i siti più affollati). Possiamo installare php-fpm insieme a php-cli e alcuni moduli PHP5 come php-mysql di cui hai bisogno se vuoi usare MySQL dai tuoi script PHP come segue:
yum install php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidy
APC è un cacher di codice operativo PHP gratuito e aperto per la memorizzazione nella cache e l'ottimizzazione del codice intermedio PHP. È simile ad altri cacher di codice operativo PHP, come eAccelerator e Xcache. Si consiglia vivamente di averne uno installato per velocizzare la tua pagina PHP.
APC può essere installato come segue:
yum install php-pecl-apc
Quindi apri /etc/php.ini e imposta cgi.fix_pathinfo=0:
vi /etc/php.ini
[...] ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo cgi.fix_pathinfo=0 [...] |
(Leggi http://wiki.nginx.org/Pitfalls per scoprire perché dovresti farlo.)
Inoltre, per evitare errori come
[08-Aug-2011 18:07:08] PHP Warning: phpinfo(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Berlin' for 'CEST/2.0/DST' instead in /usr/share/nginx/html/info.php on line 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] ; Defines the default timezone used by the date functions ; 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
[[email protected] nginx]# cat /etc/sysconfig/clock
ZONE="Europe/Berlin"
[[email protected] nginx]#
Quindi crea i collegamenti di avvio del sistema per php-fpm e avvialo:
chkconfig --levels 235 php-fpm on
/etc/init.d/php-fpm start
PHP-FPM è un processo demone (con lo script init /etc/init.d/php-fpm) che esegue un server FastCGI sulla porta 9000.
6 Configurazione di nginx
La configurazione di nginx è in /etc/nginx/nginx.conf che apriamo ora:
vi /etc/nginx/nginx.conf
La configurazione è di facile comprensione (puoi saperne di più qui:http://wiki.codemongers.com/NginxFullExample e qui:http://wiki.codemongers.com/NginxFullExample2)
Innanzitutto (questo è facoltativo) puoi aumentare il numero di processi di lavoro e impostare keepalive_timeout su un valore ragionevole:
[...] worker_processes 4; [...] keepalive_timeout 2; [...] |
Gli host virtuali sono definiti nei contenitori del server {} nella directory /etc/nginx/conf.d. Modifichiamo il vhost predefinito (in /etc/nginx/conf.d/default.conf) come segue:
vi /etc/nginx/conf.d/default.conf
[...] server { listen 80; server_name _; #charset koi8-r; #access_log logs/host.access.log main; location / { root /usr/share/nginx/html; index index.php index.html index.htm; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 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; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } } |
nome del server _; lo rende un vhost catchall predefinito (ovviamente puoi anche specificare un nome host qui come www.example.com).
Nella posizione / parte, ho aggiunto index.php alla riga dell'indice. root /usr/share/nginx/html; significa che la radice del documento è la directory /usr/share/nginx/html.
La parte importante per PHP è la stanza posizione ~ \.php$ {}. Decommentalo per abilitarlo. Modificare la riga principale nella radice del documento del sito Web (ad es. root /usr/share/nginx/html;). Si noti che ho aggiunto la riga try_files $uri =404; per prevenire exploit zero-day (vedi http://wiki.nginx.org/Pitfalls#Passing_Uncontrol_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 root del nostro documento).
PHP-FPM è in ascolto 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 linea fastcgi_pass 127.0.0.1:9000;. È anche possibile fare in modo che PHP-FPM utilizzi un socket Unix - lo descriverò nel capitolo 7.
Ora salva il file e ricarica nginx:
/etc/init.d/nginx reload
Ora crea il seguente file PHP nella radice del documento /usr/share/nginx/html...
vi /usr/share/nginx/html/info.php
<?php phpinfo(); ?> |
Ora chiamiamo quel file in un browser (es. http://192.168.0.100/info.php):
Come vedi, PHP5 funziona e funziona tramite FPM/FastCGI, come mostrato nella riga dell'API del server. Se scorri più in basso, vedrai tutti i moduli che sono già abilitati in PHP5, incluso il modulo MySQL:
7 Fare in modo che PHP-FPM utilizzi un socket Unix
Per impostazione predefinita, PHP-FPM è in ascolto sulla porta 9000 su 127.0.0.1. È anche possibile fare in modo che PHP-FPM utilizzi un socket Unix che evita l'overhead del TCP. Per fare ciò, apri /etc/php-fpm.d/www.conf...
vi /etc/php-fpm.d/www.conf
... e fai in modo che la linea di ascolto appaia come segue:
[...] ;listen = 127.0.0.1:9000 listen = /tmp/php5-fpm.sock [...] |
Quindi ricarica PHP-FPM:
/etc/init.d/php-fpm reload
Quindi passa attraverso la tua configurazione di nginx e tutti i tuoi vhost e cambia la riga fastcgi_pass 127.0.0.1:9000; a fastcgi_pass unix:/tmp/php5-fpm.sock;, ad es. così:
vi /etc/nginx/conf.d/default.conf
[...] location ~ \.php$ { root /usr/share/nginx/html; try_files $uri =404; fastcgi_pass unix:/tmp/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } [...] |
Infine ricarica nginx:
/etc/init.d/nginx reload
8 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/
Informazioni sull'autore
Falko Timme è il proprietario di Timme Hosting (hosting web nginx ultra veloce). È il principale manutentore di HowtoForge (dal 2005) e uno degli sviluppatori principali di ISPConfig (dal 2000). Ha anche contribuito al libro di O'Reilly "Linux System Administration".