We zetten onze Nginx op met een paar commando's

Hallo!
Mijn naam is Sergey, ik werk als infrastructuur engineer in het API-platformteam van tinkoff.ru.

In dit artikel zal ik vertellen over de problemen waarmee ons team werd geconfronteerd bij het voorbereiden van load balancers op basis van Nginx voor verschillende projecten. Ik zal ook een tool bespreken die ons heeft geholpen om de meeste van deze problemen te overwinnen.

Nginx is een multifunctionele en actief ontwikkelende proxyserver. Het staat bekend om zijn vele modules, hier is een zeker niet volledige lijst. Elk project stelt specifieke eisen aan de functionaliteit van de load balancer en de versie van Nginx (zoals het hebben van http/2 en gRPC-proxying), en de samenstelling van de modules.

We willen een recente versie met de noodzakelijke set modules, werkend op een specifieke Linux-distributie. In ons geval zijn dat deb- en rpm-gebaseerde systemen. Het gebruik van containers wordt in dit artikel niet besproken.

We willen snel de functionaliteit van onze load balancers kunnen aanpassen. En hier rijst meteen de vraag — hoe kunnen we dat bereiken met zo min mogelijk middelen? Het zou nog beter zijn als we het proces zo kunnen inrichten dat we een eindig aantal invoerparameters kunnen opgeven en als output een artefact in de vorm van een deb/rpm-pakket voor het juiste OS krijgen.

Uiteindelijk kunnen we een aantal problemen formuleren:

  • Niet altijd zijn er pakketten met een recente versie van Nginx.
  • Er zijn geen pakketten met de benodigde modules.
  • Handmatig compileren en een pakket bouwen kost veel tijd en is gewoon vermoeiend.
  • Er is geen beschrijving van hoe een bepaalde instantie van Nginx is samengesteld.

Om deze problemen op te lossen, is er behoefte aan een bepaalde tool die een specificatie in een leesbaar formaat als invoer accepteert en een Nginx-pakket met de gewenste functionaliteit samenstelt.

Omdat we geen geschikte optie konden vinden op GitHub, besloten we om onze eigen tool te creĆ«ren — nginx-builder.

Specificaties

In onze tool wilden we een beschrijving van de specificatie in codevorm maken, die vervolgens in een Git-repository kan worden opgeslagen. Hiervoor kozen we een gangbaar formaat voor dergelijke zaken — yaml. Voorbeeld van een specificatie:

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 geven we aan dat we een deb-pakket met Nginx-versie 1.14.2 met de gewenste set modules willen zien. De sectie met modules is optioneel. Voor elk van hen kunnen we het volgende opgeven:

  • Naam.
  • Adres waar het te verkrijgen is:
    • Git-repository. We kunnen ook een tak of tag opgeven.
    • Weblink naar het archief.
    • Lokale link naar het archief.

Sommige modules vereisen de installatie van extra afhankelijkheden, bijvoorbeeld voor nginx-auth-ldap is libldap2-dev vereist. De noodzakelijke afhankelijkheden kunnen ook worden opgegeven bij de modulebeschrijving.

De omgeving

Met onze tool kunnen we snel een omgeving opzetten met de nodige hulpmiddelen voor compilatie, pakketbuilding en andere ondersteunende software. Een Docker-container met alles wat nodig is, is hier perfect geschikt (in de repository zijn al een paar voorbeelden van Docker-bestanden voor Ubuntu en CentOS).

Nadat de specificatie is opgesteld en de omgeving is voorbereid, starten we onze bouwer op, nadat we de afhankelijkheden hebben geĆÆnstalleerd:

pip3 install -r requirements.txt
./main.py build -f [config_file].yaml -r [revision_number]

Het revisienummer is hier optioneel en dient voor versiebeheer van builds. Het wordt vastgelegd in de metadata van het pakket, waardoor het eenvoudig is om het op servers te updaten.
In de logs kun je volgen wat er gebeurt. Hier is een voorbeeld van de belangrijkste punten:

