Ikke en særlig god nyhed for dem, der bruger Canary- eller Dev-versionen af Microsoft Edges Chromium-baserede browser. Det rapporteres, at webbrowseren ikke fungerer korrekt med YouTube.

Hej!
Mit navn er Sergey, jeg arbejder som infrastrukturingeniør i API-teamet hos tinkoff.ru.

I denne artikel vil jeg fortælle om de udfordringer, vores team har mødt under forberedelsen af load balancere baseret på Nginx til forskellige projekter. Jeg vil også dele information om et værktøj, der gjorde det muligt at overvinde de fleste af dem.

Nginx er en multifunktionel og aktivt udviklende proxyserver. Den skiller sig ud med et stort antal moduler, her er ikke en udtømmende liste. Hvert projekt stiller bestemte krav til funktionaliteten af load balancer og versionen af Nginx (for eksempel tilgængelighed af http/2 og proxying af grpc), samt sammensætningen af dens moduler.

Vi ønsker at se en opdateret version med det nødvendige sæt af moduler, der kører på en bestemt Linux-distribution. I vores tilfælde er det deb- og rpm-baserede systemer. Muligheden med containere vil ikke blive behandlet i denne artikel.

Vi ønsker at kunne ændre funktionaliteten af vores load balancere hurtigt. Og her opstår straks spørgsmålet — hvordan kan vi gøre dette med så lidt ressourcer som muligt? Det ville også være optimalt at etablere en proces, hvor vi kunne bestemme et endeligt antal indgående parametre, og i udgangen få en artefakt i form af en deb/rpm-pakke til det ønskede operativsystem.

Sammenfattende kan vi formulere en række problemer:

  • Der er ikke altid pakker med den nyeste version af Nginx.
  • Der er ingen pakker med de nødvendige moduler.
  • Manuel kompilering og opbygning af pakken tager meget tid og er simpelthen trættende.
  • Der findes ingen dokumentation om, hvordan forskellige instanser af Nginx er bygget.

For at løse disse problemer, er der behov for et værktøj, der kan tage en specifikation i et menneskelæsbart format og skabe en Nginx-pakke med den ønskede funktionalitet.

Da vi ikke fandt en passende løsning på GitHub, besluttede vi at skabe vores eget værktøj — nginx-builder.

Specificationer

I vores værktøj ønskede vi at skabe en beskrivelse af specifikationen i form af kode, som derefter kan gemmes i et Git-repositorium. Derfor valgte vi det velkendte format til sådanne ting — yaml. Her er et eksempel på specifikationen:

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

Her angiver vi, at vi ønsker at se en deb-pakke med Nginx version 1.14.2 med det ønskede modulset. Sektionen med moduler er valgfri. For hver af dem kan man angive:

  • Navn.
  • Adresse, hvor den kan hentes:
    • Git-repo. Man kan også angive en gren eller en tag.
    • Weblink til arkivet.
    • Lokal link til arkivet.

Nogle moduler kræver installation af ekstra afhængigheder, for eksempel kræver nginx-auth-ldap, at libldap2-dev er installeret. Nødvendige afhængigheder kan også angives i modulbeskrivelsen.

Miljø

I vores værktøj kan man hurtigt få et miljø med installerede værktøjer til kompilering, pakkeopbygning og andet understøttende software. Her egner en docker-container sig perfekt (der er allerede et par eksempler på docker-filer til ubuntu og centos i repoet).

Når specifikationen er udarbejdet, og miljøet er sat op, starter vi vores byggeværktøj, efter at have installeret dets afhængigheder:

pip3 install -r requirements.txt
./main.py build -f [konfig_fil].yaml -r [revisions_nummer]

Revisionsnummeret er her valgfrit og bruges til versionering af bygninger. Det skrives ind i pakkens metadata, hvilket gør det nemt at opdatere det på servere.
Gennem logfilerne kan man følge med i, hvad der sker. Her er et eksempel på de vigtigste punkter:

builder - INFO - Parser yaml-fil: example.config.yaml
builder - INFO - Downloader scripts til bygning af deb-pakke
builder - INFO - Downloader nginx kilde...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Downloader 3d-party moduler...
builder - INFO - Modulet nginx-auth-ldap downloader efter gren
builder - INFO - -- Færdig: nginx-auth-ldap
builder - INFO - -- Færdig: ngx_http_substitutions_filter_module
builder - INFO - Modulet headers-more-nginx-module downloader
builder - INFO - Modulet nginx-module-vts downloader efter tag
builder - INFO - -- Færdig: nginx-module-vts
builder - INFO - Modulet ngx_devel_kit downloader efter tag
builder - INFO - -- Færdig: ngx_devel_kit
builder - INFO - -- Færdig: ngx_cache_purge
builder - INFO - -- Færdig: ngx_http_dyups_module
builder - INFO - Downloader afhængigheder
builder - INFO - Bygning af .deb-pakke
builder - INFO - Kører 'dh_make'...
builder - INFO - Kører 'dpkg-buildpackage'...
dpkg-deb: bygger pakke 'nginx' i '..\/nginx_1.14.1-1_amd64.deb'.

Så med bare et par kommandoer skaber vi miljøet og den nødvendige Nginx-build, og pakken dukker op i den mappe, hvor scriptet blev startet.

Integration

Vi kan også integrere vores værktøj i CI/CD-processer. Dette kan hjælpes af en hvilken som helst af de mange eksisterende CI-systemer i dag, for eksempel Teamcity eller Gitlab CI.

Resultatet er, at ved hver ændring af specifikationen i Git-repositoriet automatisk starter byggeren en artefakt. Versionsnummeret tilknyttes til tælleren af build-udførelser.
Ved at bruge lidt mere tid kan vi indstille artefaktens upload til et lokalt pakkerepositorium, Nexus, Artifactory, osv.

En ekstra fordel er, at konfigurationsyaml-filen kan tilsluttes i Ansible eller et andet system til automatisk konfiguration, og tage versionsnummeret og typen af pakken fra den, som vi ønsker at deployere.

vil være udsolgt

Projektet er endnu ikke afsluttet. Her er hvad vi arbejder på lige nu:

  • Vi udvider konfigurationsmulighederne, men samtidig holder vi det så simpelt som muligt. Vi ønsker ikke at definere tusind parametre, hvis der kun er behov for to, og resten er passende som standard. Dette omfatter kompilationsflager (i øjeblikket kan de ændres i den interne konfigurationsfil src/config.py), installationsveje, bruger til kørsel.
  • Vi tilføjer muligheder for automatisk upload af pakker til forskellige artefaktdepoter.
  • Udførelse af brugerdefinerede kommandoer ved indlæsningen af modulet (f.eks. for brug af github.com/nginx-modules/nginx_upstream_check_module er det nødvendigt først at anvende et patch af en bestemt version)
  • Vi tilføjer udførelsen af test:
    • Pakken installeres korrekt.
    • Nginx har den ønskede version og er bygget med de krævede flager og moduler.
    • De nødvendige veje, brugerkonti osv. oprettes.

Men kan allerede bruge dette værktøj nu, og også foreslå forbedringer — github.com/TinkoffCreditSystems/Nginx-builder velkommen!

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster