ما Nginx خود را با چند دستور مونتاژ می کنیم

سلام!
نام من سرگئی است، من به عنوان یک مهندس زیرساخت در تیم API پلت فرم tinkoff.ru کار می کنم.

در این مقاله در مورد مشکلاتی که تیم ما در هنگام تهیه بالانس بر اساس با آن مواجه بود صحبت خواهم کرد Nginx برای پروژه های مختلف من همچنین در مورد ابزاری که به من امکان داد بر اکثر آنها غلبه کنم به شما خواهم گفت.

Nginx یک سرور پراکسی چند منظوره و فعال در حال توسعه است. دارای تعداد زیادی ماژول، این فهرست کامل نیست. هر پروژه الزامات خاصی را بر عملکرد متعادل کننده و نسخه Nginx (به عنوان مثال، وجود پروکسی http/2 و grpc) و ترکیب ماژول های آن تحمیل می کند.

ما می‌خواهیم یک نسخه جدید با مجموعه ماژول‌های مورد نیاز را ببینیم که تحت یک توزیع خاص لینوکس اجرا می‌شود. در مورد ما، اینها سیستم های مبتنی بر deb و rpm هستند. گزینه با کانتینر در این مقاله در نظر گرفته نشده است.

ما می خواهیم به سرعت عملکرد متعادل کننده های خود را تغییر دهیم. و در اینجا بلافاصله این سؤال مطرح می شود: چگونه می توان به این امر دست یافت و در عین حال حداقل منابع را صرف کرد؟ حتی بهتر است فرآیند را طوری تنظیم کنیم که بتوانیم تعداد محدودی از پارامترهای ورودی را مشخص کنیم و در خروجی یک آرتیفکت به شکل بسته deb/rpm برای سیستم عامل مورد نظر دریافت کنیم.

در نتیجه، تعدادی از مشکلات را می توان فرموله کرد:

  • همیشه بسته هایی با آخرین نسخه Nginx وجود ندارد.
  • هیچ بسته ای با ماژول های مورد نیاز وجود ندارد.
  • تدوین و ساخت یک بسته به صورت دستی زمان بر و کاملا خسته کننده است.
  • هیچ توضیحی درباره نحوه مونتاژ این یا آن نمونه Nginx وجود ندارد.

برای حل این مشکلات، نیاز به ابزاری وجود دارد که مشخصاتی را در قالبی قابل خواندن برای انسان به عنوان ورودی دریافت کند و یک بسته Nginx را با عملکردهای لازم بر اساس آن مونتاژ کند.

با پیدا نکردن گزینه مناسب برای خود در وسعت Github، تصمیم گرفتیم ابزار خود را ایجاد کنیم - nginx-builder.

مشخصات

در ابزار خود، می‌خواستیم شرحی از مشخصات را در قالب کد ایجاد کنیم که سپس می‌توان آن را در یک مخزن Git قرار داد. برای انجام این کار، قالب آشنا برای چنین چیزهایی را انتخاب کردیم - yaml. مثال مشخصات:

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

در اینجا نشان می دهیم که می خواهیم یک بسته deb با Nginx نسخه 1.14.2 با مجموعه ماژول های مورد نیاز ببینیم. بخش با ماژول اختیاری است. برای هر یک از آنها می توانید تنظیم کنید:

  • نام.
  • آدرسی که می توانید آن را دریافت کنید:
    • مخزن Git. همچنین می توانید یک شاخه یا برچسب را مشخص کنید.
    • پیوند وب بایگانی.
    • پیوند محلی به آرشیو.

برخی از ماژول ها نیاز به وابستگی های اضافی برای نصب دارند، برای مثال nginx-auth-ldap نیاز به نصب libldap2-dev دارد. در هنگام توصیف ماژول می توان وابستگی های لازم را نیز مشخص کرد.

محیط

در ابزار ما می توانید به سرعت یک محیط با ابزارهای نصب شده برای کامپایل، مونتاژ بسته و سایر نرم افزارهای کمکی دریافت کنید. یک ظرف Docker با همه چیزهایی که شما نیاز دارید در اینجا ایده آل است (مخزن قبلاً چند نمونه از فایل های Docker برای ubuntu و centos دارد).

پس از تهیه مشخصات و آماده شدن محیط، سازنده خود را با نصب قبلی وابستگی های آن راه اندازی می کنیم:

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

شماره ویرایش در اینجا اختیاری است و برای نسخه‌سازی مجموعه‌ها استفاده می‌شود. در اطلاعات متا بسته نوشته شده است و به روز رسانی آن را در سرورها آسان می کند.
از سیاهههای مربوط می توانید آنچه را که اتفاق می افتد نظارت کنید. در اینجا مثالی از نکات اصلی آورده شده است:

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

بنابراین، تنها با چند دستور، محیط و مجموعه Nginx مورد نیاز را ایجاد می کنیم و بسته در فهرستی که اسکریپت از آنجا راه اندازی می شود ظاهر می شود.

جاسازی

ما همچنین می توانیم ابزار خود را در فرآیندهای CI/CD ادغام کنیم. برای مثال، هر یک از بسیاری از سیستم‌های CI که امروزه وجود دارند، می‌توانند به این امر کمک کنند شهر تیمی یا Gitlab CI.

در نتیجه، هر بار که مشخصات در مخزن Git تغییر می کند، ساخت آرتیفکت به طور خودکار راه اندازی می شود. شماره بازبینی به شمارنده راه اندازی ساخت مرتبط است.
با کمی زمان بیشتر، می توانید آرتیفکت را برای ارسال به مخزن بسته محلی، Nexus، Artifactory و غیره پیکربندی کنید.

یک مزیت اضافی این است که فایل پیکربندی yaml را می توان به Ansible یا سیستم پیکربندی خودکار دیگری متصل کرد و از آنجا می توانیم شماره نسخه و نوع بسته مورد نظر را انتخاب کنیم.

بعدی چیست؟

پروژه هنوز تکمیل نشده است. در اینجا چیزی است که ما اکنون روی آن کار می کنیم:

  • ما امکان پیکربندی را گسترش می دهیم، اما در عین حال آن را تا حد امکان ساده نگه می داریم. اگر فقط به دو پارامتر نیاز دارید، نمی خواهید هزاران پارامتر را تعریف کنید و بقیه به طور پیش فرض مناسب هستند. این شامل پرچم های کامپایل (اکنون می توانید آنها را در فایل پیکربندی داخلی src/config.py تغییر دهید)، مسیر نصب، و کاربر راه اندازی را شامل می شود.
  • ما در حال اضافه کردن گزینه هایی برای ارسال خودکار یک بسته به مخازن مصنوعی مختلف هستیم.
  • هنگام بارگذاری یک ماژول یک فرمان سفارشی را اجرا کنید (مثلاً برای استفاده github.com/nginx-modules/nginx_upstream_check_module ابتدا باید یک پچ از یک نسخه خاص اعمال کنید)
  • اضافه کردن تست ها:
    • بسته به درستی نصب شده است.
    • Nginx نسخه مورد نیاز را دارد و با پرچم ها و ماژول های مورد نیاز ساخته شده است.
    • مسیرها، اکانت ها و ... لازم ایجاد می شود.

اما اکنون می توانید از این ابزار استفاده کنید و همچنین بهبودهایی را پیشنهاد دهید - github.com/TinkoffCreditSystems/Nginx-builder خوش آمدید!

منبع: www.habr.com

اضافه کردن نظر