Kokoamme Nginximme parilla komennolla

Hi!
Nimeni on Sergey, työskentelen infrastruktuuri-insinöörinä tinkoff.ru-alustan API-tiimissä.

Tässä artikkelissa puhun ongelmista, joita tiimimme kohtasi valmistaessaan tasapainoimia perustuen nginx erilaisiin projekteihin. Kerron sinulle myös työkalusta, jonka avulla pystyin voittamaan useimmat niistä.

Nginx on monitoiminen ja aktiivisesti kehittyvä välityspalvelin. Siinä on suuri määrä moduuleja, tämä ei ole täydellinen luettelo. Jokainen projekti asettaa tiettyjä vaatimuksia tasapainottimen toimivuudelle ja Nginx-versiolle (esimerkiksi http/2- ja grpc-välityspalvelimen läsnäolo) ja sen moduulien koostumukselle.

Haluaisimme nähdä uuden version, jossa on tarvittavat moduulit ja joka toimii tietyssä Linux-jakelussa. Meidän tapauksessamme nämä ovat deb- ja rpm-pohjaisia ​​järjestelmiä. Tässä artikkelissa ei käsitellä vaihtoehtoa säiliöiden kanssa.

Haluamme muuttaa nopeasti tasapainottimiemme toimintoja. Ja tässä herää heti kysymys: kuinka saavuttaa tämä käyttämällä mahdollisimman vähän resursseja? Vielä parempi olisi asettaa prosessi niin, että voimme määrittää rajallisen määrän tuloparametreja ja vastaanottaa lähdössä artefaktin deb/rpm-paketin muodossa halutulle käyttöjärjestelmälle.

Tämän seurauksena voidaan muotoilla useita ongelmia:

  • Nginxin uusimmalla versiolla ei aina ole paketteja.
  • Tarvittavia moduuleja sisältäviä paketteja ei ole.
  • Paketin manuaalinen kokoaminen ja rakentaminen on aikaa vievää ja suorastaan ​​työlästä.
  • Ei ole kuvausta siitä, kuinka tämä tai toinen Nginx-ilmentymä kootaan.

Näiden ongelmien ratkaisemiseksi syntyy tarve työkalulle, joka ottaisi syötteeksi ihmisen luettavassa muodossa olevan spesifikaation ja koottaisi sen pohjalta Nginx-paketin tarvittavin toiminnoineen.

Koska Githubin laajuudesta ei löytynyt meille sopivaa vaihtoehtoa, päätimme luoda oman työkalumme - nginx-rakennusohjelma.

Tekniset tiedot

Halusimme työkalussamme luoda määrittelyn kuvauksen koodin muodossa, joka voidaan sitten laittaa Git-arkistoon. Tätä varten valitsimme sellaisille asioille tutun muodon - yaml. Esimerkki spesifikaatiosta:

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

Tässä osoitamme, että haluamme nähdä deb-paketin, jossa on Nginx-versio 1.14.2 ja vaaditut moduulit. Osa moduuleista on valinnainen. Jokaiselle niistä voit määrittää:

  • Nimi.
  • Osoite, josta sen saa:
    • Git arkisto. Voit myös määrittää haaran tai tunnisteen.
    • Arkistoi verkkolinkki.
    • Paikallinen linkki arkistoon.

Jotkut moduulit vaativat lisäriippuvuuksien asentamista, esimerkiksi nginx-auth-ldap vaatii libldap2-devin asentamisen. Tarvittavat riippuvuudet voidaan myös määritellä moduulia kuvattaessa.

Ympäristö

Työkalullamme saat nopeasti ympäristön, jossa on asennettuja apuohjelmia kääntämistä, pakettien kokoonpanoa ja muita apuohjelmia varten. Docker-säilö, jossa on kaikki tarvitsemasi, on ihanteellinen tähän (arkistossa on jo pari esimerkkiä Docker-tiedostoista ubuntulle ja centokselle).

Kun spesifikaatio on laadittu ja ympäristö valmis, lanseeraamme rakentajamme, joka on aiemmin asentanut sen riippuvuudet:

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

Tässä oleva versionumero on valinnainen, ja sitä käytetään kokoonpanojen versiointiin. Se on kirjoitettu paketin metatietoihin, joten se on helppo päivittää palvelimilla.
Lokeista voit seurata, mitä tapahtuu. Tässä on esimerkki tärkeimmistä kohdista:

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

Joten luomme vain parilla komennolla ympäristön ja tarvittavan Nginx-kokoonpanon, ja paketti ilmestyy hakemistoon, josta komentosarja käynnistetään.

Upottaminen

Voimme myös integroida työkalumme CI/CD-prosesseihin. Mikä tahansa monista nykyisistä CI-järjestelmistä voi auttaa esimerkiksi tässä Teamcity tai Gitlab CI.

Tämän seurauksena joka kerta, kun määritykset muuttuvat Git-arkistossa, artefaktin koontiversio käynnistetään automaattisesti. Versionumero on linkitetty koontiversion käynnistyslaskuriin.
Vähän enemmän aikaa voit määrittää lähetettävän artefaktin paikalliseen pakettivarastoon, Nexukseen, Artifactoryyn ja niin edelleen.

Lisäetuna on, että yaml-määritystiedosto voidaan liittää Ansibleen tai muuhun automaattiseen konfigurointijärjestelmään, josta voimme ottaa käyttöön versionumeron ja pakettityypin, jonka haluamme ottaa käyttöön.

Mitä seuraavaksi

Hanke ei ole vielä valmis. Työskentelemme nyt tässä:

  • Laajennamme konfigurointimahdollisuutta, mutta samalla pidämme sen mahdollisimman yksinkertaisena. Et halua määrittää tuhatta parametria, jos tarvitset vain kaksi, ja loput sopivat oletusarvoisesti. Tämä sisältää käännösliput (nyt voit muuttaa niitä sisäisessä määritystiedostossa src/config.py), asennuspolun ja käynnistää käyttäjän.
  • Lisäämme vaihtoehtoja paketin automaattiseen lähettämiseen erilaisiin artefaktivarastoihin.
  • Suorita mukautettu komento, kun lataat moduulia (esimerkiksi käyttääksesi github.com/nginx-modules/nginx_upstream_check_module sinun on ensin asennettava tietyn version korjaustiedosto)
  • Testien lisääminen:
    • Paketti on asennettu oikein.
    • Nginxillä on vaadittu versio, ja se on rakennettu vaadituilla lipuilla ja moduuleilla.
    • Tarvittavat polut, tilit ja niin edelleen luodaan.

Mutta voit käyttää tätä työkalua nyt ja ehdottaa myös parannuksia - github.com/TinkoffCreditSystems/Nginx-builder Tervetuloa!

Lähde: will.com

Lisää kommentti