WEDOS Cloud – Webserver NGINX s vysokou dostupností

  WEDOS Cloud

V předchozím návodu jsme vytvořili na platformě WEDOS Cloud dvě VPS fungující jako routery. Ty umožňují ostatním VPS připojeným do interní sítě využít sdílenou adresu routerů, a tak při výpadku jednoho z routerů nadále poskytovat soubory bez výpadku.

Pro vytvoření webserverů využijeme Nginx, který dokáže fungovat zároveň jako tradiční webserver a také jako load balancer. Primární funkce Load balanceru je přeposílání webových požadavků webserverům.

Je několik módů, podle kterých může load balancer vybrat webserver, na který se požadavek přepošle. Mezi nejčastěji využívané patří round_robin (výchozí), který odesílá požadavky v poměru 1:1 mezi všechny dostupné webservery. V režimu ip_hash se požadavky z jedné IP adresy vždy odesílají na jeden webserver. Tento režim je primárně využíván pro aplikace, které nejsou přizpůsobené k provozu na více serverech. Pokud by se každý požadavek odeslal na jiný webserver, tak by mohla stránka uživatele odhlásit, jelikož by data uživatele byla uložena na jiném serveru.

Vytvoření VPS a NAT

Začneme vytvořením dvou VPS, které budou sloužit jako webservery poskytující obsah samotného webu. Vytvořené VPS je potřeba připojit do interní sítě s názvem ve tvaru ocXXXX-private. Ve výchozím nastavení je této síti přiřazen rozsah IP adres 192.168.1.1 – 192.168.1.254. První 3 adresy jsou již využité pro routery s tím, že adresa 192.168.1.1 je mezi routery sdílená.

Pro každý z VPS nastavíme statickou adresu. V tomto případě vybereme například adresy 192.168.1.10 a 192.168.1.11. Nastavení statické adresy nalezneme po rozkliknutí vytvořené VPS, zvolení sekce Network a zobrazení pokročilých možností.

Operační systém webserverů můžete zvolit libovolný. Zvolte nejlépe ten, se kterým máte nejvíce zkušeností. V tomto návodu bude využit systém Debian 10. V případě využití jiného systému se některé příkazy mohou lišit.

Abychom se mohli na nově vytvořené VPS připojit pomocí SSH, je potřeba na routerech přidat NAT pravidlo, které přesměruje požadavky o připojení na daný webserver. Na obou routerech spustíme následující příkazy.

iptables -t nat -A PREROUTING -p tcp --dport 1111 -i eth0 -j DNAT --to 192.168.1.10:22
iptables -t nat -A PREROUTING -p tcp --dport 2222 -i eth0 -j DNAT --to 192.168.1.11:22

Po spuštění těchto příkazů bude SSH prvního serveru dostupné na {sdílená adresa routerů}:1111 a druhého na {sdílená adresa routerů}:2222

Instalace a konfigurace webserveru

Následující postup aplikujeme na oba webservery. Nejdříve systém aktualizujeme.

apt update && apt upgrade -y

Po dokončení aktualizace nainstalujeme balíček nginx.

apt install nginx -y

Ve výchozím nastavení nginx je možné využít pouze statické stránky umístěné ve složce /var/www/html/ (bez PHP). Pro instalaci PHP verze 7.3 je potřeba spustit následující příkaz.

apt install php7.3-fpm -y

Jakmile se instalace dokončí, je potřeba upravit nastavení nginx, aby všechny soubory s koncovkou .php zpracoval jako script. Jako první je potřeba upravit soubor /etc/nginx/fastcgi_params. Na konec souboru přidáme následující řádek.

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Následně vymažeme obsah souboru /etc/nginx/sites-enabled/default a nahradíme jej následujícím.

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.php index.html index.htm;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;

                fastcgi_pass unix:/run/php/php7.3-fpm.sock;
        }
}

Jakmile úpravy dokončíme, je potřeba nginx restartovat pomocí příkazu

service nginx restart

Nastavení webserveru je kompletní. Webservery jsou připravené pro nahrání webových stránek, ale zatím nejsou dostupné z internetu, jelikož jsou umístěny za routery, které provoz z internetu blokují. To změníme v následující části.

Instalace load balanceru

Abychom zajistili dostupnost webserverů z internetu, je potřeba na routery nainstalovat load balancer, který bude požadavky přeposílat na webservery. Existuje několik různých load balancerů. Například HAProxy, Traefik nebo Nginx, který využijeme v tomto návodu.

Jelikož je na routerech nainstalovaný systém Alpine Linux, budou se některé příkazy lišit od těch pro Debian.

Nejdříve aktualizujeme seznam balíčků a nainstalujeme nginx pomocí následujícího příkazu.

apk update && apk add nginx

V Alpine Linux není ve výchozí instalaci zabalen program nano pro úpravu souborů. Je možné místo něj využít program vi. Nano je případně možné doinstalovat příkazem apk add nano.

Vymažeme obsah konfiguračního souboru /etc/nginx/conf.d/default.conf a nahradíme jej následujícím:

upstream cluster {                                                             
        server 192.168.1.10;             
        server 192.168.1.11;          
}                                     
                                      
server {                                    
        listen 80 default_server;                       
        listen [::]:80 default_server;                      
                                                             
        location / {                                        
                proxy_set_header Host $host;                
                proxy_set_header X-Real-IP $remote_addr;    
                proxy_pass http://cluster;                  
        }                     
}

Sekce upstream definuje seznam serverů, na které se budou požadavky přeposílat. Pokud jsme pro webservery zvolili jiné adresy než 192.168.1.10 a 192.168.1.11, je potřeba konfigurační soubor upravit.

Po úpravě konfigurace je potřeba nginx restartovat pomocí následujícího příkazu.

rc-service nginx restart

Aby se nginx spustil i po restartu routeru je potřeba spustit příkaz:

rc-update add nginx default

Pokud jsme vše udělali správně, měli bychom po zadání sdílené adresy mezi routery vidět výchozí stránku, se kterou je nginx dodáván. Tuto stránku je možné upravit přepsáním souborů ve složce /var/www/html/