A Reverse Proxy akkor lehet hasznos számodra, ha van legalább 1 szervered, és azon több weboldalt szeretnél futtatni, különböző domain vagy aldomainekről.

Példa:
Van több webszervered, szolgáltatásod amit elszeretnél érni távolról. Ezek virtualizálva vannak (Docker, Hyper-V, stb...), vagy más-más vason helyezkednek el. Összesen 1 db 80-as és 443-as portot tudsz csak kiengedni a tűzfalon, tehát csak az egyik szolgáltatásod lesz elérhető az alapértelmezett porton, a többihez más portot kell írnod, hogy eltud érni.
Ha beüzemelsz egy reverse proxyt és az ő 80-as és 443-as portját engeded, ki és beállítod a többi szerver IP címét, és portját, akkor az összes szolgáltatásod elérhető lesz az alapértelmezett portokon, és csak 2 portot kell kiengedned a tűzfalon. Ha külön-külön vason vannak a szerverek akkor csak az IP-t kell beállítani, viszont ha ugyan azon a vason van mint a Reverse Proxy, akkor természetesen módosítani kell a szolgáltatások portját.

Példa konfiguráció:

Szeretnék távolról elérni a weboldalunkat, a valami.hu és a valamimas.hu docker konténerben futnak a következő portokon: 8830, 8831 a masik.valami.hu pedig egy dedikált szerveren fut a 80-as porton.

Nginx telepítése és konfigurálása

apt install nginx -y

Miután sikeresen feltelepítettük a webszervert hozzuk létre a következő konfigurációs fájlokat a /etc/nginx/sites-available/ könyvtár alatt:
- valami.hu
- masik.valami.hu
- valamimas.hu
Érdemes beszédes konfigurációs fájlokat létrehozni, hogy könnyedén megtudjuk állapítani, hogy az adott fájlban melyik webszerverünk beállításai találhatóak meg.

Nyissuk meg egy szövegszerkesztővel a valami.hu-fájt:

vi /etc/nginx/sites-available/valami.hu

Illesszük be a következő sorokat:

Ha vi szövegszerkesztőt használunk, akkor először nyomjuk meg az I billentyűzetet, hogy tudjuk a fájlba írni.
Mentéshez nyomjuk meg az Esc billentyűzetet, majd gépeljük be, hogy :w
Kilépés: Esc majd :q
Mentés és kilépés Esc majd :wq
Kilépés mentés nélkül: Esc majd :q!
server {
    listen 80;
    server_name valami.hu, www.valami.hu;
    root /var/www/html;

    location /.well-known/ {
        root /var/www/html/;
    }
    
    location / {
        return 301 https://valami.hu$request_uri;
    }
}

Beállítottuk a valami.hu és a www.valami.hu webes elérést is. A Let's Encrypt-nek beállítottuk, hogy a /var/www/html/.well-known mappában keresse a hitelesítéshez szükséges fájlokat, majd minden más beérkező kérést a https://valami.hu-ra irányítottunk. Tehát ha valaki a www-ről érkezik, automatikusan át lesz irányítva a www nélküli címre. Ha jobban preferálod a www-s címet, egyszerűen csak írd elé a www.-ot. Ha pedig nem szeretnéd beállítani a www-s címet, egyszerűen a server_name második www-s értékét hagyd el.

A másik két webszerver fájlja is ugyan így fog kinézni, annyi különbséggel, hogy fent más lesz a server_name, alul pedig máshova kell irányítani, tehát másoljuk le a most létrehozott fájt és mentsük el masik.valami.hu és valamimas.hu néven.

cp /etc/nginx/sites-available/valami.hu /etc/nginx/sites-available/masik.valami.hu
cp /etc/nginx/sites-available/valami.hu /etc/nginx/sites-available/valamimas.hu

Nyissuk meg a fájlokat és írjuk át a server_name-et és lentebb a valami.hu-t masik.valami.hu-ra és valamimas.hu-ra

Engedélyezzük a weboldalakat, ellenőrizzük, hogy a konfigurációs fájlok nem hibások, majd indítsuk újra a webszervert:

# Engedélyezés:
ln -s /etc/nginx/sites-available/valami.hu /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/masik.valami.hu /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/valamimas.hu /etc/nginx/sites-enabled/
# Tesztelés:
nginx -t
# Ha nincs hiba, inditsuk újra a webszerver
systemctl reload nginx
Ha nincs hiba az nginx -t parancsra a következőt fogjuk visszakapni:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Let's Encrypt telepítése és tanúsítvány igénylés

