Nginx-imizi bir neçə əmrlə yığırıq

Привет!
Mənim adım Sergey, mən tinkoff.ru platformasının API komandasında infrastruktur mühəndisi işləyirəm.

Bu yazıda komandamızın əsasında balanslaşdırıcılar hazırlayarkən qarşılaşdığı problemlərdən danışacağam Nginx müxtəlif layihələr üçün. Onların əksəriyyətinin öhdəsindən gəlməyə imkan verən vasitə haqqında da sizə məlumat verəcəyəm.

Nginx çoxfunksiyalı və aktiv şəkildə inkişaf edən proxy serverdir. Çox sayda modula malikdir, bu tam siyahı deyil. Hər bir layihə balanslaşdırıcının funksionallığına və Nginx versiyasına (məsələn, http/2 və grpc proxyinqinin olması) və onun modullarının tərkibinə müəyyən tələblər qoyur.

Biz müəyyən bir Linux paylanması altında işləyən tələb olunan modul dəsti ilə yeni versiya görmək istərdik. Bizim vəziyyətimizdə bunlar debi və rpm əsaslı sistemlərdir. Bu məqalədə konteynerlərlə seçim nəzərdən keçirilmir.

Biz balanslaşdırıcılarımızın funksionallığını tez dəyişmək istəyirik. Və burada dərhal sual yaranır: mümkün qədər az resurs sərf edərkən buna necə nail olmaq olar? Prosesi elə qurmaq daha yaxşı olardı ki, sonlu sayda giriş parametrlərini təyin edək və çıxışda istədiyiniz ƏS üçün deb/rpm paketi şəklində artefakt ala bilək.

Nəticədə, bir sıra problemlər formalaşdırıla bilər:

  • Nginx-in ən son versiyası olan paketlər həmişə olmur.
  • Tələb olunan modulları olan paketlər yoxdur.
  • Paketi əl ilə tərtib etmək və qurmaq çox vaxt aparır və tamamilə yorucudur.
  • Bu və ya digər Nginx instansiyasının necə yığıldığına dair heç bir təsvir yoxdur.

Bu problemləri həll etmək üçün insan tərəfindən oxuna bilən formatda spesifikasiyanı daxil edən və onun əsasında lazımi funksionallığı olan Nginx paketini yığan alətə ehtiyac yaranır.

Github-un genişliyində bizim üçün uyğun bir seçim tapmadıq, öz alətimizi yaratmağa qərar verdik - nginx qurucusu.

Xüsusiyyətlər

Alətimizdə biz kod şəklində spesifikasiyanın təsvirini yaratmaq istədik, sonra onu Git repozitoriyasına yerləşdirmək olar. Bunun üçün belə şeylərə tanış olan formatı seçdik - yaml. Spesifikasiya nümunəsi:

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

Burada Nginx 1.14.2 versiyası ilə tələb olunan modul dəsti ilə deb paketi görmək istədiyimizi bildiririk. Modulları olan bölmə isteğe bağlıdır. Onların hər biri üçün təyin edə bilərsiniz:

  • Ad
  • Əldə edə biləcəyiniz ünvan:
    • Git deposu. Siz həmçinin filial və ya etiketi təyin edə bilərsiniz.
    • Arxiv veb linki.
    • Arxivə yerli keçid.

Bəzi modullar əlavə asılılıqların quraşdırılmasını tələb edir, məsələn nginx-auth-ldap libldap2-dev-in quraşdırılmasını tələb edir. Modulu təsvir edərkən zəruri asılılıqlar da göstərilə bilər.

Ətraf mühit

Alətimizdə siz kompilyasiya, paketlərin yığılması və digər köməkçi proqramlar üçün quraşdırılmış utilitləri olan mühiti tez bir zamanda əldə edə bilərsiniz. Lazım olan hər şeyi olan Docker konteyneri burada idealdır (anbarda artıq ubuntu və centos üçün Docker fayllarının bir neçə nümunəsi var).

Spesifikasiya tərtib edildikdən və mühit hazırlandıqdan sonra biz onun asılılıqlarını əvvəlcədən quraşdıraraq qurucumuzu işə salırıq:

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

Buradakı təftiş nömrəsi isteğe bağlıdır və montajların versiyalaşdırılması üçün istifadə olunur. O, paketin meta məlumatlarına yazılıb, serverlərdə yeniləməyi asanlaşdırır.
Qeydlərdən nə baş verdiyini izləyə bilərsiniz. Budur əsas məqamlara bir nümunə:

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

Beləliklə, sadəcə bir neçə əmrlə mühiti və tələb olunan Nginx montajını yaradırıq və paket skriptin işə salındığı qovluqda görünür.

Yerləşdirmə

Biz həmçinin alətimizi CI/CD proseslərinə inteqrasiya edə bilərik. Bu gün mövcud olan bir çox CI sistemlərindən hər hansı biri, məsələn, buna kömək edə bilər Komanda şəhəri və ya Gitlab CI.

Nəticədə, Git deposunda spesifikasiya hər dəfə dəyişdikdə, artefaktın qurulması avtomatik olaraq işə salınır. Təftiş nömrəsi qurma başlanğıc sayğacı ilə əlaqələndirilir.
Bir az daha çox vaxt sərf edərək, artefaktı yerli paket deponuza, Nexus, Artifactory və s.-ə göndəriləcək şəkildə konfiqurasiya edə bilərsiniz.

Əlavə üstünlük ondan ibarətdir ki, yaml konfiqurasiya faylı Ansible və ya başqa bir avtomatik konfiqurasiya sisteminə qoşula bilər və oradan yerləşdirmək istədiyimiz versiya nömrəsini və paket tipini götürə bilərik.

Nədir?

Layihə hələ tamamlanmayıb. İndi üzərində işlədiyimiz budur:

  • Biz konfiqurasiya imkanlarını genişləndiririk, lakin eyni zamanda onu mümkün qədər sadə saxlayırıq. Yalnız ikiyə ehtiyacınız varsa, min parametr təyin etmək istəmirsiniz, qalanları isə standart olaraq uyğun gəlir. Buraya kompilyasiya bayraqları (indi onları src/config.py daxili konfiqurasiya faylında dəyişə bilərsiniz), quraşdırma yolu və işə salma istifadəçisi daxildir.
  • Paketi müxtəlif artefakt anbarlarına avtomatik göndərmək üçün seçimlər əlavə edirik.
  • Modulu yükləyərkən xüsusi əmri yerinə yetirin (məsələn, istifadə etmək üçün github.com/nginx-modules/nginx_upstream_check_module əvvəlcə müəyyən bir versiyanın yamasını tətbiq etməlisiniz)
  • Testlərin əlavə edilməsi:
    • Paket düzgün quraşdırılıb.
    • Nginx tələb olunan versiyaya malikdir və tələb olunan bayraqlar və modullarla qurulub.
    • Lazım olan yollar, hesablar və s. yaradılır.

Ancaq indi bu alətdən istifadə edə bilərsiniz, həmçinin təkmilləşdirmələr təklif edə bilərsiniz - github.com/TinkoffCreditSystems/Nginx-builder xoş gəlmisiniz!

Mənbə: www.habr.com

Добавить комментарий