1. Home
  2. Cloud a servery
  3. Virtuální server (VPS)
  4. Nginx + Apache na jednom Ubuntu 18.04 LTS serveru

Nginx + Apache na jednom Ubuntu 18.04 LTS serveru

Tento tutoriál nabízí praktický návod, jakým způsobem nainstalovat a nakonfigurovat Nginx jako reverzní proxy před Apache na distribuci Ubuntu 18.04 LTS (Bionic Beaver). Nginx bude současně možné používat jako samostatný webový server pro PHP a jiné aplikace. Součástí tutoriálu je i konfigurace SSL a proxování jen vybraných typů souborů.

Poznámka: Tutoriál je určený pro virtuální server (VPS) od společnosti WebSupport, avšak je aplikovatelný i na jiné prostředí, platformy a poskytovatele s danou distribucí operačního systému.

Nginx i Apache patří mezi nejrozšířenější webové servery. Výhodou těchto dvou technologií je zejména to, že si nemusíte vybírat. Není potřeba vlastnit ani dvě IP adresy, aby každý server běžel na jedné z nich, či dokonce zadávat URL ve tvaru https://example.com:80, či https://example.com:81.

Poznámka: Před většími zásahy do vašeho virtuálního serveru doporučujeme vždy vytvořit snapshot serveru. Obnovou snapshotu je možné vrátit se přesně do stavu, kdy byl snapshot vytvořený.

Než začneme

Poznámka: Na základní instalaci doporučujeme alespoň balík virtuálního serveru V3 – CPU, RAM paměť i SSD disk je samozřejmě možné kdykoliv zvětšit.

Operační systém v tomto případě zvolíme Ubuntu 18.04 LTS (jeho oficiální podpora bude do roku 2023), konfiguraci minimal, tedy bez předinstalovaných balíků (v případě zvolení LAMP nebo LEMP konfigurace je také možné pokračovat).

Vyzkoušet WebSupport VPS zdarma

Jako první krok po vytvoření VPS a přihlášení se přes root účet (nebo s dostatečnými právy) vykonáme update a upgrade balíčků (v případě update-u balíčku, například grub, doporučujeme nechat aktuální nastavení):

apt update && apt upgrade -y

Instalace a konfigurace Apache

Po úspěšném stáhnutí nejnovějších balíčků nainstalujeme a nakonfigurujeme webový server Apache. Instalace je relativně jednoduchá – můžete použít i instalaci z LAMP konfigurace serveru.

Stáhneme důležité balíčky – apache2 a nejnovější verzi PHP:

apt install apache2 php -y

Po nainstalovaní nám Apache web-server spočívá na portu 80. Tento port chceme ponechat pro server Nginx, který bude „stát před ním“. Bude tedy potřeba port změnit na jiný, například 8080 pro nezabezpečenou komunikaci a 8443 pro zabezpečenou. Pro úpravu textových souborů je možné použít různé CLI textové editory, v našem případě nano:

nano /etc/apache2/apache2.conf

Konfigurační soubor upravíme následovně:

Listen 8080
<IfModule ssl_module>
Listen 8443
</IfModule>
<IfModule mod_gnutls.c>
Listen 8443
</IfModule>

Soubor následně uložíme. Jako druhou část je potřeba upravit samotný VirtualHost, aby korektně fungoval na novém portu:

nano /etc/apache2/sites-available/000-default.conf

Upravíme první řádek:

nano /etc/apache2/sites-available/000-default.conf

Upravíme první řádek:

<VirtualHost *:8080>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Pro aktivaci všech vykonaných změn je potřeba službu apache2 restartovat:

/etc/init.d/apache2 restart

Prověřit dostupnost apache2 je možné pomocí portu přímo v URL prohlížeče. U domény s rozšířeným DNS záznamem (v tomto případě example.com) zadáme http://example.com:8080. Pokud naše doména ještě nemá rozšířené DNS záznamy, můžeme použít přímo IP adresu serveru s portem 8080. Přivítat by nás měla základní stránka Ubuntu.

Instalace a konfigurace Nginx

Po úspěšném nakonfigurovaní Apache můžeme nainstalovat server Nginx:

apt install nginx -y

Po nainstalovaní se ujistíme, že se služba nginx zapne i při restartovaní serveru a také, že aktuálně služba běží:

systemctl enable nginx.service
/etc/init.d/nginx restart

