Nginx jako reverzní proxy

Máme ve vnitřní síti několik služeb, ke kterým chceme přistupovat z internetu nebo někomu chceme umožnit přístup. Máme koupenou doménu a nechceme zadávat example.com/xyz nebo example.com:63268 pro přístup ke službě běžící na lokální síti.

Jedno z možných řešení je použití Nginx jako reverzní proxy. To nám umožní používat sub domény pro přístup k lokálním službám. Například ke Grafaně zobrazující měření z meteostanice můžeme přistupovat pomocí grafana.example.com.

Na většině linuxových systémů lze jednoduše nainstalovat Nginx. Například na Ubuntu pomocí balíčkovacího systému APT.

sudo apt install nginx

Po úspěšné instalaci bude Nginx naslouchat na portu 80. Když zadáte do prohlížeče adresu stroje na kterém běží, měli byste vidět klasickou Welcome to nginx! stránku.

Konfigurační soubory Nginx se nacházejí v /etc/nginx. Nás budou zajímat dvě složky /etc/nginx/sites-available a /etc/nginx/sites-enabled. sites-available obsahuje konfigurační soubory  a sites-enabled symlinky na soubory v sites-available.  To co je v sites-enabled je to, co je používáno.

Mějme stroj na kterém běží Nginx na 192.168.1.2 a stroj na kterém běží Grafana na 192.168.1.22. Předpokládejme, že jsme Grafanu úspěšně rozeběhli na 192.168.1.22:8080. Náš předpoklad je, že chceme na službu přistupovat přes grafana.example.com.

K tomu budeme muset vytvořit konfigurační soubor v /etc/nginx/sites-available. Jméno toho souboru je libovolné, ale zpravidla se používá název domény.

sudo nano /etc/nginx/sites-available/grafana.example.com

V konfiguračním souboru budeme mít dvě sekce. Jedna pro obsluhu nešifrované komunikace na portu 80 a druhou šifrovanou na portu 443. Předpokládáme, že nechceme nešifrovanou verzi komunikace. V dnešní době je už možné jednoduše získat certifikát, například přes službu LetsEncrypt.

První sekce pro obsluhu požadavku na port 80 řeší pouze přesměrování na port 443.

server {
    listen 80;
    server_name grafana.example.com;
    return 301 https://$host$request_uri;
}

Druhá sekce řeší požadavek na portu 443 a samotné vyřízení požadavku s Grafanou na stroji 192.168.1.22.

server {
    listen 443;

    server_name grafana.example.com;

    ssl on;
    ssl_certificate /etc/nginx/ssl/example.com.cert;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    location / {
        proxy_pass http://192.168.1.22:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Protože se jedná o šifrovanou komunikaci přes HTTPS protokol je nutné přidat cesty k certifikátům.

Kompletní soubor by mohl vypadat nějak takto.

server {
    listen 80;
    server_name grafana.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443;

    server_name grafana.example.com;

    ssl on;
    ssl_certificate /etc/nginx/ssl/example.com.cert;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    location / {
        proxy_pass http://192.168.1.22:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Poté co máme konfiguraci uloženou v sites-available potřebujeme udělat symlink do adresáře sites-enabled. Tím konfiguraci aktivujeme a po restartu ji Nginx bude brát v potaz.

sudo ln -s /etc/nginx/sites-available/grafana.example.com /etc/nginx/sites-enabled/

Předtím než restartujeme Nginx je dobré nechat Nginx zkontrolovat jestli je konfigurace OK.

nginx -t

Pokud je vše v pořádku stačí Nginx restartovat.

sudo systemctl restart nginx

Od této chvíle Nginx na 192.168.1.2 přijímá požadavky a pokud dojde požadavek na grafana.example.com, začne komunikovat s Grafanou na 192.168.1.22:8080.


Pokud to rozjíždíte doma, tak se s pravděpodobně nacházíte za domácím routerem. (pravděpodobnost hraničící s jistotou 🙂 ) Tam je nutné přesměrovat porty 80 a 443 na stroj s Nginx. A další nutná věc je samozřejmě veřejná IP. Bez té to bude docela naprd. 🙂

Loading