Nginx'imizi birkaç komutla birleştiriyoruz

Merhaba!
Adım Sergey, tinkoff.ru platformunun API ekibinde altyapı mühendisi olarak çalışıyorum.

Bu yazımda ekibimizin dengeleyicileri hazırlarken karşılaştığı sorunlardan bahsedeceğim. nginx çeşitli projeler için. Ayrıca size çoğunun üstesinden gelmemi sağlayan araçtan da bahsedeceğim.

Nginx çok işlevli ve aktif olarak gelişen bir proxy sunucusudur. Çok sayıda modüle sahiptir, bu tam bir liste değil. Her proje, dengeleyicinin işlevselliğine ve Nginx sürümüne (örneğin, http/2 ve grpc proxy'nin varlığı) ve modüllerinin bileşimine ilişkin belirli gereksinimler getirir.

Belirli bir Linux dağıtımı altında çalışan, gerekli modül setine sahip yeni bir sürüm görmek istiyoruz. Bizim durumumuzda bunlar borç ve rpm tabanlı sistemlerdir. Bu makalede konteynerli seçenek dikkate alınmamıştır.

Dengeleyicilerimizin işlevselliğini hızla değiştirmek istiyoruz. Ve burada hemen şu soru ortaya çıkıyor: Mümkün olduğunca az kaynak harcayarak bunu nasıl başarabiliriz? Süreci, sınırlı sayıda giriş parametresi belirleyebileceğimiz ve çıktıda istenen işletim sistemi için deb/rpm paketi biçiminde bir yapıt alabileceğimiz şekilde ayarlamak daha da iyi olacaktır.

Sonuç olarak, bir dizi sorun formüle edilebilir:

  • Her zaman Nginx'in en son sürümünü içeren paketler bulunmaz.
  • Gerekli modülleri içeren paket yok.
  • Bir paketi manuel olarak derlemek ve oluşturmak, zaman alıcı ve düpedüz sıkıcıdır.
  • Şunun veya bu Nginx örneğinin nasıl bir araya getirildiğine dair bir açıklama yok.

Bu sorunları çözmek için, insan tarafından okunabilir formatta bir spesifikasyonu girdi olarak alacak ve buna dayalı olarak gerekli işlevselliğe sahip bir Nginx paketi oluşturacak bir araca ihtiyaç duyulmaktadır.

Github'un genişliğinde kendimize uygun bir seçenek bulamadığımız için kendi aracımızı yaratmaya karar verdik - nginx oluşturucu.

şartname

Aracımızda, spesifikasyonun kod biçiminde bir açıklamasını oluşturmak istedik, bu daha sonra Git deposuna konabilir. Bunu yapmak için bu tür şeylere tanıdık olan formatı seçtik - yaml. Şartname örneği:

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

Burada gerekli modül setini içeren Nginx sürüm 1.14.2'ye sahip bir deb paketi görmek istediğimizi belirtiyoruz. Modüllerin bulunduğu bölüm isteğe bağlıdır. Her biri için şunları ayarlayabilirsiniz:

  • Başlık.
  • Alabileceğiniz Adres:
    • Git deposu. Ayrıca bir dal veya etiket de belirtebilirsiniz.
    • Web bağlantısını arşivleyin.
    • Arşive yerel bağlantı.

Bazı modüller ek bağımlılıkların kurulmasını gerektirir; örneğin nginx-auth-ldap, libldap2-dev'in kurulu olmasını gerektirir. Modül açıklanırken gerekli bağımlılıklar da belirtilebilir.

çevre

Aracımızda derleme, paket birleştirme ve diğer yardımcı yazılımlar için kurulu yardımcı programların bulunduğu bir ortama hızlı bir şekilde sahip olabilirsiniz. İhtiyacınız olan her şeyi içeren bir Docker kapsayıcısı burada idealdir (depoda ubuntu ve centos için zaten birkaç Docker dosyası örneği bulunmaktadır).

Şartname hazırlandıktan ve ortam hazırlandıktan sonra, bağımlılıklarını önceden kurmuş olan oluşturucumuzu başlatıyoruz:

pip3 install -r requirements.txt
./main.py build -f [конфиг_файл].yaml -r [номер_ревизии]

Buradaki revizyon numarası isteğe bağlıdır ve montajların versiyonlanması için kullanılır. Paketin meta bilgilerine yazılarak sunucularda güncellemeyi kolaylaştırır.
Günlüklerden neler olduğunu izleyebilirsiniz. İşte ana noktalara bir örnek:

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

Böylece, yalnızca birkaç komutla ortamı ve gerekli Nginx derlemesini oluşturuyoruz ve paket, betiğin başlatıldığı dizinde görünüyor.

gömme

Aracımızı CI/CD süreçlerine de entegre edebiliriz. Günümüzde mevcut olan birçok CI sisteminden herhangi biri bu konuda yardımcı olabilir; örneğin takım şehri veya Gitlab CI.

Sonuç olarak Git deposundaki spesifikasyon her değiştiğinde yapının yapısı otomatik olarak başlatılır. Revizyon numarası derleme başlatma sayacına bağlıdır.
Biraz daha zamanla, yapıyı yerel paket deponuza, Nexus'a, Artifactory'ye vb. gönderilecek şekilde yapılandırabilirsiniz.

Ek bir avantaj, yaml yapılandırma dosyasının Ansible'a veya başka bir otomatik yapılandırma sistemine bağlanabilmesidir ve buradan dağıtmak istediğimiz sürüm numarasını ve paket türünü alabiliriz.

sonra ne

Proje henüz tamamlanmadı. Şu anda üzerinde çalıştığımız şey şu:

  • Yapılandırma olasılığını genişletiyoruz, ancak aynı zamanda mümkün olduğunca basit tutuyoruz. Yalnızca ikisine ihtiyacınız varsa ve geri kalanı varsayılan olarak uyuyorsa bin parametre tanımlamak istemezsiniz. Buna derleme bayrakları (artık bunları src/config.py dahili yapılandırma dosyasında değiştirebilirsiniz), kurulum yolu ve kullanıcıyı başlatma dahildir.
  • Bir paketin çeşitli yapı depolarına otomatik olarak gönderilmesine yönelik seçenekler ekliyoruz.
  • Bir modülü yüklerken özel bir komut yürütün (örneğin, github.com/nginx-modules/nginx_upstream_check_module önce belirli bir sürümün yamasını uygulamanız gerekir)
  • Testler ekleme:
    • Paket doğru şekilde kuruldu.
    • Nginx gerekli sürüme sahiptir ve gerekli bayraklar ve modüllerle oluşturulmuştur.
    • Gerekli yollar, hesaplar vb. oluşturulur.

Ancak bu aracı şimdi kullanabilir ve iyileştirmeler önerebilirsiniz - github.com/TinkoffCreditSystems/Nginx-builder hoş geldiniz!

Kaynak: habr.com

Yorum ekle