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

  1. Webmin uruchomiony jest pod adresem: https://www.example.org:10000/
  2. Pod adresem https://www.example.org/ działa serwer nginx.
  3. 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.