Kami merakit Nginx kami dengan beberapa perintah

Hi!
Nama saya Sergey, saya bekerja sebagai insinyur infrastruktur di tim API platform tinkoff.ru.

Pada artikel kali ini saya akan membahas tentang masalah yang dihadapi tim kami saat menyiapkan penyeimbang berdasarkan Nginx untuk berbagai proyek. Saya juga akan memberi tahu Anda tentang alat yang memungkinkan saya mengatasi sebagian besar masalah tersebut.

Nginx adalah server proxy multifungsi dan aktif berkembang. Ini menampilkan sejumlah besar modul, ini bukan daftar lengkap. Setiap proyek memberlakukan persyaratan tertentu pada fungsionalitas penyeimbang dan versi Nginx (misalnya, keberadaan proxy http/2 dan grpc), dan komposisi modulnya.

Kami ingin melihat versi baru dengan kumpulan modul yang diperlukan, berjalan di bawah distribusi Linux tertentu. Dalam kasus kami, ini adalah sistem berbasis deb dan rpm. Opsi dengan kontainer tidak dibahas dalam artikel ini.

Kami ingin segera mengubah fungsi penyeimbang kami. Dan di sini pertanyaan segera muncul: bagaimana mencapai hal ini dengan menghabiskan sumber daya sesedikit mungkin? Akan lebih baik lagi jika mengatur prosesnya sehingga kita dapat menentukan sejumlah parameter masukan yang terbatas, dan pada keluarannya menerima artefak dalam bentuk paket deb/rpm untuk OS yang diinginkan.

Oleh karena itu, beberapa masalah dapat dirumuskan:

  • Tidak selalu ada paket dengan Nginx versi terbaru.
  • Tidak ada paket dengan modul yang diperlukan.
  • Mengompilasi dan membuat paket secara manual memakan waktu dan sangat membosankan.
  • Tidak ada penjelasan tentang bagaimana instance Nginx ini atau itu dirakit.

Untuk mengatasi masalah ini, diperlukan alat yang dapat memasukkan spesifikasi dalam format yang dapat dibaca manusia dan menyusun paket Nginx dengan fungsionalitas yang diperlukan berdasarkan format tersebut.

Tidak menemukan opsi yang cocok bagi kami di Github yang luas, kami memutuskan untuk membuat alat kami sendiri - nginx-builder.

Spesifikasi

Di alat kami, kami ingin membuat deskripsi spesifikasi dalam bentuk kode, yang kemudian dapat dimasukkan ke dalam repositori Git. Untuk melakukan ini, kami memilih format yang familiar untuk hal-hal seperti itu - 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 bahwa kami ingin melihat paket deb dengan Nginx versi 1.14.2 dengan kumpulan modul yang diperlukan. Bagian dengan modul bersifat opsional. Untuk masing-masingnya, Anda dapat mengatur:

  • Nama.
  • Alamat dimana Anda bisa mendapatkannya:
    • Repositori Git. Anda juga dapat menentukan cabang atau tag.
    • Tautan web arsip.
    • Tautan lokal ke arsip.

Beberapa modul memerlukan dependensi tambahan untuk diinstal, misalnya nginx-auth-ldap memerlukan instalasi libldap2-dev. Ketergantungan yang diperlukan juga dapat ditentukan saat menjelaskan modul.

Lingkungan

Di alat kami, Anda dapat dengan cepat mendapatkan lingkungan dengan utilitas terinstal untuk kompilasi, perakitan paket, dan perangkat lunak tambahan lainnya. Wadah Docker dengan semua yang Anda butuhkan sangat ideal di sini (repositori sudah memiliki beberapa contoh file Docker untuk ubuntu dan centos).

Setelah spesifikasi dibuat dan lingkungan disiapkan, kami meluncurkan pembuat kami, setelah sebelumnya menginstal dependensinya:

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

Nomor revisi di sini bersifat opsional dan digunakan untuk pembuatan versi. Itu ditulis ke dalam informasi meta paket, membuatnya mudah untuk diperbarui di server.
Dari log Anda dapat memantau apa yang terjadi. Berikut ini contoh poin utamanya:

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, hanya dengan beberapa perintah, kita membuat lingkungan dan rakitan Nginx yang diperlukan, dan paket tersebut muncul di direktori tempat skrip diluncurkan.

Menanamkan

Kami juga dapat mengintegrasikan alat kami ke dalam proses CI/CD. Salah satu dari banyak sistem CI yang ada saat ini dapat membantu dalam hal ini, misalnya kota tim ΠΈΠ»ΠΈ Gitlab CI.

Hasilnya, setiap kali spesifikasi di repositori Git berubah, pembuatan artefak diluncurkan secara otomatis. Nomor revisi ditautkan ke penghitung peluncuran build.
Dengan sedikit waktu lagi, Anda dapat mengonfigurasi artefak untuk dikirim ke repositori paket lokal Anda, Nexus, Artifactory, dan sebagainya.

Keuntungan tambahannya adalah file konfigurasi yaml dapat dihubungkan ke Ansible atau sistem konfigurasi otomatis lainnya, dan dari sana kita dapat mengambil nomor versi dan jenis paket yang ingin kita terapkan.

Apa Selanjutnya

Proyek ini belum selesai. Inilah yang sedang kami kerjakan sekarang:

  • Kami memperluas kemungkinan konfigurasi, namun pada saat yang sama menjaganya sesederhana mungkin. Anda tidak ingin menentukan seribu parameter jika Anda hanya memerlukan dua, dan sisanya sesuai secara default. Ini termasuk flag kompilasi (sekarang Anda dapat mengubahnya di file konfigurasi internal src/config.py), jalur instalasi, dan pengguna peluncuran.
  • Kami menambahkan opsi untuk mengirim paket secara otomatis ke berbagai repositori artefak.
  • Jalankan perintah khusus saat memuat modul (misalnya, untuk menggunakan github.com/nginx-modules/nginx_upstream_check_module Anda harus terlebih dahulu menerapkan tambalan versi tertentu)
  • Menambahkan tes:
    • Paket sudah terinstal dengan benar.
    • Nginx memiliki versi yang diperlukan dan dibuat dengan flag dan modul yang diperlukan.
    • Jalur, akun, dan sebagainya yang diperlukan telah dibuat.

Namun Anda dapat menggunakan alat ini sekarang, dan juga menyarankan perbaikan - github.com/TinkoffCreditSystems/Nginx-builder Selamat datang!

Sumber: www.habr.com

Tambah komentar