Vlastné HTTP status stránky pre nginx

18.07.2021 | 14:20 | Mirecove dristy | Miroslav Bendík

V dnešnom blogu predstavím jednoduchý generátor stránok pre HTTP stavy a spôsob, ako nakonfigurovať nginx s možnosťou používať užívateľom definované chybové stránky.

Na svojom githube mám zverejnený skript generate.py. Ak máme nainštalovaný python3 s knižnicou jinja2 stačí spustiť ./generate.py a výstup sa vygeneruje do adresára output.

Ako to funguje

Zoznam generovaný stránok sa nachádza v súbore settings.py. V tomto súbore je možné doplniť / odobrať stránky, prípadne im upraviť texty. Zoznam HTTP stavov je z tohto JSONu.

Šablóny stránok sú v adresári templates. Vyhľadávanie šablón pre stavu 123 má priority: 123.html, 12x.html, 1xx.html a error.html. Použije sa prvá existujúca šablóna. Ak teda vytvorím šablónu 4xx.html, použije sa pre všetky stavy začínajúce sa na 4 ak nie je definovaná špecifickejšia šablóna. Ak vytvorím ešte k tomu 404.html bude pre stránku 404 použitá táto šablóna a pre všetky ostatné generickejšia 4xx.html. Šablóny sú spracované knižnicou jinja2.

Štandardné šablóny je možné vidieť v pripravenom deme. Pozrieť sa dajú aj jednotlivé stavy na github stránkach.

Štandardné šablóny
Obrázok 1: Štandardné šablóny

Konfigurácia nginx

Najskôr je potrebné stránky umiestniť niekam, kam má nginx prístup. Ja používam adresár /usr/share/nginx/html/error. Konfigurujem nginx tak, aby štandardné error stránky pochádzali z globálneho adresára, ale aby sa zároveň dali nahrať do root adresára virtuálneho hostu, takže každý užívateľ môže mať vlastné error stránky ak chce. Konfigurácia vyzerá nasledovne:

error_page 400 /error/400.html;
error_page 401 /error/401.html;
error_page 402 /error/402.html;
error_page 403 /error/403.html;
error_page 404 /error/404.html;
error_page 405 /error/405.html;
error_page 406 /error/406.html;
error_page 407 /error/407.html;
error_page 408 /error/408.html;
error_page 409 /error/409.html;
error_page 410 /error/410.html;
error_page 411 /error/411.html;
error_page 412 /error/412.html;
error_page 413 /error/413.html;
error_page 414 /error/414.html;
error_page 415 /error/415.html;
error_page 416 /error/416.html;
error_page 417 /error/417.html;
error_page 418 /error/418.html;
error_page 421 /error/421.html;
error_page 422 /error/422.html;
error_page 423 /error/423.html;
error_page 424 /error/424.html;
error_page 425 /error/425.html;
error_page 426 /error/426.html;
error_page 428 /error/428.html;
error_page 429 /error/429.html;
error_page 431 /error/431.html;
error_page 451 /error/451.html;
error_page 500 /error/500.html;
error_page 501 /error/501.html;
error_page 502 /error/502.html;
error_page 503 /error/503.html;
error_page 504 /error/504.html;
error_page 505 /error/505.html;
error_page 506 /error/506.html;
error_page 507 /error/507.html;
error_page 508 /error/508.html;
error_page 510 /error/510.html;
error_page 511 /error/511.html;
recursive_error_pages on;

location @system_wide_error_pages {
	root /usr/share/nginx/html/;
}

location ~ ^/error/(.*)$ {
	internal;
	try_files /error/$1 @system_wide_error_pages;
}

Pozrime sa na konfiguračný súbor zdola nahor. Pravidlo location ~ ^/error/(.*)$ platí pre všetky cesty začínajúce sa na /error/. Modifikátor internal znamená, že daný súbor je prístupný z nginx len interne. Užívateľ tak nemôže zobraziť error stránku pomocou URL adresy napr. https://domena/error/500.html. Direktíva try_files definuje prioritu vyhľadávania súboru. V tomto prípade sa najskôr hľadá v koreňovom adresári virtualhostu a potom v @system_wide_error_pages (zavináč označuje pomenovanú adresu nedostupnú zvonku). Zostáva už len definovať cesty pre chybové stránky (direktívy error_page) a prípadne zapnúť recursive_error_pages, čo znamená, že pri chybe načítania chybovej stránky sa nepoužije vstavaná chybová stránka, ale ďalej sa vyhľadáva vo vlastných stránkach.

Tento súbor uložíme do /etc/nginx/snippets/standard-error-pages.conf. Pre použitie vo virtual hostoch stačí len pridať do sekcie server { } direktívu include snippets/standard-error-pages.conf;.

    • RE: Vlastné HTTP status stránky pre nginx 19.07.2021 | 10:37
      Avatar LUcoRP Debian, *Ubuntu, Android  Administrátor

      Vyzera to dobre. Mozno by stalo za to zabalit to aj ako baliceck pre django?

      git blame | Muj Desvorc je vetsi nez tvuj!
      • RE: Vlastné HTTP status stránky pre nginx 26.07.2021 | 12:45
        Avatar Miroslav Bendík Gentoo  Administrátor

        Pre django asi nie, django nemá s error stránkami moc spoločného, o ne sa stará web server.

        • RE: Vlastné HTTP status stránky pre nginx 28.07.2021 | 02:59
          Avatar LUcoRP Debian, *Ubuntu, Android  Administrátor

          Jasne ze nie vsetky, ale niektore moze riesit vrstva nad webserverom ie. 400, 403, 404, 500.

          git blame | Muj Desvorc je vetsi nez tvuj!