Installa Nginx con PHP e MySQL (stack LEMP) su CentOS 7

In questo tutorial uso il nome host server1.example.com con l'indirizzo IP 192.168.1.105. Queste impostazioni potrebbero essere diverse per te, quindi devi sostituirle se necessario.

 

2 Abilitazione di repository aggiuntivi

Nginx non è disponibile dai repository CentOS ufficiali, quindi includiamo il repository del progetto Nginx per installarlo:

vi /etc/yum.repos.d/nginx.repo

 [nginx] name = nginx repo baseurl = http: //nginx.org/packages/centos/$releasever/$basearch/ gpgcheck = 0 abilitato = 1

 

3 Installazione di MySQL

Per prima cosa installiamo Mariadb. Mariadb è un fork gratuito di MySQL. Esegui questo comando sulla shell:

yum install mariadb mariadb-server net-tools

Quindi creiamo i collegamenti di avvio del sistema per MySQL (in modo che MySQL si avvii automaticamente all'avvio del sistema) e avvii il server MySQL:

systemctl abilita mariadb.service
systemctl start mariadb.service

Ora verifica che la rete sia abilitata. Correre

netstat -tap | grep mysql

Dovrebbe mostrare qualcosa del genere:

[root @ example ~] # netstat -tap | grep mysql
tcp 0 0 0.0.0.0: mysql 0.0.0.0: * ASCOLTA 10623 / mysqld

 

Correre

mysql_secure_installation

per impostare una password per l'utente radice (altrimenti chiunque può accedere al tuo database MySQL!):

[root @ example ~] # mysql_secure_installation
/ usr / bin / mysql_secure_installation: riga 379: find_mysql_client: comando non trovato

NOTA: ESEGUIRE TUTTE LE PARTI DI QUESTO SCRIPT È CONSIGLIATO PER TUTTI MariaDB
SERVER IN USO DI PRODUZIONE! LEGGERE ATTENTAMENTE OGNI FASE!

Per accedere a MariaDB per proteggerlo, avremo bisogno della corrente
password per l'utente root. Se hai appena installato MariaDB, e
non hai ancora impostato la password di root, la password sarà vuota,
quindi dovresti semplicemente premere invio qui.

Immettere la password corrente per root (immettere per nessuno):
OK, password utilizzata con successo, in corso ...

L'impostazione della password di root garantisce che nessuno possa accedere a MariaDB
utente root senza l'autorizzazione appropriata.

Imposta la password di root? [Y / n]<- ENTER
Nuova password: <- yourrootsqlpassword
Reinserire la nuova password: <- yourrootsqlpassword
Password aggiornata correttamente!
Ricarica le tabelle dei privilegi ..
... successo!

Per impostazione predefinita, l'installazione di MariaDB ha un utente anonimo, consentendo a chiunque
accedere a MariaDB senza che sia necessario creare un account utente
loro. Questo è inteso solo per testare e fare l'installazione
andare un po 'più liscio. Dovresti rimuoverli prima di trasferirti in a
ambiente di produzione.

Rimuovere gli utenti anonimi? [Y / n] <- ENTER
... successo!

Normalmente, a root dovrebbe essere permesso di connettersi solo da "localhost". Questo
assicura che qualcuno non possa indovinare la password di root dalla rete.

Non consentire il login di root da remoto? [Y / n] <- ENTER
... successo!

Di default, MariaDB ha un database chiamato 'test' che chiunque può
accesso. Anche questo è inteso solo per i test e dovrebbe essere rimosso
prima di trasferirsi in un ambiente di produzione.

Rimuovere il database di test e accedervi? [Y / n] <- ENTER
- Rilascio del database di test ...
... successo!
- Rimozione dei privilegi sul database di test ...
... successo!

Ricaricare le tabelle dei privilegi assicurerà che tutte le modifiche apportate finora
entrerà in vigore immediatamente.

Ricarica le tabelle dei privilegi adesso? [Y / n] <- ENTER
... successo!

Pulire…

Tutto fatto! Se hai completato tutti i passaggi precedenti, il tuo MariaDB
l'installazione dovrebbe ora essere sicura.

Grazie per aver utilizzato MariaDB!
[root @ example ~] #

[root @ server1 ~] # mysql_secure_installation

4 Installazione di Nginx

Nginx è disponibile come pacchetto da nginx.org che possiamo installare come segue:

yum installa nginx

Quindi creiamo i collegamenti di avvio del sistema per nginx e avvialo:

systemctl abilita nginx.service
systemctl start nginx.service

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

[root @ server1 ~] # servizio nginx start
Avvio di nginx: nginx: [emerge] bind () su 0.0.0.0: 80 non riuscito (98: indirizzo già in uso)
nginx: [emerge] bind () a 0.0.0.0: 80 fallito (98: indirizzo già in uso)
nginx: [emerge] bind () a 0.0.0.0: 80 fallito (98: indirizzo già in uso)
nginx: [emerge] bind () a 0.0.0.0: 80 fallito (98: indirizzo già in uso)
nginx: [emerge] bind () a 0.0.0.0: 80 fallito (98: indirizzo già in uso)
nginx: [emerge] ancora non poteva legare ()
[FAILED]
[root @ server1 ~] #

Quindi significa che ci sono possibilità di servizio Apache in esecuzione lì. Interrompere il servizio e avviare ulteriormente il servizio per NGINX come segue

systemctl stop httpd.service
yum rimuovi httpd
systemctl disabilita httpd.service

systemctl abilita nginx.service
systemctl start nginx.service

E 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 sarà simile a questo:

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

Inserisci l'indirizzo IP o il nome host del tuo server web in un browser (es http://192.168.1.105), 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 di PHP FastCGI alternativa con alcune funzionalità aggiuntive utili per siti di qualsiasi dimensione, in particolare siti più frequentati). Possiamo installare php-fpm insieme 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-ldap php-odbc php-pdo php-pecl-memcache php-pear php-mbstring php-xml php-xmlrpc php-mbstring php-snmp php-sapone

APC è un cacher opcode PHP gratuito e aperto per il caching e l'ottimizzazione del codice intermedio PHP. È simile ad altri cachers opcode PHP, come eAccelerator e Xcache. Si consiglia vivamente di avere uno di questi installato per accelerare la pagina PHP.

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

yum installa php-devel
yum groupinstall 'Strumenti di sviluppo'

e installare APC

pecl install apc

[root @ example ~] # pecl install apc
scaricare APC-3.1.13.tgz ...
Iniziare a scaricare APC-3.1.13.tgz (byte 171,591)
............... .. done: 171,591 byte
File sorgente 55, creazione
in esecuzione: phpize
Configurazione per:
Versione API PHP: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525
Abilita il debug interno in APC [no]: <- ENTER
Abilita per informazioni sul file di richiesta sui file utilizzati dalla cache APC [no]: <- ENTER
Abilita spin lock (SPERIMENTALE) [no]: <- ENTER
Abilita protezione memoria (SPERIMENTALE) [no]: <- ENTER
Abilita mutex pthread (predefinito) [no]: <- ENTER
Abilita i blocchi di lettura / scrittura pthread (SPERIMENTALE) [sì]: <- ENTER
costruzione in / var / tmp / pear-build-rootVrjsuq / APC-3.1.13
......

Quindi apri /etc/php.ini e impostare cgi.fix_pathinfo = 0:

vi /etc/php.ini

[...]; cgi.fix_pathinfo fornisce il supporto * reale * PATH_INFO / PATH_TRANSLATED per CGI. PHP; comportamento precedente era quello di impostare PATH_TRANSLATED su SCRIPT_FILENAME e di non eseguire il grok; cos'è PATH_INFO. Per ulteriori informazioni su PATH_INFO, vedere le specifiche cgi. Ambientazione ; questo per 1 farà sì che PHP CGI corregga i suoi percorsi per conformarsi alle specifiche. Un'impostazione; di zero fa sì che PHP si comporti come prima. L'impostazione predefinita è 1. Dovresti correggere i tuoi script; utilizzare SCRIPT_FILENAME anziché 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 farlo.)

e aggiungi la linea:

[...] estensione = apc.so

alla fine di /etc/php.ini file.

Oltre a ciò, al fine di evitare errori di fuso orario come

[21-July-2014 10: 07: 08] Avviso PHP: phpinfo (): non è sicuro affidarsi alle impostazioni del fuso orario del sistema. Sei * richiesto * per utilizzare l'impostazione date.timezone o la funzione date_default_timezone_set (). Nel caso in cui hai usato uno di questi metodi e ricevi ancora questo avviso, molto probabilmente hai sbagliato a digitare l'identificatore del fuso orario. Abbiamo selezionato "Europa / Berlino" per "CEST / 2.0 / DST" in /usr/share/nginx/html/info.php sulla linea 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:

[...] [Data] ; Definisce il fuso orario predefinito usato dalle funzioni di data; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone date.timezone = "Europa / Berlino" [...]

Puoi trovare 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] #

