# 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.