Week-5: Server, tipovi servera
Last updated
Last updated
Server je racunarski sistem ili program koji pruza usluge drugim racunarima ili programima u mrezi. Server moze biti svaki fizicki racunar ili virtuelna masina. Serverima se nazivaju i fizicki racunari koji se nalaze u on-premise data centrima a na kojima je pokrenut serverski program.
Neke od osnovnih karakteristika servera su:
Pouzdanost
Perfromanse
Sigurnost
Skalabilnost
Visoka dostupnost
Upravljivost
Mrezna povezanost
Za razliku od racunara za licnu upotrebu, hardwer racunara koji se koriste kao serveri su obicno dizajnirani da budu pouzdani i da imaju visoku dostupnost. Serveri su obicno opremljeni sa dodatnim hardwerom za povecanje performansi i sigurnosti.
Data centar je fizicki objekat koji sadrzi servere, mreznu opremu, klimatizaciju, UPS-e, generatora, kablovsku mrezu, itd. Data centri obicno imaju fizicke i digitalne sigurnosne mjere kako bi se zastitili podaci i oprema. Ovo moze ukljucivati kamere za nadzor, sisteme za pristup i identifikaciju, kao i razne fizicke barijere.
Server OS ima nekoliko karakteristika koje ga razlikuju od Operatinih Sistema na racunarima za licnu upotrebu.
Pouzdanost
Skalabilnost (podrska za multi-core procesore, multi-threading, itd.)
Perfromanse
Upravljanje resursima
Sigurnost
Udaljeno upravljanje
Web serveri su racunarski programi / servisi koji su dizajnirani za obradjivanje HTTP zahtjeva i slanje HTTP odgovora korisnicima koji pregledavaju web stranice ili pristupaju web aplikacijama. Web serveri obicno se koriste za posluzivanje statickih web stranica, dinamickih web stranica i drugih vrsta web sadrzaja. Web serveri moze biti bilo koji racunar dostupan na Internetu, ali se obicno koriste posebni racunari odnosno serveri koje su optimizovani za brz i siguran rad. Trenutno najpopularniji web serveri su Apache, Nginx i Microsoft IIS.
NGINX (izgovara se "Engine X") je open-source web server i reverse proxy server. Zahvaljujuci svojoj jednostavnosti koristenja, brzini, skalabilnosti i sigurnosti postao je jedan od najpopularnijih web servera. NGINX ima i svoju placenu verziju koja se naziva NGINX Plus. Iako NGINX Plus ima odredjene funkcionalnosti koje nisu dostupne u open-source verziji, vecina korisnika i dalje nalazi dovoljnim open-source verziju NGINX-a.
Koraci za instalaciju Nginx-a na CentOS 7:
Defaultni root direktoriji nalazi se na lokaciji: /usr/share/nginx/html
. Ova putanja definisana je unutar server
bloka defaultnog nginx konfiguracijskog fajla koji se nalazi na lokaciji /etc/nginx/nginx.conf
. nginx.conf predstavlja globalni konfiguracijski fajl. U njemu se definisu globalne promenljive, globalni http
blok, globalni server
blok, itd.
Koraci za automatsko pokretanje Nginx-a nakon restarta servera:
Za svaki pojedinacni web sajt / web servis koji hostujete na serveru potrebno je kreirati zaseban server
blok unutar konfiguracijskog fajla. Preporuka je da se ti konfiguracijski fajlovi nalaze u direktorijumu /etc/nginx/conf.d/
i da imaju ekstenziju .conf
. Za svaki sajt kreirate poseban konfiguracijski fajl. U NGINX-u, direktive (eng. directives) su komande koje definisu kako Nginx obradjuje HTTP zahtjeve. Svaka direktiva se sastoji od naziva i vrijednosti koja se dodeljuje tom nazivu. Direktive se koriste u konfiguracijskim fajlovima da bi se definisala podesavanja za Nginx web server, kao sto su server blokovi, lokacije i ostale opcije.
Primjer jedne direktive bi mogao biti:
U ovom primjeru, "listen" je naziv direktive, a "80" je vrijednost koja se dodeljuje toj direktivi. Ova direktiva definise da Nginx slusa na portu 80 za dolazne HTTP zahtjeve.
Konteksti (eng. contexts) su oblasti u kojima se koriste direktive. Svaka direktiva se nalazi u nekom kontekstu, a kontekst definise koja se podesavanja primjenjuju na koji dio Nginx konfiguracije. Postoje tri vrste konteksta u Nginx-u:
Main Context
- Ovo je glavni kontekst koji obuhvata podesavanja koja se primjenjuju globalno na Nginx server.
Server Context
- Ovaj kontekst obuhvata podesavanja koja se primjenjuju na pojedinacne server blokove u konfiguraciji.
Location Context
- Ovaj kontekst obuhvata podesavanja koja se primjenjuju na pojedinacne URL-ove na serveru.
Primjer server konteksta bi mogao biti:
U ovom primjeru, sve direktive koje se nalaze u bloku server
primjenjuju se na taj pojedinacni server blok. Direktive koje se nalaze u bloku location
primjenjuju se samo na URL-ove koji odgovaraju putanji /. U ovom slucaju, direktiva try_files
definise da Nginx treba da pokusa da pronadje datoteku koja odgovara URL-u koji je klijent poslao. Ako datoteka ne postoji, Nginx ce pokusati da pronadje datoteku koja odgovara URL-u koji je klijent poslao, ali sa dodatnim znakom /. Ako ni ta datoteka ne postoji, Nginx ce pokusati da pronadje datoteku koja se zove index.html. Razumijevanje konteksta i direktiva u Nginx-u je kljucno za kreiranje ispravne konfiguracije i definisanje podesavanja za vas web server.
Da bi izmjene koje ste napravili u konfiguraciji Nginx-a bile vidljive, potrebno je ponovo pokrenuti Nginx. Ovo se moze uraditi sa sledecom komandom:
Pored nginx.conf fajla, postoje i drugi konfiguracijski fajlovi koji se nalaze u direktorijumu /etc/nginx/
. Ovi fajlovi se koriste za dodatna podesavanja i konfiguracije.
To su sljedeci fajlovi:
mime.types
- Ovaj fajl sadrzi listu MIME tipova koji se koriste za odredjivanje tipa sadrzaja koji se vraca klijentu sto omogucava klijentima da pravilno prikazu sadrzaj web stranica. Npr. MIME tip za HTML fajl je text/html
, a za JPEG sliku image/jpeg
. Ako server salje HTML fajl sa MIME tipom text/html
, browser ce ga pravilno interpretirati i prikazati HTML stranicu. Slicno tome, ako server salje sliku sa MIME tipom image/jpeg
, browser ce prikazati sliku na odgovarajuci nacin.
fastcgi.conf
- Ovaj fajl sadrzi podesavanja za FastCGI
procese. FastCGI
procesi se koriste za obradu dinamickog sadrzaja na web sajtu. FastCGI
je protokol koji omogucava web serveru da uspostavi vezu sa FastCGI procesom koji izvrsava aplikaciju. FastCGI procesi se koriste za generisanje dinamickog sadrzaja na web sajtu, kao sto su skripte za generisanje HTML stranica, PHP skripte i drugi programski jezici.
scgi_params
- SCGI (Simple Common Gateway Interface) je jednostavan protokol za komunikaciju izmedju web servera i aplikacijskog servera koji se koristi za generisanje dinamickog sadrzaja na web sajtovima. SCGI je slican FastCGI protokolu, ali je jednostavniji i manje fleksibilan. SCGI
procesi se koriste za generisanje dinamickog sadrzaja na web sajtu, kao sto su skripte za generisanje HTML stranica, Python skripte i drugi programski jezici.
uwsgi_params
- Ovaj fajl sadrzi podesavanja za uWSGI
procese. uWSGI
je jedan od najpopularnijh WSGI (Web Server Gateway Interface) servera. uWSGI
procesi se koriste za obradu dinamickog sadrzaja na web sajtu. uWSGI
je protokol koji omogucava web serveru da uspostavi vezu sa uWSGI
procesom koji izvrsava aplikaciju. uWSGI
procesi se koriste za generisanje dinamickog sadrzaja na web sajtu, kao sto su skripte za generisanje HTML stranica, Python skripte i drugi programski jezici. Preporuka je da pogledate sljedecu stranicu Why is WSGI necessary? kako bi razumjeli zasto je potreban WSGI protokol.
*-utf
- UTF metode omogucavaju enkodiranje znakova razlicitih jezika sto omogucava njihovo prikazivanje.
NAPOMENA: Instalacija Nginx-a na ostalim Linux/Unix distribucijama moze da kreira dodatne direktorije poput sites-available
i sites-enabled
. Ovi direktoriji mogu da sadrze dodatne .conf
fajlove koji se koriste za dodatna podesavanja i konfiguracije. Kod CentOS 7 OS-a konfiguracije za razlicite sajtove se nalaze unutar direktorijuma /etc/nginx/conf.d/
.
Da bi smo u potpunosti razumijeli rad web servera neophodno je da razumijemo aplikacijski server. Osnovni zadatak aplikacijskog servera je da omoguci klijentima pristup onome sto cesto nazivamo biznis logikom aplikacije koja generise dinamicki sadrzaj. Web Server isporucuje staticki sadrzaj ukljucujuci HTML stranice, slike, video fajlove i druge tipove podataka ukljucene u web sajt. Aplikacijski server sa druge strane generise dinamicki sadrzaj koji se isporucuje klijentima. Aplikacijski server nikada ne moze biti zamjena za web servere, umjesto toga aplikacijski server i web server moraju da rade zajedno kako bi klijent imao potpuno iskustvo prilikom koristenja web sajta. Bez aplikacijskog web servera, web aplikacije bi bile ogranicene na staticki sadrzaj i ne bi bile u mogucnosti da se prilagode promjenama u zahtjevima korisnika.
Uzmimo za primjer da imamo Node.js aplikaciju koju zelimo da pokrenemo na nasem serveru (hostu). Da bi je pokrenuli potreban nam je Node.js
server koji omogucava pokretanje Node.js
aplikacije. Node.js
server omogucava obradu HTTP
zahtjeva koji stizu od klijenata i generisanje odgovora na osnovu Node.js koda. Node.js
server pruza podrsku za razlicite HTTP
metode, ukljucujuci GET
, POST
, PUT
, DELETE
, i druge. Kako bi omogucili posluzivanje statickih fajlova, bolju skalabilnost, sigurnost, jednostavniju konfiguraciju neophodno je da ispred naseg Node.js servera postavimo web server (u ovom primjeru Nginx) koji ce da obradi HTTP
zahtjeve i proslijedi ih Node.js
serveru. Ovaj tip arhitekture se naziva Reverse Proxy arhitektura. U ovom slucaju, NGINX server je Reverse Proxy server koji obradjuje HTTP
zahtjeve i proslijedjuje ih Node.js
serveru. Node.js
server je u ovom slucaju Backend server koji obradjuje HTTP
zahtjeve i generise odgovore na osnovu Node.js koda koje proslijedjuje NGINX serveru koji ih isporucuje klijentima.
Kako da konfigurisemo Nginx da bude Reverse Proxy server?
Da bi konfigurisali NGINX da bude Reverse Proxy server neophodno je da podesimo jednostavnu Node.js aplikaciju koja ce da vrati Hello World
poruku kada se pozove. Ova aplikacija ce biti nas Backend server. Nakon toga potrebno je da podesimo NGINX da bude Reverse Proxy server koji ce da obradjuje HTTP
zahtjeve i proslijedjuje ih nasem Backend serveru.
Postoji vise razloga zasto bi koristili reverse proxy, a neki od njih su:
Skalabilnost - Reverse proxy serveri mogu da podrze veliki broj klijenata i da se lako skaliraju.
Sigurnost - Reverse proxy moze da sprijeci napade na backend servere.
Jednostavnost - Reverse proxy serveri mogu da se konfigurisu jednostavnije nego backend odnosno aplikacijski serveri.
Brzina - Reverse proxy serveri mogu da se konfigurisu da podrze cache-ovanje i da omoguce brze isporuke sadrzaja klijentima.
Load Balancing - Reverse proxy serveri mogu da podrze load balancing i da rasporede zahteve klijenata na razlicite backend odnosno aplikacijske servere.
SSL Termination - Reverse proxy serveri mogu da podrze SSL terminaciju i da omoguce klijentima da komuniciraju sa backend serverima preko HTTPS protokola.
U tu svrhu cemo ispratiti tutorijal sa Digital Ocean stranice How To Set Up a Node.js Application for Production on CentOS 7
Ukoliko dobijete sljedecu gresku:
Node JS mozete instalirati koristeci node version manager (nvm) alat na sljedeci nacin:
Svakako je preporuka da pogledate node github repozitoriji za instrukcije za instalaciju na razlicitim operativnim sistemima.
Application setup
Koraci za automatsko pokretanje pm2 nakon restarta servera:
Nakon izvrsenja komande pm2 startup
prikazuje se komanda koju trebamo pokrenuti kao root user ili sa sudo privilegijama. A ukoliko smo komandu pm2 startup
izvrsili kao root korisnik onda se ta komanda izvrsava automatski i ne trebamo je ponovo izvrsavati. Primjer takve komande koja se generise je:
Komanda kreira systemd
servis koji ce pokrenuti pm2
pri sistemskom boot-u i izvrsiti je kao navedeni korisnik your_user
username koji koristimo za pokretanje Node.js aplikacije -u your_user
opcija -u
specificira korisnika s cijim će se username-om izvrsiti navedena komanda env PATH=$PATH:/usr/bin
postavljamo enviromental varijablu PATH
da ukljucuje /usr/bin
direktorij gdje se nalazi node
binary executable file
node
komanda se koristi za izvršavanje fajla. Na primjer $ node app.js
/usr/lib/node_modules/pm2/bin/pm2
je putanja do executable PM2 fajla --hp /home/your_user
specificira gdje se nalazi home
direktorij korisnika, kako bi pm2 znao gdje se nalaze korisnikovi konfiguracijski fajlovi i log fajlovi
Defaultno se pm2 servis pokrece kao root korisnik, ali je preporuka iz sigurnosnih razloga da koristimo non-root korisnike sa ogranicenim permisijama i zato se navodi putanja do home
direktorija.
Kao poruku da je komanda izvrsena uspjesno dobijemo nesto slicno "Systemd process manager installed" , sto znaci da je skripta instalirana i pm2
ce se pokretati automatski pri sistemskom boot-u.
Za provjeru koristimo komande:
NGINX setup
gdje je node-app.conf
:
node-app.conf
- predstavlja konfiguracijski fajl gdje smo unutar server
bloka definisali jedan virtuealni server koji ce da obradjuje HTTP
zahtjeve koji stizu na port 80
i proslijedjuje ih na Node.js
server koji slusa na portu 3000
server
- pocetak definicije bloka konfiguracije za virtualni server.
listen 80
- Nginx ce slusati dolazne zahtjeve na portu 80.
server_name 3.68.91.255
- ovaj virtualni server ce odgovoriti na zahtjeve sa hostom 3.68.91.255
location /
- sva podudaranja putanja ce biti preusmjerena na proxy server.
proxy_pass http://127.0.0.1:3000
- svi dolazni zahtjevi ce biti proslijedjeni na adresu 127.0.0.1:3000
gdje se pokrece vasa aplikacija, to je ustvari localhost
adresa pa ste mogli da koristite i proxy_pass http://localhost:3000
proxy_http_version 1.1
- verzija HTTP protokola koja ce se koristiti za komunikaciju izmedju Nginx i aplikacije.
proxy_set_header Upgrade $http_upgrade;
- podesava zaglavlje Upgrade koje omogucava koristenje WebSocket komunikacije.
proxy_set_header Connection 'upgrade';
- podesava zaglavlje Connection koje omogucava koristenje WebSocket komunikacije.
proxy_set_header Host $host;
- podesava zaglavlje Host na vrijednost primljenog zahtjeva.
proxy_cache_bypass $http_upgrade;
- onemogucuje koristenje kesa za WebSocket komunikaciju.
Troubleshooting
Pogledajte NGINX logove i greske:
Korisne komande za troubleshooting:
Za razliku od reverse proxy-a koji sluzi za zastitu servera, forward proxy sluzi za zastitu klijenta. Forward proxy je server koji se nalazi izmedju klijenta ili grupe klijenta i interneta. Kada klijenti naprave zahtijev odnosno request prema internetu, oni se prvo salju na forward proxy server, koji ih proslijedi na internet. Forward proxy ce presresti zahtijev i "razgovarati" ce sa web serverom u ime klijenta.
Nekoliko je razloga zasto bi klijent zelio da koristi forward proxy server:
Zastita privatnosti - klijent moze da sakrije svoju IP adresu i da koristi IP adresu forward proxy servera.
Zaobilazak zabrana - klijent moze da koristi forward proxy server da bi zaobilazio zabrane koje su postavljene na strani servera.
Blokira pristup - forward proxy server moze da zabrani klijentima pristup odredjenim web stranicama.
Apache HTTP Server ili Apache ili Apache HTTPD je besplatni, open-source web server koji se koristi za hostovanje web stranica i web aplikacija.
Instalacija Apache-a i osnovni konfiguracijski fajlovi Instalacija na CentOS 7:
Lokacija na kojoj je instaliran je /etc/httpd/
.
Konfiguracijski direktoriji i fajlovi
Folderi koje vidimo na ovoj putanji su:
conf
- folder koji sadrzi konfiguracijske fajlove za Apache server httpd.conf
i magic
fajlove.
httpd.conf
- glavni konfiguracijski fajl za Apache server
magic
- fajl koji sadrzi informacije o tipovima fajlova odnosno datoteka koje se prenose preko web-a. Apache koristi magic datoteku kako bi utvrdio vrstu datoteke koja se prenosi, a zatim pravilno poslao odgovarajući MIME tip u HTTP zaglavlje. MIME tip omogućuje klijentima da znaju kako da obrade datoteke koje primaju, što je posebno važno kada se radi o binarnim datotekama, poput izvršnih datoteka ili arhiva.
conf.d
- folder koji sadrzi konfiguracijske fajlove za Apache server kreirane od strane korisnika
modules
- Ovaj direktorij se koristi za pohranu modula koje Apache koristi. Ovdje se nalaze datoteke koje definiraju funkcionalnost Apache modula. To su prekompilirane datoteke s ekstenzijom .so
za Unix sisteme ili .dll
za Windows.
conf.modules.d
- direktorij se koristi za pohranu konfiguracijskih datoteka za Apache module. Ove datoteke opisuju kako se moduli učitavaju i konfigurisu. Sadrži datoteke s nazivom u obliku XX-naziv_modula.conf
, gdje XX
oznacava redoslijed u kojem se moduli učitavaju. Datoteke u ovom direktoriju obično sadrže LoadModule
direktive koje specificiraju putanju do modula i naziv modula.
Virtual Hosts / Virtuelni hostovi
Zahvaljujuci virtuelnim hostovi, Apache server moze da hostuje vise web stranica na jednom serveru. Svaka web stranica ima svoj virtuelni host. Virtuelni hostovi se konfigurisu u httpd.conf
fajlu. Ukoliko je potrebno da se konfigurise vise virtuelnih hostova, onda se konfiguracija virtuelnih hostova izdvoji u posebane fajlove koji se nalaze u conf.d
direktoriju.
Reverse Proxy
ProxyPreserveHost On
- ova opcija omogucava da se host header proslijedi na Node.js aplikaciju
ProxyPass / http://localhost:3000/
- ova opcija proslijedjuje sve zahtjeve koji dolaze na Apache server na Node.js aplikaciju
ProxyPassReverse / http://localhost:3000/
- ova opcija proslijedjuje sve odgovore koji dolaze od Node.js aplikacije na Apache server
ProxyRequests Off
- zabranjuje koristenje apache web servera kao forward proxy servera
Apache Tomcat ili samo Tomcat je open-source web server koji se koristi za posluzivanje web aplikacija koje su napisane u Javi. Tomcat se obicno koristi za posluzivanje dinamickih web stranica koje koriste JSP (JavaServer Pages) i servlet tehnologije.
Tomcat je razvijen na bazi Apache web servera i sadrzi mnoge od njegovih funkcionalnosti, ali se razlikuje po tome sto je specijaliziran za posluzivanje Java aplikacija. Tomcat takodjer ima svoje vlastite funkcionalnosti, ukljucujuci ugradjenu podrsku za Java Servlet API, JavaServer Pages (JSP), WebSockets i Java Server Faces (JSF).
Serveri za baze podataka - Koriste se za pohranu i upravljanje podacima u bazi podataka, neki od popularnih servera baza podataka (eng. database server) su:
MySQL
PostgreSQL
MariaDB
Microsoft SQL Server
Oracle Database Vise o serverima baza podataka je receno tokom predavavanja u WEEK-9 snimak tog predavanja mozete pogledati na WEEK-9-tier-1-group-2 video session recording.
E-mail serveri - Koriste se za slanje i primanje e-poste.
File serveri - Koriste se za pohranu i dijeljenje fajlova.
FTP serveri - Koriste se za slanje i primanje fajlova preko FTP (File Transfer Protocol)
protokola.
DNS serveri - Koriste se za razrjesavanje domenskih imena u IP adrese.