Kami ngumpul Nginx kami nganggo sababaraha paréntah

Salam!
Nami abdi Sergey, abdi damel salaku insinyur infrastruktur di tim API tina platform tinkoff.ru.

Dina artikel ieu kuring bakal ngobrol ngeunaan masalah anu tim kami Nyanghareupan nalika Nyiapkeun balancers dumasar kana Nginx pikeun sagala rupa proyék. Kuring ogé bakal nyaritakeun ngeunaan alat anu ngamungkinkeun kuring pikeun ngatasi kalolobaanana.

Nginx mangrupikeun server proxy anu multifungsi sareng aktip ngembangkeun. Éta ngagaduhan sajumlah ageung modul, ieu teu daptar lengkep. Unggal proyék maksakeun sarat nu tangtu dina pungsionalitas balancer jeung versi Nginx (contona, ayana http / 2 na grpc proxying), sarta komposisi modul na.

Kami hoyong ningali versi énggal sareng set modul anu diperyogikeun, ngajalankeun dina distribusi Linux khusus. Dina kasus urang, ieu mangrupikeun sistem dumasar-deb sareng rpm. Pilihan sareng wadah henteu dipertimbangkeun dina tulisan ieu.

Kami hoyong gancang ngarobih fungsionalitas pangimbang urang. Sareng di dieu patarosan langsung timbul: kumaha carana ngahontal ieu bari nyéépkeun sakedik sumber-gancang? Eta bakal leuwih hadé pikeun nyetél prosés sangkan bisa nangtukeun jumlah wates input parameter, sarta dina kaluaran nampi artefak dina bentuk deb / rpm pakét pikeun OS nu dipikahoyong.

Hasilna, sababaraha masalah tiasa dirumuskeun:

  • Aya henteu salawasna bungkusan sareng versi panganyarna tina Nginx.
  • Henteu aya bungkusan sareng modul anu diperyogikeun.
  • Nyusun sareng ngawangun pakét sacara manual nyéépkeun waktos sareng leres-leres pikasieuneun.
  • Henteu aya katerangan kumaha ieu atanapi éta conto Nginx dirakit.

Pikeun ngabéréskeun masalah ieu, kabutuhan timbul pikeun alat anu bakal janten input spésifikasi dina format anu tiasa dibaca manusa sareng ngumpul pakét Nginx kalayan fungsionalitas anu diperyogikeun dumasar kana éta.

Henteu mendakan pilihan anu cocog pikeun kami ngeunaan kalegaan Github, kami mutuskeun pikeun nyiptakeun alat kami sorangan - nginx-pembina.

spésifikasi

Dina alat kami, kami hoyong ngadamel pedaran spésifikasi dina bentuk kode, anu teras tiasa dilebetkeun kana gudang Git. Jang ngalampahkeun ieu, kami milih format akrab pikeun hal sapertos - yaml. conto spésifikasi:

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

Di dieu kami nunjukkeun yén urang hoyong ningali pakét deb sareng versi Nginx 1.14.2 sareng set modul anu diperyogikeun. Bagian kalayan modul nyaéta pilihan. Pikeun unggal sahijina anjeun tiasa nyetél:

  • Nami.
  • Alamat dimana anjeun tiasa kéngingkeun:
    • Repository Git. Anjeun oge bisa nangtukeun cabang atawa tag.
    • Arsipkeun tautan wéb.
    • Tumbu lokal ka arsip.

Sababaraha modul merlukeun dependensi tambahan pikeun dipasang, contona nginx-auth-ldap merlukeun libldap2-dev dipasang. kagumantungan diperlukeun ogé bisa dieusian nalika ngajéntrékeun modul.

Lingkungan

Dina alat kami anjeun tiasa gancang kéngingkeun lingkungan kalayan utilitas anu dipasang pikeun kompilasi, pakét pakét sareng parangkat lunak bantu anu sanés. Wadah Docker sareng sadaya anu anjeun peryogikeun idéal di dieu (Repositori parantos ngagaduhan sababaraha conto file Docker pikeun ubuntu sareng centos).

Saatos spésifikasi digambar sareng lingkunganana disiapkeun, urang ngaluncurkeun pembina urang, saatos masang katergantunganna:

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

Nomer révisi di dieu nyaéta opsional sareng dianggo pikeun majelis versi. Éta diserat kana inpormasi meta pakét, sahingga gampang pikeun ngapdet dina server.
Tina log anjeun tiasa ngawas naon anu lumangsung. Ieu conto titik utama:

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

Janten, ngan ukur sababaraha paréntah, urang nyiptakeun lingkungan sareng rakitan Nginx anu diperyogikeun, sareng pakét muncul dina diréktori tempat naskah diluncurkeun.

Embedding

Urang ogé tiasa ngahijikeun alat urang kana prosés CI/CD. Salah sahiji seueur sistem CI anu aya ayeuna tiasa ngabantosan ieu, contona Teamcity atawa Gitlab CI.

Hasilna, unggal waktos spésifikasi robih dina gudang Git, ngawangun artefak sacara otomatis diluncurkeun. Jumlah révisi numbu ka counter peluncuran ngawangun.
Kalayan sakedik waktos, anjeun tiasa ngonpigurasikeun artefak pikeun dikirim ka gudang pakét lokal anjeun, Nexus, Artifactory, sareng sajabana.

Kauntungannana tambahan nyaéta yén file konfigurasi yaml tiasa dihubungkeun ka Ansible atanapi sistem konfigurasi otomatis anu sanés, sareng ti dinya urang tiasa nyandak nomer versi sareng jinis pakét anu badé disebarkeun.

Naon salajengna

Proyék teu acan réngsé. Ieu naon anu urang nuju dianggo ayeuna:

  • Urang dilegakeun kamungkinan konfigurasi, tapi dina waktos anu sareng tetep sasederhana mungkin. Anjeun teu hoyong nangtukeun sarébu parameter lamun ngan butuh dua, sarta sésana fits sacara standar. Ieu kalebet panji kompilasi (ayeuna anjeun tiasa ngarobih dina file konfigurasi internal src/config.py), jalur pamasangan, sareng peluncuran pangguna.
  • Kami nambihan pilihan pikeun ngirim pakét sacara otomatis ka sababaraha repositori artefak.
  • Laksanakeun paréntah khusus nalika ngamuat modul (contona, ngagunakeun github.com/nginx-modules/nginx_upstream_check_module Anjeun kedah nerapkeun patch tina versi khusus)
  • Nambahkeun tés:
    • pakét dipasang leres.
    • Nginx ngagaduhan versi anu diperyogikeun sareng diwangun ku bandéra sareng modul anu diperyogikeun.
    • Jalur anu diperyogikeun, akun, sareng saterasna diciptakeun.

Tapi anjeun tiasa nganggo alat ieu ayeuna, sareng ogé nyarankeun perbaikan - github.com/TinkoffCreditSystems/Nginx-builder wilujeng sumping!

sumber: www.habr.com

Tambahkeun komentar