Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Greške
  • Šta je Nginx? Web server Nginx i apache - šta je to i kako ova kombinacija radi.

Šta je Nginx? Web server Nginx i apache - šta je to i kako ova kombinacija radi.

Predmet ispravna podešavanja nginx je veoma velik, i bojim se da se ne uklapa u okvir jednog članka na Habréu. U ovom tekstu pokušao sam da progovorim opšta struktura config, zanimljivije sitnice i pojedinosti mogu doći kasnije. :)

Dobra polazna tačka za postavljanje nginx-a je konfiguracija koja dolazi uz distribuciju, ali mnoge mogućnosti ovog servera se u njoj ne spominju. Mnogo više detaljan primjer dostupno na web stranici Igora Sysoeva: sysoev.ru/nginx/docs/example.html. Ipak, bolje da pokušamo da izgradimo našu konfiguraciju od nule, sa bridžom i pesnikinjama. :)

Počnimo sa opšta podešavanja. Prvo ćemo naznačiti korisnika u čije ime će se nginx pokrenuti (loše je raditi kao root, svi znaju :))

Sada hajde da kažemo nginx-u koliko radnih procesa treba da proizvede. obično, dobar izbor Ponekad je broj procesa jednak broju procesorskih jezgara na vašem serveru, ali vrijedi eksperimentirati s ovom postavkom. Ako se očekuje veliko opterećenje HDD, možete obaviti jedan proces za svaki fizički čvrsti disk, jer će sav rad i dalje biti ograničen njegovim performansama.

Worker_processes 2;

Hajde da razjasnimo gde pisati dnevnike grešaka. Zatim, za pojedinačne virtuelne servere, ovaj parametar se može poništiti, tako da će se u ovom dnevniku pojaviti samo „globalne“ greške, na primer, vezane za pokretanje servera.

Error_log /spool/logs/nginx/nginx.error_log obaveštenje; # Nivo obaveštenja "obaveštenja" se naravno može promeniti

Sada dolazi veoma zanimljiv odeljak „događaji“. U njemu možete postaviti maksimalni iznos veze koje će jedan radni proces istovremeno obraditi i metod koji će se koristiti za primanje asinhronih obavijesti o događajima u OS-u. Naravno, možete odabrati samo one metode koje su dostupne na vašem OS-u i koje su uključene tokom kompilacije.

Ove postavke mogu imati značajan utjecaj na performanse vašeg servera. Moraju se odabrati pojedinačno, ovisno o OS-u i hardveru. Mogu dati samo nekoliko općih pravila.

Moduli za rad sa događajima:
- select i poll su obično sporiji i dosta opterećuju procesor, ali su dostupni skoro svuda i rade skoro uvek;
- kqueue i epoll - efikasniji, ali dostupni samo na FreeBSD-u i Linuxu 2.6;
- rtsig - prilično efikasan metod, i podržavaju ga čak i vrlo stari Linuxi, ali može uzrokovati probleme kada veliki broj veze;
- /dev/poll - koliko znam, radi u nešto egzotičnijim sistemima, kao što je Solaris, i tamo je prilično efikasan;

parametar worker_connections:
- Ukupan maksimalni broj opsluženih klijenata će biti jednak worker_processes * worker_connections;
- Ponekad mogu da rade pozitivnu stranučak i najekstremnije vrijednosti, kao što je 128 procesa, 128 veza po procesu ili 1 proces, ali sa parametrom worker_connections=16384. U potonjem slučaju, međutim, najvjerovatnije ćete morati podesiti OS.

Događaji (
worker_connections 2048;
use kqueue; # Imamo BSD :)
}

Sljedeći odjeljak je najveći i sadrži najzanimljivije stvari. Ovo je opis virtuelnih servera i nekih parametara zajedničkih za sve njih. Izostaviću standardne postavke koje se nalaze u svakoj konfiguraciji, kao što su putanje do dnevnika.

HTTP(
# Sav kod ispod će biti unutar ovog odjeljka %)
# ...
}

Unutar ovog odjeljka mogu biti neki prilično zanimljivi parametri.

Sistemski poziv sendfile je relativno nov za Linux. Omogućava vam slanje podataka na mrežu bez potrebe da ih kopirate u adresni prostor aplikacije. U mnogim slučajevima ovo značajno poboljšava performanse servera, pa je najbolje uvijek omogućiti opciju sendfile.

Parametar keepalive_timeout odgovoran je za maksimalno vrijeme održavanja keepalive veze ako korisnik ne zahtijeva ništa na njemu. Razmotrite kako vaša stranica šalje zahtjeve i prilagodite ovu postavku. Za web-stranice koje aktivno koriste AJAX, bolje je zadržati vezu duže; za statične stranice koje će korisnici čitati duže vrijeme, bolje je raskinuti vezu ranije. Imajte na umu da održavanjem neaktivne veze za održavanje aktivacije preuzimate vezu koja bi se mogla koristiti drugačije. :)

Keepalive_timeout 15;

Zasebno, vrijedi istaknuti postavke nginx proxyja. Najčešće se nginx koristi upravo kao proxy server, shodno tome imaju dosta veliki značaj. Konkretno, ima smisla postaviti veličinu bafera za proksi zahtjeve ne manju od očekivane veličine odgovora sa pozadinskog servera. Sa sporim (ili, obrnuto, vrlo brzim) backendovima, ima smisla promijeniti vremensko ograničenje za čekanje odgovora od pozadine. Zapamtite, što su ova vremenska ograničenja duža, korisnici će duže čekati na odgovor ako je backend spor.

Proxy_buffers 8 64k;
proxy_intercept_errors uključeno;
proxy_connect_timeout 1s;
proxy_read_timeout 3s;
proxy_send_timeout 3s;

Mali trik. U slučaju da nginx opslužuje više od jednog virtuelnog hosta, ima smisla kreirati „podrazumevani virtuelni host“ koji će obraditi zahteve u slučajevima kada server ne može da pronađe drugu alternativu koristeći zaglavlje Host u zahtevu klijenta.

# podrazumevani virtuelni host
server (
slušaj 80 default;
server_name localhost;
poricati sve;
}

Ovo može biti praćeno jednim (ili nekoliko) "serverskih" sekcija. Svaki od njih opisuje virtuelni host (najčešće baziran na imenu). Za vlasnike više lokacija na jednom hostingu, ili za hostere, može postojati nešto poput direktive

