Sestavujeme svůj Nginx pár příkazů

Ahoj!
Jmenuji se Sergej, pracuji jako infrastrukturální inženýr v týmu API platformy tinkoff.ru.

V tomto článku se podělím o problémy, se kterými se náš tým potýkal při přípravě balancerů na základě Nginx pro různé projekty. Také představím nástroj, který nám umožnil překonat většinu z nich.

Nginx je multifunkční a aktivně se rozvíjející proxy server. Vyznačuje se velkým množstvím modulů, toto je daleko neúplný seznam. Každý projekt klade určité požadavky na funkčnost balanceru a verzi Nginx (například přítomnost http/2 a proxying grpc) a na soubor jeho modulů.

Chceme vidět aktuální verzi s potřebným souborem modulů, která funguje pod určitým distribucí Linuxu. V našem případě jde o systémy založené na deb a rpm. Varianta s kontejnery v tomto článku nebude zvažována.

Chceme rychle měnit funkčnost našich balancerů. A hned nastává otázka — jak toho dosáhnout s co nejmenšími náklady? Ještě by bylo lepší nastavit proces tak, abychom mohli stanovit konečný počet vstupních parametrů a na výstupu získat artefakt ve formě deb/rpm balíčku pro potřebný operační systém.

Nakonec můžeme formulovat řadu problémů:

  • Ne vždy jsou k dispozici balíčky s aktuální verzí Nginx.
  • Nejsou k dispozici balíčky s potřebnými moduly.
  • Ruční kompilace a sestavení balíčku trvá mnoho času a je zkrátka únavné.
  • Není popsáno, jak je konstruován ten či onen instance Nginx.

Abychom tyto problémy vyřešili, je potřeba vytvořit určitý nástroj, který by jako vstup přijímal specifikaci ve čitelné podobě a sestavoval balíček Nginx s požadovanou funkčností.

Nenašli jsme pro nás vhodné řešení v hlubinách Gitu, a tak jsme se rozhodli vytvořit svůj nástroj — nginx-builder.

Specifikace

V našem nástroji jsme chtěli vytvářet popis specifikace ve formě kódu, který by bylo možné uložit do Git repozitáře. K tomu jsme zvolili obvyklý formát pro podobné účely — yaml. Příklad specifikace:

nginx_version: 1.14.1
output_package: deb
modules:
  - module:
      name: nginx-auth-ldap
      git_url: https://github.com/kvspb/nginx-auth-ldap.git
      git_branch: master
      dependencies:
        - libldap2-dev
  - module:
      name: ngx_http_substitutions_filter_module
      git_url: https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
  - module:
      name: headers-more-nginx-module
      web_url: https://github.com/openresty/headers-more-nginx-module/archive/v0.261.zip
  - module:
      name: nginx-module-vts
      git_url: https://github.com/vozlt/nginx-module-vts.git
      git_tag: v0.1.18
  - module:
      name: ngx_devel_kit
      git_url: https://github.com/simplresty/ngx_devel_kit.git
      git_tag: v0.3.0
  - module:
      name: ngx_cache_purge
      git_url: https://github.com/FRiCKLE/ngx_cache_purge.git
  - module:
      name: ngx_http_dyups_module
      git_url: https://github.com/yzprofile/ngx_http_dyups_module.git
  - module:
      name: nginx-brotli
      git_url: https://github.com/eustas/ngx_brotli.git
      git_tag: v0.1.2
  - module:
      name: nginx_upstream_check_module
      git_url: https://github.com/yaoweibin/nginx_upstream_check_module.git
  - module:
      name: njs
      git_url: https://github.com/nginx/njs.git
      git_tag: 0.2.5
      config_folder_path: nginx

Zde uvádíme, že chceme vidět deb balíček s verzí Nginx 1.14.2 s potřebnou sadou modulů. Sekce moduly je volitelná. Pro každý z nich můžeme stanovit:

  • Název.
  • Adresa, kde je k dispozici:
    • Git repozitář. Je také možné uvést větev nebo tag.
    • Webový odkaz na archiv.
    • Místní odkaz na archiv.

