E ndërtojmë Nginx-in tonë me disa komanda

🥇Si të arrish në qiell dhe të bëhesh pilot | ProHoster
Quhem Sergej dhe punoj si inxhinier infrastrukture në ekipin e platformës API të tinkoff.ru.

Në këtë artikull do të flas për problemet me të cilat u përball ekipi ynë gjatë përgatitjes së balancuesve të ngarkesës të bazuar në Nginx për projekte të ndryshme. Do të tregoj gjithashtu për mjetin që na lejoi të kapërcenim shumicën e tyre.

Nginx është një proxy server shumëfunksional që zhvillohet në mënyrë aktive. Ai dallohet për një numër të madh modulesh, ja një listë larg së qenit e plotë. Çdo projekt vendos kërkesa të caktuara për funksionalitetin e balancuesit, për versionin e Nginx-it (për shembull, mbështetja për http/2 dhe proxying për grpc) dhe për përbërjen e moduleve të tij.

Ne duam të kemi një version të fundit me grupin e duhur të moduleve, që funksionon në një shpërndarje të caktuar Linux. Në rastin tonë, bëhet fjalë për sisteme deb- dhe rpm-based. Opsioni me kontejnerë nuk trajtohet në këtë artikull.

Ne duam të ndryshojmë me shpejtësi funksionalitetin e balancuesve tanë. Dhe këtu lind menjëherë pyetja: si mund ta arrijmë këtë duke shpenzuar sa më pak burime? Edhe më mirë do të ishte ta organizonim procesin në mënyrë që të mund të përcaktonim një numër të kufizuar parametrash hyrës dhe në dalje të merrnim një artefakt në formën e një pakete deb/rpm për OS-in e nevojshëm.

Si përfundim, mund të formulojmë një sërë problemesh:

  • Jo gjithmonë ka paketa me versionin më të fundit të Nginx-it.
  • Nuk ka paketa me modulet e nevojshme.
  • Kompilimi dhe ndërtimi i paketës manualisht kërkon shumë kohë dhe është thjesht i lodhshëm.
  • Nuk ka përshkrim se si është ndërtuar ky apo ai instancë e Nginx-it.

Për të zgjidhur këto probleme, nevojitet një mjet që të marrë si hyrje një specifikim në një format të lexueshëm për njerëzit dhe, mbi bazën e tij, të ndërtojë një paketë Nginx me funksionalitetin e kërkuar.

Duke mos gjetur një zgjidhje të përshtatshme për ne në GitHub, vendosëm të krijonim mjetin tonë — nginx-builder.

Specifikimet

Në mjetin tonë donim të krijonim përshkrimin e specifikimit në formë kodi, i cili më pas mund të ruhej në një repository Git. Për këtë zgjodhëm formatin e njohur për gjëra të tilla — yaml. Shembull specifikimi:

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

Këtu përcaktojmë që duam të marrim një paketë deb me versionin Nginx 1.14.2 dhe grupin e nevojshëm të moduleve. Seksioni i moduleve është opsional. Për secilin prej tyre mund të specifikohen:

  • Emri.
  • Adresa nga ku mund të merret:
    • Depoja Git. Mund të specifikoni gjithashtu degën ose tag-un.
    • Lidhja web drejt arkivit.
    • Lidhja lokale drejt arkivit.

Disa module kërkojnë instalimin e varësive shtesë; për shembull, për nginx-auth-ldap duhet të jetë i instaluar libldap2-dev. Varësitë e nevojshme mund të specifikohen gjithashtu në përshkrimin e modulit.

Mjedisi

Me mjetin tonë mund të përgatitni shpejt një mjedis me utilitete të instaluara për kompilim, ndërtimin e paketës dhe softuer tjetër ndihmës. Zgjidhja më e përshtatshme këtu është një kontejner Docker me gjithçka të nevojshme (në depo ka tashmë disa shembuj të Dockerfile për Ubuntu dhe CentOS).

Pasi të jetë përgatitur specifikimi dhe mjedisi të jetë gati, nisim ndërtuesin tonë, pasi të kemi instaluar më parë varësitë e tij:

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