builder - INFO - YAML-bestand parseren: example.config.yaml
builder - INFO - Scripts downloaden voor het bouwen van het deb-pakket
builder - INFO - Bezig met downloaden van nginx src...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Bezig met downloaden van 3e-partij modules...
builder - INFO - Module nginx-auth-ldap zal gedownload worden op basis van de branch
builder - INFO - -- Voltooid: nginx-auth-ldap
builder - INFO - -- Voltooid: ngx_http_substitutions_filter_module
builder - INFO - Module headers-more-nginx-module wordt gedownload
builder - INFO - Module nginx-module-vts zal gedownload worden op basis van de tag
builder - INFO - -- Voltooid: nginx-module-vts
builder - INFO - Module ngx_devel_kit zal gedownload worden op basis van de tag
builder - INFO - -- Voltooid: ngx_devel_kit
builder - INFO - -- Voltooid: ngx_cache_purge
builder - INFO - -- Voltooid: ngx_http_dyups_module
builder - INFO - Bezig met downloaden van afhankelijkheden
builder - INFO - .deb-pakket bouwen
builder - INFO - Bezig met uitvoeren van 'dh_make'...
builder - INFO - Bezig met uitvoeren van 'dpkg-buildpackage'...
dpkg-deb: pakket 'nginx' bouwen in '../nginx_1.14.1-1_amd64.deb'.

Met slechts een paar commando's creƫren we de omgeving en de benodigde Nginx-build, en verschijnt het pakket in de directory waar het script is uitgevoerd.

Inbouwen

We kunnen ons hulpmiddel ook in CI/CD-processen inbouwen. Dit kan met behulp van een van de vele bestaande CI-systemen, bijvoorbeeld de Teamcity of Gitlab CI.

Daardoor wordt bij elke wijziging van de specificatie in de Git-repository automatisch de build van het artefact gestart. Het revisienummer wordt gekoppeld aan de teller van de build-uitvoeringen.
Als we iets meer tijd besteden, kunnen we het artefact automatisch naar een lokale pakketrepository verzenden, zoals Nexus, Artifactory, enzovoort.

Een extra voordeel is dat het configuratie yaml-bestand kan worden gekoppeld aan Ansible of een ander automatiseringssysteem, en we kunnen daar het versienummer en het type pakket ophalen dat we willen implementeren.

Hier was eigenlijk een praktische sectie gepland met demonstratie van drie projecten op STM32 en STM8, speciaal voor dit artikel gemaakt met behulp van datasheets, met lampen, SPI, timers, PWM en interrupts:

Het project is nog niet voltooid. Hier zijn we momenteel mee bezig:

  • We breiden de configuratiemogelijkheden uit, maar willen het tegelijkertijd zo eenvoudig mogelijk houden. We willen geen duizend parameters definiĆ«ren als we er maar twee hoeven te hebben, en de rest prima is met de standaardwaarden. Dit betreft onder andere de compilatie-vlaggen (die momenteel kunnen worden gewijzigd in het interne configuratiebestand src/config.py), installatiepaden, gebruiker voor uitvoering.
  • We voegen opties toe voor het automatisch verzenden van het pakket naar verschillende opslagplaatsen voor artefacten.
  • Voer een gebruikerscommando uit bij het laden van de module (bijvoorbeeld voor gebruik github.com/nginx-modules/nginx_upstream_check_module moet eerst een patch van een specifieke versie worden toegepast)
  • We voegen het uitvoeren van testen toe:
    • Het pakket wordt correct geĆÆnstalleerd.
    • Nginx heeft de juiste versie en is opgebouwd met de vereiste vlaggen en modules.
    • De benodigde paden, accounts, enzovoort worden aangemaakt.

Maar u kunt deze tool nu al gebruiken en ook verbeteringen voorstellen — github.com/TinkoffCreditSystems/Nginx-builder welkom!

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster