Sestavíme náš Nginx pomocí několika příkazů

Ahoj!
Jmenuji se Sergey a pracuji jako infrastrukturní inženýr v týmu API platformy tinkoff.ru.

V tomto článku budu hovořit o problémech, kterým náš tým čelil při přípravě balancérů na základě Nginx pro různé projekty. Řeknu vám také o nástroji, který mi umožnil překonat většinu z nich.

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

Rádi bychom viděli čerstvou verzi s požadovanou sadou modulů, běžící pod konkrétní linuxovou distribucí. V našem případě se jedná o systémy založené na deb- a rpm. Možnost s kontejnery není v tomto článku zvažována.

Chceme rychle změnit funkčnost našich balancerů. A zde se hned nabízí otázka: jak toho dosáhnout při vynaložení co nejméně prostředků? Ještě lepší by bylo nastavit proces tak, abychom mohli specifikovat konečný počet vstupních parametrů a na výstupu dostali artefakt v podobě deb/rpm balíčku pro požadovaný OS.

V důsledku toho lze formulovat řadu problémů:

  • Ne vždy existují balíčky s nejnovější verzí Nginx.
  • Neexistují žádné balíčky s požadovanými moduly.
  • Ruční kompilace a sestavení balíčku je časově náročné a vyloženě únavné.
  • Neexistuje žádný popis toho, jak se ta či ona instance Nginx sestavuje.

K vyřešení těchto problémů vyvstává potřeba nástroje, který by vzal jako vstup specifikaci ve formátu čitelném pro člověka a na jejím základě sestavil balíček Nginx s potřebnou funkčností.

Protože jsme pro rozlehlost Githubu nenašli vhodnou volbu, rozhodli jsme se vytvořit vlastní nástroj - nginx-builder.

Specifikace

V našem nástroji jsme chtěli vytvořit popis specifikace ve formě kódu, který lze následně vložit do úložiště Git. K tomu jsme zvolili formát známý pro takové věci – 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 Nginx verze 1.14.2 s požadovanou sadou modulů. Sekce s moduly je volitelná. Pro každý z nich můžete nastavit:

  • Jméno.
  • Adresa, kde to můžete získat:
    • Git úložiště. Můžete také zadat větev nebo značku.
    • Webový odkaz na archiv.
    • Místní odkaz na archiv.

Některé moduly vyžadují instalaci dalších závislostí, například nginx-auth-ldap vyžaduje instalaci libldap2-dev. Potřebné závislosti lze také specifikovat při popisu modulu.

Prostředí

V našem nástroji můžete rychle získat prostředí s nainstalovanými utilitami pro kompilaci, sestavování balíčků a další pomocný software. Ideální je zde kontejner Docker se vším, co potřebujete (úložiště již má pár příkladů souborů Docker pro ubuntu a centos).

Po sestavení specifikace a připraveném prostředí spustíme náš builder, který předtím nainstaloval jeho závislosti:

pip3 install -r requirements.txt
./main.py build -f [конфиг_файл].yaml -r [номер_ревизии]

Číslo revize zde je volitelné a používá se pro verzování sestavení. Zapisuje se do metainformací balíčku, což usnadňuje aktualizaci na serverech.
Z logů můžete sledovat, co se děje. Zde je příklad hlavních bodů:

builder - INFO - Parse yaml file: example.config.yaml
builder - INFO - Download scripts for build deb package
builder - INFO - Downloading nginx src...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Downloading 3d-party modules...
builder - INFO - Module nginx-auth-ldap will download by branch
builder - INFO - -- Done: nginx-auth-ldap
builder - INFO - -- Done: ngx_http_substitutions_filter_module
builder - INFO - Module headers-more-nginx-module will downloading
builder - INFO - Module nginx-module-vts will download by tag
builder - INFO - -- Done: nginx-module-vts
builder - INFO - Module ngx_devel_kit will download by tag
builder - INFO - -- Done: ngx_devel_kit
builder - INFO - -- Done: ngx_cache_purge
builder - INFO - -- Done: ngx_http_dyups_module
builder - INFO - Downloading dependencies
builder - INFO - Building .deb package
builder - INFO - Running 'dh_make'...
builder - INFO - Running 'dpkg-buildpackage'...
dpkg-deb: building package 'nginx' in '../nginx_1.14.1-1_amd64.deb'.

Takže pomocí několika příkazů vytvoříme prostředí a požadované sestavení Nginx a balíček se objeví v adresáři, odkud se skript spouští.

Vkládání

Náš nástroj můžeme také integrovat do procesů CI/CD. S tím může pomoci například kterýkoli z mnoha systémů CI, které dnes existují Týmové město nebo Gitlab CI.

Výsledkem je, že při každé změně specifikace v úložišti Git se automaticky spustí sestavení artefaktu. Číslo revize je spojeno s počítadlem spuštění sestavení.
S trochou více času můžete nakonfigurovat, aby byl artefakt odeslán do vašeho místního úložiště balíčků, zařízení Nexus, Artifactory atd.

Další výhodou je, že konfigurační soubor yaml lze připojit k Ansible nebo jinému automatickému konfiguračnímu systému a odtud můžeme vzít číslo verze a typ balíčku, který chceme nasadit.

Co je další

Projekt ještě není dokončen. Zde je to, na čem nyní pracujeme:

  • Rozšiřujeme možnost konfigurace, ale zároveň ji udržujeme co nejjednodušší. Nechcete definovat tisíc parametrů, pokud potřebujete pouze dva a zbytek se ve výchozím nastavení hodí. To zahrnuje příznaky kompilace (nyní je můžete změnit v interním konfiguračním souboru src/config.py), instalační cestu a spouštěcího uživatele.
  • Přidáváme možnosti pro automatické odeslání balíčku do různých úložišť artefaktů.
  • Při načítání modulu spusťte vlastní příkaz (například pro použití github.com/nginx-modules/nginx_upstream_check_module musíte nejprve použít opravu konkrétní verze)
  • Přidání testů:
    • Balíček je nainstalován správně.
    • Nginx má požadovanou verzi a je sestaven s požadovanými příznaky a moduly.
    • Jsou vytvořeny potřebné cesty, účty a tak dále.

Tento nástroj však můžete použít již nyní a také navrhnout vylepšení - github.com/TinkoffCreditSystems/Nginx-builder Vítejte!

Zdroj: www.habr.com

Přidat komentář