Serwer WWW w oparciu o NGINX

# Instalacja
pakiety do wyboru:
nginx-core <- tylko niezbędne funkcje, najbardziej ograniczona wersja serwera
nginx-full <- wszystkie opcje dostępne są aktywne
nginx-extras <- dodatkowe moduły, tworzone przez community, rozbudowują możliwość nginxa [zalecane]

# Sprawdzenie czy działa
netstat -plnt
p – wyświetl nazwę programu
l – listen, czyli nasłuchujące
n – bez rozwijania nazw, same adresy IP
t – TCP
u – UDP

curl http://localhost – powinno zwrócić stronę HTML nginxa

# Wirtualne hosty
/etc/nginx/sites-available_enabled – rozwiązanie identyczne jak w przypadku Apache

W przypadku systemów z rodziny RHEL pliki dodajemy do katalogu conf.d, bez konieczności tworzenia żadnych symlinków. Składnia pliku identyczna. Rozszerzenie plików .conf. Warto pamiętać o SELinux.

Przeanalizujmy plik default w katalogu sites-available
listen 80 default_server – nasłuch na porcie 80, jeżeli nie wie co uruchomić to potraktuj ten wpis jako default server (nie ma skonfigurowanego hosta dla domeny)
listen [::]:80 default_server – nasłuchuj na porcie 80 na wszystkich dostępnych adresach IPv6
root /var/www/html – lokalizacja katalogu plików strony
index index.html index.htm index.nginx-debian.html – kolejność plików index; który plik ma być głównym indexem; będzie szukał ich po kolei
server_name _ – domena serwera, _ oznacza, że wszystkie domeny są akceptowane; serwer umożliwia do jednego wirtualnego hosta podpięcie kilku domen, wystarczy oddzielić je spacjami (np. server_name sub1.domena.local sub2.domena.local;)
location / {} – otworzenie strony głównej serwera i zachowanie
try_files $uri $uri/ =404 – otwórz pliki, które zostaną podane jako parametr; jeżeli mu się nie uda odnaleźć pliku to otworzy katalog o nazwie podanej jako parametr; jeżeli się nie uda wyświetli błąd 404
access_log /var/log/nginx/host.access.log; – obsługa błędów identycznie jak w przypadku Apache
error_log /var/log/nginx/host.error.log;

Kolejny wirtualny host tworzymy w oddzielnym pliku (np. kopii pliku default). Podmieniamy tam rekord listen usuwając default_server (bo może być tylko jeden), zmieniamy lokalizację katalogu root oraz podajemy domenę dla tego hosta.

# Uruchomienie dodanego wirtualnego hosta
W katalogu sites-enabled tworzymy symlinka do konfiguracji
ln -s ../sites-available/virtual_host

# Sprawdzenie konfiguracji nginx
nginx -t

# Restart serwera
nginx -s reload
-s <- wyślij sygnał do serwera nginx

restart = zabij proces, utwórz nowy, zaczytaj wszystkie konfiguracje; zerwie wszystkie połączenia z klientami
reload = przeładuj tylko konfigurację serwera

Jeżeli modyfikujemy pliki na dysku (pliki strony), nie potrzeba przeładowywać nginxa.

# Modyfikacja komunikatu błędu
Do pliku z konfiguracją wirtualnego hosta musimy dopisać:
error_page 404 /error404.html; – dla błędu 404 otwórz dany plik, który znajduje się w root katalogu dla danego hosta
error_page 403 /error403.html; – kolejne błędy dopisujemy jako oddzielne rekordy
error_page 400 401 402 500 501 /error.html; – można grupować, aby wyświetlały ten sam błąd

# Wyświetlenie zawartości katalogu
Domyślnie jest to wyłączone, aby to włączyć w katalogu sites-available w odpowiednim pliku dopisujemy nowe location:

location /katalog {
autoindex on;
allow IP;
deny all;
}

autoindex on – uruchamia automatyczne indeksowanie
allow – informuje jakie adresy IP mogą wyświetlić zawartość
deny all – blokuje dla wszystkich pozostałych

Jeżeli zainstalowaliśmy wersję extras serwera nginx możemy zamienić autoindex na fancyindex – zamieni nam to sposób wyświetlania plików na trochę przyjemniejszy.

# Snippety, czyli wspólna część konfiguracyjna
Przyjmijmy, że do każdego wirtualnego hosta chcemy dodać identyczne strony błędów. Możemy w katalogu snippets utworzyć dowolny plik konfiguracyjny, np. error.conf i wówczas w plikach konfiguracyjnych hostów wystarczy dopisać:
include ../snippets/error.conf

# Wyłączenie informacji wyświetlanych o serwerze
W głównym pliku konfiguracyjnym serwera w sekcji http należy dopisać:
server_tokens off;
Po przeładowaniu usługi możemy zobaczyć za pomocą np. curl -I http://localhost, że udostępnia zdecydowanie mniej wrażliwych danych (np. wersja serwera).

# Przekierowanie ruchu z nginxa na aplikacje działającą w Dockerze
Odpalmy kontener z wordpressem:
docker container run -d -p 8080:80 wordpress

W konfiguracji wirtualnego hosta kasuje dyrektywę root, bo będzie przekierowywał dalej. W location wywalam try_files (bo nie ma jakich plików testować) a dopisuje:
proxy_set_header Host $host;
proxy_pass http://localhost:8080;

Gdy ktoś będzie odpalał stronę główną wówczas proxy ma przekierowywać na wskazaną stronę – w naszym przypadku kontener. Dodatkowo ustawia w nagłówku host jako naszą domenę, unikniemy w tym problemów z proxowaniem.

