Néhány paranccsal összeállítjuk az Nginxünket

Hi!
A nevem Sergey, infrastruktúra mérnökként dolgozom a tinkoff.ru platform API csapatában.

Ebben a cikkben azokról a problémákról fogok beszélni, amelyekkel csapatunk szembesült az egyensúlyozók elkészítésekor nginx különféle projektekhez. Mesélek arról az eszközről is, amely lehetővé tette, hogy legyőzzem a legtöbbet.

Az Nginx egy többfunkciós és aktívan fejlődő proxyszerver. Számos modult tartalmaz, ez nem teljes lista. Minden projekt bizonyos követelményeket támaszt a kiegyenlítő funkcionalitásával és az Nginx verziójával (például a http/2 és a grpc proxy meglétével), valamint a moduljainak összetételével kapcsolatban.

Szeretnénk egy friss verziót látni a szükséges modulkészlettel, amely egy adott Linux disztribúció alatt fut. Esetünkben ezek deb- és rpm-alapú rendszerek. Ebben a cikkben nem foglalkozunk a konténerekkel való lehetőséggel.

Gyorsan szeretnénk változtatni kiegyensúlyozóink működésén. És itt rögtön felmerül a kérdés: hogyan lehet ezt elérni a lehető legkevesebb erőforrás elköltése mellett? Még jobb lenne úgy beállítani a folyamatot, hogy véges számú bemeneti paramétert adhassunk meg, és a kimeneten kapjunk egy műterméket deb/rpm csomag formájában a kívánt operációs rendszerhez.

Ennek eredményeként számos probléma megfogalmazható:

  • Nem mindig vannak csomagok az Nginx legújabb verziójával.
  • Nincsenek csomagok a szükséges modulokkal.
  • Egy csomag manuális összeállítása és összeállítása időigényes és kifejezetten unalmas.
  • Nincs leírás arról, hogy ez vagy az az Nginx-példány hogyan kerül összeállításra.

E problémák megoldásához szükség van egy olyan eszközre, amely bemenetként egy ember által olvasható formátumú specifikációt vesz, és az alapján összeállít egy Nginx csomagot a szükséges funkciókkal.

Mivel nem találtunk megfelelő lehetőséget a hatalmas Githubban, úgy döntöttünk, hogy elkészítjük saját eszközünket - nginx-építő.

Műszaki adatok

Eszközünkben a specifikáció leírását szerettük volna elkészíteni kód formájában, amit aztán egy Git repository-ba tehetünk. Ehhez az ilyen dolgokhoz ismerős formátumot választottuk - yaml. Példa a specifikációra:

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

Itt jelezzük, hogy szeretnénk látni egy Nginx 1.14.2-es verziójú deb csomagot a szükséges modulkészlettel. A modulokat tartalmazó rész nem kötelező. Mindegyikhez beállíthatja:

  • Név.
  • Cím ahol lehet kapni:
    • Git repository. Megadhat egy ágat vagy címkét is.
    • Archív web link.
    • Helyi link az archívumhoz.

Egyes modulok telepítéséhez további függőségek szükségesek, például az nginx-auth-ldap telepítéséhez szükséges a libldap2-dev. A modul leírásánál a szükséges függőségek is megadhatók.

A környezet

Eszközünkben gyorsan hozzáférhet egy olyan környezethez, amely telepített segédprogramokkal rendelkezik a fordításhoz, a csomagösszeállításhoz és egyéb segédszoftverekhez. Ideális itt egy Docker-tároló mindennel, amire szüksége van (a tárolóban már van néhány példa Docker-fájlra ubuntuhoz és centoshoz).

A specifikáció elkészítése és a környezet előkészítése után elindítjuk építtetőnket, előzetesen telepítve a függőségeit:

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

A verziószám itt nem kötelező, és az összeállítások verziózásához használatos. Be van írva a csomag metainformációiba, megkönnyítve a frissítést a szervereken.
A naplókból nyomon követheti, mi történik. Íme egy példa a főbb pontokra:

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

Így mindössze néhány paranccsal létrehozzuk a környezetet és a szükséges Nginx összeállítást, és a csomag megjelenik abban a könyvtárban, ahonnan a szkript elindul.

Beágyazás

Eszközünket integrálhatjuk a CI/CD folyamatokba is. Ebben például a sok ma létező CI-rendszer bármelyike ​​segíthet Teamcity vagy Gitlab CI.

Ennek eredményeként minden alkalommal, amikor a specifikáció megváltozik a Git-lerakatban, a műtermék buildje automatikusan elindul. A verziószám a build indítási számlálójához kapcsolódik.
Kicsit több idővel beállíthatja, hogy a műterméket elküldje a helyi csomagtárolóba, a Nexusba, az Artifactoryba stb.

További előny, hogy a yaml konfigurációs fájl Ansible-hez vagy más automatikus konfigurációs rendszerhez csatlakoztatható, és onnan vehetjük át a telepíteni kívánt verziószámot és csomagtípust.

Mi a következő

A projekt még nem fejeződött be. Most a következőn dolgozunk:

  • Bővítjük a konfiguráció lehetőségét, ugyanakkor a lehető legegyszerűbben tartjuk. Nem akarsz ezer paramétert megadni, ha csak kettőre van szükséged, és a többi alapértelmezés szerint belefér. Ez magában foglalja a fordítási jelzőket (most az src/config.py belső konfigurációs fájlban módosíthatja), a telepítési útvonalat és az indító felhasználót.
  • Lehetőségeket adunk a csomagok automatikus küldésére különböző műterméktárakba.
  • Egyéni parancs végrehajtása modul betöltésekor (például használatához github.com/nginx-modules/nginx_upstream_check_module először egy adott verzió javítását kell alkalmazni)
  • Tesztek hozzáadása:
    • A csomag megfelelően van telepítve.
    • Az Nginx rendelkezik a szükséges verzióval, és a szükséges zászlókkal és modulokkal készült.
    • Létrejönnek a szükséges utak, fiókok és így tovább.

De most már használhatja ezt az eszközt, és javasolhat fejlesztéseket is - github.com/TinkoffCreditSystems/Nginx-builder sziasztok!

Forrás: will.com

Hozzászólás