Nginx felépítése pár parancssorral

Helló!
A nevem Szergej, infrastruktúra mérnökként dolgozom a tinkoff.ru API platforma csapatában.

Ebben a cikkben arról fogok beszélni, hogy milyen problémákkal szembesült a csapatunk a különböző projektekhez készült load balancerek előkészítése során. Nginx Emellett bemutatok egy eszközt, amely lehetővé tette, hogy a legtöbb problémát leküzdjük.

Az Nginx egy sokoldalú és folyamatosan fejlődő proxy szerver. Nagy számú modullal rendelkezik, ezért itt nem teljes lista található. Minden projekt bizonyos követelményeket támaszt a load balancer funkcionalitásával és az Nginx verziójával (például http/2 meglétével és grpc proxyzással) valamint a modulok együttesével kapcsolatban.

Szeretnénk, ha a friss verzió a szükséges modulokkal működne egy bizonyos Linux disztribútor alatt. Az esetünkben ez deb- és rpm-alapú rendszerek. A konténeres megoldás nem kerül szóba ebben a cikkben.

Fontos számunkra, hogy gyorsan változtathassuk a load balancereink funkcionalitását. Itt azonnal felmerül a kérdés — hogyan érhetjük el mindezt, hogy a lehető legkevesebb erőforrást használjuk? Jobb lenne, ha a folyamatot úgy tudnánk kialakítani, hogy megadhassunk egy végső számú bemeneti paramétert, és a kimenetként egy deb/rpm csomagot kapjunk a kívánt operációs rendszerhez.

Végül egy sor problémát megfogalmazhatunk:

  • Nem mindig állnak rendelkezésre friss Nginx verziójú csomagok.
  • Nincs elérhető csomag a szükséges modulokkal.
  • A kézi fordítás és csomagépítés sok időt igényel, és egyszerűen kimerítő.
  • Nincs leírás arról, hogyan készült az adott Nginx példány.

Ezeknek a problémáknak a megoldására szükség van egy eszközre, amely emberi olvasásra alkalmas formátumban várná a specifikációt, és az alapján összeszerelné a szükséges funkcionalitással rendelkező Nginx csomagot.

Miután nem találtunk megfelelő megoldást a GitHubon, úgy döntöttünk, hogy létrehozunk saját eszközünket — nginx-builder.

Specifikációk

Eszközünkben a specifikációkat kód formájában szeretnénk létrehozni, amelyet aztán Git-tárolóba helyezhetünk. Ehhez a hasonló esetekhez szokásos yaml formátumot választottuk. A specifikáció példája:

nginx_verzió: 1.14.1
kimeneti_csomag: deb
modulok:
  - modul:
      név: nginx-auth-ldap
      git_url: https://github.com/kvspb/nginx-auth-ldap.git
      git_branch: master
      függőségek:
        - libldap2-dev
  - modul:
      név: ngx_http_substitutions_filter_module
      git_url: https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
  - modul:
      név: headers-more-nginx-module
      web_url: https://github.com/openresty/headers-more-nginx-module/archive/v0.261.zip
  - modul:
      név: nginx-module-vts
      git_url: https://github.com/vozlt/nginx-module-vts.git
      git_tag: v0.1.18
  - modul:
      név: ngx_devel_kit
      git_url: https://github.com/simplresty/ngx_devel_kit.git
      git_tag: v0.3.0
  - modul:
      név: ngx_cache_purge
      git_url: https://github.com/FRiCKLE/ngx_cache_purge.git
  - modul:
      név: ngx_http_dyups_module
      git_url: https://github.com/yzprofile/ngx_http_dyups_module.git
  - modul:
      név: nginx-brotli
      git_url: https://github.com/eustas/ngx_brotli.git
      git_tag: v0.1.2
  - modul:
      név: nginx_upstream_check_module
      git_url: https://github.com/yaoweibin/nginx_upstream_check_module.git
  - modul:
      név: njs
      git_url: https://github.com/nginx/njs.git
      git_tag: 0.2.5
      config_folder_path: nginx

Itt megadjuk, hogy deb csomagot szeretnénk látni az Nginx 1.14.2 verziójával a megfelelő modulok készletével. A modulok szekciója opcionális. Mindegyikhez megadható:

  • Név.
  • Cím, ahonnan megszerezhető:
    • Git-repozitórium. Meg lehet adni ágat vagy taget is.
    • Weblink az archívumhoz.
    • Helyi hivatkozás az archívumhoz.