Quindi creare i collegamenti di avvio del sistema per php-fpm e avviarlo:

systemctl abilita php-fpm.service
systemctl avvia 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.

 

6 Configurazione di nginx

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

vi /etc/nginx/nginx.conf

La configurazione è facile da capire (si può imparare di più qui: http://wiki.codemongers.com/NginxFullExample e qui: http://wiki.codemongers.com/NginxFullExample2)

Primo (questo è facoltativo) è possibile aumentare il numero di processi di lavoro e impostare il keepalive_timeout ad un valore ragionevole:

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

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

vi /etc/nginx/conf.d/default.conf

[...] server {ascolta 80; nome_server localhost; #charset koi8-r; #access_log /var/log/nginx/log/host.access.log main; posizione / {root / usr / share / nginx / html; indice index.html index.htm; } #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 #

    posizione ~ .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 radice del documento # di Apache è compatibile con quella # di nginx
    posizione ~ /.ht {nega tutto; }

}

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

Nel Posizione / parte, ho aggiunto index.php al indice linea. root / usr / share / nginx / html; significa che la radice del documento è la directory / Usr / share / nginx / html.

La parte importante per PHP è il posizione ~ .php $ {} stanza. Rimuovi il commento per attivarlo. Cambiare il radice linea verso la radice del documento del sito web (es root / usr / share / nginx / html;). Si prega di notare che ho aggiunto la linea try_files $ uri = 404; per prevenire gli 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). Si prega di assicurarsi di modificare il fastcgi_param linea a 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 dei documenti).

