وضع Nginx الخاص بك معا

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

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

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

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

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

تتطلب بعض الوحدات تثبيت تبعيات إضافية ، على سبيل المثال ، يحتاج nginx-auth-ldap إلى تثبيت libldap2-dev. يمكن أيضًا تحديد التبعيات الضرورية في وصف الوحدة.

البيئة


في أداتنا ، يمكنك الحصول بسرعة على بيئة بها أدوات مساعدة مثبتة للتجميع وإنشاء حزمة وبرامج مساعدة أخرى. هنا ، تعد حاوية الإرساء التي تحتوي على كل ما تحتاجه هي الأنسب (يحتوي المستودع بالفعل على أمثلة من ملفات الإرساء لأوبونتو و 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 الموجودة ، مثل Teamcity أو Gitlab CI ، المساعدة في ذلك.

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

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

ما التالي


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

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

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

Source: https://habr.com/ru/post/ar452336/


All Articles