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
- How to install nginx as a Reverse Proxy for Apache on Ubuntu 16.04
- Apache and Nginx Together
- How to configure Nginx as a reverse proxy for Apache on Debian and Ubuntu
- How To Configure Nginx as a Web Server and Reverse Proxy for Apache on One Ubuntu 18.04 Server
- How To Configure Nginx as a Reverse Proxy for Apache
- Apache vs Nginx: Practical Considerations
- How to do an Nginx redirect
- Ubuntu Releases