V základní instalaci by měl server nginx spočívat na portu 80 a po námi vykonaných změnách by měl server apache2 spočívat na portu 8080. Pro kontrolu těchto nastavení můžeme prověřit aktuálně otevřené porty našeho serveru přes příkaz netstat:

netstat -tlpn

Konfigurace parametrů proxování z Nginx na Apache se nachází v souboru /etc/nginx/proxy_params. Mezi základními parametry najdeme následovné:

proxy_set_header Host $http_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;

Parametre se dají doplnit o mnohé užitečné direktivy. Jejich kompletní seznam je možné najít na adrese nginx.org/en/docs/http/ngx_http_proxy_module.html. Z hlediska našeho nastavení přidáme pod čtyři existující direktivy další čtyři naše:

proxy_buffering on;
proxy_buffer_size 64k;
proxy_buffers 256 8k;
proxy_read_timeout 120;

Parametry se dají specifikovat i přímo v nastavení VirtualHost a pod Nginx serverem.
Následně upravíme výchozí stránku Nginx (/etc/nginx/sites-available/default) a to tak, aby všechny požadavky (requesty) na port 80 byly zaslané (proxované) na server Apache:

server {
     listen 80 default_server;
     index index.html index.htm index.nginx-debian.html;
     server_name example.com www.example.com;
     location / {
       proxy_pass http://localhost:8080;
       include /etc/nginx/proxy_params;
     }
}

Abychom změny aplikovali, je potřeba server Nginx restartovat:

/etc/init.d/nginx restart

Ověřit správné proxování můžeme například pomocí developer nástrojů v prohlížeči. Stačí zadat název domény nebo IP adresu serveru do pole URL (v našem případě 195.210.29.181), přičemž důraz klademe na Response headers – Server:

Zrychlení konfigurace

Jak však snížit odezvu VPS jako web serveru? Jak odlehčit Apache server, aby fungoval rýchleji? Samotným proxováním mezi servery totiž až tak moc nezískáme. Představíme si dva způsoby zrychlení vaší konfigurace.

a) Zpracování SSL zabezpečení už na službě Nginx

Mezi standardy dnešních webů rozhodně patří SSL certifikát a protokol HTTPS. Tyto certifikáty je možné buď koupit, nebo získat jednu z free verzí, například od společnosti Let’s Encrypt. Na VPS vytvoříme složku, ve které budeme držet soubory certifikátů (example.com nahradíme názvem domény) a do této složky vložíme dva soubory – privátní klíč (private.key) a certifikát spojený s certificate chain (certificate.crt):

mkdir -p /etc/ssl/example.com
nano /etc/ssl/example.com/private.key
nano /etc/ssl/example.com/certificate.crt

Následně můžeme upravit soubor VirtualHost pro službu Nginx (/etc/nginx/sites-available/default) tak, aby byl každý nezabezpečený request přes protokol HTTP na port 80 přesměrovaný na zabezpečený protokol HTTPS a port 443 jednoduchým redirectem a následně obsloužený backend serverem Apache:

server {
        listen 80 default_server;
        server_name example.com www.example.com;
        return 301 https://$server_name;
}

server {
        listen 443 default_server;
        ssl on;
        ssl_certificate /etc/ssl/example.com/certificate.crt;
        ssl_certificate_key /etc/ssl/example.com/private.key;
        ssl_protocols SSLv3 TLSv1.1 TLSv1.2;
        location / {
            proxy_pass http://localhost:8080;
            include /etc/nginx/proxy_params;
        }
}

Abychom opět aplikovali vykonané změny, je potřeba server Nginx restartovat:

/etc/init.d/nginx restart

Po zadaní domény do URL nás aktuálně přesměruje Nginx server na HTTPS protokol a obslouží náš request certifikátem navzdory tomu, že požadavek přepošle na backend serveru Apache.

b) Proxování požadavků pouze pro vybrané soubory

Protože je Nginx známý zejména svojí rychlostí, vyplatí se mnoho souborů obsloužit už na této službě a neposílat je na backendový server Apache. Zvolit tedy můžeme pouze proxování .php souborů, zatím co ostatní obsloužíme přímo. Na otestování si vytvoříme soubor s funkcí phpinfo() ve složce s webem /var/www/html/info.php

Po vytvoření stačí upravit direktivy location. Přidáme také direktivu index, kterou definujeme, aby Nginx hledal základní stránku pro zobrazení právě pod souborem index.nginx-debian.html, což nám poslouží na jednodušší vyobrazení rozdílu mezi soubory, které obsluhuje Nginx a které Apache server:

server {
        listen 80 default_server;
        server_name example.com www.example.com;
        return 301 https://$server_name;
}

server {
        listen 443 default_server;
        root /var/www/html;
        ssl on;
        ssl_certificate /etc/ssl/example.com/certificate.crt;
        ssl_certificate_key /etc/ssl/example.com/private.key;
        ssl_protocols SSLv3 TLSv1.1 TLSv1.2;
        location / {
            index index.nginx-debian.html;
        }
        location ~ \.php {
            proxy_pass http://localhost:8080;
            include /etc/nginx/proxy_params;
        }
}

Aktuálně je tedy naše doména example.com přesměrovaná na HTTPS protokol a zobrazí nám základní stránku Nginx. Po zadaní example.com/info.php jsme už proxovaní na Apache server, který zpracuje PHP soubor.

Proxování pouze vybraných souborů má velmi velké využití při zrychlování stránek. V praxi je to například definování statických souborů podle koncovky, které mohou zůstat v paměti cache až 3 měsíce a budou podávané už komprimované pomocí gzip. Nepotřebujeme, aby se zapisovaly do access logu a budeme jim přidávat vlastní hlavičku Cache-Control. Taková konfigurace by vypadala následovně:

server {
        listen 80 default_server;
        server_name example.com www.example.com;
        return 301 https://$server_name;
}

server {
        listen 443 default_server;
        root /var/www/html;
        ssl on;
        ssl_certificate /etc/ssl/example.com/certificate.crt;
        ssl_certificate_key /etc/ssl/example.com/private.key;
        ssl_protocols SSLv3 TLSv1.1 TLSv1.2;
        location ~* .(ico|png|gif|jpg|jpeg|swf|woff|css|js|html)$ {
            access_log off;
            gzip_static on;
            gzip_comp_level 5;
            expires 3M;
            add_header Cache-Control private;
        }
        location / {
            index index.nginx-debian.html;
        }
        location ~ \.php {
            proxy_pass http://localhost:8080;
            include /etc/nginx/proxy_params;
        }
}

Pro nejběžnější použití je ideální ještě definovat tzv. „fallback“ – tedy definovat na Nginx serveru cesty, kde má které soubory hledat a až když se soubory nenajdou, zkusit je proxovat na Apache server. Toto nastavení se nejčastěji používá při CMS WordPress nebo jiných aplikacích, které používají v Apache mod_rewrite. Aktivujeme tedy mod_rewrite:

a2enmod rewrite
systemctl restart apache2

Obohatíme poslední konfiguraci o fallback na Apache server (tímto krokem také zfunkčníme logo na základní stránce Apache – example.com/index.html), a zakážeme přímý přístup k souborům s tečkou (jako například .htaccess.htpasswd:

server {
        listen 80 default_server;
        server_name proxyngap.docolomansky.sk www.proxyngap.docolomansky.sk;
        return 301 https://$server_name;
}

server {
        listen 443 default_server;
        root /var/www/html;
        ssl on;
        ssl_certificate /etc/ssl/example.com/certificate.crt;
        ssl_certificate_key /etc/ssl/example.com/private.key;
        ssl_protocols SSLv3 TLSv1.1 TLSv1.2;
        location ~* .(ico|jpg|png|gif|jpeg|css|swf|js|woff|html)$ {
            access_log off;
            gzip_static on;
            gzip_comp_level 5;
            expires 3M;
            add_header Cache-Control private;
            try_files $uri @proxy;
        }
        location @proxy {
            proxy_pass http://localhost:8080;
        }
        location / {
            index index.nginx-debian.html;
        }
        location ~ \.php {
            proxy_pass http://localhost:8080;
            include /etc/nginx/proxy_params;
        }
        location ~ /\. {
            deny all;
        }
}

Po změně konfigurací je opět potřeba restartovat službu nginx:

/etc/init.d/nginx restart

Další zdroje

Aktualizováno: 12 října, 2021

Byl tento článek užitečný?

Related Articles

Zákaznická podpora
24 hodin denně, 7 dní v týdnu
KONTAKTOVAT PODPORU