Hai
Nama saya Sergey, saya bekerja sebagai insinyur infrastruktur di tim API platform tinkoff.ru.
Dalam artikel ini saya akan berbicara tentang masalah yang dihadapi tim kami dalam mempersiapkan penyeimbang berbasis
Nginx untuk berbagai proyek. Saya juga akan berbicara tentang alat yang memungkinkan saya untuk mengatasi sebagian besar dari mereka.
Nginx adalah server proxy multifungsi dan aktif. Ini memiliki sejumlah besar modul,
tetapi ini bukan daftar lengkap . Setiap proyek memberlakukan persyaratan tertentu pada fungsionalitas penyeimbang dan versi Nginx (misalnya, keberadaan http / 2 dan proksi grpc), dan komposisi modul-modulnya.
Kami ingin melihat versi terbaru dengan set modul yang tepat, bekerja di bawah distribusi Linux tertentu. Dalam kasus kami, ini adalah sistem berbasis deb dan rpm. Opsi wadah tidak dipertimbangkan dalam artikel ini.
Kami ingin dengan cepat mengubah fungsi penyeimbang kami. Dan di sini muncul pertanyaan segera - bagaimana mencapainya dengan menghabiskan sumber daya sesedikit mungkin? Dan akan lebih baik untuk mengatur proses sehingga kita dapat mengatur sejumlah parameter input, dan pada output mendapatkan artefak dalam bentuk paket deb / rpm untuk OS yang diinginkan.
Akibatnya, sejumlah masalah dapat dirumuskan:
- Tidak selalu ada paket dengan versi terbaru Nginx.
- Tidak ada paket dengan modul yang tepat.
- Mengompilasi dan merakit paket secara manual membutuhkan banyak waktu dan cukup membosankan.
- Tidak ada deskripsi tentang bagaimana instance Nginx tertentu dibangun.
Untuk mengatasi masalah ini, alat tertentu meminta untuk menerima spesifikasi dalam format yang dapat dibaca manusia dan mengumpulkan paket Nginx dengan fungsionalitas yang diperlukan di dalamnya.
Karena tidak menemukan opsi yang cocok untuk kami di ruang terbuka github, kami memutuskan untuk membuat alat kami sendiri -
nginx-builder .
Spesifikasi
Dalam 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 biasa 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 mengindikasikan bahwa kami ingin melihat paket deb dengan Nginx versi 1.14.2 dengan set modul yang diinginkan. Bagian dengan modul adalah opsional. Untuk masing-masing Anda dapat mengatur:
- Nama.
- Alamat di mana Anda bisa mendapatkannya:
- Git repositori. Anda juga dapat menentukan cabang atau tag.
- Tautan web ke arsip.
- Tautan lokal ke arsip.
Beberapa modul memerlukan instalasi dependensi tambahan, misalnya, nginx-auth-ldap perlu diinstal libldap2-dev. Ketergantungan yang diperlukan juga dapat ditentukan dalam deskripsi modul.
Lingkungan
Dalam alat kami, Anda dapat dengan cepat mendapatkan lingkungan dengan utilitas yang diinstal untuk mengkompilasi, membangun paket, dan perangkat lunak tambahan lainnya. Di sini, wadah buruh pelabuhan dengan semua yang Anda butuhkan adalah yang paling sesuai (sudah ada beberapa contoh file buruh pelabuhan untuk ubuntu dan centos di repositori).
Setelah spesifikasi dikompilasi dan disiapkan oleh lingkungan, kami menjalankan kolektor kami, pra-instal dependensinya:
pip3 install -r requirements.txt ./main.py build -f [_].yaml -r [_]
Nomor revisi di sini adalah opsional dan berfungsi untuk majelis versi. Itu direkam dalam meta-informasi dari paket, yang membuatnya mudah untuk memperbaruinya di server.
Dengan log Anda dapat mengamati apa yang terjadi. Berikut ini contoh highlight:
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 beberapa perintah yang kita buat lingkungan dan perakitan Nginx yang diinginkan, dan paket muncul di direktori di mana skrip berjalan.
Menanamkan
Kami juga dapat menanamkan alat kami dalam proses CI / CD. Salah satu dari banyak sistem CI yang ada, seperti
Teamcity atau
Gitlab CI, dapat membantu dengan ini.
Akibatnya, setiap kali Anda mengubah spesifikasi di repositori Git, perakitan artefak secara otomatis dimulai. Nomor revisi terkait dengan penghitung peluncuran build.
Setelah menghabiskan lebih banyak waktu, Anda dapat mengonfigurasi pengiriman artefak ke repositori paket lokal, Nexus, Artifactory, dan sebagainya.
Kelebihan lainnya adalah konfigurasi yaml-file dapat dihubungkan ke Ansible atau sistem konfigurasi otomatis lainnya, dan mengambil nomor versi dan jenis paket yang ingin kita gunakan.
Apa selanjutnya
Proyek belum selesai. Inilah yang sedang kami kerjakan sekarang:
- Kami memperluas kemungkinan konfigurasi, tetapi pada saat yang sama tetap sesederhana mungkin. Saya tidak ingin menetapkan seribu parameter, jika hanya dua yang diperlukan, dan sisanya adalah default. Ini termasuk flag kompilasi (sekarang Anda dapat mengubahnya di file konfigurasi internal src / config.py), jalur instalasi, pengguna untuk menjalankan.
- Tambahkan opsi untuk secara otomatis mengirim paket ke berbagai repositori artefak.
- Menjalankan perintah pengguna saat memuat modul (misalnya, untuk menggunakan github.com/nginx-modules/nginx_upstream_check_module, Anda harus terlebih dahulu menerapkan tambalan versi tertentu)
- Tambahkan pengujian:
- Paket diinstal dengan benar.
- Nginx memiliki versi yang benar dan dikompilasi dengan flag dan modul yang diperlukan.
- Jalur, akun, dan sebagainya yang diperlukan dibuat.
Tetapi Anda dapat menggunakan alat ini sekarang, serta menawarkan peningkatan -
github.com/TinkoffCreditSystems/Nginx-builder wellcome!