نقوم بتجميع Nginx الخاص بنا باستخدام أمرين

مرحبا!
اسمي سيرجي، أعمل كمهندس بنية تحتية في فريق واجهة برمجة التطبيقات لمنصة tinkoff.ru.

سأتحدث في هذه المقالة عن المشكلات التي واجهها فريقنا عند إعداد الموازنات بناءً عليها إنجن إكس لمختلف المشاريع. سأخبرك أيضًا عن الأداة التي سمحت لي بالتغلب على معظمها.

Nginx هو خادم وكيل متعدد الوظائف ومتطور بشكل نشط. ويضم عدد كبير من الوحدات، هذه ليست قائمة كاملة. يفرض كل مشروع متطلبات معينة على وظيفة الموازن وإصدار Nginx (على سبيل المثال، وجود وكيل http/2 و grpc)، وتكوين وحداته.

نود أن نرى إصدارًا جديدًا يحتوي على مجموعة الوحدات المطلوبة، ويعمل ضمن توزيعة Linux محددة. في حالتنا، هذه أنظمة تعتمد على deb وrpm. لم يتم أخذ خيار الحاويات بعين الاعتبار في هذه المقالة.

نريد تغيير وظائف موازناتنا بسرعة. وهنا يطرح السؤال على الفور: كيف يمكن تحقيق ذلك مع إنفاق أقل قدر ممكن من الموارد؟ سيكون من الأفضل إعداد العملية حتى نتمكن من تحديد عدد محدود من معلمات الإدخال، وعند الإخراج نتلقى قطعة أثرية في شكل حزمة deb/rpm لنظام التشغيل المطلوب.

ونتيجة لذلك يمكن صياغة عدد من المشاكل:

  • لا توجد دائمًا حزم تحتوي على أحدث إصدار من Nginx.
  • لا توجد حزم مع الوحدات المطلوبة.
  • يستغرق تجميع الحزمة وإنشائها يدويًا وقتًا طويلاً ومملًا تمامًا.
  • لا يوجد وصف لكيفية تجميع مثيل Nginx هذا أو ذاك.

لحل هذه المشاكل، تبرز الحاجة إلى أداة تأخذ مواصفات بتنسيق يمكن قراءته بواسطة الإنسان كمدخلات وتجميع حزمة Nginx مع الوظائف الضرورية المبنية عليها.

لم نجد خيارًا مناسبًا لنا على اتساع جيثب، قررنا إنشاء أداتنا الخاصة - 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 مع الإصدار 1.14.2 من Nginx مع مجموعة الوحدات المطلوبة. القسم الذي يحتوي على الوحدات اختياري. لكل واحد منهم يمكنك تعيين:

  • العنوان.
  • العنوان حيث يمكنك الحصول عليه:
    • مستودع جيت. يمكنك أيضًا تحديد فرع أو علامة.
    • أرشيف رابط الويب.
    • الرابط المحلي للأرشيف.

تتطلب بعض الوحدات تثبيت تبعيات إضافية، على سبيل المثال، يتطلب 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 العديدة الموجودة اليوم أن تساعد في هذا الأمر تيم سيتي أو جيتلاب سي.

ونتيجة لذلك، في كل مرة تتغير فيها المواصفات في مستودع Git، يتم تشغيل إنشاء الأداة تلقائيًا. رقم المراجعة مرتبط بعداد إطلاق البناء.
مع القليل من الوقت، يمكنك تكوين القطعة الأثرية ليتم إرسالها إلى مستودع الحزم المحلي لديك، وNexus، وArtifactory، وما إلى ذلك.

هناك ميزة إضافية وهي أنه يمكن توصيل ملف تكوين yaml بـ Ansible أو أي نظام تكوين تلقائي آخر، ومن هناك يمكننا الحصول على رقم الإصدار ونوع الحزمة التي نريد نشرها.

ما هي الخطوة التالية

المشروع لم يكتمل بعد وإليكم ما نعمل عليه الآن:

  • نقوم بتوسيع إمكانية التكوين، ولكن في نفس الوقت نجعل الأمر بسيطًا قدر الإمكان. لا تريد تحديد ألف معلمة إذا كنت تحتاج إلى اثنين فقط، والباقي يناسبك بشكل افتراضي. يتضمن ذلك علامات الترجمة (يمكنك الآن تغييرها في ملف التكوين الداخلي src/config.py)، ومسار التثبيت، ومستخدم الإطلاق.
  • نحن نضيف خيارات لإرسال الحزمة تلقائيًا إلى مستودعات القطع الأثرية المختلفة.
  • قم بتنفيذ أمر مخصص عند تحميل وحدة نمطية (على سبيل المثال، to use github.com/nginx-modules/nginx_upstream_check_module يجب عليك أولاً تطبيق تصحيح لإصدار معين)
  • إضافة الاختبارات:
    • تم تثبيت الحزمة بشكل صحيح.
    • يمتلك Nginx الإصدار المطلوب وهو مُصمم باستخدام العلامات والوحدات المطلوبة.
    • يتم إنشاء المسارات والحسابات وما إلى ذلك الضرورية.

ولكن يمكنك استخدام هذه الأداة الآن، واقتراح التحسينات أيضًا - github.com/TinkoffCreditSystems/Nginx-builder مرحبا!

المصدر: www.habr.com

إضافة تعليق