Em Nginx-a xwe bi çend fermanan kom dikin

Hello!
Navê min Sergey e, ez wekî endezyarek binesaziyê di tîmê API-ya platforma tinkoff.ru de dixebitim.

Di vê gotarê de ez ê li ser pirsgirêkên ku tîmê me dema ku li ser bingeha hevsengkeran amade dikin bipeyivim nginx ji bo projeyên cuda. Ez ê di heman demê de ji we re li ser amûra ku hişt ku ez piraniya wan bi ser bixim vebêjim.

Nginx serverek proxy ya pirfunctional û çalak e. Ew hejmareke mezin ji modulan vedigire, ev ne lîsteyek tam e. Her proje hin hewcedariyên li ser fonksiyona hevseng û guhertoya Nginx ferz dike (mînak, hebûna http/2 û proxying grpc), û pêkhatina modulên wê.

Em dixwazin guhertoyek nû ya bi komek modulên hewcedar bibînin, ku di bin belavkirinek taybetî ya Linux-ê de dixebitin. Di rewşa me de, ev pergalên deb- û rpm-bingeh in. Vebijarka bi konteyneran di vê gotarê de nayê hesibandin.

Em dixwazin bi lez fonksiyonên hevsengên xwe biguhezînin. Û li vir pirs tavilê derdikeve holê: meriv çawa bigihîje vê yekê dema ku bi qasî hindik çavkaniyan xerc bike? Dê hîn çêtir be ku em pêvajoyê saz bikin da ku em bikaribin hejmareke bêdawî ya parametreyên têketinê diyar bikin, û di encam de ji bo OS-ya xwestî hunerek di forma pakêtek deb/rpm de bistînin.

Wekî encamek, çend pirsgirêk dikarin bêne formule kirin:

  • Her gav pakêtên bi guhertoya herî dawî ya Nginx re nîn in.
  • Tu pakêtên bi modulên pêwîst hene.
  • Berhevkirin û avakirina pakêtek bi destan dem dixwe û bêkêmasî ye.
  • Danasînek tune ku ev an ew mînaka Nginx çawa tête berhev kirin.

Ji bo çareserkirina van pirsgirêkan, pêdivî bi amûrek çêdibe ku dê wekî navnîşek taybetmendiyek bi rengek mirov-xwende bigire û pakêtek Nginx bi fonksiyona pêwîst li ser bingeha wê kom bike.

Li ser berfirehiya Github vebijarkek minasib ji me re nedît, me biryar da ku em amûrê xwe biafirînin - nginx-çêker.

Taybetmendî (biguherîne)

Di amûra xwe de, me xwest ku di forma kodê de ravekek taybetmendiyê biafirînin, ku dûv re dikare di depoyek Git de were danîn. Ji bo vê yekê, me forma ku ji bo tiştên weha naskirî hilbijart - yaml. Mînaka taybetmendiyê:

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

Li vir em destnîşan dikin ku em dixwazin pakêtek deb bi Nginx guhertoya 1.14.2 bi koma modulên pêwîst re bibînin. Beşa bi modulan vebijarkî ye. Ji bo her yek ji wan hûn dikarin destnîşan bikin:

  • Nav.
  • Navnîşana ku hûn dikarin wê bistînin:
    • Depoya Git. Her weha hûn dikarin şaxek an tagek diyar bikin.
    • Girêdana malperê ya arşîvê.
    • Girêdana herêmî ya arşîvê.

Hin modul pêdivî ye ku pêwendiyên zêde werin saz kirin, mînakî nginx-auth-ldap pêdivî ye ku libldap2-dev were saz kirin. Di dema danasîna modulê de girêdanên pêdivî jî dikarin bêne diyar kirin.

Dor

Di amûra me de hûn dikarin zû hawîrdorek bi karûbarên sazkirî yên ji bo berhevkirin, komkirina pakêtê û nermalavên din ên alîkar bistînin. Konteynirek Docker bi her tiştê ku hûn hewce ne li vir îdeal e (depo jixwe ji bo ubuntu û centos çend mînakên pelên Docker hene).

Piştî ku taybetmendî hate çêkirin û hawîrdor hate amadekirin, em avakerê xwe didin destpêkirin, ku berê pêwendiyên xwe saz kirine:

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

Hejmara guhertoya li vir vebijarkî ye û ji bo guhertokirina meclîsan tê bikar anîn. Ew di agahdariya meta ya pakêtê de hatî nivîsandin, nûvekirina li ser serveran hêsan dike.
Ji qeydan hûn dikarin çi diqewime bişopînin. Li vir mînakek xalên sereke ye:

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

Ji ber vê yekê, bi tenê çend fermanan, em hawîrdor û kombûna Nginx-ê ya pêwîst diafirînin, û pakêt di pelrêça ku jê hatî destpêkirin de tê xuyang kirin.

Embedding

Di heman demê de em dikarin amûrê xwe di pêvajoyên CI/CD-ê de yek bikin. Ji gelek pergalên CI yên ku îro hene dikarin bi vê yekê re bibin alîkar, mînakî Teamcity an Gitlab CI.

Wekî encamek, her carê ku taybetmendî di depoya Git de diguhezîne, avakirina hunerê bixweber tê destpêkirin. Hejmara guhertoyê bi jimareya destpêkirina çêkirinê ve girêdayî ye.
Bi demek piçûktir, hûn dikarin hunerê mîheng bikin ku ji depoya pakêta xweya herêmî, Nexus, Artifactory, û hwd re were şandin.

Avantajek din ev e ku pelê veavakirina yaml dikare bi Ansible an pergalek veavakirina otomatîkî ya din ve were girêdan, û ji wir em dikarin jimareya guhertoyê û celebê pakêtê ya ku em dixwazin bicîh bikin bigirin.

Çi ye?

Proje hîn bi dawî nebûye. Ya ku em niha li ser dixebitin ev e:

  • Em îhtîmala veavakirinê berfireh dikin, lê di heman demê de ew bi qasî ku gengaz dibe sade dihêlin. Heke hûn tenê du hewce ne, hûn naxwazin hezar parametre diyar bikin, û yên mayî ji hêla xwerû ve girêdayî ne. Di nav de alayên berhevkirinê (niha hûn dikarin wan di pelê veavakirina hundurîn src/config.py de biguhezînin), riya sazkirinê, û bikarhênerê destpêkirinê.
  • Em vebijarkan lê zêde dikin ku bixweber pakêtek bişînin depoyên cihêreng ên hunerî.
  • Dema ku modulek barkirin fermanek xwerû bicîh bikin (mînak, bikar bînin github.com/nginx-modules/nginx_upstream_check_module divê hûn pêşî pêçek guhertoyek taybetî bicîh bikin)
  • Zêdekirina testan:
    • Pakêt rast hatiye sazkirin.
    • Nginx guhertoya pêwîst heye û bi ala û modulên pêwîst ve hatî çêkirin.
    • Rêyên pêwîst, hesab û hwd têne çêkirin.

Lê hûn dikarin vê amûrê nuha bikar bînin, û her weha çêtirkirinan pêşniyar bikin - github.com/TinkoffCreditSystems/Nginx-builder bi xêr hatî!

Source: www.habr.com

Add a comment