Come configurare smartphone e PC. Portale informativo
  • casa
  • Errori
  • Cos'è Nginx? Server Web Nginx e Apache: cos'è e come funziona questa combinazione.

Cos'è Nginx? Server Web Nginx e Apache: cos'è e come funziona questa combinazione.

Soggetto impostazioni corrette nginx è molto grande e, temo, non rientra nel quadro di un articolo su Habré. In questo testo ho cercato di parlare di struttura generale config, piccole cose e dettagli più interessanti potrebbero arrivare in seguito. :)

Un buon punto di partenza per configurare nginx è la configurazione fornita con la distribuzione, ma molte delle funzionalità di questo server non sono nemmeno menzionate al suo interno. Molto di piu esempio dettagliato disponibile sul sito web di Igor Sysoev: sysoev.ru/nginx/docs/example.html. Tuttavia, proviamo meglio a costruire la nostra configurazione da zero, con bridge e poetesses. :)

Iniziamo con impostazioni generali. Per prima cosa indicheremo l'utente per conto del quale verrà eseguito nginx (è brutto lavorare come root, lo sanno tutti :))

Ora diciamo a nginx quanti processi di lavoro generare. Generalmente, bella scelta A volte il numero di processi è uguale al numero di core del processore nel server, ma vale la pena sperimentare questa impostazione. Se è previsto un carico elevato HDD, puoi eseguire un processo per ciascun disco rigido fisico, poiché tutto il lavoro sarà comunque limitato dalle sue prestazioni.

Processi_lavoratore 2;

Chiariamo dove scrivere i log degli errori. Quindi, per i singoli server virtuali, questo parametro può essere sovrascritto, in modo che in questo registro vengano visualizzati solo gli errori "globali", ad esempio relativi all'avvio del server.

Avviso_log_errore /spool/logs/nginx/nginx.error_log; # Il livello di notifica "avviso" può ovviamente essere modificato

Ora arriva la sezione “eventi” molto interessante. In esso puoi impostare importo massimo connessioni che un processo di lavoro elaborerà simultaneamente e un metodo che verrà utilizzato per ricevere notifiche asincrone sugli eventi nel sistema operativo. Naturalmente potete selezionare solo i metodi disponibili sul vostro sistema operativo e che sono stati inclusi durante la compilazione.

Queste impostazioni possono avere un impatto significativo sulle prestazioni del tuo server. Devono essere selezionati individualmente, a seconda del sistema operativo e dell'hardware. Posso solo dare alcune regole generali.

Moduli per lavorare con gli eventi:
- select e poll sono solitamente più lenti e caricano parecchio il processore, ma sono disponibili quasi ovunque e funzionano quasi sempre;
- kqueue ed epoll - più efficienti, ma disponibili solo rispettivamente su FreeBSD e Linux 2.6;
- rtsig - carino metodo efficace, ed è supportato anche da sistemi Linux molto vecchi, ma può causare problemi quando elevato numero connessioni;
- /dev/poll - per quanto ne so, funziona in sistemi un po' più esotici, come Solaris, ed è abbastanza efficace lì;

Parametro connessioni_lavoratore:
- Il numero massimo totale di clienti serviti sarà pari a lavoratore_processi * lavoratori_connessioni;
- A volte possono lavorare lato positivo anche i valori più estremi, come 128 processi, 128 connessioni per processo o 1 processo, ma con il parametro work_connections=16384. In quest'ultimo caso, tuttavia, molto probabilmente dovrai ottimizzare il sistema operativo.

Eventi (
connessioni_lavoratore 2048;
usa kqueue; # Abbiamo BSD :)
}

La sezione successiva è la più grande e contiene le cose più interessanti. Questa è una descrizione dei server virtuali e alcuni parametri comuni a tutti loro. Ometterò le impostazioni standard presenti in ogni configurazione, come i percorsi dei log.

HTTP(
# Tutto il codice seguente sarà all'interno di questa sezione%)
# ...
}

All'interno di questa sezione potrebbero esserci dei parametri piuttosto interessanti.

La chiamata di sistema sendfile è relativamente nuova per Linux. Ti consente di inviare dati alla rete senza doverli copiare nello spazio degli indirizzi dell'applicazione. In molti casi, ciò migliora significativamente le prestazioni del server, quindi è meglio abilitare sempre l'opzione sendfile.

Il parametro keepalive_timeout è responsabile del tempo massimo per mantenere una connessione keepalive se l'utente non richiede nulla su di essa. Considera il modo in cui il tuo sito invia le richieste e modifica questa impostazione. Per i siti che utilizzano attivamente AJAX, è meglio mantenere la connessione più a lungo; per le pagine statiche che gli utenti leggeranno a lungo, è meglio interrompere anticipatamente la connessione. Tieni presente che mantenendo una connessione keepalive inattiva, stai attivando una connessione che potrebbe essere utilizzata diversamente. :)

Keepalive_timeout 15;

Separatamente, vale la pena evidenziare le impostazioni del proxy nginx. Molto spesso, nginx viene utilizzato proprio come server proxy, di conseguenza hanno abbastanza Grande importanza. In particolare, ha senso impostare la dimensione del buffer per le richieste proxy su un valore non inferiore alla dimensione della risposta prevista dal server backend. Con backend lenti (o, al contrario, molto veloci), ha senso modificare i timeout per l'attesa di una risposta dal backend. Ricorda, più lunghi sono questi timeout, più a lungo i tuoi utenti attenderanno una risposta se il backend è lento.

Buffer_proxy 8 64k;
proxy_intercept_errors attivo;
proxy_connect_timeout 1s;
proxy_read_timeout 3s;
proxy_send_timeout 3s;

Un piccolo trucco. Nel caso in cui nginx serva più di un host virtuale, ha senso creare un "host virtuale predefinito" che elaborerà le richieste nei casi in cui il server non riesce a trovare un'altra alternativa utilizzando l'intestazione Host nella richiesta del client.

# host virtuale predefinito
server (
ascolta 80 predefinito;
nome_server host locale;
negare tutto;
}

Questo può essere seguito da una (o più) sezioni “server”. Ognuno di essi descrive un host virtuale (molto spesso basato sul nome). Per i proprietari di molti siti su un hosting o per gli hoster, potrebbe esserci qualcosa di simile a una direttiva