Některé moduly vyžadují instalaci dalších závislostí, například pro nginx-auth-ldap je potřeba nainstalovaný libldap2-dev. Požadované závislosti lze také uvést při popisu modulu.

Prostředí

V našem nástroji můžeme rychle získat prostředí s nainstalovanými nástroji pro kompilaci, stavbu balíčku a další pomocný software. Sem perfektně zapadá docker kontejner se vším potřebným (v repozitáři již je několik příkladů docker souborů pro ubuntu a centos).

Jakmile je specifikace sestavena a prostředí připraveno, spustíme náš builder poté, co nainstalujeme jeho závislosti:

pip3 install -r requirements.txt
./main.py build -f [konfig_file].yaml -r [revize]

Číslo revize je zde volitelné a slouží k verzionování sestavení. Je zaznamenáno v metainformacích balíčku, což usnadňuje jeho aktualizaci na serverech.
Podle logů můžeme sledovat, co se děje. Zde je příklad hlavních bodů:

builder - INFO - Zpracování yaml souboru: example.config.yaml
builder - INFO - Stahování skriptů pro vytvoření deb balíčku
builder - INFO - Stahování nginx src...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Stahování 3d-party modulů...
builder - INFO - Modul nginx-auth-ldap se stáhne podle větve
builder - INFO - -- Hotovo: nginx-auth-ldap
builder - INFO - -- Hotovo: ngx_http_substitutions_filter_module
builder - INFO - Modul headers-more-nginx-module se stáhne
builder - INFO - Modul nginx-module-vts se stáhne podle štítku
builder - INFO - -- Hotovo: nginx-module-vts
builder - INFO - Modul ngx_devel_kit se stáhne podle štítku
builder - INFO - -- Hotovo: ngx_devel_kit
builder - INFO - -- Hotovo: ngx_cache_purge
builder - INFO - -- Hotovo: ngx_http_dyups_module
builder - INFO - Stahování závislostí
builder - INFO - Vytváření .deb balíčku
builder - INFO - Spuštění 'dh_make'...
builder - INFO - Spuštění 'dpkg-buildpackage'...
dpkg-deb: vytváření balíčku 'nginx' v '..../nginx_1.14.1-1_amd64.deb'.

Tak snadno několika příkazy vytvoříme prostředí a požadovanou sestavu Nginx, a balíček se objeví v adresáři, odkud byl skript spuštěn.

Vkládání

Také můžeme náš nástroj integrovat do CI/CD procesů. V tom může pomoci jakýkoli z mnoha současných CI systémů, například Teamcity nebo Gitlab CI.

Jako výsledek se při každé změně specifikace v Git repozitáři automaticky spustí sestavení artefaktu. Číslo revize se váže na čítač spuštění buildu.
Pokud věnujeme ještě trochu času, můžeme nastavit odesílání artefaktu do místního repozitáře balíčků, Nexus, Artifactory a tak dále.

Dalším plusem je, že konfigurační yaml soubor lze připojit v Ansible nebo jiném systému automatického konfigurace a brát odtud číslo verze a typu balíčku, který chceme nasadit.

Co dál

Projekt ještě není dokončen. Na čem nyní pracujeme:

  • Rozšiřujeme možnosti konfigurace, ale zároveň ji udržujeme co nejjednodušší. Nechceme definovat tisíc parametrů, pokud potřebujeme jen dva, a ostatní jsou vhodná podle výchozího nastavení. To se týká kompilátorových příznaků (v současnosti je lze měnit v interním konfiguračním souboru src/config.py), cest instalace, uživatele pro spuštění.
  • Přidáváme možnosti automatického odesílání balíčku do různých úložišť artefaktů.
  • Provádění uživatelského příkazu při načítání modulu (například pro použití github.com/nginx-modules/nginx_upstream_check_module je třeba nejprve aplikovat opravu určité verze)
  • Přidáváme testování:
    • Balíček se správně instaluje.
    • Nginx má požadovanou verzi a byl sestaven s požadovanými příznaky a moduly.
    • Vytvářejí se potřebné cesty, uživatelské účty a tak dále.

Ale můžete tento nástroj používat již nyní a také navrhovat vylepšení — github.com/TinkoffCreditSystems/Nginx-builder Vítejte!

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster