Assemblamu u nostru Nginx cù un coppiu di cumandamenti

Hello!
Mi chjamu Sergey, travagliu cum'è un ingegnere di l'infrastruttura in a squadra API di a piattaforma tinkoff.ru.

In questu articulu vi parleraghju di i prublemi chì a nostra squadra hà affruntatu quandu preparava balancers basatu nantu Nginx per vari prughjetti. Vi cuntaraghju ancu di u strumentu chì m'hà permessu di superà a maiò parte di elli.

Nginx hè un servitore proxy multifunzionale è attivamente in sviluppu. Hà un gran numaru di moduli, questu ùn hè micca una lista cumpleta. Ogni prughjettu impone certe esigenze nantu à a funziunalità di u balancer è a versione di Nginx (per esempiu, a presenza di http/2 è grpc proxy), è a cumpusizioni di i so moduli.

Vuleriamu vede una versione fresca cù u settore necessariu di moduli, in esecuzione sottu una distribuzione Linux specifica. In u nostru casu, questi sò sistemi basati in deb è rpm. L'opzione cù cuntenituri ùn hè micca cunsideratu in questu articulu.

Vulemu cambià rapidamente a funziunalità di i nostri balancers. È quì hè subitu a quistione: cumu si pò ottene questu mentre spende quant'è pocu risorse pussibule? Saria ancu megliu di stallà u prucessu in modu chì pudemu specificà un nùmeru finitu di parametri di input, è à l'output riceve un artefattu in forma di un pacchettu deb / rpm per u SO desideratu.

In u risultatu, una quantità di prublemi ponu esse formulati:

  • Ùn ci sò micca sempre pacchetti cù l'ultima versione di Nginx.
  • Ùn ci sò micca pacchetti cù i moduli necessarii.
  • Cumpilà è custruisce un pacchettu manualmente richiede tempu è ghjustu fastidiosu.
  • Ùn ci hè micca descrizzione di cumu questu o quellu esempiu Nginx hè assemblatu.

Per risolve questi prublemi, hè bisognu di un strumentu chì piglià cum'è input una specificazione in un formatu leggibile da l'omu è assemble un pacchettu Nginx cù e funziunalità necessariu basatu annantu à questu.

Ùn truvamu micca una opzione adatta per noi nantu à l'immensità di Github, avemu decisu di creà u nostru propiu strumentu - nginx-builder.

Quaternu

In u nostru strumentu, avemu vulutu creà una descrizzione di l'specificazione in forma di codice, chì pò esse messu in un repository Git. Per fà questu, avemu sceltu u formatu familiar per tali cose - yaml. Esempiu di specificazione:

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

Quì avemu indicatu chì vulemu vede un pacchettu deb cù a versione Nginx 1.14.2 cù u settore di moduli necessariu. A seccione cù i moduli hè opzionale. Per ognunu di elli pudete stabilisce:

  • Nome.
  • Indirizzu induve pudete ottene:
    • Repository Git. Pudete ancu specificà un ramu o tag.
    • Archive web link.
    • Link locale à l'archiviu.

Certi moduli necessitanu dipendenze supplementari per esse installati, per esempiu nginx-auth-ldap richiede libldap2-dev installatu. I dependenzii necessarii ponu ancu esse specificati quandu descrive u modulu.

Ambiente

In u nostru strumentu pudete ottene rapidamente un ambiente cù utilità installate per a compilazione, l'assemblea di pacchetti è altri software ausiliari. Un containeru Docker cù tuttu ciò chì avete bisognu hè ideale quì (u repository hà digià un paru di esempi di schedari Docker per ubuntu è centos).

Dopu chì a specificazione hè stata elaborata è l'ambiente hè preparatu, lanciamu u nostru costruttore, avè installatu prima e so dipendenze:

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

U numeru di rivisione quì hè opzionale è hè utilizatu per l'assemblee di versione. Hè scrittu in a meta infurmazione di u pacchettu, facendu faciule d'aghjurnà in i servitori.
Da i logs pudete monitorà ciò chì succede. Eccu un esempiu di i punti principali:

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'.

Allora, cù solu un paru di cumandamenti, creemu l'ambiente è l'assemblea Nginx necessaria, è u pacchettu appare in u cartulare da induve u script hè lanciatu.

Incrustà

Pudemu ancu integrà u nostru strumentu in i prucessi CI / CD. Qualchese di i tanti sistemi CI esistenti oghje pò aiutà cun questu, per esempiu Teamcity o Gitlab CI.

In u risultatu, ogni volta chì a specificazione cambia in u repository Git, a custruzione di l'artefattu hè automaticamente lanciata. U numeru di rivisione hè ligatu à u contatore di lanciamentu di custruzzione.
Cù un pocu di più tempu, pudete cunfigurà l'artefattu per esse mandatu à u vostru pacchettu lucale, Nexus, Artifactory, etc.

Un vantaghju supplementu hè chì u schedariu di cunfigurazione yaml pò esse cunnessu à Ansible o à un altru sistema di cunfigurazione automatica, è da quì pudemu piglià u numeru di versione è u tipu di pacchettu chì vulemu implementà.

Chì vene

U prugettu ùn hè ancu finitu. Eccu ciò chì avemu travagliatu avà:

  • Ampliemu a pussibilità di cunfigurazione, ma à u stessu tempu mantene u più simplice pussibule. Ùn vulete micca definisce mille paràmetri s'ellu avete bisognu di dui solu, è u restu si mette in modu predeterminatu. Questu include bandieri di compilazione (ora pudete cambià in u schedariu di cunfigurazione internu src/config.py), a strada di installazione è l'utilizatore di lanciamentu.
  • Avemu aghjustatu opzioni per mandà automaticamente un pacchettu à diversi repositori di artefatti.
  • Eseguite un cumandamentu persunalizatu quandu caricate un modulu (per esempiu, per aduprà github.com/nginx-modules/nginx_upstream_check_module duvete prima applicà un patch di una versione specifica)
  • Aghjunghjite testi:
    • U pacchettu hè stallatu currettamente.
    • Nginx hà a versione necessaria è hè custruitu cù e bandiere è moduli necessarii.
    • I chjassi necessarii, cunti, è cusì sò creati.

Ma pudete aduprà sta strumentu avà, è ancu suggerisce migliurà - github.com/TinkoffCreditSystems/Nginx-builder benvenutu!

Source: www.habr.com

Add a comment