Uključuje /spool/users/nginx/*.conf;

Ostatak će najvjerovatnije opisati njihov virtuelni host direktno u glavnoj konfiguraciji.

Server (
slušaj 80;

# Imajte na umu da direktiva server_name može specificirati više imena u isto vrijeme.
server_name myserver.ru myserver.com;
access_log /spool/logs/nginx/myserver.access_log timed;
error_log /spool/logs/nginx/myserver.error_log warn;
# ...

Postavimo zadano kodiranje za izlaz.

Charset utf-8;

I recimo da ne želimo prihvatiti zahtjeve klijenata koji su duži od 1 megabajta.

Client_max_body_size 1m;

Omogućimo SSI za server i zatražimo da rezervišemo ne više od 1 kilobajta za SSI varijable.

Si on;
ssi_value_length 1024;

I na kraju, opisat ćemo dvije lokacije, od kojih će jedna voditi do backend-a, do Apachea koji radi na portu 9999, a druga će slati statične slike iz lokalnog sistema datoteka. Za dvije lokacije ovo nema smisla, ali za veći broj njih također ima smisla odmah definirati varijablu u kojoj će biti pohranjen korijenski direktorij poslužitelja, a zatim je koristiti u opisima lokacija.

Namjenski web server baziran na nginx-u – odličan način poboljšanje performansi web stranica. U brzini obrade statički sadržaj jednostavno mu nema premca: lako može izdržati nekoliko hiljada istovremene veze i može se lako optimizirati i prilagoditi bilo kojoj konfiguraciji. Kako god? Djelujući kao prednji kraj za Apache, nginx se ispostavilo da je najranjivija tačka cjelokupne web infrastrukture, tako da se posebna pažnja mora posvetiti nginx sigurnosti.

Ovaj članak je neka vrsta obrazovnog programa, ili, ako želite, sažetak svih tehnika za poboljšanje nginx sigurnosti. Neće sadržavati teoriju, opis osnova postavljanja web servera i druge gluposti. Umjesto toga, dobićete sveobuhvatan praktičan materijal, koji opisuje sve osnovne korake koje je potrebno preduzeti da biste imali zaista siguran web server.

Instalacija

Nginx paket je dostupan u prethodno kompajliranom obliku za bilo koju distribuciju. Međutim, ako sami napravite server, možete ga učiniti kompaktnijim i pouzdanijim, a takođe ćete imati priliku da promenite pozdravnu liniju veb servera kako biste obeshrabrili budalastu decu skriptu.

Promijenite pozdravnu liniju web servera

Preuzmite nginx izvore, otvorite datoteku src/http/ngx_http_header_filter_module.c i pronađite sljedeća dva reda:

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

Zamijenite ih nečim ovako:

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

Uklonite sve nginx module koje ne koristite

Neki nginx moduli se povezuju na Web server direktno tokom kompilacije i svaki od njih je prepun potencijalne opasnosti. Možda će u budućnosti biti pronađena ranjivost u jednom od njih i vaš server će biti u opasnosti. Onemogućavanjem nepotrebnih modula možete značajno smanjiti rizik od nastanka takve situacije.

Izgradite koristeći sljedeće naredbe:

# ./configure --bez-http_autoindex_module --bez-http_ssi_module
#make
# izvrši instalaciju

Na ovaj način ćete dobiti nginx sa unapred onemogućenim modulima SSI (Server Side Includes) i Autoindex (i u većini slučajeva beskorisni). Da biste saznali koji moduli se mogu bezbedno ukloniti sa Web servera, pokrenite skriptu za konfigurisanje sa '-help' zastavicom.

Hajde da analiziramo nginx.conf

Nakon instalacije, nginx bi trebao biti konfigurisan. Već je postojao materijal koji opisuje ovaj proces na stranicama časopisa, ali ćemo se zadržati na temi članka i govoriti o načinima povećanja sigurnosti servera.

Onemogućite prikazivanje verzije servera na svim stranicama s greškama

Dodajte red “server_tokens off” u datoteku nginx.conf. Ovo će primorati nginx da sakrije informacije o tipu i verziji web servera na stranicama generiranim kao odgovor na pogrešan zahtjev klijenta.

Postavite zaštitu od prekida steka

Dodajte u odjeljak servera sledeći redovi:

# vi /etc/nginx/nginx.conf

# Maksimalna veličina bafera za pohranjivanje tijela zahtjeva klijenta
client_body_buffer_size 1K;
# Maksimalna veličina bafera za pohranjivanje zaglavlja zahtjeva klijenta
client_header_buffer_size 1k;
# Maksimalna veličina tijela zahtjeva klijenta, navedena u polju zaglavlja Content-Length. Ako server mora podržavati prijenos datoteka, ova vrijednost se mora povećati
client_max_body_size 1k;
# Broj i veličina bafera za čitanje velikog zaglavlja zahtjeva klijenta
large_client_header_buffers 2 1k;

Obratite pažnju na direktivu large_client_header_buffers. Podrazumevano, nginx dodeljuje četiri bafera za skladištenje URI niza, svaki veličine jednaka veličini memorijske stranice (za x86 ovo je 4 KB). Baferi se oslobađaju svaki put kada veza uđe u stanje održavanja u životu nakon obrade zahtjeva. Dva bafera od 1 KB mogu pohraniti URI-je duge samo 2 KB, što pomaže u borbi protiv botova i DoS napada.

Da poboljšate performanse, dodajte sljedeće linije:

# vi /etc/nginx/nginx.conf

# Isteklo vrijeme za čitanje tijela zahtjeva klijenta
client_body_timeout 10;
# Isteklo je tokom čitanja zaglavlja zahtjeva klijenta
client_header_timeout 10;
# Istekanje nakon kojeg se veza sa klijentom neće zatvoriti sa strane servera
keepalive_timeout 5 5;
# Istekanje pri slanju odgovora klijentu
send_timeout 10;

Kontrolirajte broj istovremenih veza

Da biste zaštitili web server od preopterećenja i pokušaja izvođenja DoS napada, dodajte sljedeće linije u konfiguraciju:

# vi /etc/nginx/nginx.conf

# Opisujemo zonu (ograničenja) u kojoj će se pohranjivati ​​stanja sesije. Zona od 1 MB može pohraniti oko 32000 stanja, mi smo postavili njenu veličinu na 5 MB
limit_zone limits $binary_remote_addr 5m;
# Postavite maksimalni broj istovremenih veza za jednu sesiju. U suštini, ovaj broj određuje maksimalan broj konekcija sa jedne IP adrese
limit_conn limits 5;

Prva direktiva bi trebala biti u odjeljku HTTP, a druga u odjeljku lokacija. Kada broj konekcija premaši ograničenja, klijent će dobiti poruku „Usluga nedostupna“ sa kodom 503.

Dozvolite veze samo na vašu domenu

Hakeri mogu koristiti botove da skeniraju podmreže i pronađu ranjive web servere. Tipično, botovi jednostavno prelaze opsege IP adresa tražeći otvorenih 80 portova i šalju HEAD zahtjev da dobiju informacije o web serveru (ili početnoj stranici). Takvo skeniranje možete lako spriječiti tako što ćete zabraniti pristup serveru putem IP adrese (dodajte u pododjeljak lokacija):

# vi /etc/nginx/nginx.conf

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

Ograničite broj dostupnih metoda za pristup Web serveru

Neki botovi koriste različite metode da kontaktiraju server kako bi pokušali detekciju tipa i/ili infiltraciju, ali RFC 2616 jasno kaže da web server nije obavezan da implementira sve njih, a nepodržane metode možda jednostavno neće biti obrađivane. Danas su u upotrebi samo metode GET (zahtjev za dokument), HEAD (zahtjev za zaglavlje servera) i POST (zahtjev za objavljivanje dokumenta), tako da se sve ostale mogu bezbolno onemogućiti postavljanjem sljedećih redova u serverski dio konfiguracijske datoteke:

# vi /etc/nginx/nginx.conf

if ($request_method !~ ^(GET|HEAD|POST)$) (
povratak 444;
}

Ugasi botove

Drugi način blokiranja botova, skenera i drugih zlih duhova baziran je na određivanju tipa klijenta (korisnički agent). Nije baš efikasan, jer većina botova cilja potpuno legitimne pretraživače, ali u nekim slučajevima ostaje koristan:

# vi /etc/nginx/nginx.conf

# Blokirajte menadžere preuzimanja
if ($http_user_agent ~* LWP::Simple|BBBike|wget) (
povratak 403;
}
# Blokirajte neke vrste botova
if ($http_user_agent ~* msnbot|scrapbot) (
povratak 403;
}

Blokirajte neželjenu poštu upućivača

Ako vaša web stranica objavljuje web logove u javno dostupnom obliku, lako možete postati žrtva neželjene pošte Referrer (kada spam botovi kontaktiraju vaš server, navodeći upućivača u zaglavlju - adresu oglašene stranice). Ova vrsta neželjene pošte može lako uništiti SEO ocjene web stranice, tako da se mora blokirati bez greške. Jedan od načina da to učinite je stavljanje na crnu listu najčešćih riječi koje se nalaze na adresama oglašenih stranica.

# vi /etc/nginx/nginx.conf

# Server odjeljak
if ($http_referer ~* (bebe|na prodaju|djevojka|nakit|ljubav|nudit|organski|poker|porno|seks|tinejdžeri))
{
povratak 403;
}

Blokiraj hotlink

Hotlink je uključivanje slike (ili drugog sadržaja) sa druge stranice na stranicu. U suštini, ovo je krađa, jer sliku na koju ste proveli više od jednog sata svog slobodnog vremena ne samo da slobodno koriste drugi, već i stvara opterećenje na vašem web serveru bez dovođenja posjetitelja na njega. Za borbu protiv hotlinkova, dovoljno je osigurati da se slike šalju klijentu samo ako ih je zatražio dok je već bio na stranici (drugim riječima, zaglavlje zahtjeva za upućivanje treba da sadrži naziv vaše stranice). Dodajte sljedeće linije u odjeljak servera konfiguracijske datoteke nginx.conf (host.com je adresa vaše web stranice):

# vi /etc/nginx/nginx.conf

lokacija /slike/ (
valid_referers nijedan blokiran www.host.com host.com;
if ($invalid_referer) (
povratak 403;
}
}

Alternativno, možete konfigurirati server za otpremanje specijalni baner sa porukom o krađi umjesto tražene slike. Da biste to učinili, zamijenite redak “return 403” sa linijom:

prepiši ^/images/uploads.*\.(gif|jpg|jpeg|png)$ http://www.host.com/banned.jpg zadnji

Zaštitite važne direktorije od stranaca

Kao i svaki drugi web server, nginx vam omogućava da regulišete pristup direktorijumima na osnovu IP adresa i lozinki. Ova funkcija se može koristiti za zatvaranje određenih dijelova stranice od znatiželjnih očiju. Na primjer, da odsiječete URI od vanjskog svijeta:

# vi /etc/nginx/nginx.conf

lokacija /uploads/ (
# Dozvolite pristup samo mašinama lokalna mreža
dozvoli 192.168.1.0/24;
# Hajde da pobijemo sve ostale
poricati sve;
}

Sada će samo korisnici lokalne mreže imati pristup dokumentima u direktoriju za otpremanje. Da biste postavili lozinku, morat ćete učiniti više složene radnje. Prvo, morate kreirati datoteku lozinke koja je privatna za nginx i dodati joj potrebne korisnike (kao primjer, dodajmo administratorskog korisnika):

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

# vi /etc/nginx/nginx.conf

lokacija /admin/ (
auth_basic "Ograničeno";
auth_basic_user_file /etc/nginx/.htpasswd/passwd;
}

Novi korisnici se mogu dodati pomoću sljedeće naredbe:

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

Koristite SSL

Ako vaša stranica radi s privatnim korisničkim podacima, kao što su brojevi kreditne kartice, lozinke sa drugih usluga ili omogućava pristup drugim važnim informacijama koje mogu postati tidbit za treće strane, vodite računa o šifriranju. Nginx dobro radi sa SSL-om, a ovu funkciju ne treba zanemariti.

Da biste postavili SSL enkripciju pomoću nginxa, samo slijedite nekoliko jednostavnih koraka. Prvo morate kreirati certifikat koristeći sljedeći niz naredbi:

# 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

Zatim opišite certifikat u konfiguracijski fajl nginx:

# vi /etc/nginx/nginx.conf

server (
server_name host.com;
slušaj 443;
ssl on;
ssl_certificate /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;
}

Nakon ovoga, možete ponovo pokrenuti web server:

# /etc/init.d/nginx ponovno učitavanje

Naravno, bez podrške sa same web stranice, ovo je besmisleno raditi.

druge metode

Postavite ispravne vrijednosti za sistemske varijable

Otvorite /etc/sysctl.conf datoteku i postavite sljedeće redove u nju:

# vi /etc/sysctl.conf

# Zaštita od napada Štrumpfova
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Zaštita od nevažećih ICMP poruka
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Zaštita od SYN poplave
net.ipv4.tcp_syncookies = 1
# Onemogući izvorno rutiranje
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Zaštita protiv lažiranja
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Mi nismo ruter
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Omogući ExecShield
kernel.exec-shield = 1
kernel.randomize_va_space = 1
# Proširivanje raspona dostupnih portova
net.ipv4.ip_local_port_range = 2000 65000
# Povećajte maksimalnu veličinu TCP bafera
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

Postavite korijenski direktorij web servera na namjensku particiju

Postavljanjem korijenskog direktorija web servera u namjensku particiju i zabranom postavljanja bilo kojeg izvršne datoteke i datoteke uređaja, zaštitićete ostatak sistema od bilo koga ko može da dobije pristup korenu veb servera. U ovom slučaju, unos u datoteci /etc/fstab bi trebao izgledati otprilike ovako:

/dev/sda5 /nginx ext4 defaults,nosuid,noexec,nodev 1 2

Stavite nginx u chroot/jail okruženje

Svaki moderni *nix sistem vam omogućava da zaključate aplikaciju u izolovanom okruženju izvršavanja. U Linuxu za to možete koristiti KVM, Xen, OpenVZ i VServer tehnologije, u FreeBSD-u - Jail, u Solarisu - Zone. Ako nijedna od ovih tehnologija nije dostupna, možete staviti nginx u klasični chroot, koji, iako je mnogo krhkiji, može zaustaviti većinu hakera.

Instalirajte SELinux pravila da zaštitite nginx

Dobra alternativa izolovane sredine predstave su lokalni sistemi Alati za otkrivanje i prevenciju upada kao što su SELinux ili AppArmor. Ako su ispravno konfigurisani, mogu spriječiti pokušaje hakovanja web servera. Podrazumevano, nijedan od njih nije konfigurisan da radi zajedno sa nginxom, međutim, u okviru projekta SELinuxNginx(http://sf.net/projects/selinuxnginx/) pravila za SELinux su kreirana koja svako može koristiti. Sve što ostaje je preuzeti i instalirati:

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

Postavljanje zaštitnog zida

Obično je nginx instaliran na namenskim mašinama spremnim za veliko opterećenje, tako da je često jedina mrežna usluga koja radi na serveru. Da biste osigurali server, dovoljno je kreirati vrlo mali skup pravila koja će otvoriti portove 80, 110 i 143 (ako, naravno, nginx treba da radi i kao IMAP/POP3 proxy) i zatvoriti sve ostalo iz vanjskog svijeta .

Ograničite broj veza pomoću zaštitnog zida

Za slabo opterećenu web lokaciju, dobra je ideja ograničiti broj pokušaja povezivanja s jedne IP adrese u minuti. Ovo vas može zaštititi od nekih vrsta DoS napada i grube sile. Na Linuxu, to se može učiniti pomoću standardnog modula stanja iptables/netfilter:

# iptables -A INPUT -p tcp --dport 80 -i eth0 \
-m stanje --stanje NOVO -m nedavno --set
# iptables -A INPUT -p tcp --dport 80 -i eth0 \
-m stanje --stanje NOVO -m nedavno --ažuriranje \
--sekunde 60 --broj pogodaka 15 -j DROP

Pravila smanjuju ograničenje broja konekcija sa jednog IP-a u minuti na 15. Isto se može učiniti koristeći pf:

# vi /etc/pf.conf

webserver_ip="1.1.1.1"
sto uporno
blokiraj brzo iz
proslijediti $ext_if proto tcp na $webserver_ip \
port www zastavice S/SA zadrži stanje \
(max-src-conn 100, max-src-conn-rate 15/60,\
preopterećenja flush)

Pored ograničenja broja uzastopnih veza (15 u minuti), ovo pravilo postavlja dodatno ograničenje za broj istovremenih veza jednako 100.

PHP Setup

Ako koristite nginx zajedno sa PHP-om, ne zaboravite da ga konfigurišete. Ovako bi trebao izgledati konfiguracijski fajl /etc/php/php.ini sigurnog servera:

# vi /etc/php/php.ini

# Onemogućite opasne funkcije
disable_functions = phpinfo, system, mail, exec
# Maksimalno vrijeme izvršavanja skripte
max_execution_time = 30
# Maksimalno vrijeme koje skripta može potrošiti na obradu podataka zahtjeva
max_input_time = 60
# Maksimalna količina memorije dodijeljena svakoj skripti
memory_limit = 8M
# Maksimalna veličina podataka poslatih skripti pomoću POST metode
post_max_size = 8M
# Maksimalna veličina učitanih fajlova
upload_max_filesize = 2M
# Ne prikazuj greške PHP skripte korisnicima
display_errors = Isključeno
# Omogući Safe Mode
safe_mode = Uključeno
# Omogućite SQL siguran način rada
sql.safe_mode = Uključeno
# Dozvoli da se eksterne komande izvršavaju samo u ovom direktorijumu
safe_mode_exec_dir = /path/to/protected/directory
# Zaštitite od curenja informacija o PHP-u
expose_php = Isključeno
# Čuvamo dnevnike
log_errors = Uključeno
# Spriječite otvaranje udaljenih datoteka
allow_url_fopen = Isključeno

zaključci

Primjenom preporuka opisanih u ovom članku, dobit ćete mnogo sigurniji web server. Ali imajte na umu da sve tehnike neće odgovarati vašoj konfiguraciji. Na primjer, brute force zaštita zasnovana na smanjenju veličine bafera koje nginx dodjeljuje za obradu zahtjeva klijenata može dovesti do smanjenja performansi, au nekim slučajevima i do neuspjeha u obradi zahtjeva. Ograničavanje broja konekcija će ozbiljno uticati na performanse čak i umjereno učitane web stranice, ali će biti od koristi ako stranica ima nizak promet. Uvijek provjerite kako promjene koje napravite utječu na performanse i cjelokupno zdravlje web stranice.

O heroju dana

Nginx je jedan od najmoćnijih i najpopularnijih web servera na svijetu. Prema Netcraft-u, koristi se za podršku više od 12 miliona web stranica širom svijeta, uključujući mastodonte kao što su Rambler, Yandex, Begun, WordPress.com, Wrike, vkontakte.ru, megashara.com, Librusec i Taba.ru. Kompetentna arhitektura zasnovana na multipleksiranju konekcija koristeći sistemske pozive select, epoll (Linux), kqueue (FreeBSD) i mehanizam za upravljanje memorijom baziran na skupovima (mali baferi od 1 do 16 KB) omogućava nginx-u da ne propadne čak i pod vrlo velikim opterećenjima, izdržavajući preko 10.000 istovremenih veza (tzv. problem C10K). Originalno je napisao Igor Sysoev za Rambler i otvoren 2004. pod licencom sličnom BSD-u.

U kontaktu sa

I drugi). Trenutna verzija,0.6.x, smatra se stabilnim u smislu pouzdanosti, a izdanja iz grane 0.7 smatraju se nestabilnim. Važno je napomenuti da će se funkcionalnost nekih modula promijeniti, zbog čega se mogu promijeniti i direktive, stoga kompatibilnost unatrag u nginx-u prije verzije 1.0.0 nije zajamčeno.

Zašto je nginx tako dobar i zašto ga administratori projekata visokog opterećenja toliko vole? Zašto jednostavno ne koristite Apache?

Zašto je Apache loš?

Prvo moramo objasniti kako oni funkcioniraju općenito. mrežni serveri. Oni koji su upoznati sa mrežnim programiranjem znaju da u suštini postoje tri modela rada servera:

  1. Dosljedno. Server otvara utičnicu za slušanje i čeka da se pojavi veza (u blokiranom je stanju dok čeka). Kada veza stigne, server je obrađuje u istom kontekstu, zatvara vezu i ponovo čeka vezu. Očigledno, ovo je daleko od najboljeg načina, pogotovo kada rad s klijentom traje dugo i ima puno veza. Osim toga, sekvencijalni model ima mnogo više nedostataka (na primjer, nemogućnost korištenja više procesora), au stvarnim uvjetima praktički se ne koristi.
  2. Višeprocesni (višestruki). Server otvara utičnicu za slušanje. Kada veza stigne, ona je prihvata, nakon čega kreira (ili uzima iz grupe prethodno kreiranih) novi proces ili nit koja može raditi sa vezom koliko god želi, a po završetku posla prekida ili povratak u bazen. Glavna nit je u međuvremenu spremna da prihvati novu vezu. Ovo je najpopularniji model jer je relativno jednostavan za implementaciju, omogućava izvođenje složenih i dugotrajnih proračuna na svakom klijentu i koristi sve dostupne procesore. Primjer njegove upotrebe je Apache web server. Međutim, ovaj pristup ima i nedostatke: kada velike količine simultane veze stvaraju mnogo niti (ili, još gore, procesa), a operativni sistem troši mnogo resursa na prebacivanje konteksta. Posebno je loše kada klijenti veoma sporo prihvataju sadržaj. Ovo rezultira stotinama niti ili procesa koji su samo zauzeti slanjem podataka sporim klijentima, što stvara dodatno opterećenje na OS planeru, povećava broj prekida i troši dosta memorije.
  3. Neblokirajuće utičnice/mašina stanja. Server radi unutar jedne niti, ali koristi neblokirajuće utičnice i mehanizam prozivanja. One. server na svakoj iteraciji beskonačna petlja Odabire iz svih utičnica onaj koji je spreman za primanje/slanje podataka pomoću poziva select(). Nakon što je socket odabran, server mu šalje podatke ili ih čita, ali ne čeka potvrdu, već ide u početno stanje i čeka događaj na drugom soketu ili obrađuje sljedeći u kojem se događaj dogodio tokom obrade prethodni. Ovaj model Veoma efikasno koristi procesor i memoriju, ali je prilično složen za implementaciju. Osim toga, unutar ovog modela, obrada događaja na soketu mora se odvijati vrlo brzo - inače će se mnogi događaji akumulirati u redu čekanja i na kraju će se on preliti. Upravo na ovom modelu radi nginx. Osim toga, omogućava vam pokretanje više radnih procesa (tzv. radnika), tj. može koristiti više procesora.

Dakle, zamislite sledeću situaciju: 200 klijenata sa 256 Kbit/s kanalom se povezuje na HTTP server sa 1 Gbit/s kanalom:

Šta se dešava u slučaju Apača? Kreira se 200 niti/procesa koji relativno brzo generišu sadržaj (ovo bi moglo biti nešto slično dinamičke stranice i statičke datoteke koje se čitaju s diska), ali ih polako isporučuju klijentima. Operativni sistem je primoran da se nosi sa gomilom niti i I/O zaključavanja.

U ovoj situaciji, Nginx troši red veličine manje OS resursa i memorije na svaku vezu. Međutim, ovo otkriva ograničenje nginx mrežnog modela: on ne može interno generirati dinamički sadržaj, jer ovo će dovesti do blokada unutar nginxa. Naravno, postoji rješenje: nginx može proxy takve zahtjeve (za generiranje sadržaja) na bilo koji drugi web server (na primjer, isti Apache) ili na FastCGI server.

Razmotrimo mehanizam rada kombinacije nginx kao „glavnog“ servera i Apachea kao servera za generisanje dinamičkog sadržaja:

Nginx prihvaća vezu od klijenta i čita cijeli zahtjev s njega. Ovdje treba napomenuti da sve dok nginx ne pročita cijeli zahtjev, ne predaje ga na “obradu”. Zbog toga se gotovo svi indikatori napretka učitavanja datoteka obično "lome" - međutim, moguće ih je popraviti pomoću modula upload_progress treće strane (to će zahtijevati modifikaciju aplikacije).

Nakon što nginx pročita cijeli odgovor, otvara vezu s Apacheom. Potonji radi svoj posao (generira dinamički sadržaj), nakon čega svoj odgovor šalje nginx-u, koji ga baferuje u memoriju ili privremenu datoteku. U međuvremenu, Apache oslobađa resurse. Zatim, nginx polako isporučuje sadržaj klijentu, trošeći redove veličine manje resursa nego Apache.

Ova šema se zove frontend + backend i koristi se vrlo često.

Instalacija

Jer nginx tek počinje da dobija na popularnosti, postoje neki problemi sa binarnim paketima, pa budite spremni da ga sami prevedete. Obično nema problema s ovim, samo trebate pažljivo pročitati izlaz naredbe./configure --help i odabrati opcije kompilacije koje su vam potrebne, na primjer ove:

./configure\
--prefix=/opt/nginx-0.6.x \ # instalacijski prefiks
--conf-path=/etc/nginx/nginx.conf \ # lokacija konfiguracionog fajla
—pid-path=/var/run/nginx.pid \ # ... i pid datoteku
—user=nginx \ # korisničko ime pod kojim će se nginx pokrenuti
—with-http_ssl_module —with-http_gzip_static_module —with-http_stub_status_module \ # lista potrebnih
—bez-http_ssi_module —bez-http_userid_module —bez-http_autoindex_module —bez-http_geo_module —bez-http_referer_module —bez-http_memcached_module —bez-http_limit_zone_module ... i unmodule

Nakon konfiguracije, trebali biste pokrenuti standardnu ​​make && make install, nakon čega možete koristiti nginx.

Pored toga, u Gentoo-u možete koristiti ebuild iz standardnog stabla portova; u RHEL/CentOS od epel repozitorija (koje sadrži nginx 0.6.x) ili srpm za verziju 0.7, koji se može preuzeti ovdje: http://blogs.mail.ru/community/nginx; na Debianu možete koristiti nginx paket iz nestabilne grane.

Konfiguracioni fajl

Nginx konfiguracijski fajl je vrlo zgodan i intuitivan. Obično se zove nginx.conf i nalazi se u $prefix/conf/ ako lokacija nije zaobiđena tokom kompilacije. Volim da ga stavim u /etc/nginx/, kao i programeri svih gore navedenih paketa.

Struktura konfiguracijskog fajla je sljedeća:

korisnik nginx; # korisničko ime sa čijim pravima će nginx raditi
worker_processes 1; # broj radnih procesa
događaji (
<…># ovaj blok specificira mehanizam prozivanja koji će se koristiti (vidi dolje) i maksimalan broj mogućih konekcija
}

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

# opis servera (ovo se zove VirtualHost u apacheu)
server (
# adresa i ime servera
slušaj *:80;
server_name aaa.bbb;

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

# i ovako možete definirati lokaciju, za koju također možete nadjačati gotovo sve direktive navedene na globalnijim nivoima
lokacija /abcd/ (
<директивы>;
}
# Osim toga, možete napraviti lokaciju koristeći regularni izraz, na primjer ovako:
lokacija ~ \.php$ (
<директивы>;
}
}

# drugi server
server (
slušaj *:80;
server_name ccc.bbb;

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

Imajte na umu da se svaka direktiva mora završavati tačkom i zarezom.
Reverse proxying i FastCGI

Dakle, gore smo pogledali prednosti frontend + backend šeme, shvatili instalaciju, strukturu i sintaksu konfiguracijske datoteke, a sada ćemo pogledati kako implementirati obrnuto proxy u nginx.

I vrlo je jednostavno! Na primjer ovako:

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

U ovom primjeru, svi zahtjevi koji padaju na lokaciju / biće proksi serveru 1.2.3.4, port 8080. Ovo može biti ili apache ili bilo koji drugi http server.

Međutim, postoji nekoliko suptilnosti koje se odnose na činjenicu da će aplikacija smatrati da joj, prvo, svi zahtjevi dolaze s iste IP adrese (što se može smatrati, na primjer, pokušajem DDoS napada ili pogađanja lozinke), i drugo, pretpostavimo da radi na hostu 1.2.3.4 i portu 8080 (respektivno, generirajte pogrešna preusmjeravanja i apsolutne veze). Kako bih izbjegao ove probleme bez ponovnog pisanja aplikacije, sljedeća konfiguracija mi je zgodna:
Nginx sluša eksterni interfejs na portu 80.

Ako se backend (recimo Apache) nalazi na istom hostu kao i nginx, onda "sluša" na portu 80 na 127.0.0.1 ili drugoj internoj IP adresi.

nginx konfiguracija u ovom slučaju izgleda ovako:

server (
slušaj 4.3.2.1:80;
# postavite zaglavlje Host i X-Real-IP: za svaki zahtjev koji se šalje backendu
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host:$proxy_port;
# ili “proxy_set_header Host $host;” ako će aplikacija dodati:80 svim vezama
}

Da bi aplikacija razlikovala IP adrese posjetitelja, potrebno je ili instalirati mod_extract_forwarded modul (ako se izvršava Apache server), ili izmijenite aplikaciju tako da preuzima informacije o IP adresi korisnika iz X-Real-IP HTTP zaglavlja.

Druga pozadinska opcija je korištenje FastCGI. U ovom slučaju, nginx konfiguracija će izgledati otprilike ovako:

server (
<…>

# lokacija na koju će ići zahtjevi za php skripte
lokacija ~ .php$ (
fastcgi_pass 127.0.0.1:8888; # odredite adresu i port fastcgi servera,
fastcgi_index index.php; # ...indeks fajl

# i neke parametre koje treba proslijediti fastcgi serveru kako bi razumio koju skriptu treba izvršiti i s kojim parametrima:
fastcgi_param SCRIPT_FILENAME /usr/www/html$fastcgi_script_name; # ime skripte
fastcgi_param QUERY_STRING $query_string; # string upita
# i parametri zahtjeva:
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
}

# zbog činjenice da lokacije sa regularnim izrazima imaju visok "prioritet", svi ne-php zahtjevi će pasti ovdje.

lokacija/(
root /var/www/html/
}

Statika

Da biste manje učitavali pozadinu, bolje je opsluživati ​​statičke datoteke samo preko nginx-a - on se bolje nosi s tim zadatkom, jer troši znatno manje resursa na svaki zahtjev (nema potrebe za stvaranjem novog procesa, a Nginx proces obično troši manje memorije i može servisirati mnoge veze).

U konfiguracijskoj datoteci to izgleda otprilike ovako:

server (
slušaj *:80;
server_name myserver.com;

Lokacija/(
proxy_pass


">http://127.0.0.1:80;

}

# pretpostavimo da su svi statički fajlovi u /files
lokacija /fajlovi/ (
root /var/www/html/; # označava putanju do fs
ističe 14d; # dodajte zaglavlje Expires:
error_page 404 = @back; # i ako datoteka nije pronađena, šaljemo je na imenovanu lokaciju @back
}

# zahtjeva iz /files za koje nije pronađena datoteka se šalju na pozadinu, a može se ili generirati potreban fajl, ili prikaži prelepa poruka o grešci
lokacija @pozadi (
proxy_pass
"title="http://127.0.0.1:80;

">http://127.0.0.1:80;

}

Ako sva statika nije smještena u određeni direktorij, onda koristite regularni izraz:

lokacija ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf |js)$ (
# slično onome što je gore, samo svi zahtjevi koji završavaju jednim od navedenih sufiksa ići će na ovu lokaciju
root /var/www/html/;
error_page 404 = @back;
}

Nažalost, nije implementiran u nginx asinhroni rad sa fajlovima. Drugim riječima, nginx worker je blokiran na I/O operacijama. Dakle, ako imate puno statičnih datoteka i posebno ako se iz njih čitaju različiti diskovi, bolje je povećati broj radnih procesa (na broj koji je 2-3 puta veći od ukupnog broja glava na disku). Ovo, naravno, povećava opterećenje OS-a, ali se ukupne performanse povećavaju. Za rad sa tipičnom količinom statičkog sadržaja (ne baš velikim brojem relativno malih fajlova: CSS, JavaScript, slike), dovoljna su jedan ili dva toka posla.

Nastavlja se

Linkovi

Ovdje možete pronaći dodatne informacije o nginxu:

Nginx je web server i email proxy koji je javno dostupan od 2004. Razvoj projekta započeo je 2002. godine; na ruskom ime zvuči kao engine-ex. Kao kreacija poznatog programera Igora Sysoeva, Nginx je prvobitno bio namijenjen kompaniji Rambler. Dizajniran je za operativne sisteme koji pripadaju Unix-sličnoj grupi. Sklop je uspješno testiran na OpenBSD, FreeBSD, Linux, Mac OS X, Solaris. Na platformi Microsoft Windows Nginx je počeo da radi sa pojavom verzije 0.7.52 binarnog sklopa.

Statistike za mart 2011. pokazuju da je broj sajtova koje Nginx opslužuje već prešao granicu od 22 miliona. Danas Nginx koriste poznati projekti kao što su Rambler, Begun, Yandex, SourceForge.net, WordPress.com, vkontakte.ru i drugi. Zajedno sa lighttpd-om, Nginx se koristi za posluživanje statičkog sadržaja generiranog od strane "nezgodne" web aplikacije koja radi "pod autoritetom" drugog web servera.
Ali prije nego što uđemo u džunglu Nginxovih funkcionalnih mogućnosti, bilo bi korisno podsjetiti se što je web server općenito, a posebno proxy server.

Web server i proxy server

Web server je server koji prihvaća HTTP zahtjeve od web pretraživača i drugih klijenata i izdaje HTTP odgovore na njih. Potonji su obično zastupljeni HTML stranica, medijski tok, slika, datoteka, drugi podaci. Pod web serverom se podrazumijeva softver, obavljanje funkcija web servera i hardvera. Razmjena podataka i traženih informacija vrši se putem HTTP protokola.

Dodaj na listu dodatne funkcije web serveri uključuju: autorizaciju i autentifikaciju korisnika, evidentiranje njihovog pristupa resursima, HTTPS podršku za sigurnu komunikaciju sa klijentima i drugo. Najčešće korišteni web server na operativnim sistemima sličnim Unixu je Apache. Nginx trenutno zauzima treće mjesto na listi preferencija klijenata.

Proxy server omogućava klijentima da se bave upiti za pretraživanje na mrežne usluge u indirektnom obliku. To jest, to je server koji je specijaliziran za preusmjeravanje zahtjeva klijenata na druge servere. Povezivanjem na proxy server i traženjem resursa koji se nalazi na drugom serveru, klijent ima mogućnost da zadrži anonimnost i zaštiti računar od mrežni napadi. Proxy server daje tražene podatke klijentu ili iz vlastite keš memorije (ako postoji) ili primanjem od navedenog servera. U nekim slučajevima (da bi se postigli gore navedeni ciljevi), odgovor servera, kao i zahtjev klijenta, može biti promijenjen od strane proxy servera.

Najjednostavniji proxy server je Network Address Translator ili NAT. Godine 2000, proxy NAT je ugrađen u Windows distribuciju. Proxy serveri, kao i svaki fenomen, imaju dvije strane medalje, odnosno mogu se koristiti i za dobro i za zlo. Na primjer, uz njihovu pomoć oni koji se plaše sankcija za svoje nepristojne radnje na internetu skrivaju svoje IP adrese...

Nginx funkcionalni raspon:

  • održavanje servera indeksnih datoteka, statičkih upita, generiranje keš deskriptora otvorenih datoteka, lista datoteka;
  • ubrzano proxy, elementarna raspodjela opterećenja, tolerancija grešaka;
  • podrška za keširanje tokom ubrzanog proxyja i FastCGI;
  • podrška za FastCGI (ubrzane) i memcached servere;
  • modularnost, filteri, uključujući nastavak (opsezi bajtova) i kompresiju (gzip);
  • HTTP autentifikacija, odgovori u komadima, SSI filter;
  • paralelno izvršavanje nekoliko podupita na stranici obrađenoj preko FastCGI ili proxyja u SSI filteru;
  • StartTLS i SSL podrška;
  • mogućnost podrške ugrađenom Perlu;
  • jednostavna autentikacija (USER/PASS, LOGIN);
  • preusmjeravanje servera (IMAP/POP3 proxy) korisnika na IMAP/POP3 pozadinu korištenjem vanjskog servera za autentifikaciju (HTTP).

Za one koji nisu upoznati s ovom terminologijom, opis funkcionalnosti Nginxa može izgledati vrlo nejasan. Ali kada govorimo o specifičnim načinima korištenja ovog web servera, on će postepeno početi nestajati.

Arhitektura i konfiguracija

Radni procesi u Nginx-u istovremeno opslužuju više konekcija, pružajući im OS (operativni sistem) epoll (Linux), select i kqueue (FreeBSD) pozive. Podaci primljeni od klijenta se analiziraju pomoću državnog stroja. Raščlanjeni zahtjev se obrađuje od strane lanca modula specificiranih konfiguracijom. Odgovor klijentu se generira u baferima, koji mogu ukazivati ​​na dio datoteke ili pohranjivati ​​podatke u memoriju. Redoslijed prijenosa podataka do klijenta određen je lancima u koje su baferi grupirani.

Strukturno, Nginx HTTP server je podeljen na virtuelne servere, koji su zauzvrat podeljeni na lokacije. Virtuelni server ili direktive, možete odrediti portove i adrese za prijemne veze. Za lokaciju možete specificirati tačan URI, dio URI-ja ili regularni izraz.Za online upravljanje memorijom, koriste se skupovi, koji su niz unaprijed odabranih memorijskih blokova. Jedan blok, prvobitno dodijeljen za bazen, ima dužinu od 1 do 16 kilobajta. Podijeljena je na područja - zauzeta i nenaseljena. Kako se potonji popunjava, dodjela novog objekta osigurava se formiranjem novog bloka.

Geografska klasifikacija klijenata po njihovoj IP adresi se vrši u Nginx-u pomoću specijalni modul. Radix sistem stabla vam omogućava brz rad sa IP adresama, zauzimajući minimum memorije.

Prednosti Nginxa

Nginx se smatra veoma brzim HTTP server. Umjesto Apache-a ili zajedno s njim, Nginx se koristi za ubrzavanje obrade zahtjeva i smanjenje opterećenja na serveru. Činjenica je da većini korisnika nisu potrebne ogromne mogućnosti inherentne Apacheovoj modularnoj arhitekturi. Ovu nezatraženu funkcionalnost morate platiti uz značajnu potrošnju sistemskih resursa. Obične stranice, po pravilu, karakterizira jasna "dominacija" statičkih datoteka (slike, stilski fajlovi, JavaScript), a ne skripti. Za prijenos ovih datoteka posjetitelju resursa nije potrebna nikakva posebna funkcionalnost, jer je zadatak vrlo jednostavan. To znači da web server za obradu takvih zahtjeva mora biti jednostavan i lagan, poput Nginxa.

Načini korištenja Nginxa

Na zasebnom portu/IP-u. Ako je resurs zasićen slikama ili datotekama za preuzimanje, Nginx se može konfigurirati na zasebnom portu ili IP-u i distribuirati statički sadržaj preko njega. Međutim, da biste to učinili, morat ćete se malo pozabaviti promjenom veza na web stranici. Ako postoji veliki broj zahtjeva za statičke datoteke, ima smisla napraviti poseban server i na njemu instalirati Nginx.

Ubrzano proxying. Sa ovom opcijom, svi zahtjevi posjetitelja prvo idu na Nginx. Zahtjevi za statične datoteke (na primjer, slike, jednostavan HTML, JavaScript ili CSS fajl) Nginx ga obrađuje nezavisno. Ako korisnik pristupi određenoj skripti, on će preusmjeriti zahtjev na Apache odjel. Nema potrebe za bilo kakvom transformacijom koda stranice.

Ako je kanal od servera do posjetitelja i obrnuto spor, ova upotreba Nginxa može dati dodatni efekat. Nginx prosljeđuje zahtjev primljen od posjetitelja Apacheu na obradu. Nakon obrade zahtjeva, Apache prosljeđuje stranicu u Nginx i zatvara vezu s osjećajem postignuća. Nginx sada može slati stranicu korisniku koliko god dugo želi, praktično bez trošenja sistemskih resursa. Rad Apache-a na njegovom mjestu bio bi praćen nerazumno velikim opterećenjem memorije kada bi radio gotovo u praznom hodu. Usput, ovaj slučaj upotrebe za Nginx ima drugo ime: "frontend za Apache".

Nginx plus FastCGI. Apache možda uopće neće biti potreban ako tumač jezika na kojem su napisane skripte stranice podržava FastCGI tehnologiju. Takvi jezici uključuju, na primjer, PHP, Perl i niz drugih. Međutim, u ovom slučaju ćete možda morati izmijeniti kodove skripte.

Postoji mnogo detaljnih materijala o tome kako instalirati i konfigurirati Nginx na Internetu. Više o Nginxu možete saznati na web stranici njegovog programera Igora Sysoeva.

Zdravo, Poštovani korisniče Habrakhabra. Moj govor će biti o tome kako pripremiti teren za lokalne web razvojne projekte u operacionoj sali Ubuntu sistem 16.04.1 LTS.

U ovom članku bih želio da otklonim i objasnim moguće poteškoće povezane s instaliranjem i konfiguracijom softvera koji je neophodan za moderni web razvoj, na koje se mogu susresti programeri početnici i drugi.

Tehnologije koje će se koristiti u članku: nginx, php-fpm.

Prije početka priče, želim napomenuti da sam sve ove radnje radio na „golom“ sistemu.
Radit ću s upraviteljem paketa aptitude. Također preporučujem ažuriranje indeksa paketa i samih paketa prije instaliranja softvera. U ovom članku ćemo zajedno uraditi ove korake.

Idi!

Instaliranje menadžera paketa sposobnost, ažuriranja indeksa i paketa

Instaliraj:

Sudo apt install aptitude
Ažuriramo indeks.

Sudo aptitude ažuriranje
Ažuriramo pakete (naredba će ažurirati sve pakete za koje postoje nove verzije; ako pakete treba ukloniti, to će biti učinjeno).

Sudo aptitude puna nadogradnja

Instalacija i konfiguracija nginx(verzija >= 1.10.0)

Mi instaliramo.

Sudo aptitude instalira nginx
Hajdemo.

Sudo servis nginx start
Provjeravamo verziju kako bismo bili sigurni da nismo instalirali staru, odnosno nižu od 1.10.0.

Instalacija i pokretanje su završeni, sada idemo u direktorij gdje je instaliran naš nginx i pogledajmo njegovu strukturu. Direktorij nginx nalazi se na ovoj stazi:

CD /etc/nginx/
Možete pogledati sadržaj direktorija pomoću naredbe ls; sa zastavicama -la bit će zgodnije vidjeti sadržaj direktorija (zapravo, ova naredba s određenim oznakama može se detaljnije i preciznije opisati, ali danas imamo drugu temu).

Ls-la
Trenutno smo zainteresovani za dva kataloga koja vidite na snimku ekrana. Ovo su direktoriji dostupni na web lokacijama i na kojima je omogućena web lokacija.

Idemo u direktorij sites-available i počnimo konfigurirati naš virtualni host (web-lokaciju).

Cd /etc/nginx/sites-available
Prije nego počnemo kreirati konfiguracijsku datoteku, provjerimo šta imamo ovaj katalog. U mom slučaju direktorij nije prazan, već sadrži konfiguracijske datoteke, obrisao sam ih da vas ne zavaravam.

Važna digresija

U slučaju instaliranja nginxa "od nule", tačnije "od nule", od kada deinstalirate nginx naredbom
sudo apt-get remove nginx ili sudo apt remove nginx konfiguracijske datoteke ostaju i ako odjednom ne razumijete zašto nginx ne radi i želite ga ponovo instalirati (obično početnici pribjegavaju ovome Korisnici Linuxa), onda ni nakon ponovne instalacije neće raditi kako treba, jer stare konfiguracijske datoteke (ne brišu se nakon uklanjanja naredbom remove) sadrže pogrešne postavke, morat će se obrisati ili ispravno konfigurirati, tek tada će nginx raditi.

Preporučujem brisanje naredbom sudo apt-get purge nginx ili sudo apt purge nginx. Ako koristite upravitelj paketa aptitude, naredba sudo aptitude purge nginx uklanja cijeli paket zajedno sa svim ovisnostima i konfiguracijskim datotekama.


U ovom direktoriju će po defaultu postojati jedna datoteka, koja se zove default. Sadržat će konfiguracijsku datoteku s primjerom, s komentarima, možete je proučiti u slobodno vrijeme ili je možete potpuno izbrisati (uvijek možete pogledati zvaničnu dokumentaciju).

Ls-la

Kreirajmo vlastitu konfiguracijsku datoteku, koja će odgovarati nazivu domene naše lokalne stranice (ili pravoj, ako već znate njeno ime). Ovo je zgodno, u budućnosti, kada bude mnogo konfiguracijskih datoteka, to će vas spasiti od zabune u njima. Za mene će se ovaj fajl zvati project.local.

Sudo touch project.local
Da vidimo šta se desilo.

Sada ga otvorimo u editoru, ja ću ga otvoriti u nano.

Sudo nano project.local
Vidimo da je prazan. Sada idemo na kreiranje naše datoteke. Morate dovesti konfiguraciju u formu opisanu u nastavku. Opisaću samo vitalne direktive ovog fajla, neću opisivati ​​ostalo, jer to trenutno nije važno, ipak imamo temu osnovna podešavanja. Ova „slajd“ podešavanja su dovoljna za razvoj lokalnih projekata, ne samo malih, već i prilično velikih. U sljedećim člancima opisat ću posebno svaku od korištenih direktiva (tako se zovu linije, na primjer ime_servera) ove datoteke.

Pogledajte komentare direktno u konfiguracionoj datoteci.

Server ( slušaj 80; # port sluša nginx server_name project.local; # Ime domena vezano za struju virtuelni host root /home/stavanger/code/project.local; # direktorij u kojem se projekt nalazi, put do ulazne točke index.php; # add_header Access-Control-Allow-Origin *; # služi statičke datoteke direktno lokacija ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ ( access_log off; ističe max; log_not_found off; ) location / ( # add_header Access-Control-Allow- Porijeklo *; try_files $uri $uri/ /index.php?$query_string; ) lokacija ~* \.php$ ( try_files $uri = 404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix :/var/run/php/php7.0-fpm.sock; # povežite php-fpm socket fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; uključi fastcgi_params; ) lokacija ~ /\.ht) ( deny all; )
Sačuvajte fajl. Sada moramo provjeriti ima li u njemu grešaka. Možemo to uraditi kao tim.

Sudo nginx -t
Ako vidimo takve informacije kao na snimku ekrana, onda je sve ispravno i možemo nastaviti s postavljanjem. Ako dobijete bilo kakve greške, vrijedi još jednom provjeriti svoju konfiguracijsku datoteku.

Sada treba da aktiviramo konfiguracioni fajl, u direktorijumu /etc/nginx/sites-enabled/ treba da kreiramo simboličku vezu (symlink). Ako ste instalirali nginx od nule, tada u ovom direktoriju postoji simbolična veza na zadanu datoteku, o kojoj smo gore govorili; možete je izbrisati ako vam nije potrebna. Idite na željeni direktorij.

CD /etc/nginx/sites-enabled/
Sada smo u pravom imeniku. Kreirajmo našu simboličku vezu. Za kreiranje koristite naredbu ln sa zastavicom -s, tada ćemo naznačiti putanju do naše project.local konfiguracije.

Sudo ln -s /etc/nginx/sites-available/project.local
Pogledajmo našu kreiranu simboličku vezu.

Da bismo bili sigurni da i dalje sve radimo ispravno, pokrenimo naredbu ponovo.

File domaćini

Ova datoteka se nalazi na /etc/hosts. Prisustvo unosa u njemu omogućava vam da pokrenete nginx koristeći localhost kao domenu. U ovoj datoteci možete dodijeliti alternativne pseudonime, na primjer za naš projekt project.local, mi ćemo dodijeliti domen project.local.

Otvorite datoteku u nano editoru.

Sudo nano /etc/hosts
Imat ćete druge informacije u ovoj datoteci, samo ih zanemarite. Samo treba da dodate liniju kao na mom snimku ekrana.

Instalacija php-fpm (>=7.0)

sudo aptitude install php-fpm
Provjeravam instaliranu verziju, za svaki slučaj, iako je u Ubuntu 16.04.1 verzija 7.0 u spremištima.

PHP-fpm7.0 -v

Hajde da se uverimo da je sve u redu. Pokrenimo php-fpm.

Sudo servis php7.0-fpm start
Ako uređujete konfiguracije, ne zaboravite ponovo pokrenuti demon. Tako i radi. Ali neće nam trebati.

Sudo servis php7.0-fpm restart
Ovim je završena instalacija i konfiguracija php-fpm-a. Zaista, to je sve. Ovo nije magija; putanja do php-fpm socketa je već navedena u konfiguracionoj datoteci. Naravno, možda će vam trebati neke PHP ekstenzije za razvoj ličnih projekata, ali možete ih instalirati po potrebi.

Idemo sada u direktorij s našim projektom, imam ga na ovoj stazi.

CD /home/stavanger/code/project.local
Idemo gore do gornjeg direktorija i napravimo dozvole 777 (to jest, uradićemo puna prava direktorij s našim projektom projekta.local). Ovo će nas spasiti od nepotrebnih problema u budućnosti.

Cd .. sudo chmod -R 777 project.local
Ovim je završeno podešavanje softvera, napravimo probnu datoteku u našem radnom direktoriju project.local i uvjerimo se da sve radi. Napraviću index.php fajl sa ovim sadržajem.

Idemo u pretraživač i vidimo da nam sve radi odlično! PHP interpreter uključujući.

S poštovanjem prema čitaocima, Stavanger.

Najbolji članci na ovu temu