Ons stel ons Nginx saam met 'n paar opdragte

Привет!
My naam is Sergey, ek werk as 'n infrastruktuuringenieur in die API-span van die tinkoff.ru-platform.

In hierdie artikel sal ek praat oor die probleme waarmee ons span te kampe gehad het met die voorbereiding van balanseerders gebaseer op Nginx vir verskeie projekte. Ek sal jou ook vertel van die instrument wat my toegelaat het om die meeste van hulle te oorkom.

Nginx is 'n multifunksionele en aktief ontwikkelende instaanbediener. Dit bevat 'n groot aantal modules, dit is nie 'n volledige lys nie. Elke projek stel sekere vereistes aan die funksionaliteit van die balanseerder en die weergawe van Nginx (byvoorbeeld die teenwoordigheid van http/2 en grpc proxying), en die samestelling van sy modules.

Ons wil graag 'n vars weergawe met die vereiste stel modules sien wat onder 'n spesifieke Linux-verspreiding loop. In ons geval is dit deb- en rpm-gebaseerde stelsels. Die opsie met houers word nie in hierdie artikel oorweeg nie.

Ons wil die funksionaliteit van ons balanseerders vinnig verander. En hier ontstaan ​​die vraag dadelik: hoe om dit te bereik terwyl so min moontlik hulpbronne bestee word? Dit sal selfs beter wees om die proses op te stel sodat ons 'n eindige aantal invoerparameters kan spesifiseer, en by die uitset 'n artefak in die vorm van 'n deb/rpm-pakket vir die verlangde bedryfstelsel kan ontvang.

As gevolg hiervan kan 'n aantal probleme geformuleer word:

  • Daar is nie altyd pakkette met die nuutste weergawe van Nginx nie.
  • Daar is geen pakkette met die vereiste modules nie.
  • Om 'n pakket met die hand saam te stel en te bou is tydrowend en ronduit vervelig.
  • Daar is geen beskrywing van hoe hierdie of daardie Nginx-instansie saamgestel word nie.

Om hierdie probleme op te los, ontstaan ​​die behoefte aan 'n instrument wat 'n spesifikasie in 'n mens-leesbare formaat as invoer sal neem en 'n Nginx-pakket saamstel met die nodige funksionaliteit wat daarop gebaseer is.

Omdat ons nie 'n geskikte opsie vir ons op die uitgestrekte Github gevind het nie, het ons besluit om ons eie instrument te skep - nginx-bouer.

Spesifikasies

In ons instrument wou ons 'n beskrywing van die spesifikasie skep in die vorm van kode, wat dan in 'n Git-bewaarplek geplaas kan word. Om dit te doen, het ons die bekende formaat vir sulke dinge gekies - yaml. Spesifikasie voorbeeld:

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

Hier dui ons aan dat ons 'n deb-pakket wil sien met Nginx weergawe 1.14.2 met die vereiste stel modules. Die afdeling met modules is opsioneel. Vir elkeen van hulle kan jy instel:

  • Naam.
  • Adres waar jy dit kan kry:
    • Git-bewaarplek. Jy kan ook 'n tak of merker spesifiseer.
    • Argief webskakel.
    • Plaaslike skakel na die argief.

Sommige modules vereis bykomende afhanklikhede om geïnstalleer te word, byvoorbeeld nginx-auth-ldap vereis dat libldap2-dev geïnstalleer is. Nodige afhanklikhede kan ook gespesifiseer word wanneer die module beskryf word.

Die omgewing

In ons instrument kan jy vinnig 'n omgewing kry met geïnstalleerde nutsprogramme vir samestelling, pakketsamestelling en ander bykomende sagteware. 'n Docker-houer met alles wat u nodig het, is hier ideaal (die bewaarplek het reeds 'n paar voorbeelde van Docker-lêers vir ubuntu en centos).

Nadat die spesifikasie opgestel is en die omgewing voorberei is, begin ons ons bouer, nadat ons voorheen sy afhanklikhede geïnstalleer het:

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

Die hersieningsnommer hier is opsioneel en word gebruik vir weergawesamestellings. Dit word in die pakket se meta-inligting geskryf, wat dit maklik maak om op bedieners op te dateer.
Van die logs kan jy monitor wat gebeur. Hier is 'n voorbeeld van die hoofpunte:

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

Dus, met net 'n paar opdragte, skep ons die omgewing en die vereiste Nginx-samestelling, en die pakket verskyn in die gids vanwaar die skrip geloods word.

Inbedding

Ons kan ook ons ​​instrument in CI/CD-prosesse integreer. Enige van die vele CI-stelsels wat vandag bestaan, kan byvoorbeeld hiermee help Spanstad of Gitlab CI.

As gevolg hiervan, elke keer as die spesifikasie in die Git-bewaarplek verander, word die bou van die artefak outomaties geloods. Die hersieningsnommer is gekoppel aan die bou-bekendstellingteller.
Met 'n bietjie meer tyd kan jy die artefak opstel om na jou plaaslike pakketbewaarplek, Nexus, Artifactory, ensovoorts gestuur te word.

'n Bykomende voordeel is dat die yaml-konfigurasielêer aan Ansible of 'n ander outomatiese konfigurasiestelsel gekoppel kan word, en van daar af kan ons die weergawenommer en pakkettipe neem wat ons wil ontplooi.

Wat is volgende?

Die projek is nog nie voltooi nie. Hier is waaraan ons nou werk:

  • Ons brei die moontlikheid van konfigurasie uit, maar hou dit terselfdertyd so eenvoudig as moontlik. Jy wil nie 'n duisend parameters definieer as jy net twee nodig het nie, en die res pas by verstek. Dit sluit samestellingsvlae in (nou kan jy dit verander in die interne konfigurasielêer src/config.py), installasiepad en begingebruiker.
  • Ons voeg opsies by om 'n pakket outomaties na verskeie artefakbewaarplekke te stuur.
  • Voer 'n pasgemaakte opdrag uit wanneer 'n module laai (byvoorbeeld om te gebruik github.com/nginx-modules/nginx_upstream_check_module jy moet eers 'n pleister van 'n spesifieke weergawe toepas)
  • Voeg toetse by:
    • Die pakket is korrek geïnstalleer.
    • Nginx het die vereiste weergawe en is gebou met die vereiste vlae en modules.
    • Die nodige paaie, rekeninge, ensovoorts word geskep.

Maar jy kan hierdie hulpmiddel nou gebruik, en ook verbeterings voorstel - github.com/TinkoffCreditSystems/Nginx-builder welkom!

Bron: will.com

Voeg 'n opmerking