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