Kami memasang Nginx kami dengan beberapa arahan

Hello!
Nama saya Sergey, saya bekerja sebagai jurutera infrastruktur dalam pasukan API platform tinkoff.ru.

Dalam artikel ini saya akan bercakap tentang masalah yang dihadapi oleh pasukan kami semasa menyediakan pengimbang berdasarkan Nginx untuk pelbagai projek. Saya juga akan memberitahu anda tentang alat yang membolehkan saya mengatasi kebanyakannya.

Nginx ialah pelayan proksi pelbagai fungsi dan sedang membangunkan secara aktif. Ia mempunyai sejumlah besar modul, ini bukan senarai lengkap. Setiap projek mengenakan keperluan tertentu pada kefungsian pengimbang dan versi Nginx (contohnya, kehadiran proksi http/2 dan grpc), dan komposisi modulnya.

Kami ingin melihat versi baharu dengan set modul yang diperlukan, berjalan di bawah pengedaran Linux tertentu. Dalam kes kami, ini adalah sistem berasaskan deb dan rpm. Pilihan dengan bekas tidak dipertimbangkan dalam artikel ini.

Kami mahu menukar fungsi pengimbang kami dengan cepat. Dan di sini persoalan segera timbul: bagaimana untuk mencapai ini sambil membelanjakan sedikit sumber yang mungkin? Adalah lebih baik untuk menyediakan proses supaya kita boleh menentukan bilangan parameter input yang terhingga, dan pada output menerima artifak dalam bentuk pakej deb/rpm untuk OS yang dikehendaki.

Akibatnya, beberapa masalah boleh dirumuskan:

  • Tidak selalu ada pakej dengan versi terkini Nginx.
  • Tiada pakej dengan modul yang diperlukan.
  • Menyusun dan membina pakej secara manual memakan masa dan membosankan.
  • Tiada penerangan tentang bagaimana contoh Nginx ini atau itu dipasang.

Untuk menyelesaikan masalah ini, timbul keperluan untuk alat yang akan mengambil sebagai input spesifikasi dalam format yang boleh dibaca manusia dan memasang pakej Nginx dengan fungsi yang diperlukan berdasarkannya.

Tidak mencari pilihan yang sesuai untuk kami mengenai keluasan Github, kami memutuskan untuk mencipta alat kami sendiri - pembina nginx.

Spesifikasi

Dalam alat kami, kami ingin mencipta penerangan spesifikasi dalam bentuk kod, yang kemudiannya boleh dimasukkan ke dalam repositori Git. Untuk melakukan ini, kami memilih format biasa untuk perkara sedemikian - yaml. Contoh spesifikasi:

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 sini kami menunjukkan bahawa kami ingin melihat pakej deb dengan Nginx versi 1.14.2 dengan set modul yang diperlukan. Bahagian dengan modul adalah pilihan. Untuk setiap daripada mereka anda boleh menetapkan:

  • Nama.
  • Alamat di mana anda boleh mendapatkannya:
    • Repositori Git. Anda juga boleh menentukan cawangan atau teg.
    • Arkibkan pautan web.
    • Pautan tempatan ke arkib.

Sesetengah modul memerlukan kebergantungan tambahan untuk dipasang, contohnya nginx-auth-ldap memerlukan libldap2-dev dipasang. Kebergantungan yang diperlukan juga boleh ditentukan apabila menerangkan modul.

Persekitaran

Dalam alat kami, anda boleh dengan cepat mendapatkan persekitaran dengan utiliti yang dipasang untuk penyusunan, pemasangan pakej dan perisian tambahan lain. Bekas Docker dengan semua yang anda perlukan adalah sesuai di sini (repositori sudah mempunyai beberapa contoh fail Docker untuk ubuntu dan centos).

Selepas spesifikasi disediakan dan persekitaran disediakan, kami melancarkan pembina kami, setelah memasang kebergantungannya sebelum ini:

pip3 install -r requirements.txt
./main.py build -f [ΠΊΠΎΠ½Ρ„ΠΈΠ³_Ρ„Π°ΠΉΠ»].yaml -r [Π½ΠΎΠΌΠ΅Ρ€_Ρ€Π΅Π²ΠΈΠ·ΠΈΠΈ]

Nombor semakan di sini adalah pilihan dan digunakan untuk pemasangan versi. Ia ditulis ke dalam maklumat meta pakej, menjadikannya mudah untuk dikemas kini pada pelayan.
Daripada log anda boleh memantau apa yang berlaku. Berikut adalah contoh perkara 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'.

Jadi, dengan hanya beberapa arahan, kami mencipta persekitaran dan pemasangan Nginx yang diperlukan, dan pakej itu muncul dalam direktori dari mana skrip dilancarkan.

Membenamkan

Kami juga boleh menyepadukan alat kami ke dalam proses CI/CD. Mana-mana daripada banyak sistem CI yang sedia ada hari ini boleh membantu dengan ini, sebagai contoh Teamcity atau Gitlab CI.

Akibatnya, setiap kali spesifikasi berubah dalam repositori Git, binaan artifak dilancarkan secara automatik. Nombor semakan dipautkan ke kaunter pelancaran binaan.
Dengan sedikit masa lagi, anda boleh mengkonfigurasi artifak untuk dihantar ke repositori pakej setempat anda, Nexus, Artifactory dan sebagainya.

Kelebihan tambahan ialah fail konfigurasi yaml boleh disambungkan kepada Ansible atau sistem konfigurasi automatik yang lain, dan dari situ kita boleh mengambil nombor versi dan jenis pakej yang ingin kita gunakan.

Apa yang Seterusnya

Projek masih belum siap. Inilah perkara yang sedang kami usahakan sekarang:

  • Kami memperluaskan kemungkinan konfigurasi, tetapi pada masa yang sama memastikannya semudah mungkin. Anda tidak mahu menentukan seribu parameter jika anda hanya memerlukan dua, dan selebihnya sesuai secara lalai. Ini termasuk bendera kompilasi (kini anda boleh menukarnya dalam fail konfigurasi dalaman src/config.py), laluan pemasangan dan pengguna pelancaran.
  • Kami menambah pilihan untuk menghantar pakej secara automatik ke pelbagai repositori artifak.
  • Jalankan arahan tersuai semasa memuatkan modul (contohnya, untuk menggunakan github.com/nginx-modules/nginx_upstream_check_module anda mesti menggunakan tampalan versi tertentu dahulu)
  • Menambah ujian:
    • Pakej dipasang dengan betul.
    • Nginx mempunyai versi yang diperlukan dan dibina dengan bendera dan modul yang diperlukan.
    • Laluan, akaun, dan sebagainya yang diperlukan dicipta.

Tetapi anda boleh menggunakan alat ini sekarang, dan juga mencadangkan penambahbaikan - github.com/TinkoffCreditSystems/Nginx-builder selamat datang!

Sumber: www.habr.com

Tambah komen