Náš Nginx zostavíme pomocou niekoľkých príkazov

Ahoj!
Volám sa Sergey, pracujem ako inžinier infraštruktúry v tíme API platformy tinkoff.ru.

V tomto článku budem hovoriť o problémoch, ktorým náš tím čelil pri príprave vyvažovačov Nginx pre rôzne projekty. Poviem vám tiež o nástroji, ktorý mi umožnil prekonať väčšinu z nich.

Nginx je multifunkčný a aktívne sa rozvíjajúci proxy server. Obsahuje veľké množstvo modulov, toto nie je úplný zoznam. Každý projekt kladie určité požiadavky na funkčnosť balancera a verziu Nginx (napríklad prítomnosť http/2 a grpc proxying) a zloženie jeho modulov.

Radi by sme videli čerstvú verziu s požadovanou sadou modulov, ktorá beží pod špecifickou distribúciou Linuxu. V našom prípade ide o systémy založené na deb- a rpm. Možnosť s kontajnermi sa v tomto článku nezohľadňuje.

Chceme rýchlo zmeniť funkčnosť našich balancerov. A tu sa hneď vynára otázka: ako to dosiahnuť pri vynaložení čo najmenej zdrojov? Ešte lepšie by bolo nastaviť proces tak, aby sme mohli zadať konečný počet vstupných parametrov a na výstupe dostať artefakt v podobe balíka deb/rpm pre požadovaný OS.

V dôsledku toho je možné formulovať množstvo problémov:

  • Nie vždy existujú balíčky s najnovšou verziou Nginx.
  • Neexistujú žiadne balíčky s požadovanými modulmi.
  • Manuálne zostavenie a zostavenie balíka je časovo náročné a úplne únavné.
  • Neexistuje žiadny popis, ako sa zostavuje tá alebo tá inštancia Nginx.

Na vyriešenie týchto problémov vzniká určitý nástroj, ktorý by zobral ako vstup špecifikáciu v ľudsky čitateľnom formáte a na jej základe zostavil balík Nginx s potrebnou funkcionalitou.

Keďže sme pre rozľahlosť Githubu nenašli vhodnú možnosť, rozhodli sme sa vytvoriť vlastný nástroj - nginx-builder.

Špecifikácie

V našom nástroji sme chceli vytvoriť popis špecifikácie vo forme kódu, ktorý je možné následne vložiť do úložiska Git. Na tento účel sme zvolili formát známy pre takéto veci - yaml. Príklad špecifikácie:

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

Tu uvádzame, že chceme vidieť deb balík s Nginx verzie 1.14.2 s požadovanou sadou modulov. Časť s modulmi je voliteľná. Pre každý z nich môžete nastaviť:

  • Názov.
  • Adresa, kde ho môžete získať:
    • Úložisko Git. Môžete tiež určiť vetvu alebo značku.
    • Webový odkaz na archív.
    • Miestny odkaz na archív.

Niektoré moduly vyžadujú inštaláciu ďalších závislostí, napríklad nginx-auth-ldap vyžaduje nainštalovaný libldap2-dev. Pri popise modulu je možné špecifikovať aj potrebné závislosti.

okolia

V našom nástroji môžete rýchlo získať prostredie s nainštalovanými pomôckami na kompiláciu, zostavovanie balíkov a ďalší pomocný softvér. Ideálny je tu kontajner Docker so všetkým, čo potrebujete (úložisko už má niekoľko príkladov súborov Docker pre ubuntu a centos).

Po vypracovaní špecifikácie a príprave prostredia spustíme náš builder, ktorý predtým nainštaloval jeho závislosti:

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

Číslo revízie je tu voliteľné a používa sa na zostavovanie verzií. Zapisuje sa do meta informácií balíka, čo uľahčuje aktualizáciu na serveroch.
Z denníkov môžete sledovať, čo sa deje. Tu je príklad hlavných bodov:

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 pomocou niekoľkých príkazov vytvoríme prostredie a požadovanú zostavu Nginx a balík sa objaví v adresári, odkiaľ sa skript spúšťa.

Vkladanie

Náš nástroj môžeme tiež integrovať do procesov CI/CD. Pomôcť s tým môže napríklad ktorýkoľvek z mnohých systémov CI, ktoré dnes existujú Teamcity alebo Gitlab CI.

Výsledkom je, že pri každej zmene špecifikácie v úložisku Git sa automaticky spustí zostavenie artefaktu. Číslo revízie je prepojené s počítadlom spustenia zostavy.
S trochou viac času môžete nakonfigurovať, aby bol artefakt odoslaný do vášho lokálneho úložiska balíkov, Nexus, Artifactory atď.

Ďalšou výhodou je, že konfiguračný súbor yaml je možné pripojiť k Ansible alebo inému automatickému konfiguračnému systému a odtiaľ môžeme prevziať číslo verzie a typ balíka, ktorý chceme nasadiť.

čo ďalej

Projekt ešte nie je ukončený. Tu je to, na čom teraz pracujeme:

  • Rozširujeme možnosť konfigurácie, no zároveň ju zachovávame čo najjednoduchšiu. Nechcete definovať tisíc parametrov, ak potrebujete iba dva a zvyšok sa štandardne hodí. To zahŕňa príznaky kompilácie (teraz ich môžete zmeniť v internom konfiguračnom súbore src/config.py), cestu inštalácie a spúšťacieho používateľa.
  • Pridávame možnosti automatického odosielania balíka do rôznych úložísk artefaktov.
  • Pri zavádzaní modulu vykonajte vlastný príkaz (napríklad na použitie github.com/nginx-modules/nginx_upstream_check_module najprv musíte použiť opravu konkrétnej verzie)
  • Pridanie testov:
    • Balík je nainštalovaný správne.
    • Nginx má požadovanú verziu a je zostavený s požadovanými príznakmi a modulmi.
    • Vytvoria sa potrebné cesty, účty atď.

Teraz však môžete tento nástroj použiť a tiež navrhnúť vylepšenia - github.com/TinkoffCreditSystems/Nginx-builder Vitaj!

Zdroj: hab.com

Pridať komentár