Panime oma Nginxi kokku paari käsuga

Tere!
Minu nimi on Sergei, töötan platvormi tinkoff.ru API meeskonnas infrastruktuuriinsenerina.

Selles artiklis räägin probleemidest, millega meie meeskond tasakaalustusseadmeid ette valmistades kokku puutus nginx erinevate projektide jaoks. Räägin teile ka tööriistast, mis võimaldas mul enamikust neist üle saada.

Nginx on multifunktsionaalne ja aktiivselt arenev puhverserver. Sellel on suur hulk mooduleid, see pole täielik nimekiri. Iga projekt seab teatud nõuded tasakaalustaja ja Nginxi versiooni funktsionaalsusele (näiteks http/2 ja grpc puhverserveri olemasolu) ning selle moodulite koostisele.

Soovime näha värsket versiooni koos vajaliku moodulite komplektiga, mis töötaks konkreetse Linuxi distributsiooni all. Meie puhul on need deb- ja rpm-põhised süsteemid. Konteinerite valikut selles artiklis ei käsitleta.

Soovime kiiresti muuta oma tasakaalustajate funktsionaalsust. Ja siin tekib kohe küsimus: kuidas seda saavutada, kulutades võimalikult vähe ressursse? Veelgi parem oleks protsess seadistada nii, et saaksime määrata lõpliku arvu sisendparameetreid ja väljundis saada soovitud OS-i jaoks artefakti deb/rpm paketi kujul.

Selle tulemusena saab sõnastada mitmeid probleeme:

  • Nginxi uusima versiooniga pakette pole alati saadaval.
  • Vajalike moodulitega pakette pole.
  • Paketi käsitsi koostamine ja koostamine on aeganõudev ja lausa tüütu.
  • Puudub kirjeldus selle või teise Nginxi eksemplari kokkupanemise kohta.

Nende probleemide lahendamiseks tekib vajadus tööriista järele, mis võtaks sisendiks inimesele loetavas vormingus spetsifikatsiooni ja koostaks selle põhjal Nginxi paketi koos vajaliku funktsionaalsusega.

Kuna Githubi avarustest meile sobivat valikut ei leidnud, otsustasime luua oma tööriista - nginx-ehitaja.

Tehnilised nõuded

Tahtsime oma tööriistas luua spetsifikatsiooni kirjelduse koodi kujul, mille saab seejärel panna Giti hoidlasse. Selleks valisime selliste asjade jaoks tuttava formaadi - yaml. Spetsifikatsiooni näide:

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

Siin näitame, et tahame näha deb-paketti Nginxi versiooniga 1.14.2 koos nõutud moodulite komplektiga. Moodulitega sektsioon on valikuline. Igaühele neist saate määrata:

  • Nimi.
  • Aadress, kust selle kätte saab:
    • Giti hoidla. Samuti saate määrata haru või sildi.
    • Arhiivi veebilink.
    • Kohalik link arhiivile.

Mõne mooduli installimiseks on vaja täiendavaid sõltuvusi, näiteks nginx-auth-ldap nõuab libldap2-dev installimist. Vajalikud sõltuvused saab määrata ka mooduli kirjeldamisel.

Ümbruskond

Meie tööriistaga saate kiiresti hankida installitud utiliitidega keskkonna kompileerimiseks, pakettide kokkupanekuks ja muuks abitarkvaraks. Siin sobib ideaalselt Dockeri konteiner kõige vajalikuga (hoidlas on juba paar näidet Dockeri failidest ubuntu ja centose jaoks).

Pärast spetsifikatsiooni koostamist ja keskkonna ettevalmistamist käivitame oma ehitaja, olles eelnevalt paigaldanud selle sõltuvused:

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

Siin olev versiooninumber on valikuline ja seda kasutatakse komplektide versioonide koostamiseks. See on kirjutatud paketi metateabesse, muutes selle serverites värskendamise lihtsaks.
Logidest saab toimuvat jälgida. Siin on näide põhipunktidest:

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

Seega loome vaid paari käsuga keskkonna ja vajaliku Nginxi koostu ning pakett ilmub kataloogi, kust skript käivitatakse.

Manustamine

Samuti saame oma tööriista integreerida CI/CD protsessidesse. Näiteks mis tahes paljudest tänapäeval olemasolevatest CI-süsteemidest võib selles aidata Teamcity või Gitlab CI.

Selle tulemusena käivitatakse artefakti ehitamine automaatselt iga kord, kui spetsifikatsioonid Giti hoidlas muutuvad. Redaktsiooninumber on lingitud järgu käivitamise loenduriga.
Veidi rohkem aega saate konfigureerida artefakti, mis saadetakse teie kohalikku paketihoidlasse, Nexusesse, Artifactorysse jne.

Täiendavaks eeliseks on see, et yamli konfiguratsioonifaili saab ühendada Ansible või mõne muu automaatse konfiguratsioonisüsteemiga ning sealt saame kasutusele võtta versiooninumbri ja paketi tüübi, mida soovime juurutada.

mis edasi

Projekt pole veel lõppenud. Siin on see, mille kallal me praegu töötame:

  • Laiendame konfigureerimise võimalust, kuid samal ajal hoiame selle võimalikult lihtsana. Kui vajate ainult kahte, ei soovi te tuhandet parameetrit määratleda ja ülejäänud sobivad vaikimisi. See hõlmab kompileerimislippe (nüüd saate neid muuta sisemises konfiguratsioonifailis src/config.py), installitee ja kasutaja käivitamise.
  • Lisame valikud paketi automaatseks saatmiseks erinevatesse artefaktihoidlatesse.
  • Käivitage mooduli laadimisel kohandatud käsk (näiteks kasutamiseks github.com/nginx-modules/nginx_upstream_check_module peate esmalt rakendama konkreetse versiooni plaastri)
  • Testide lisamine:
    • Pakett on õigesti installitud.
    • Nginxil on vajalik versioon ja see on ehitatud vajalike lippude ja moodulitega.
    • Luuakse vajalikud teed, kontod jne.

Kuid saate seda tööriista nüüd kasutada ja ka parandusi soovitada - github.com/TinkoffCreditSystems/Nginx-builder tere tulemast!

Allikas: www.habr.com

Lisa kommentaar