Webmin via nginx proxy
Webmin via nginx proxy
Opis problemu
Webmin domyślnie uruchamia własny serwer www i działa na porcie tcp/10000
. Czasem wygodniej by było „schować” go za standardowym portem tcp/443, np. w podkatalogu /webmin
. Aby to zrobić, należy:
- skonfigurować przekierowanie (reverse proxy) na serwerze www zajmującym port tcp/443,
- „poinformować” webmina, że teraz działa schowany za serwerem proxy.
Założenia
- Webmin uruchomiony jest pod adresem: https://www.example.org:10000/
- Pod adresem https://www.example.org/ działa serwer nginx.
- Chcemy mieć dostęp do Webmina poprzez adres https://www.example.org/webmin/
Reverse proxy w NGINX
Reverse proxy to jedna z podstawowych funkcji serwera nginx, więc nie trzeba doinstalowywać żadnych dodatkowych modułów. Trzeba natomiast dodać nowy wpis typu location.
server {
(...)
location /webmin/ {
proxy_pass https://www.example.org:10000/;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
}
(...)
}
Celowo pomijam ustawienia serwera, bowiem nie to jest istotne w tym wpisie.
Zacznijmy od początku, czyli od
location /webmin/
oznacza wszystkie odwołania https://www.example.org/webmin/...
, czyli zaczynające się od /webmin/
. Tutaj warto doczytać o kolejności, wg której przeszukiwane są wpisy w pliku konfiguracyjnym serwera nginx, bowiem algorytm dopasowania nie jest taki oczywisty.
proxy_pass https://www.example.org:10000/;
Proxy_pass, czyli wskazuję serwer docelowy. W praktyce, jeżeli Webmin pracuje na tym samym serwerze, co serwer nginx, można wpisać 127.0.0.1
, czyli:
proxy_pass https://127.0.0.1:10000/;
W kolejnym kroku ustawiamy opcję proxy_buffering
wyłączamy buforowanie, aby zmniejszyć opóźnienie w ładowaniu stron oraz zaoszczędzić na pamięci.
proxy_buffering off;
Warto jednak pamiętać, że do większości zastosowań tę opcję lepiej zostawić włączoną.
Na koniec jeszcze będziemy przekazywać Webminowi prawdziwy adres IP klienta:
proxy_set_header X-Real-IP $remote_addr;
Nie jest to niezbędne, ale przydatne.
Konfiguracja Webmina Czemu w ogóle trzeba coś zmieniać w Webminie? Bowiem Webmin używa odwołań bezwzględnych w generowanych przez siebie stronach HTML. Oto przykład ze strony logowania, 4 linijka:
<link rel='stylesheet' type='text/css' href='/unauthenticated/gray-reset-fonts-grids-base.css'>
jeżeli otworzymy tę stronę bezpośrednio wpisując adres:
https://www.example.org:10000/
to przeglądarka będzie szukać pliku css pod adresem
https://www.example.org:10000/unauthenticated/gray-reset-fonts-grids-base.css
Natomiast jeżeli połączymy się poprzez serwe nginx, czyli nasze proxy, wpisując adres:
https://www.example.org/webmin/
to przeglądarka będzie szukać pliku css pod adresem:
https://www.example.org/unauthenticated/gray-reset-fonts-grids-base.css
zamiast
https://www.example.org/webmin/unauthenticated/gray-reset-fonts-grids-base.css
i właśnie ten błąd trzeba poprawić edytując plik /etc/webmin/config i dodając wpisy:
webprefix=/webmin
webprefixnoredir=1
referer=www.example.org
Szczegółowy opis znajduje się tutaj w punkcie Webmin In A Sub-Directory Via A Proxy, podpunkt 3 i 4.
Restart
Pamiętaj na koniec o zrestartowaniu nginx oraz Webmina.
Zadanie dodatkowe
Zarówno nginx jak i Webmin działają w trybie https, a więc mamy podwójne szyfrowanie:
user <---szyfrowanie_1---> nginx <---szyfrowanie_2---> webmin.
Jeżeli nginx i webmin pracują na tym samym serwerze, to warto wyłączyć szyfrowanie_2
, aby zaoszczędzić trochę cykli procesora.
Otwórz plik: /etc/webmin/miniserv.conf
i ustaw parametry:
ssl=0
ssl_redirect=0
bind=127.0.0.1
no_resolv_myname=1
W konfiguracji nginx wyłącz https, czyli zmień wpis na:
proxy_pass http://127.0.0.1:10000/;
…i to wszystko. Od tej pory Webmin pracuje bez SSLa oraz nasłuchuje jedynie na 127.0.0.1.