apt install certbot -y

Telepítés után igényeljünk tanúsítványokat a weboldalaknak.

certbot certonly --authenticator webroot -w /var/www/html -d valami.hu -d www.valami.hu
certbot certonly --authenticator webroot -w /var/www/html -d masik.valami.hu -d www.masik.valami.hu
certbot certonly --authenticator webroot -w /var/www/html -d valamimas.hu -d www.valamimas.hu

Nginx SSL és Reverse Proxy beállítása

Miután sikeresen elkészültek az SSL tanúsítványaink nyissuk meg újra a webszerver konfigurációs fájlt:

vi /etc/nginx/sites-available/valami.hu

Majd illesszük be a következő sorokat a fájl végébe.
A Let's Encrypt a /etc/letsencrypt/live/DomainNév/ mappában tárolja a domainhoz tartozó tanúsítványt.

server {
    listen 443 ssl;
    server_name valami.hu;

    ssl_certificate /etc/letsencrypt/live/valami.hu/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/valami.hu/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8830;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
    }
}

server {
    listen 443 ssl;
    server_name www.valami.hu;

    ssl_certificate /etc/letsencrypt/live/valami.hu/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/valami.hu/privkey.pem;
    
    location / {
        return 301 https://valami.hu$request_uri;
    }
}

Beállításra került az SSL és a Reverse Proxy is. A fenti példa alapján ugyan ezen a gépen van telepítve a docker amiben konténerben fut két webszerver a valami.hu és a valamimas.hu, ezért a proxy_pass-hoz a localhostot, vagyis a 127.0.0.1-et adtam meg. A masik.valami.hu esetén pedig a belső hálózat IP címét kell írni és a 80-as portot, mert egy másik szerveren fut pl.: 192.168.1.210:80
Mivel korábban azt állítottuk, be hogy a www nélküli címre legyen irányítva minden forgalom, itt is meg kell tenni, de vigyázzunk, nem lehet 1 server_name alatt a www-s és a www nélküli cím, mert végtelen átirányításba fog kerülni az oldalunk ami miatt elérhetetlen lesz.

Adjuk hozzá ezeket a sorokat, a másik két webszerverhez is, majd teszteljük az nginx -t paranccsal, hogy nincs benne hiba, majd indítsuk újra a webszervert a systemctl reload nginx paranccsal.

Végezetül a valami.hu végleges konfigurációs fájlja így nézz ki:

server {
    listen 80;
    server_name valami.hu www.valami.hu;
    root /var/www/html;

    location /.well-known/ {
        root /var/www/html/;
    }

    location / {
        return 301 https://valami.hu$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name valami.hu;

    ssl_certificate /etc/letsencrypt/live/valami.hu/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/valami.hu/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8830;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
    }
}

server {
    listen 443 ssl;
    server_name www.valami.hu;

    ssl_certificate /etc/letsencrypt/live/valami.hu/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/valami.hu/privkey.pem;

    location / {
        return 301 https://valami.hu$request_uri;
    }
}

SSL Tanúsítvány automatikus megújítása

A Let's Encrypt tanúsítványok 90 napig érvényesek, ezért mindig meg kell újítani. Adjuk hozzá a megújító parancsot a crontab-hoz, amit minden nap 0:30-kor lefuttat és a lejáró tanúsítványokat automatikusan megújítja.

crontab -e

Adjuk a következő sort a fájl végéhez:

30 0 * * * certbot renew

Hiba megoldás a következőre: Túl nagy a fájlméret! Nem tudok fájt feltölteni!

Bizonyos esetekben előfordulhat, hogy fájlt kell feltöteni, de közli a rendszer velünk, hogy túl nagy a fájlméret. Ezt úgy tudjuk megoldani, hogy hozzáadjuk Az SSL-es verzióhoz a client_max_body_size beállítást és megadjuk, hogy mekkora a maximális megengedett feltölthető fájlméret (pl.: client_max_body_size 64M;)

A konfigurációs fájlban ez a beállítás pedig valahogy így nézz ki:

...
server {
    listen 443 ssl;
    server_name valami.hu;

    ssl_certificate /etc/letsencrypt/live/valami.hu/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/valami.hu/privkey.pem;

    client_max_body_size 64M;

    location / {
        proxy_pass http://127.0.0.1:8830;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect off;
    }
}
...

A beállítás után ne felejtsük el, újraindítani a nginx szervert!

systemctl reload nginx