# Logowanie IP w kontenerze
docker logs nazwa_kontenera
Wszystkie logi pochodzą z naszego głównego IP (172.17.0.1) dockera. Logowanie prawdziwych adresów IP klientów wymaga dopisanie do konfiguracji hosta w sekcji location dyrektywy:
proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;

# Proxowanie innej strony pod naszą domeną + modyfikacja treści
Modyfikujemy konfigurację hosta i edytujemy sekcję location. Musi ona zawierać 3 powyższe wpisy, lekko zmodyfikowane:
proxy_set_header Host 'wojst.pl’;
proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
proxy_pass https://wojst.pl;

Taki zapis pozwoli nam na wyświetlenie strony wojst.pl pod naszą domeną. Aby zmodyfikować jakąś frazę musimy użyć dyrektywy sub_filter wewnątrz location.
sub_filter „słowo na stronie” „słowo na jakie zmieniamy”;

# Dodanie certyfikatu SSL dla domeny
Instalacja pakietów: certbot oraz python3-certbot-nginx (który ogarnie integracje z nginxem)

Tworzenie certyfikatu:
certbot –nginx -d nazwa_domeny.pl -d nazwa_drugiej_domeny.pl -d *.nazwa_trzeciej_domeny.pl
Podajemy adres mailowy dla certa
Gdy zapyta o rewrite to dajemy tak, wówczas z automatu wymusi przekierowywanie na https

# Doinstalowanie PHP
Instalujemy pakiety: php php-fpm
fpm: serwer, który jest uruchomiony w tle i nasłuchuje (jako usługa); do niego wysyłany jest ruch związany z plikami PHP
Dzięki temu możemy mieć kilka wersji PHP i każda z witryn może używać innej wersji.

Następnie do virtualnego hosta musimy dopisać sekcję (odkomentowujemy domyślny wpis):
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}

W fastcgi_pass definiujemy ścieżkę do socketu na jakim działa fpm

# Przekierowanie na inny URL
W pliku vhosta dopisujemy:
rewrite ^/strona$ https://strona.pl last;

Przekierowanie na konkretną podstronę na stronie docelowej:
rewrite ^/strona/(.+)$ https://strona.pl/$1 last;
$1 informuje, aby wkleił tam to co będzie w (.+)

^ last służy poinformować, że to jest jedyne przekierowanie, ma nie szukać innych wzorców

# Włączenie możliwości obsługi plików .htaccess
Należy doinstalować odpowiedni moduł do nginxa
cd /tmp
git clone https://github.com/e404/htaccess-for-nginx
cd htaccess-for-nginx
Tutaj znajdziemy plik htaccess.lua – serwer nginx musi obsługiwać język LUA; w przypadku instalacja wersji nginx-extras wspomniany moduł będzie już zainstalowany

Należy skopiować plik htaccess.lua do głównego katalogu nginxa, a następnie włączyć obsługę w głównym pliku konfiguracyjnym.
W sekcji http należy dopisać:
lua_shared_dict htaccess 16m; (16 mb pamięci cache dla modułu htaccess)
a następnie uruchomić plik dla konkretnego vhosta, w pliku konfiguracyjnym VH dopisujemy dyrektywę:
rewrite_by_lua_file /etc/nginx/htaccess.lua;

Na koniec pozostaje utworzenie pliku .htaccess w odpowiednim katalogu WWW.
Jako zasadę sprawdzającą wykorzystamy przekierowanie:
RewriteEngine On
RewriteRule ^info$ /a.php [L]

# Obsługa kilku vhostów jednym plikiem konfiguracyjnym
Modyfikacji dokonujemy w pliku sites-available/default (w przypadku Ubuntu) oraz nginx.conf w przypadku RHEL:

set $rootdir /var/www/html;
if ($host ~ ^sub[0-9]\.nazwa.local$) {
set $rootdir /var/www/nazwa.local;
}

if ($host = „domena.pl”) {}

root $rootdir;

~ – jest podobny
= – jest dokładnie dopasowane
Najpierw musimy zdefiniować zmienną, którą ewentualnie nadpiszemy jeżeli będzie dopasowanie.
Jeżeli dopasuje wówczas rootdir będzie ten pierwszy, jeżeli nie dopasuje nic wówczas dojdzie do ostatniego rootdira i z niego skorzysta.
sub[0-9] – do tego odwołujemy się jako $1, jeżeli byśmy po tym dodawali kolejne wyrażenia regularne wówczas odnosimy się jako $2 itd.

Jeżeli chcemy ustawiać jakiekolwiek inne dyrektywy dla vhostów cały czas operujemy na zmiennych (ustawianych za pomocą set).
Warto również wspomnieć, że nginx nie wspiera „else„.

# Spowolnienie pobierania dużego pliku
Dzięki temu nie zapchamy całego łącza wysyłaniem pliku.

Do pliku z vhostami dopisujemy:
location /plik {
limit_rate 50k;
}

# Dodawanie nagłówków bezpieczeństwa do serwera
Do pliku jak powyżej dodajemy:
add_header nazwa_headera „wartość”;
add_header X-Frame-Options „DENY”;

Najlepiej wrzucić je do jednego snippeta i dołączać go w każdym vhoście.

W celu świadczenia usług na najwyższym poziomie stosujemy pliki cookies, które będą zamieszczane w Państwa urządzeniu (komputerze, laptopie, smartfonie). W każdym momencie mogą Państwo dokonać zmiany ustawień Państwa przeglądarki internetowej i wyłączyć opcję zapisu plików cookies. View more
Zaakceptuj