петак, 26 априла, 2024
Сам свој мајстор

Nginx као посреднички сервер

Аутор: Ромео Млинар

Уколико направите сајт у неком од окружења за развој, имаћете могућност да своју сајт-апликацију поставите на интернет директно, покретањем сервера из окружења за развој, или посредно, тако што ћете апликацију поставити иза неког намјенског HTTP сервера. Како се ово потоње ради помоћу Ngnix сервера показујемо у овом тексту.

За примјер ћемо узети апликацију писану у CherryPy окружењу које има уграђен Python сервер. У конфигурационој датотеци за сајт видимо да је видљив само на рачунару/серверу на којем је покренут (127.0.0.1) и да је доступан на порту 8085. Односно, адреса сајта је 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"

Уколико бисмо у подешавањима навели да сајт слуша захтјеве са свих интерфејса, то би изгледало овако: server.socket_host = ‘0.0.0.0’. Овим би сајт био доступан свима који знају IP или web адресу сервера. Међутим, не желимо да сајт „живи” на www.sajt.com:8085 или сличној адреси. Не желимо ни потенцијалне сигурносне пропусте, излажући сервер интернету преко сервера framework-а. Поред тога, на серверу можда имамо сајтове на портовима 8086 и 8087, те бисмо хтјели да их распоредимо тако да су доступни са поддомена. Како све то извести?

На сервер ћемо инсталирати Nginx, чија је функција HTTP сервер и посреднички (proxy) сервер, а у /etc/nginx/sites-available/sajt.conf ставити оваква подешавања за наш главни сајт:

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; }
}

Видимо да Nginx, након што се покрене, слуша на адреси www.sajt.com. Све захтјеве који стигну прослиједиће на http://localhost:8085, односно нашу апликацију која је доступна само са рачунара на којем је покренута (сервера). Nginx ће апликацији уредно прослиједити и сва заглавља, као што је излистано у подешавањима. Пошто је сајт је доступан на порту 443 користимо SSL и Nginx-у препуштамо комплетну енкрипцију саобраћаја.

Преостало нам је да региструјемо и направимо поддомене за наше сајтове/апликације на портовима 8086 и 8087, и да сачувамо двије нове конфигурацијске датотеке, са овом разликом:

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

Односно:

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

Овим смо три сајта која су на серверу „подигнута у локалу” поставили на интернет. Много познатијем и стабилнијем Ngninx-у препустили смо преусмјеравање саобраћаја и IP заглавља, али и енкрипцију и компресију података. Овим смо повећали сигурност главног сервера и растеретили HTTP сервере апликација у којима су сајтови прављени. Уколико апликација иза сервера пријави грешку, корисници ће видјети само да нешто није у реду, али не и лог апликације који би могао садржати податке за злоупотребу.