Vlastné HTTP status stránky pre nginx
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.
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;
.
Pre pridávanie komentárov sa musíte prihlásiť.
Vyzera to dobre. Mozno by stalo za to zabalit to aj ako baliceck pre django?
Pre django asi nie, django nemá s error stránkami moc spoločného, o ne sa stará web server.
Jasne ze nie vsetky, ale niektore moze riesit vrstva nad webserverom ie. 400, 403, 404, 500.