Tento tutoriál ukazuje, jak můžete nastavit nginx jako reverzní proxy před webovým serverem Apache2 na Ubuntu 16.04. nginx (vyslovováno jako "engine x") je bezplatný, open-source, vysoce výkonný HTTP server. nginx je známý svou stabilitou, bohatou sadou funkcí, jednoduchou konfigurací a nízkou spotřebou zdrojů.
1 předběžná poznámka
V tomto tutoriálu používám název hostitele server1.example.com s IP adresou 192.168.1.100. Tato nastavení se pro vás mohou lišit, takže je v případě potřeby musíte nahradit.
Předpokládám, že máte existující Apache vhost (v tomto tutoriálu použiji výchozí vhost Apache), který naslouchá na portu 80 na IP adrese 192.168.1.100, kterou chcete proxy přes nginx. Jako základ použiji výukový program Ubuntu LAMP. Upozorňujeme, že tento výukový program pokrývá pouze http, nikoli https (SSL).
2 Konfigurace Apache
První věc, kterou musíme udělat, je nakonfigurovat náš Apache vhost, aby naslouchal na localhost (127.0.0.1) na nepoužívaném portu jiném než 80 (např. 8000). Otevřete /etc/apache2/ports.conf...
nano /etc/apache2/ports.conf
... a upravit řádky NameVirtualHost a Listen pro port 80 tak, aby používal port 8000:
# Pokud pouze změníte port nebo zde přidáte další porty, budete pravděpodobně muset také
# změnit příkaz VirtualHost v
# /etc/apache2/sites-enabled/000-default. conf
Poslouchejte 8000
Poslouchejte 443
Poslouchejte 443
Dále otevřete konfigurační soubor vhost (např. /etc/apache2/sites-available/000-default.conf)...
nano /etc/apache2/sites-available/000-default.conf
... a změňte řádek
[...]
Nakonfigurujeme nginx jako transparentní proxy, to znamená, že předá IP adresu původního uživatele v poli X-Forwarded-For backendovému Apache. Samozřejmě by měl backend Apache zaznamenávat IP adresu původního uživatele do svých přístupových protokolů namísto IP adresy nginx (127.0.0.1). Existují dva způsoby, jak toho dosáhnout:
1) Můžeme upravit řádek LogFormat v /etc/apache2/apache2.conf a nahradit %h za %{X-Forwarded-For}i:
nano /etc/apache2/apache2.conf
[...]#LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" " combinedLogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" kombinované [...]
2) Na Debian/Ubuntu můžeme nainstalovat modul Apache libapache2-mod-rpaf, který se stará o protokolování správné IP adresy:
apt-get -y install libapache2-mod-rpaf
Po všech těchto změnách restartujte Apache:
restart služby apache2
3 Konfigurace nginx
Pokud nginx ještě není nainstalován, nainstalujte jej následovně:
apt-get -y install nginx
Vytvořte jeho odkazy pro spuštění systému a ujistěte se, že je spuštěn:
systemctl povolí nginx.service
restart služby nginx
Nyní by měl naslouchat na portu 80.
Některé standardní parametry proxy jsou v souboru /etc/nginx/proxy_params:
nano /etc/nginx/proxy_params
hostitel proxy_set_header $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-Preto $scheme; >Protože tento soubor zahrneme později do proxy části našeho nginx vhost for example.com, možná budete chtít do tohoto souboru přidat další proxy direktivy, pokud chcete, např. takto:
hostitel proxy_set_header $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-Clize_0_0body $scheme; client_body_buffer_size 1m;proxy_intercept_errors on;proxy_buffering on;proxy_buffer_size 128k;proxy_buffers 256 16k;proxy_busy_buffers_size 256k;proxy_temp_file_write_size>premax_file_write_size 256k;Nyní upravte výchozí vhost pro nginx – ujistěte se, že používá stejný kořen dokumentu jako Apache vhost for example.com (např. /var/www/html), aby nginx mohl doručovat statické soubory přímo bez předání požadavku Apache:
nano /etc/nginx/sites-available/defaultserver {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Přidejte index.php do seznamu, pokud používáte PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
umístění / {
proxy_pass http://localhost:8000;
zahrnují /etc/nginx/proxy_params;
}
}Toto je velmi jednoduchá konfigurace, která by proxy všechny požadavky na Apache.
Znovu načtěte nginx, aby se změny projevily:
znovu načtení služby nginxNyní můžete do prohlížeče zadat název hostitele serveru nebo IP 192.168.1.100 a měli byste vidět výchozí webovou stránku Apache, ale tentokrát poskytovanou prostřednictvím nginx.
Jak jsem již řekl, jedná se o velmi jednoduchou konfiguraci, která proxy posílá všechny požadavky do Apache. Ale protože nginx mnohem rychleji dodává statické soubory (jako jsou JavaScript, CSS, obrázky, soubory PDF, statické soubory HTML atd.) než Apache, je dobré nechat nginx tyto soubory obsluhovat přímo. To lze provést přidáním nového umístění pro tyto soubory, např. takto:
server { listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Přidat index. php do seznamu, pokud používáte PHP
index index.html index.htm index.nginx-debian.html;
název_serveru _;
umístění / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} umístění ~* \.(js|css|jpg|jpeg|gif|png|svg| ico|pdf|html|htm)$ { }}Znovu načíst nginx:
znovu načtení služby nginxPro tyto soubory můžete dokonce nastavit hlavičku Expires HTTP, aby prohlížeče tyto soubory ukládaly do mezipaměti (další podrobnosti najdete v části Ukládání statických souborů do mezipaměti prohlížečů na nginx):
server { listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Přidat index. php do seznamu, pokud používáte PHP
index index.html index.htm index.nginx-debian.html;
název_serveru _;
umístění / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} umístění ~* \.(js|css|jpg|jpeg|gif|png|svg| ico|pdf|html|htm)$ { vyprší 30d; }}Nyní můžeme toto nastavení posunout o krok dále tím, že necháme nginx obsluhovat tolik požadavků, kolik dokáže splnit, a pouze předávat zbývající požadavky plus soubory PHP do Apache:
server { listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Přidat index. php do seznamu, pokud používáte PHP
index index.html index.htm index.nginx-debian.html;
název_serveru _;
umístění / {
proxy_pass http://localhost:8000;
include /etc/nginx/proxy_params;
} umístění ~* \.(js|css|jpg|jpeg|gif|png|svg| ico|pdf|html|htm)$ { vyprší 30d; } umístění @proxy { proxy_pass http://127.0.0.1:8000; zahrnout /etc/nginx/proxy_params; } umístění ~* \.php$ { proxy_pass http://127.0.0.1:8000; zahrnout /etc/nginx/proxy_params; }}Znovu načíst nginx:
znovu načtení služby nginxToto nastavení můžete samozřejmě ještě více vyladit, například pomocí nginx proxy_cache (pokud to vaše aplikace umožňuje – musíte se například ujistit, že se captcha nebo nákupní košíky neukládají do mezipaměti a že přihlášení uživatelé vždy získejte novou kopii stránky) nebo pokud má vaše aplikace úplnou mezipaměť stránky - nginx by v takovém případě mohl přistupovat k mezipaměti celé stránky přímo (příklad najdete v tomto tutoriálu:Jak zrychlit Drupal 7.7 pomocí Boost And nginx (Debian Squeeze)).
4 odkazy
- nginx:http://nginx.net/
- Apache:http://httpd.apache.org/
- Ubuntu:http://www.ubuntu.com/