Includere /spool/users/nginx/*.conf;

Il resto molto probabilmente descriverà il proprio host virtuale direttamente nella configurazione principale.

Server (
ascolta 80;

# Tieni presente che la direttiva server_name può specificare più nomi contemporaneamente.
nome_server mioserver.ru mioserver.com;
access_log /spool/logs/nginx/myserver.access_log temporizzato;
error_log /spool/logs/nginx/myserver.error_log avvisa;
# ...

Impostiamo la codifica predefinita per l'output.

Carattere utf-8;

E diciamo che non vogliamo accettare richieste da client di lunghezza superiore a 1 megabyte.

Cliente_max_corpo_dimensione 1m;

Abilitiamo SSI per il server e chiediamo di riservare non più di 1 kilobyte per le variabili SSI.

Sì, sì;
ssi_value_length 1024;

E infine, descriveremo due percorsi, uno dei quali porterà al backend, ad Apache in esecuzione sulla porta 9999, e il secondo invierà immagini statiche dal file system locale. Per due posizioni questo non ha molto senso, ma per un numero maggiore di esse ha anche senso definire immediatamente una variabile in cui verrà archiviata la directory root del server e quindi utilizzarla nelle descrizioni delle posizioni.

Server Web dedicato basato su nginx – ottimo modo migliorare le prestazioni dei siti Web. Nella velocità di elaborazione contenuto statico semplicemente non ha eguali: può facilmente resistere a diverse migliaia connessioni simultanee e può essere facilmente ottimizzato e adattato a qualsiasi configurazione. Tuttavia? Agendo come front-end per Apache, nginx risulta essere il punto più vulnerabile dell'intera infrastruttura Web, quindi è necessario prestare particolare attenzione alla sicurezza di nginx.

Questo articolo è una sorta di programma educativo o, se vuoi, un riepilogo di tutte le tecniche per migliorare la sicurezza di nginx. Non conterrà teoria, una descrizione delle basi per la configurazione di un server Web e altre sciocchezze. Riceverai invece un pacchetto completo materiale pratico, che descrive tutti i passaggi fondamentali da compiere per avere un server Web veramente sicuro.

Installazione

Il pacchetto nginx è disponibile in forma precompilata per qualsiasi distribuzione. Tuttavia, costruendo il server da soli, è possibile renderlo più compatto e affidabile e si avrà anche l'opportunità di modificare la riga di saluto del server Web per scoraggiare gli sciocchi script kid.

Modificare la riga di saluto del server Web

Scarica i sorgenti nginx, apri il file src/http/ngx_http_header_filter_module.c e trova le seguenti due righe:

static char ngx_http_server_string = "Server: nginx" CRLF;
static char ngx_http_server_full_string = "Server: " NGINX_VER CRLF;

Sostituiscili con qualcosa del genere:

static char ngx_http_server_string = "Server: ][ Server web"CRLF;
static char ngx_http_server_full_string = "Server: ][ Server Web" CRLF;

Rimuovi tutti i moduli nginx che non stai utilizzando

Alcuni moduli nginx si connettono al server Web direttamente durante la compilazione e ognuno di essi è pieno di potenziali pericoli. Forse in futuro verrà trovata una vulnerabilità in uno di essi e il tuo server sarà a rischio. Disabilitando i moduli non necessari, puoi ridurre significativamente il rischio che si verifichi una situazione del genere.

Costruisci utilizzando i seguenti comandi:

# ./configure --without-http_autoindex_module --without-http_ssi_module
#Fare
# crea installazione

In questo modo otterrai nginx con i moduli SSI (Server Side Include) e Autoindex disabilitati anticipatamente (e nella maggior parte dei casi inutili). Per scoprire quali moduli possono essere rimossi in modo sicuro dal server Web, eseguire lo script configure con il flag '-help'.

Analizziamo nginx.conf

Dopo l'installazione, nginx dovrebbe essere configurato. Sulle pagine della rivista c'era già materiale che descriveva questo processo, ma resteremo fedeli all'argomento dell'articolo e parleremo di come aumentare la sicurezza del server.

Disabilita la visualizzazione della versione del server su tutte le pagine di errore

Aggiungi la riga "server_tokens off" al file nginx.conf. Ciò costringerà nginx a nascondere le informazioni sul tipo e sulla versione del server Web sulle pagine generate in risposta a una richiesta errata del client.

Configura la protezione contro l'interruzione dello stack

Aggiungi alla sezione server seguenti righe:

# vi /etc/nginx/nginx.conf

# Dimensione massima del buffer per la memorizzazione del corpo della richiesta del client
client_body_buffer_size 1K;
# Dimensione massima del buffer per la memorizzazione delle intestazioni delle richieste del client
client_header_buffer_size 1k;
# La dimensione massima del corpo della richiesta del client, specificata nel campo dell'intestazione Content-Length. Se il server deve supportare il caricamento di file, questo valore deve essere aumentato
cliente_max_corpo_dimensione 1k;
# Numero e dimensione dei buffer per la lettura di intestazioni di richieste client di grandi dimensioni
large_client_header_buffers 2 1k;

Presta attenzione alla direttiva large_client_header_buffers. Per impostazione predefinita, nginx alloca quattro buffer per memorizzare la stringa URI, ciascuno della dimensione uguale alla taglia pagine di memoria (per x86 questo è 4 KB). I buffer vengono rilasciati ogni volta che la connessione entra nello stato keep-alive dopo l'elaborazione di una richiesta. Due buffer da 1 KB possono memorizzare URI lunghi solo 2 KB, il che aiuta a combattere bot e attacchi DoS.

Per migliorare le prestazioni, aggiungere le seguenti righe:

# vi /etc/nginx/nginx.conf

# Timeout durante la lettura del corpo della richiesta del client
client_body_timeout 10;
# Timeout durante la lettura dell'intestazione della richiesta del client
client_header_timeout 10;
# Timeout trascorso il quale la connessione keep-alive con il client non verrà chiusa dal lato server
keepalive_timeout 5 5;
# Timeout durante l'invio della risposta al client
invio_timeout 10;

Controlla il numero di connessioni simultanee

Per proteggere il Web server da sovraccarichi e tentativi di effettuare un attacco DoS, aggiungere alla configurazione le seguenti righe:

# vi /etc/nginx/nginx.conf

# Descriviamo la zona (limiti) in cui verranno archiviati gli stati della sessione. Una zona da 1 MB può memorizzare circa 32000 stati, impostiamo la sua dimensione su 5 MB
limit_zone riduce $binary_remote_addr 5m;
# Imposta il numero massimo di connessioni simultanee per una sessione. Essenzialmente, questo numero specifica il numero massimo di connessioni da un IP
limit_conn riduce 5;

La prima direttiva dovrebbe trovarsi nella sezione HTTP, la seconda nella sezione location. Quando il numero di connessioni supera i limiti, il client riceverà un messaggio "Servizio non disponibile" con il codice 503.

Consenti connessioni solo al tuo dominio

Gli hacker possono utilizzare i bot per scansionare le sottoreti e trovare server Web vulnerabili. In genere, i bot attraversano semplicemente gli intervalli di indirizzi IP alla ricerca di 80 porte aperte e inviano una richiesta HEAD per ottenere informazioni sul server Web (o sulla home page). Puoi facilmente impedire tale scansione vietando l'accesso al server tramite l'indirizzo IP (aggiungi alla sottosezione relativa alla posizione):

# vi /etc/nginx/nginx.conf

if ($host!~ ^(host.com|www.host.com)$) (
ritorno 444;
}

Limitare il numero di metodi disponibili per accedere al server Web

Alcuni bot utilizzano diversi metodi per contattare il server e tentare il rilevamento del tipo e/o l'infiltrazione, ma RFC 2616 afferma chiaramente che il server Web non è tenuto a implementarli tutti e che i metodi non supportati potrebbero semplicemente non essere elaborati. Oggi rimangono in uso solo i metodi GET (richiesta documento), HEAD (richiesta intestazione server) e POST (richiesta pubblicazione documento), quindi tutti gli altri possono essere disabilitati senza problemi inserendo le seguenti righe nella sezione server del file di configurazione:

# vi /etc/nginx/nginx.conf

if ($metodo_richiesta !~ ^(GET|HEAD|POST)$) (
ritorno 444;
}

Spegni i bot

Un altro modo per bloccare bot, scanner e altri spiriti maligni si basa sulla determinazione del tipo di client (user-agent). Non è molto efficace, perché la maggior parte dei bot prendono di mira browser completamente legittimi, ma in alcuni casi rimane utile:

# vi /etc/nginx/nginx.conf

# Blocca i gestori di download
if ($http_user_agent ~* LWP::Simple|BBBike|wget) (
ritorno 403;
}
# Blocca alcuni tipi di bot
if ($http_user_agent ~* msnbot|scrapbot) (
ritorno 403;
}

Blocca lo spam dei referrer

Se il tuo sito pubblica log Web in un formato accessibile al pubblico, puoi facilmente diventare vittima dello spam Referrer (quando i bot spam contattano il tuo server, indicando referrer nell'intestazione - l'indirizzo del sito pubblicizzato). Questo tipo di spam può facilmente rovinare le valutazioni SEO di una pagina web, quindi deve essere bloccato a colpo sicuro. Un modo per farlo è inserire nella lista nera le parole più comuni trovate negli indirizzi dei siti pubblicizzati.

# vi /etc/nginx/nginx.conf

# Sezione server
if ($http_referer ~* (bellezze|in vendita|ragazza|gioielli|amore|nudit|organic|poker|porno|sesso|adolescente))
{
ritorno 403;
}

Blocca il collegamento

Un hotlink è l'inclusione di un'immagine (o altro contenuto) da un altro sito in una pagina. Si tratta essenzialmente di un furto, perché l'immagine su cui hai trascorso più di un'ora del tuo tempo libero non solo viene utilizzata liberamente da altri, ma crea anche un carico sul tuo server Web senza attirare visitatori. Per combattere gli hotlink è sufficiente assicurarsi che le immagini vengano inviate al cliente solo se le ha richieste mentre era già sul sito (in altre parole, l'intestazione della richiesta del referrer dovrebbe contenere il nome del tuo sito). Aggiungi le seguenti righe alla sezione server del file di configurazione nginx.conf (host.com è l'indirizzo del tuo sito web):

# vi /etc/nginx/nginx.conf

posizione /immagini/ (
valid_referers nessuno bloccato www.host.com host.com;
se ($referer_invalido) (
ritorno 403;
}
}

In alternativa, è possibile configurare il server per il caricamento striscione speciale con un messaggio di furto al posto dell'immagine richiesta. Per fare ciò, sostituisci la riga “return 403” con la riga:

riscrivi ^/images/uploads.*\.(gif|jpg|jpeg|png)$ http://www.host.com/banned.jpg ultimo

Proteggi le directory importanti dagli estranei

Come qualsiasi altro server Web, nginx consente di regolare l'accesso alle directory in base a indirizzi IP e password. Questa funzionalità può essere utilizzata per proteggere alcune parti del sito da occhi indiscreti. Ad esempio, per isolare l'URI dal mondo esterno:

# vi /etc/nginx/nginx.conf

posizione /caricamenti/ (
# Consenti l'accesso solo alle macchine rete locale
consentire 192.168.1.0/24;
# Uccidiamo tutti gli altri
negare tutto;
}

Ora solo gli utenti della rete locale avranno accesso ai documenti nella directory dei caricamenti. Per impostare una password dovrai fare di più azioni complesse. Innanzitutto, devi creare un file di password privato per nginx e aggiungervi gli utenti necessari (ad esempio, aggiungiamo l'utente amministratore):

# mkdir /etc/nginx/.htpasswd
# htpasswd -c /etc/nginx/.htpasswd/passwd admin

# vi /etc/nginx/nginx.conf

posizione /admin/ (
auth_basic "Limitato";
auth_basic_user_file /etc/nginx/.htpasswd/passwd;
}

È possibile aggiungere nuovi utenti utilizzando il seguente comando:

# htpasswd -s /etc/nginx/.htpasswd/passwd utente

Utilizza SSL

Se il tuo sito funziona con dati utente privati, come i numeri carte di credito, password di altri servizi o fornisce l'accesso ad altre informazioni importanti che potrebbero diventare bocconcino per terze parti, occuparsi della crittografia. Nginx funziona bene con SSL e questa funzionalità non dovrebbe essere trascurata.

Per impostare la crittografia SSL utilizzando nginx, basta seguire alcuni semplici passaggi. Per prima cosa devi creare un certificato utilizzando la seguente sequenza di comandi:

# cd /etc/nginx
# openssl genrsa -des3 -out server.key 1024
# openssl req -new -key server.key -out server.csr
# cp server.key server.key.org
# openssl rsa -in server.key.org -out server.key
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Quindi descrivere il certificato in file di configurazione nginx:

# vi /etc/nginx/nginx.conf

server (
nome_server host.com;
ascolta 443;
SSL attivo;
certificato_ssl /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
access_log /etc/nginx/logs/ssl.access.log;
error_log /etc/nginx/logs/ssl.error.log;
}

Successivamente è possibile riavviare il server Web:

# /etc/init.d/nginx ricarica

Naturalmente, senza il supporto del sito Web stesso, è inutile farlo.

altri metodi

Imposta i valori corretti per le variabili di sistema

Apri il file /etc/sysctl.conf e inserisci al suo interno le seguenti righe:

# vi /etc/sysctl.conf

# Protezione contro gli attacchi dei puffi
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Protezione contro i messaggi ICMP non validi
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Protezione contro l'inondazione SYN
net.ipv4.tcp_syncookies = 1
# Disabilita il routing di origine
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Protezione anti-spoofing
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Non siamo un router
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Abilita ExecShield
kernel.exec-shield = 1
kernel.randomize_va_space = 1
# Ampliare la gamma di porte disponibili
net.ipv4.ip_local_port_range = 2000 65000
# Aumenta la dimensione massima dei buffer TCP
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1

Posiziona la directory root del server web su una partizione dedicata

Posizionando la directory root del server Web in una partizione dedicata e vietando il posizionamento di qualsiasi file eseguibili e file del dispositivo, proteggerai il resto del sistema da chiunque possa accedere alla radice del server Web. In questo caso, la voce nel file /etc/fstab dovrebbe assomigliare a questa:

/dev/sda5 /nginx ext4 valori predefiniti,nosuid,noexec,nodev 1 2

Posiziona nginx in un ambiente chroot/jail

Qualsiasi moderno sistema *nix consente di bloccare l'applicazione in un ambiente di esecuzione isolato. In Linux, puoi utilizzare le tecnologie KVM, Xen, OpenVZ e VServer per questo, in FreeBSD - Jail, in Solaris - Zones. Se nessuna di queste tecnologie è disponibile, puoi inserire nginx in un classico chroot che, sebbene molto più fragile, può fermare la maggior parte degli hacker.

Installa le regole SELinux per proteggere nginx

Una buona alternativa ambienti isolati le prestazioni sono sistemi locali strumenti di rilevamento e prevenzione delle intrusioni come SELinux o AppArmor. Se configurati correttamente, possono impedire tentativi di hackeraggio del server Web. Per impostazione predefinita, nessuno di essi è configurato per funzionare insieme a nginx, tuttavia, nell'ambito del progetto SELinuxNginx(http://sf.net/projects/selinuxnginx/) sono state create regole per SELinux che chiunque può utilizzare. Non resta che scaricare e installare:

# tar -zxvf se-ngix_1_0_10.tar.gz
# cd se-ngix_1_0_10/nginx
#Fare
# /usr/sbin/semodule -i nginx.pp

Configurazione del firewall

In genere, nginx è installato su macchine dedicate pronte per carichi elevati, quindi è spesso l'unico servizio di rete in esecuzione sul server. Per proteggere il server è sufficiente creare un piccolissimo insieme di regole che apriranno le porte 80, 110 e 143 (se, ovviamente, nginx dovesse funzionare anche come proxy IMAP/POP3) e chiuderanno tutto il resto dal mondo esterno .

Limita il numero di connessioni utilizzando un firewall

Per un sito Web poco carico, è una buona idea limitare il numero di tentativi di connessione da un singolo indirizzo IP al minuto. Questo può proteggerti da alcuni tipi di attacchi DoS e forza bruta. Su Linux, questo può essere fatto utilizzando il modulo di stato standard iptables/netfilter:

# iptables -A INPUT -p tcp --dport 80 -i eth0 \
-m stato --state NUOVO -m recente --set
# iptables -A INPUT -p tcp --dport 80 -i eth0 \
-m stato --state NUOVO -m recente --aggiornamento \
--secondi 60 --hitcount 15 -j DROP

Le regole riducono il limite al numero di connessioni da un IP al minuto a 15. Lo stesso può essere fatto utilizzando pf:

# vi /etc/pf.conf

webserver_ip="1.1.1.1"
tavolo persistere
blocca l'accesso rapido da
passare $ext_if proto tcp a $webserver_ip \
porta www flag S/SA mantieni stato \
(max-src-conn 100, max-src-conn-rate 15/60,\
sovraccarico sciacquone)

Oltre al limite al numero di connessioni sequenziali (15 al minuto), questa regola prevede un ulteriore limite al numero di connessioni simultanee pari a 100.

Configurazione PHP

Se usi nginx insieme a PHP, non dimenticare di configurarlo anche tu. Ecco come dovrebbe apparire il file di configurazione /etc/php/php.ini del server sicuro:

# vi /etc/php/php.ini

# Disabilita le funzioni pericolose
disabilita_funzioni = phpinfo, sistema, posta, exec
# Tempo massimo di esecuzione dello script
tempo_max_esecuzione = 30
# Tempo massimo che lo script può impiegare per elaborare i dati della richiesta
max_input_time = 60
# Quantità massima di memoria allocata a ciascuno script
limite_memoria = 8M
# Dimensione massima dei dati inviati allo script utilizzando il metodo POST
post_max_size = 8M
# Dimensione massima dei file caricati
upload_max_dimensione file = 2 milioni
# Non mostrare gli errori di script PHP agli utenti
errori_visualizzati = disattivato
# Abilita la modalità provvisoria
modalità_sicura = attiva
# Abilita la modalità provvisoria SQL
sql.safe_mode = Attivato
# Consenti l'esecuzione di comandi esterni solo in questa directory
safe_mode_exec_dir = /percorso/della/directory/protetta
# Proteggi dalla fuga di informazioni su PHP
esporre_php = Disattivato
# Conserviamo i registri
log_errori = Attivo
# Impedisce l'apertura di file remoti
consent_url_fopen = Disattivato

conclusioni

Applicando i consigli descritti in questo articolo, otterrai un server Web molto più sicuro. Ma tieni presente che non tutte le tecniche sono adatte alla tua configurazione. Ad esempio, la protezione dalla forza bruta basata sulla riduzione della dimensione dei buffer allocati da nginx per l'elaborazione delle richieste dei client può portare a una diminuzione delle prestazioni e, in alcuni casi, a errori nell'elaborazione delle richieste. Limitare il numero di connessioni avrà un grave impatto sulle prestazioni anche di un sito Web con un carico moderato, ma sarà vantaggioso se la pagina ha un traffico ridotto. Controlla sempre in che modo le modifiche apportate influiscono sulle prestazioni e sullo stato generale della pagina Web.

A proposito dell'eroe del giorno

Nginx è uno dei server Web più potenti e popolari al mondo. Secondo Netcraft, viene utilizzato per supportare più di 12 milioni di siti Web in tutto il mondo, inclusi mastodonti come Rambler, Yandex, Begun, WordPress.com, Wrike, vkontakte.ru, megashara.com, Librusec e Taba.ru. Un'architettura competente basata su connessioni multiplex utilizzando chiamate di sistema select, epoll (Linux), kqueue (FreeBSD) e un meccanismo di gestione della memoria basato su pool (piccoli buffer da 1 a 16 KB) consente a nginx di non cedere anche sotto carichi molto elevati, resistendo oltre 10.000 connessioni simultanee (il cosiddetto problema C10K). Scritto originariamente da Igor Sysoev per Rambler e aperto nel 2004 con una licenza simile a BSD.

In contatto con

E altri). Versione attuale,0.6.x, è considerato stabile in termini di affidabilità, mentre i rilasci dal ramo 0.7 sono considerati instabili. È importante notare che la funzionalità di alcuni moduli cambierà, di conseguenza anche le direttive potrebbero cambiare retrocompatibilità in nginx prima della versione 1.0.0 non è garantito.

Perché nginx è così valido e perché gli amministratori di progetti ad alto carico lo adorano così tanto? Perché non usare semplicemente Apache?

Perché Apache è cattivo?

Per prima cosa dobbiamo spiegare come funzionano in generale. server di rete. Chi ha familiarità con la programmazione di rete sa che esistono essenzialmente tre modelli di funzionamento del server:

  1. Coerente. Il server apre un socket di ascolto e attende che venga visualizzata una connessione (è in uno stato bloccato durante l'attesa). Quando arriva una connessione, il server la elabora nello stesso contesto, chiude la connessione e attende nuovamente la connessione. Ovviamente questo non è il modo migliore, soprattutto quando lavorare con un cliente richiede molto tempo e ci sono molte connessioni. Inoltre, il modello sequenziale presenta molti più svantaggi (ad esempio, l'impossibilità di utilizzare più processori) e in condizioni reali non viene praticamente utilizzato.
  2. Multiprocesso (multithread). Il server apre un socket in ascolto. Quando arriva una connessione, la accetta, dopodiché crea (o prende da un pool di processi pre-creati) un nuovo processo o thread che può funzionare con la connessione per tutto il tempo desiderato e, al termine del lavoro, terminare o ritorno in piscina. Il thread principale, nel frattempo, è pronto ad accettare una nuova connessione. Questo è il modello più popolare perché è relativamente facile da implementare, consente di eseguire calcoli complessi e dispendiosi in termini di tempo su ciascun client e utilizza tutti i processori disponibili. Un esempio del suo utilizzo è Server Web Apache. Tuttavia, questo approccio presenta anche degli svantaggi: quando grandi quantità le connessioni simultanee creano molti thread (o, peggio ancora, processi) e il sistema operativo spende molte risorse sui cambi di contesto. È particolarmente grave quando i client sono molto lenti nell’accettare i contenuti. Ciò si traduce in centinaia di thread o processi impegnati solo nell'invio di dati a client lenti, il che crea un carico aggiuntivo sullo scheduler del sistema operativo, aumenta il numero di interruzioni e consuma molta memoria.
  3. Prese/macchina a stati non bloccanti. Il server opera all'interno di un singolo thread, ma utilizza socket non bloccanti e un meccanismo di polling. Quelli. server ad ogni iterazione ciclo infinito Seleziona da tutti i socket quello pronto a ricevere/inviare dati utilizzando la chiamata select(). Dopo aver selezionato il socket, il server gli invia i dati o li legge, ma non attende la conferma, ma passa allo stato iniziale e attende un evento su un altro socket o elabora quello successivo in cui si è verificato l'evento durante l'elaborazione del precedente. Questo modello Utilizza il processore e la memoria in modo molto efficiente, ma è piuttosto complesso da implementare. Inoltre, all'interno di questo modello, l'elaborazione degli eventi su un socket deve avvenire molto rapidamente, altrimenti molti eventi si accumuleranno nella coda e alla fine questa andrà in overflow. Questo è esattamente il modello su cui lavora nginx. Inoltre, consente di eseguire più processi di lavoro (i cosiddetti lavoratori), ad es. può utilizzare più processori.

Immaginiamo quindi la seguente situazione: 200 client con un canale da 256 Kbit/s si connettono ad un server HTTP con un canale da 1 Gbit/s:

Cosa succede nel caso di Apache? Vengono creati 200 thread/processi che generano contenuto in tempi relativamente brevi (potrebbe essere qualcosa del tipo pagine dinamiche e file statici letti dal disco), ma li stanno lentamente distribuendo ai client. Il sistema operativo è costretto a far fronte a una serie di thread e blocchi I/O.

In questa situazione, Nginx spende un ordine di grandezza in meno di risorse del sistema operativo e memoria su ciascuna connessione. Tuttavia, ciò rivela una limitazione del modello di rete nginx: non può generare contenuti dinamici internamente, perché questo porterà a blocchi all'interno di nginx. Naturalmente esiste una soluzione: nginx può proxy tali richieste (per la generazione di contenuti) a qualsiasi altro server web (ad esempio, lo stesso Apache) o a un server FastCGI.

Consideriamo il meccanismo di funzionamento della combinazione nginx come server “principale” e Apache come server per la generazione di contenuti dinamici:

Nginx accetta la connessione dal client e legge da esso l'intera richiesta. Va notato qui che finché nginx non ha letto l’intera richiesta, non la invia per “l’elaborazione”. Per questo motivo, quasi tutti gli indicatori di avanzamento del caricamento dei file di solito "si interrompono", tuttavia è possibile correggerli utilizzando il modulo upload_progress di terze parti (questo richiederà la modifica dell'applicazione).

Dopo che nginx ha letto l'intera risposta, apre una connessione ad Apache. Quest'ultimo fa il suo lavoro (genera contenuto dinamico), dopodiché invia la sua risposta a nginx, che lo memorizza nel buffer o in un file temporaneo. Nel frattempo Apache libera risorse. Successivamente, nginx consegna lentamente il contenuto al client, spendendo risorse molto inferiori rispetto ad Apache.

Questo schema si chiama frontend + backend e viene utilizzato molto spesso.

Installazione

Perché nginx sta appena iniziando a guadagnare popolarità, ci sono alcuni problemi con i pacchetti binari, quindi preparati a compilarlo da solo. Di solito non ci sono problemi con questo, devi solo leggere attentamente l'output del comando./configure --help e selezionare le opzioni di compilazione che ti servono, ad esempio queste:

./configura\
--prefix=/opt/nginx-0.6.x \ # prefisso di installazione
--conf-path=/etc/nginx/nginx.conf \ # posizione del file di configurazione
—pid-path=/var/run/nginx.pid \ # ... e file pid
—user=nginx \ # nome utente con cui verrà eseguito nginx
—with-http_ssl_module —with-http_gzip_static_module —with-http_stub_status_module \ # elenco dei richiesti
—senza-http_ssi_module —senza-http_userid_module —senza-http_autoindex_module —senza-http_geo_module —senza-http_referer_module —senza-http_memcached_module —senza-http_limit_zone_module # ... e moduli non necessari

Dopo la configurazione, dovresti eseguire il make && make install standard, dopodiché puoi utilizzare nginx.

Inoltre, in Gentoo è possibile utilizzare un ebuild dall'albero dei port standard; in RHEL/CentOS dal repository epel (che contiene nginx 0.6.x) o srpm per la versione 0.7, che può essere scaricato da qui: http://blogs.mail.ru/community/nginx; su Debian puoi usare il pacchetto nginx dal ramo unstable.

File di configurazione

Il file di configurazione nginx è molto comodo e intuitivo. Di solito si chiama nginx.conf e si trova in $prefix/conf/ se la posizione non è stata sovrascritta durante la compilazione. Mi piace inserirlo in /etc/nginx/, così come fanno gli sviluppatori di tutti i pacchetti sopra menzionati.

La struttura del file di configurazione è la seguente:

utente nginx; # nome utente con i cui diritti verrà eseguito nginx
processi_operaio 1; # numero di processi di lavoro
eventi (
<…># questo blocco specifica il meccanismo di polling che verrà utilizzato (vedi sotto) e il numero massimo di connessioni possibili
}

HTTP(
<глобальные директивы http-сервера, например настройки таймаутов и т.п.>;
<почти все из них можно переопределить для отдельного виртуального хоста или локейшена>;

# descrizione dei server (questo è ciò che viene chiamato VirtualHost in apache)
server (
# indirizzo e nome del server
ascolta *:80;
nome_server aaa.bbb;

<Директивы сервера. Здесь обычно указывают расположение докуменов (root), редиректы и переопределяют глобальные настройки>;

# ed è così che puoi definire una posizione, per la quale puoi anche sovrascrivere quasi tutte le direttive specificate a livelli più globali
posizione /abcd/ (
<директивы>;
}
# Inoltre, puoi creare la posizione utilizzando un'espressione regolare, ad esempio in questo modo:
posizione ~ \.php$ (
<директивы>;
}
}

# un altro server
server (
ascolta *:80;
nome_server ccc.bbb;

<директивы>
}
}

Tieni presente che ogni direttiva deve terminare con un punto e virgola.
Proxy inverso e FastCGI

Quindi, sopra abbiamo esaminato i vantaggi dello schema frontend + backend, abbiamo individuato l'installazione, la struttura e la sintassi del file di configurazione e ora vedremo come implementare il proxy inverso in nginx.

Ed è molto semplice! Ad esempio in questo modo:

posizione/(
proxy_pass http://1.2.3.4:8080;
}

In questo esempio, tutte le richieste che rientrano nella posizione / verranno inoltrate al server 1.2.3.4, porta 8080. Può essere Apache o qualsiasi altro server http.

Tuttavia, ci sono diverse sottigliezze legate al fatto che l'applicazione considererà che, in primo luogo, tutte le richieste provengono dallo stesso indirizzo IP (il che può essere considerato, ad esempio, come un tentativo di attacco DDoS o di indovinare la password), e in secondo luogo, supponiamo che sia in esecuzione sull'host 1.2.3.4 e sulla porta 8080 (rispettivamente, genera reindirizzamenti e collegamenti assoluti errati). Per evitare questi problemi senza dover riscrivere l'applicazione, trovo utile la seguente configurazione:
Nginx ascolta l'interfaccia esterna sulla porta 80.

Se il backend (diciamo Apache) si trova sullo stesso host di nginx, allora “ascolta” sulla porta 80 su 127.0.0.1 o su un altro indirizzo IP interno.

La configurazione di nginx in questo caso è simile alla seguente:

server (
ascolta 4.3.2.1:80;
# imposta l'intestazione Host e X-Real-IP: per ogni richiesta inviata al backend
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:$proxy_port;
# o "proxy_set_header Host $host;" se l'applicazione aggiungerà:80 a tutti i collegamenti
}

Affinché l'applicazione possa distinguere tra gli indirizzi IP dei visitatori, è necessario installare il modulo mod_extract_forwarded (se eseguito Server Apache) o modificare l'applicazione in modo che prenda informazioni sull'indirizzo IP dell'utente dall'intestazione HTTP X-Real-IP.

Un'altra opzione di backend è utilizzare FastCGI. In questo caso, la configurazione di nginx sarà simile a questa:

server (
<…>

# posizione in cui verranno indirizzate le richieste di script php
posizione ~ .php$ (
fastcgi_pass 127.0.0.1:8888; # determinare l'indirizzo e la porta del server fastcgi,
fastcgi_index indice.php; # ...file indice

# e alcuni parametri che devono essere passati al server fastcgi in modo che capisca quale script eseguire e con quali parametri:
fastcgi_param NOME_FILE_SCRIPT /usr/www/html$nome_script_fastcgi; # nome dello script
fastcgi_param QUERY_STRING $query_string; # stringa della domanda
# e parametri di richiesta:
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param TIPO_CONTENUTO $tipo_contenuto;
fastcgi_param CONTENT_LENGTH $content_length;
}

# a causa del fatto che le posizioni con espressioni regolari hanno un'elevata "priorità", tutte le richieste non php ricadranno qui.

posizione/(
radice /var/www/html/
}

Statica

Per caricare meno il backend, è meglio servire file statici solo tramite nginx: affronta meglio questo compito, perché spende molte meno risorse per ogni richiesta (non è necessario generare un nuovo processo e il processo Nginx solitamente consuma meno memoria e può gestire molte connessioni).

Nel file di configurazione appare qualcosa del genere:

server (
ascolta *:80;
nome_server mioserver.com;

Posizione/(
proxy_pass


">http://127.0.0.1:80;

}

# presuppone che tutti i file statici siano in /files
posizione /file/ (
radice /var/www/html/; # indica il percorso di fs
scade 14 gg; # aggiungi l'intestazione Expires:
pagina_errore 404 = @indietro; # e se il file non viene trovato, lo inviamo nella posizione denominata @back
}

# le richieste da /files per le quali non è stato trovato alcun file vengono inviate al backend e possono essere generate file richiesto o mostrare bellissimo messaggio sull'errore
posizione @indietro (
proxy_pass
"titolo="http://127.0.0.1:80;

">http://127.0.0.1:80;

}

Se tutti i dati statici non vengono inseriti in una directory specifica, utilizza un'espressione regolare:

posizione ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf |js)$ (
# simile a quanto sopra, solo tutte le richieste che terminano con uno dei suffissi specificati andranno a questa posizione
radice /var/www/html/;
pagina_errore 404 = @indietro;
}

Sfortunatamente, non è implementato in nginx lavoro asincrono con file. In altre parole, il lavoratore nginx è bloccato sulle operazioni di I/O. Quindi, se hai molti file statici e soprattutto se vengono letti dischi diversi, è meglio aumentare il numero di processi di lavoro (ad un numero 2-3 volte maggiore del numero totale di testine sul disco). Ciò, ovviamente, aumenta il carico sul sistema operativo, ma le prestazioni complessive aumentano. Per lavorare con una quantità tipica di contenuto statico (non un numero molto elevato di file relativamente piccoli: CSS, JavaScript, immagini), sono sufficienti uno o due flussi di lavoro.

Continua

Collegamenti

Qui puoi trovare ulteriori informazioni su nginx:

Nginx è un server web e un proxy di posta elettronica disponibile pubblicamente dal 2004. Lo sviluppo del progetto è iniziato nel 2002; in russo il nome suona come engine-ex. Essendo la creazione del famoso programmatore Igor Sysoev, Nginx era originariamente destinato alla società Rambler. È progettato per i sistemi operativi appartenenti al gruppo simile a Unix. L'assembly è stato testato con successo su OpenBSD, FreeBSD, Linux, Mac OS X, Solaris. Sulla piattaforma Microsoft Windows Nginx ha iniziato a funzionare con l'avvento dell'assembly binario versione 0.7.52.

Le statistiche di marzo 2011 indicano che il numero di siti serviti da Nginx ha già superato la soglia dei 22 milioni. Oggi Nginx è utilizzato da progetti famosi come Rambler, Begun, Yandex, SourceForge.net, WordPress.com, vkontakte.ru e altri. Insieme a lighttpd, Nginx viene utilizzato per servire contenuti statici generati da un'applicazione web "scomoda" che opera "sotto l'autorità" di un altro server web.
Ma prima di addentrarci nella giungla delle funzionalità di Nginx, sarebbe utile ricordare cosa è un server web in generale e un server proxy in particolare.

Server Web e server proxy

server webè un server che accetta richieste HTTP da browser Web e altri client e invia loro risposte HTTP. Questi ultimi sono solitamente rappresentati Pagina HTML, flusso multimediale, immagine, file e altri dati. Per server web si intende Software, eseguendo funzioni del server web e hardware. Lo scambio dei dati e delle informazioni richieste avviene tramite il protocollo HTTP.

Aggiungi alla lista funzioni aggiuntive i server Web includono: autorizzazione e autenticazione degli utenti, registrazione del loro accesso alle risorse, supporto HTTPS per comunicazioni sicure con i client e altro. Il server web più comunemente utilizzato sui sistemi operativi simili a Unix è Apache. Nginx occupa attualmente il terzo posto nell'elenco delle preferenze del cliente.

Server proxy consente ai clienti di affrontare query di ricerca ai servizi di rete in forma indiretta. Cioè, è un server specializzato nel reindirizzare le richieste dei client ad altri server. Collegandosi a un server proxy e richiedendo una risorsa situata su un altro server, il client ha l'opportunità di mantenere l'anonimato e proteggere il computer da attacchi di rete. Il server proxy fornisce i dati richiesti al client dalla propria cache (se presente) o ricevendoli dal server specificato. In alcuni casi (per raggiungere gli obiettivi di cui sopra), la risposta del server, come la richiesta del client, può essere modificata dal server proxy.

Il server proxy più semplice è Network Address Translator o NAT. Nel 2000, il NAT proxy è stato integrato nella distribuzione di Windows. I server proxy, come ogni fenomeno, hanno due facce della medaglia, ovvero possono essere utilizzati sia nel bene che nel male. Ad esempio, con il loro aiuto, coloro che temono sanzioni per le loro azioni indecorose online nascondono i propri indirizzi IP...

Gamma funzionale Nginx:

  • manutenzione server di file indice, query statiche, generazione di descrittori cache di file aperti, elenco di file;
  • proxy accelerato, distribuzione elementare del carico, tolleranza ai guasti;
  • supporto per la memorizzazione nella cache durante il proxy accelerato e FastCGI;
  • supporto per server FastCGI (accelerati) e memcached;
  • modularità, filtri, inclusa la ripresa (intervalli di byte) e la compressione (gzip);
  • Autenticazione HTTP, risposte in blocchi, filtro SSI;
  • esecuzione parallela di più sottoquery su una pagina elaborata tramite FastCGI o un proxy nel filtro SSI;
  • Supporto StartTLS e SSL;
  • capacità di supportare Perl integrato;
  • autenticazione semplice (UTENTE/PASS, LOGIN);
  • reindirizzamento del server (proxy IMAP/POP3) dell'utente al backend IMAP/POP3 utilizzando un server di autenticazione esterno (HTTP).

Per chi non ha familiarità con questa terminologia, la descrizione delle funzionalità di Nginx può sembrare molto vaga. Ma quando parliamo delle modalità specifiche di utilizzo di questo server web, esso inizierà gradualmente a dissiparsi.

Architettura e configurazione

I processi di lavoro in Nginx servono simultaneamente più connessioni, fornendo loro chiamate epoll (Linux), select e kqueue (FreeBSD) del sistema operativo (sistema operativo). I dati ricevuti dal client vengono analizzati utilizzando una macchina a stati. La richiesta analizzata viene elaborata da una catena di moduli specificati dalla configurazione. La risposta al client viene generata in buffer, che possono puntare a una sezione di un file o archiviare dati in memoria. La sequenza del trasferimento dei dati al client è determinata dalle catene in cui sono raggruppati i buffer.

Strutturalmente, il server HTTP Nginx è suddiviso in server virtuali, a loro volta suddivisi in posizioni. Server virtuale o direttiva, è possibile specificare porte e indirizzi per la ricezione delle connessioni. Per la posizione è possibile specificare un URI esatto, parte di un URI o un'espressione regolare. Per la gestione della memoria online vengono utilizzati pool, che sono una sequenza di blocchi di memoria preselezionati. Un blocco, inizialmente assegnato al pool, ha una lunghezza compresa tra 1 e 16 kilobyte. È diviso in aree: occupate e non occupate. Man mano che quest'ultimo si riempie, l'assegnazione di un nuovo oggetto è assicurata dalla formazione di un nuovo blocco.

La classificazione geografica dei client in base al loro indirizzo IP viene eseguita in Nginx utilizzando modulo speciale. Il sistema ad albero Radix consente di lavorare rapidamente con gli indirizzi IP, occupando un minimo di memoria.

Vantaggi di Nginx

Nginx è considerato molto veloce serverHTTP. Al posto di Apache o insieme ad esso viene utilizzato Nginx per velocizzare l'elaborazione delle richieste e ridurre il carico sul server. Il fatto è che la maggior parte degli utenti non ha bisogno delle enormi capacità inerenti all'architettura modulare di Apache. Devi pagare per questa funzionalità non reclamata con un consumo significativo di risorse di sistema. I siti ordinari, di regola, sono caratterizzati da una chiara "dominanza" di file statici (immagini, file di stile, JavaScript) piuttosto che di script. Non è richiesta alcuna funzionalità speciale per trasferire questi file al visitatore della risorsa, poiché l'attività è molto semplice. Ciò significa che il server web per l’elaborazione di tali richieste deve essere semplice e leggero, come Nginx.

Modi di utilizzare Nginx

Su una porta/IP separato. Se la risorsa è satura di immagini o file da scaricare, Nginx può essere configurato su una porta o IP separato e distribuire attraverso di esso il contenuto statico. Per fare questo, però, dovrai armeggiare un po’ con la modifica dei link sul sito. Se c'è un gran numero di richieste di file statici, ha senso creare un server separato e installarvi Nginx.

Proxy accelerato. Con questa opzione, tutte le richieste dei visitatori vanno prima a Nginx. Richieste di file statici (ad esempio, immagini, HTML semplice, JavaScript o file CSS) Nginx lo elabora in modo indipendente. Se un utente accede a un particolare script, reindirizzerà la richiesta al dipartimento Apache. Non è necessario apportare alcuna trasformazione al codice del sito.

Se il canale dal server al visitatore e viceversa è lento, questo utilizzo di Nginx può dare un ulteriore effetto. Nginx passa la richiesta ricevuta dal visitatore ad Apache per l'elaborazione. Dopo aver elaborato la richiesta, Apache inoltra la pagina a Nginx e chiude la connessione con un senso di soddisfazione. Nginx ora può inviare una pagina a un utente per tutto il tempo desiderato, praticamente senza consumare risorse di sistema. Il lavoro di Apache al suo posto sarebbe accompagnato da un carico di memoria irragionevolmente elevato quando è quasi inattivo. A proposito, questo caso d'uso per Nginx ha un altro nome: "frontend per Apache".

Nginx più FastCGI. Apache potrebbe non essere affatto necessario se l'interprete del linguaggio in cui sono scritti gli script del sito supporta la tecnologia FastCGI. Tali linguaggi includono, ad esempio, PHP, Perl e numerosi altri. Tuttavia, in questo caso potrebbe essere necessario modificare i codici dello script.

Esistono molti materiali dettagliati su come installare e configurare Nginx su Internet. Puoi saperne di più su Nginx sul sito web del suo sviluppatore Igor Sysoev.

Ciao, caro utente Habrakhabra. Il mio intervento riguarderà come preparare il terreno per progetti di sviluppo web locale in sala operatoria Sistema Ubuntu 16.04.1 LTS.

In questo articolo vorrei dissipare e spiegare le possibili difficoltà associate all'installazione e alla configurazione del software necessario per lo sviluppo web moderno, che possono essere incontrate da sviluppatori alle prime armi e altri.

Tecnologie che verranno utilizzate nell'articolo: nginx, php-fpm.

Prima di iniziare la storia, voglio sottolineare che tutte queste azioni le ho eseguite su un sistema “nudo”.
Lavorerò con il gestore di pacchetti aptitude. Consiglio inoltre di aggiornare l'indice dei pacchetti e i pacchetti stessi prima di installare il software. In questo articolo faremo insieme questi passaggi.

Andare!

Installazione di un gestore di pacchetti attitudine, indicizzazione e aggiornamenti dei pacchetti

Installare:

Sudo apt installa aptitude
Aggiorniamo l'indice.

Aggiornamento dell'attitudine Sudo
Aggiorniamo i pacchetti (il comando aggiornerà tutti i pacchetti per i quali esistono nuove versioni; se i pacchetti devono essere rimossi, verrà fatto).

Aggiornamento completo di Sudo Aptitude

Installazione e configurazione nginx(versione >= 1.10.0)

Installiamo.

Sudo aptitude installa nginx
Lanciamo.

Avvio del servizio Sudo nginx
Controlliamo la versione per assicurarci di non averne installata una vecchia, cioè inferiore alla 1.10.0.

L'installazione e il lancio sono stati completati, ora andiamo nella directory dove è installato il nostro nginx e guardiamo la sua struttura. La directory nginx si trova in questo percorso:

CD /etc/nginx/
Puoi visualizzare il contenuto di una directory con il comando ls; con i flag -la sarà più comodo visualizzare il contenuto della directory (infatti questo comando con flag specifici può essere descritto in modo più dettagliato e accurato, ma oggi abbiamo un argomento diverso).

Ls-la
Al momento siamo interessati ai due cataloghi che vedi nello screenshot. Queste sono le directory dei siti disponibili e dei siti abilitati.

Andiamo alla directory sites-available e iniziamo a configurare il nostro host virtuale (sito).

Cd /etc/nginx/sites-available
Prima di iniziare a creare il file di configurazione, controlliamo cosa abbiamo dentro questo catalogo. Nel mio caso la directory non è vuota, contiene già i file di configurazione, li ho cancellati per non trarre in inganno.

Digressione importante

Nel caso di installazione di nginx “da zero”, appunto “da zero”, poiché quando si disinstalla nginx con il comando
rimangono i file di configurazione sudo apt-getremove nginx o sudo aptremove nginx e se all'improvviso non capisci perché nginx non funziona e desideri reinstallarlo (di solito i principianti ricorrono a questo Utenti Linux), quindi anche dopo la reinstallazione non funzionerà correttamente, poiché i vecchi file di configurazione (non vengono eliminati dopo la rimozione con il comando rimuovi) contengono impostazioni errate, dovranno essere eliminati o configurati correttamente, solo allora nginx funzionerà.

Consiglio di eliminare con il comando sudo apt-get purge nginx o sudo apt purge nginx. Se si utilizza il gestore pacchetti aptitude, il comando sudo aptitude purge nginx rimuove l'intero pacchetto insieme a tutte le dipendenze e i file di configurazione.


Ci sarà un file in questa directory per impostazione predefinita, chiamato default. Conterrà un file di configurazione con un esempio, con commenti, potrai studiarlo a tuo piacimento, oppure potrai cancellarlo completamente (puoi sempre fare riferimento alla documentazione ufficiale).

Ls-la

Creiamo il nostro file di configurazione, che corrisponderà al nome di dominio del nostro sito locale (o reale, se ne conosci già il nome). Questo è utile, in futuro, quando ci sono molti file di configurazione, ti salverà dalla confusione al loro interno. Per me questo file si chiamerà project.local.

Sudo touch project.local
Vediamo cosa è successo.

Adesso apriamolo nell'editor, io lo aprirò in nano.

Sudo nano progetto.local
Vediamo che è vuoto. Passiamo ora alla creazione del nostro file. È necessario riportare la configurazione nel form come scritto di seguito. Descriverò solo le direttive vitali di questo dossier, non descriverò il resto, poiché questo non è importante al momento, dopotutto abbiamo un argomento impostazioni di base. Queste impostazioni “slide” sono sufficienti per sviluppare progetti localmente, non solo piccoli, ma anche piuttosto grandi. Negli articoli seguenti descriverò separatamente ciascuna delle direttive utilizzate (così si chiamano le righe, ad esempio nome_server) di questo file.

Vedi i commenti direttamente nel file di configurazione.

Server ( ascolta 80; # porta in ascolto su nginx nome_server progetto.local; # Nome del dominio legati alla corrente ospite virtuale root /home/stavanger/code/project.local; # la directory in cui si trova il progetto, il percorso del punto di ingresso indice indice.php; # add_header Access-Control-Allow-Origin *; # serve direttamente i file statici location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ ( access_log off; scade max; log_not_found off; ) location / ( # add_header Access-Control-Allow- Origine *; try_files $uri $uri/ /index.php?$query_string; ) posizione ~* \.php$ ( try_files $uri = 404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix :/var/run/php/php7.0-fpm.sock; # collega il socket php-fpm fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; ) location ~ /\.ht ( nega tutto; ) )
Salvare il file. Ora dobbiamo verificare se sono presenti errori. Possiamo farlo come squadra.

Sudo nginx -t
Se vediamo le informazioni come nello screenshot, allora tutto è corretto e possiamo continuare la configurazione. Se ricevi qualche errore, vale la pena ricontrollare il file di configurazione.

Adesso dobbiamo attivare il file di configurazione, nella directory /etc/nginx/sites-enabled/ dobbiamo creare un symlink (link simbolico). Se hai installato nginx da zero, in questa directory c'è un collegamento simbolico al file predefinito, di cui abbiamo parlato sopra; puoi eliminarlo se non ne hai bisogno. Vai alla directory desiderata.

Cd /etc/nginx/sites-enabled/
Ora siamo nella directory giusta. Creiamo il nostro collegamento simbolico. Per creare, usa il comando ln con il flag -s, quindi indicheremo il percorso della nostra configurazione project.local.

Sudo ln -s /etc/nginx/sites-available/project.local
Diamo un'occhiata al nostro collegamento simbolico creato.

Per assicurarci che stiamo ancora facendo tutto correttamente, eseguiamo nuovamente il comando.

File ospiti

Questo file si trova in /etc/hosts. La presenza di voci al suo interno consente di eseguire nginx utilizzando localhost come dominio. In questo file puoi assegnare alias alternativi, ad esempio per il nostro progetto project.local, assegneremo il dominio project.local.

Apri il file nell'editor nano.

Sudo nano /etc/hosts
Avrai altre informazioni in questo file, ignoralo. Devi solo aggiungere una riga come nel mio screenshot.

Installazione php-fpm (>=7.0)

sudo aptitude installa php-fpm
Controllo versione installata, per ogni evenienza, anche se in Ubuntu 16.04.1 la versione 7.0 è nei repository.

Php-fpm7.0 -v

Assicuriamoci che sia tutto ok. Avviamo php-fpm.

Avvio del servizio Sudo php7.0-fpm
Se modifichi le configurazioni, non dimenticare di riavviare il demone. Lo fa. Ma non ne avremo bisogno.

Riavvio del servizio Sudo php7.0-fpm
Questo completa l'installazione e la configurazione di php-fpm. Davvero, questo è tutto. Non si tratta di magia; il percorso del socket php-fpm era già specificato nel file di configurazione. Naturalmente, potresti aver bisogno di alcune estensioni PHP per sviluppare progetti personali, ma puoi installarle secondo necessità.

Ora andiamo alla directory con il nostro progetto, ce l'ho lungo questo percorso.

Cd /home/stavanger/code/project.local
Andiamo nella directory sopra e impostiamo i permessi 777 (cioè faremo pieni diritti directory con il nostro progetto project.local). Questo ci salverà da problemi inutili in futuro.

Cd .. sudo chmod -R 777 project.local
Questo completa la configurazione del software, creiamo un file di prova nella nostra directory di lavoro project.local e assicuriamoci che tutto funzioni. Creerò un file index.php con questo contenuto.

Andiamo al browser e vediamo che per noi funziona tutto alla grande! Interprete PHP incluso.

Per quanto riguarda i lettori, Stavanger.

I migliori articoli sull'argomento