PHP-FPM è in ascolto sulla porta 9000 on 127.0.0.1 di default, quindi diciamo a nginx di connetterci 127.0.0.1: 9000 con la linea fastcgi_pass 127.0.0.1: 9000;. È anche possibile fare PHP-FPM usare un socket Unix - lo descriverò 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...

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

<? php phpinfo (); ?>

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

Clicca per ingrandire

 

Come vedete, PHP5 sta funzionando, e sta funzionando con FPM / FastCGI, come mostrato in API Server linea. Se scorri verso il basso, vedrai tutti i moduli che sono già abilitati in PHP5, incluso il modulo MySQL:

Clicca per ingrandire

 

 

7 Making PHP-FPM Usa un socket Unix

Di default PHP-FPM è in ascolto sulla porta 9000 on 127.0.0.1. È anche possibile fare in modo che PHP-FPM usi un socket Unix che evita il sovraccarico del TCP. Per fare questo, apri /etc/php-fpm.d/www.conf...

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

... e fare il ascolta linea guarda come segue:

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

Quindi ricarica PHP-FPM:

systemctl restart php-fpm.service

Quindi passa attraverso la configurazione di nginx e tutti i tuoi vhosts e modifica la linea fastcgi_pass 127.0.0.1: 9000; to fastcgi_pass unix: /tmp/php5-fpm.sock;, ad esempio in questo modo:

vi /etc/nginx/conf.d/default.conf

[...] posizione ~ .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

Lascia un Commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati dei tuoi commenti.