Numri i revisionit këtu është opsional dhe përdoret për versionimin e ndërtimeve. Ai ruhet në metainformacionin e paketës, gjë që e bën përditësimin e saj në serverë të thjeshtë.
Procesin mund ta ndiqni përmes log-eve. Ja një shembull i pikave kryesore:

builder - INFO - Përpuno skedarin yaml: example.config.yaml
builder - INFO - Shkarko skriptet për ndërtimin e paketës deb
builder - INFO - Po shkarkohet kodi burimor i nginx...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Po shkarkohen modulet e palëve të treta...
builder - INFO - Moduli nginx-auth-ldap do të shkarkohet sipas branch-it
builder - INFO - -- Përfundoi: nginx-auth-ldap
builder - INFO - -- Përfundoi: ngx_http_substitutions_filter_module
builder - INFO - Moduli headers-more-nginx-module do të shkarkohet
builder - INFO - Moduli nginx-module-vts do të shkarkohet sipas tag-ut
builder - INFO - -- Përfundoi: nginx-module-vts
builder - INFO - Moduli ngx_devel_kit do të shkarkohet sipas tag-ut
builder - INFO - -- Përfundoi: ngx_devel_kit
builder - INFO - -- Përfundoi: ngx_cache_purge
builder - INFO - -- Përfundoi: ngx_http_dyups_module
builder - INFO - Po shkarkohen varësitë
builder - INFO - Po ndërtohet paketa .deb
builder - INFO - Po ekzekutohet 'dh_make'...
builder - INFO - Po ekzekutohet 'dpkg-buildpackage'...
dpkg-deb: po ndërtohet paketa 'nginx' në '../nginx_1.14.1-1_amd64.deb'.

Kështu, fjalë për fjalë me vetëm disa komanda, krijojmë mjedisin dhe build-in e nevojshëm të Nginx, ndërsa paketa shfaqet në direktoriumin nga i cili është nisur skripti.

Integrimi

Gjithashtu, mund ta integrojmë mjetin tonë në proceset CI/CD. Për këtë mund të ndihmojë cilido nga sistemet e shumta CI që ekzistojnë sot, për shembull Teamcity ose Gitlab CI.

Si rezultat, sa herë që ndryshon specifikimi në repository-n Git, build-i i artefaktit nis automatikisht. Numri i revision-it lidhet me numëruesin e ekzekutimeve të build-it.
Duke investuar edhe pak kohë, mund të konfiguroni dërgimin e artefaktit në një repository lokal paketash, Nexus, Artifactory e kështu me radhë.

Një avantazh shtesë është se skedari i konfigurimit yaml mund të lidhet me Ansible ose me një sistem tjetër të automatizimit të konfigurimit, dhe prej andej të merren numri i versionit dhe lloji i paketës që duam të deploy-ojmë.

Çfarë pason

Projekti ende nuk ka përfunduar. Ja se për çfarë po punojmë tani:

  • Po zgjerojmë mundësitë e konfigurimit, duke i ruajtur njëkohësisht sa më të thjeshta. Nuk ka kuptim të përcaktohen një mijë parametra kur duhen vetëm dy, ndërsa pjesa tjetër është e përshtatshme sipas parazgjedhjes. Këtu përfshihen flamujt e kompilimit (aktualisht ato mund të ndryshohen në skedarin e brendshëm të konfigurimit src/config.py), rrugët e instalimit dhe përdoruesi për ekzekutim.
  • Po shtojmë opsione për dërgimin automatik të paketës në depo të ndryshme artefaktesh.
  • Ekzekutimi i një komande të personalizuar gjatë ngarkimit të modulit (për shembull, për përdorimin e github.com/nginx-modules/nginx_upstream_check_module duhet fillimisht të aplikohet një patch i një versioni të caktuar)
  • Po shtojmë kryerjen e testeve:
    • Paketa instalohet saktë.
    • Nginx ka versionin e kërkuar dhe është ndërtuar me flamujt dhe modulet e nevojshme.
    • Krijohen rrugët, llogaritë dhe të tjera sipas nevojës.

Por këtë mjet mund ta përdorni që tani, si edhe të propozoni përmirësime — github.com/TinkoffCreditSystems/Nginx-builder mirë se vini!

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster