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