četvrtak, 26 decembra, 2024
Sam svoj majstor

Nginx kao posrednički server

Autor: Romeo Mlinar

Ukoliko napravite sajt u nekom od okruženja za razvoj, imaćete mogućnost da svoju sajt-aplikaciju postavite na internet direktno, pokretanjem servera iz okruženja za razvoj, ili posredno, tako što ćete aplikaciju postaviti iza nekog namjenskog HTTP servera. Kako se ovo potonje radi pomoću Ngnix servera pokazujemo u ovom tekstu.

Za primjer ćemo uzeti aplikaciju pisanu u CherryPy okruženju koje ima ugrađen Python server. U konfiguracionoj datoteci za sajt vidimo da je vidljiv samo na računaru/serveru na kojem je pokrenut (127.0.0.1) i da je dostupan na portu 8085. Odnosno, adresa sajta je http://127.0.0.1:8080.

[global] server.socket_port = 8085 server.socket_host = '127.0.0.1' tools.proxy.on: True log.access_file = "/home/projekat/sajt_access.log" log.error_file = "/home/projekat/sajt_errors.log"

Ukoliko bismo u podešavanjima naveli da sajt sluša zahtjeve sa svih interfejsa, to bi izgledalo ovako: server.socket_host = ‘0.0.0.0’. Ovim bi sajt bio dostupan svima koji znaju IP ili web adresu servera. Međutim, ne želimo da sajt „živi” na www.sajt.com:8085 ili sličnoj adresi. Ne želimo ni potencijalne sigurnosne propuste, izlažući server internetu preko servera framework-a. Pored toga, na serveru možda imamo sajtove na portovima 8086 i 8087, te bismo htjeli da ih rasporedimo tako da su dostupni sa poddomena. Kako sve to izvesti?

Na server ćemo instalirati Nginx, čija je funkcija HTTP server i posrednički (proxy) server, a u /etc/nginx/sites-available/sajt.conf staviti ovakva podešavanja za naš glavni sajt:

server { listen 443; server_name www.sajt.com; access_log /var/log/nginx/sajt-access.log; ssl on; ssl_certificate /etc/nginx/keys/sajt.crt; ssl_certificate_key /etc/nginx/keys/sajt.key; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Host $host; proxy_pass http://localhost:8085; } #!!! IMPORTANT !!! We need to hide the password file from prying eyes # This will deny access to any hidden file (beginning with a .period) location ~ /\. { deny  all; } }

Vidimo da Nginx, nakon što se pokrene, sluša na adresi www.sajt.com. Sve zahtjeve koji stignu proslijediće na http://localhost:8085, odnosno našu aplikaciju koja je dostupna samo sa računara na kojem je pokrenuta (servera). Nginx će aplikaciji uredno proslijediti i sva zaglavlja, kao što je izlistano u podešavanjima. Pošto je sajt je dostupan na portu 443 koristimo SSL i Nginx-u prepuštamo kompletnu enkripciju saobraćaja.

Preostalo nam je da registrujemo i napravimo poddomene za naše sajtove/aplikacije na portovima 8086 i 8087, i da sačuvamo dvije nove konfiguracijske datoteke, sa ovom razlikom:

server_name domen1.sajt.com; proxy_pass http://localhost:8086;

Odnosno:

server_name domen2.sajt.com; proxy_pass http://localhost:8087;

Ovim smo tri sajta koja su na serveru „podignuta u lokalu” postavili na internet. Mnogo poznatijem i stabilnijem Ngninx-u prepustili smo preusmjeravanje saobraćaja i IP zaglavlja, ali i enkripciju i kompresiju podataka. Ovim smo povećali sigurnost glavnog servera i rasteretili HTTP servere aplikacija u kojima su sajtovi pravljeni. Ukoliko aplikacija iza servera prijavi grešku, korisnici će vidjeti samo da nešto nije u redu, ali ne i log aplikacije koji bi mogao sadržati podatke za zloupotrebu.