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 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, . Unggal proyék maksakeun sarat nu tangtu dina pungsionalitas balancer jeung versi Nginx (contona, ayana http / 2 na grpc proxying), sarta komposisi modul na.
Urang hoyong ningali vérsi anyar kalayan sét modul anu diperyogikeun, anu dijalankeun dina distribusi anu khusus. LinuxDina kasus urang, ieu mangrupikeun sistem berbasis deb sareng rpm. Sistem berbasis 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 - .
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
Pakakas kami ngamungkinkeun anjeun pikeun gancang nyiptakeun lingkungan kalayan utilitas anu dipasang pikeun kompilasi, ngawangun pakét, sareng parangkat lunak bantu anu sanés. Wadah Docker kalayan sadayana anu anjeun peryogikeun idéal pikeun tujuan ieu (repositori parantos ngandung sababaraha conto file Docker pikeun ubuntu и 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 atawa .
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 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 - wilujeng sumping!
sumber: www.habr.com
