Last Updated on 28/10/2024 by administrator
Nginx – Konfigurace Reverzní Proxy (NGINX Reverse Proxy)
Nginx – Konfigurace Reverzní Proxy (NGINX Reverse Proxy)
Motivace:
Nginx lze nakonfigurovat tak, aby fungoval jako reverzní server. Reverzní proxy (reverse proxy) je server, který přijímá požadavky od klientů (např. webových prohlížečů) a přeposílá je na backendový server (např. webový server nebo aplikaci). Nginx je populární webový server a reverzní proxy server.
Návod ukazuje tak nakonfigurovat Reverzní proxy pro dva webové servery a následně pro ně získat SSL certifikát.
Ačkoliv je mnoho účelu proč použít reverzní proxy, hlavní motivací bylo mít více webových serveru pod jednou veřejnou IP adresou.
OS:
Implementace byla prováděna na Ubuntu 22.04 LTS. Nicméně návod bude pravděpodobně aplikovatelný na nižší verze Ubuntu.
Topologie sítě:
Princip funkce:
Mějme dva webové servery (tzn. backend servery) pod IP adresama 192.168.0.150 a 192.168.0.151. Ty jsou schované za Nginx reverzní proxy pod IP adresou 192.168.0.120.
Klient (například webový prohlížeč) zadá webovou adresu mujweb1.mooo.com do svého prohlížeče a odešle HTTPS požadavek na tuto adresu. Doménové jméno mujweb1.mooo.com je je přeloženo na nějakém DNS serveru na IP adresu 7.47.97.41. Požadavek od klienta nejprve dorazí k routeru, který přeloží IP adresu 7.47.97.41 na 192.168.0.120 a tímto požadavek dorazí na Nginx reverse proxy. Nginx reverse proxy analyzuje příchozí HTTPS požadavek od klienta. Podle své konfigurace rozhodne, na který backend server přesměrovat požadavek. V tomto případě požadavek na mujweb1.mooo.com přesměruje na IP adresu 192.168.0.150.
Implementace [1]:
Veškterá implemetace se provádí na Nginx reverzním proxy serveru (192.168.0.120).
apt install nginx -y
Pokud je nakonfigurovaný firewall (lze zjistit příkazem sudo ufw status), je nutné povolit provoz TCP/443 a TCP/80:
sudo ufw allow 443/tcp sudo ufw allow 80/tcp
Konfigurace Virtualhosta pro doménu mujweb1.mooo.com:
Vytvořit soubor s názvem mujweb1.mooo.com:
vi /etc/nginx/sites-available/mujweb1.mooo.com
a vložit do něj tento konfigurační blok níže:
server { listen 80; server_name mujweb1.mooo.com; location / { proxy_pass http://192.168.0.150; 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; } }
Legenda:
- listen 80; – Nginx naslouchá na portu 80, který je obvyklým portem pro HTTP.
- server_name your_domain.com; – Definuje doménu pro tento virtuálního host.
- location / { … }: Konfigurace pro lokalitu, ve které se nastavuje reverzní proxy.
- proxy_pass http://192.168.0.151; – Nastavuje IP adresu a port backendového serveru (jeho reálnou IP adresu), na který budou směrovány požadavky.
- proxy_set_header: – Nastavuje některé HTTP hlavičky pro předání informací z původního požadavku na backendový server.
Pozn. Pokud backend server běží pod HTTPS, stačí upravit proxy_pass na https://192.168.0.151
Vytvořit symbolický link mezi konfiguračním souborem pro virtuálního hosta /etc/nginx/sites-available/mujweb1.mooo.com a adresářem /etc/nginx/sites-enabled/, který Nginx načítá pro aktivní virtuální hosty:
sudo ln -s /etc/nginx/sites-available/mujweb1.mooo.com /etc/nginx/sites-enabled/
Konfigurace Virtualhosta pro doménu mujweb2.mooo.com:
Vytvořit soubor s názvem mujweb2.mooo.com:
vi /etc/nginx/sites-available/mujweb2.mooo.com
a vložit do něj tento konfigurační blok níže:
server { listen 80; server_name mujweb2.mooo.com; location / { proxy_pass http://192.168.0.151; 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; } }
Vytvořit symbolický link mezi konfiguračním souborem pro virtuálního hosta /etc/nginx/sites-available/mujweb2.mooo.com a adresářem /etc/nginx/sites-enabled/, který Nginx načítá pro aktivní virtuální hosty:
sudo ln -s /etc/nginx/sites-available/mujweb2.mooo.com /etc/nginx/sites-enabled/
Pro zkontrolování Nginx syntaxe použít:
sudo nginx -t
Provést restart služby Nginx:
sudo systemctl reload nginx
Ověření funkčnosti:
Pokud ještě nejsou doménová jména mujweb1.mooo.com a mujweb2.mooo.com namapována na veřejných DNS serverech, lze si ověřit funkčnost pomocí přidáním záznamu do hosts file souboru, počítače přistupující k webovému serveru. U Windowsu se hosts file nachází v lokaci C:\Windows\System32\drivers\etc\hosts a u linuxových distribucí v /etc/hosts.
Následně je možné odzkoušet v prohlížeči http://mujweb1.mooo.com a http://mujweb2.mooo.com
Při problémech doporučuji vymazat cache prohlížeče.
Zabezpečení serverů pomocí SSL:
Pro zabezpečení webových serverů (pro každé doménové jméno) je možné získat certifikát zdarma na 3 měsíce. Vše se opět konfiguruje na Nginx reverzním proxy serveru (192.168.0.120).
V tomto článku je uvedeno jak nainstalovat Certbota na Nginx server.
Ověření certifikátů doménových jmen:
Pro mujweb1.mooo.com:
Při problémech doporučuji vymazat cache prohlížeče.
Zvýšení zabezpečení – Security headers
Nasazením hlaviček lze nastavit bezpečnostní pravidla mezi webovým prohlížečem a serverem a lze ochránit nejen web před různými typy útoků, ale také návštěvníky, na které můžou být útoky vedeny. Je to novější způsob aktivní ochrany webu a aplikací a podporují je všechny moderní webové prohlížeče, zatímco starší prohlížeče by je měly ignorovat.
Vše se opět konfiguruje na Nginx reverzním proxy serveru (192.168.0.120).
V tomto článku je uvedeno jak bezpečnostní hlavičky nasadit na Nginx server
Your .htaccess file does not contain all recommended security headers
Zdroj:
[1] https://blog.knoldus.com/nginx-understanding-and-setting-up-a-reverse-proxy-server/
[2] ChatGPT