Néhány modul további függőségek telepítését igényli, például az nginx-auth-ldap számára szükséges a telepített libldap2-dev. A szükséges függőségek szintén megadhatók a modul leírásában.

Környezet

Eszközünk segítségével gyorsan létrehozható a környezet a szükséges fordítóeszközökkel, csomaggyártási és egyéb segédprogramokkal. Ehhez a legjobban a docker-konténer illik, amely minden szükséges tartalommal rendelkezik (a repozitóriumban már található néhány példa docker fájl az ubuntu és centos számára).

Miután a specifikáció elkészült és a környezet előkészítve, elindítjuk a buildert, miután telepítettük a függőségeit:

pip3 install -r requirements.txt
./main.py build -f [konfig_fájl].yaml -r [revízió_száma]

A revíziószám itt opcionális, és a build verziózására szolgál. Ez bejegyzésre kerül a csomag meta-információiban, ami lehetővé teszi a könnyű frissítést a szervereken.
A naplók alapján figyelemmel kísérhető, ami történik. Itt van néhány alapvető elem példaként:

builder - INFO - Yaml fájl elemzése: example.config.yaml
builder - INFO - Script-ek letöltése a deb csomag létrehozásához
builder - INFO - NGINX forrás letöltése...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - 3d-s modulok letöltése...
builder - INFO - Az nginx-auth-ldap modul ágat letölt
builder - INFO - -- Kész: nginx-auth-ldap
builder - INFO - -- Kész: ngx_http_substitutions_filter_module
builder - INFO - A headers-more-nginx-module modul letöltése folyamatban
builder - INFO - Az nginx-module-vts modul címke alapján töltődik le
builder - INFO - -- Kész: nginx-module-vts
builder - INFO - Az ngx_devel_kit címke alapján töltődik le
builder - INFO - -- Kész: ngx_devel_kit
builder - INFO - -- Kész: ngx_cache_purge
builder - INFO - -- Kész: ngx_http_dyups_module
builder - INFO - Függőségek letöltése
builder - INFO - .deb csomag készítése
builder - INFO - 'dh_make' futtatása...
builder - INFO - 'dpkg-buildpackage' futtatása...
dpkg-deb: az 'nginx' csomag építése a '..\/nginx_1.14.1-1_amd64.deb'-ben.

Így pár parancs segítségével létrehozzuk a környezetet és a szükséges NGINX buildet, és a csomag megjelenik abban a könyvtárban, ahonnan a szkript elindult.

Beillesztés

Ezenfelül integrálhatjuk eszközünket CI/CD folyamatokba. Ebben bármelyik létező CI rendszer segíthet, például Teamcity vagy Felhőplatformok.

Ennek eredményeként minden egyes specifikációváltozásnál automatikusan elindul az artefaktum buildelése a Git-tárhelyen. A revízió szám a build indítások számlálójához van kötve.
Egy kis időráfordítással beállítható az artefaktum helyi csomagtárba, például Nexusba, Artifactoryba való automatikus küldése.

További előny, hogy a konfigurációs yaml fájl csatlakoztatható Ansible-hoz vagy más automatikus konfiguráló rendszerhez, és leolvashatjuk belőle a verziószámot és a csomag típusát, amelyet telepíteni szeretnénk.

Mi következik

A projekt még nem fejeződött be. Az alábbiakon dolgozunk most:

  • A konfigurálhatóság lehetőségeit bővítjük, miközben megőrizzük a lehető legnagyobb egyszerűséget. Nem szeretnénk ezer paramétert megadni, ha csak kettő szükséges, és a többi megfelel az alapértelmezettnek. Ide tartoznak a fordítási zászlók (jelenleg ezek az src/config.py belső konfigurációs fájlban módosíthatók), telepítési utak, futtatásra szolgáló felhasználó.
  • Automatikus csomagküldési lehetőségeket adunk hozzá különböző artefaktumtárakba.
  • Felhasználói parancs végrehajtása a modul betöltésekor (például a használatához github.com/nginx-modules/nginx_upstream_check_module először egy adott verzió patch-ét kell alkalmazni)
  • Tesztelés hozzáadása:
    • A csomag helyesen települ.
    • A NGINX a szükséges verzióval és a kért zászlókkal és modulokkal van összeállítva.
    • Megfelelő utak, felhasználói fiókok stb. kerülnek létrehozásra.

De ezt az eszközt már most is használhatja, és javasolhatja a fejlesztéseket – github.com/TinkoffCreditSystems/Nginx-builder Üdvözöljük!

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster