njs هو مترجم JavaScript في خادم ويب خفيف الوزن يمكنك من خلاله إنشاء متغيرات nginx جديدة وطلب معالجات المرحلة. ما فائدة njs؟ ما لا يستطيع؟ ولماذا فعلوا ذلك على الإطلاق؟ سيتم الرد على هذه الأسئلة وغيرها من قبل Dmitry Volyntsev (
xeioex ) ، مطور nginx والمطور الرئيسي لمترجم njs.

- ديمتري ، لماذا احتجت إلى البرمجة النصية في إعدادات nginx؟
- السبب الأول هو التوجيه
if
. يعتقد الأشخاص الذين رأوها لأول مرة أنه يمكن استخدامها بشكل حتمي. في الواقع الأمر ليس كذلك - تكوين nginx هو إعلاني. في المثال أدناه ، قد تعتقد أن الرد سيكون له رأسين: X-First و X-Second. لكن العنوان الثاني فقط هو الذي سيحصل على الإجابة ، لأن nginx مرتبة للغاية: إذا كتبنا أمرين إذا كانت التوجيهات ، فسيتم تحديد آخر واحد.
location /only-one-if { set $true 1; if ($true) { add_header X-First 1; } if ($true) { add_header X-Second 2; }
السبب الثاني هو ما جاء nginx الآن. في السابق ، تم استخدامه لتخزين الإحصائيات والطلبات مؤقتًا ، بالإضافة إلى موازنة التحميل - مجموعة وكيل كلاسيكية. أدى تكاثر الخدمات الصغيرة إلى تآكل نطاق nginx. إذا انتهت إعدادات التكوين السابقة بزوج من الموقع على العديد من الواجهات الخلفية في بعض اللغات ، فعندئذٍ مع بنية الخدمات الصغيرة لدينا المزيد من الأجزاء المتحركة. أصبحت الواجهة الخلفية مجموعة من المكونات الصغيرة. على سبيل المثال ، يجب تكرار منطق التفويض على كل خدمة صغيرة أو استبعاده ، على سبيل المثال ، على الواجهة الأمامية. لتنفيذ التفويض المتقدم ، لا يوجد دائمًا ما يكفي من آليات الحلول المضمنة في nginx.
ثالثًا ، في nginx ، تقبل العديد من التوجيهات التعبيرات المحسوبة ديناميكيًا ، على سبيل المثال:
proxy cache bypass $cookie_nocache $arg_nocache;
يمكنك ربط المتغيرات مع بعضها البعض أو باستخدام السلاسل الحرفية. لكن هذا لا يكفي ، وأود الحصول على أدوات أكثر قوة ، على سبيل المثال ، لحساب التجزئة ، للعمل مع البيانات الرقمية ، للإرسال إلى الأحرف الكبيرة والصغيرة.
لتوسيع جميع الاختناقات في nginx ، تحتاج إلى تطوير بناء الجملة الخاص بك أو استخدام شيء جاهز. توصلنا إلى استنتاج مفاده أنه من الأفضل أخذ لغة برمجة نصية حالية. وبالتالي ، لا يحتاج المطورون إلى تعلم لغة جديدة ، مما سيوفر أيضًا الوقت ويخفض عتبة الدخول. اخترنا جافا سكريبت.
- ولماذا جافا سكريبت؟
- اخترنا جافا سكريبت لعدة أسباب:
- لهجة حديثة ، وهي جيدة للمطورين الذين يتحولون من لغات أخرى.
- على غرار C. هذا مهم لأن nginx config يستخدم أقواس متعرجة ، وفي المستقبل نريد إضافة القدرة على كتابة كود JS داخل التكوين مباشرة. الأقواس ستساعدنا في ذلك. في لوا ، على سبيل المثال ، يتم تنفيذ دور الأقواس المتعرجة من البداية والنهاية - وهذا غير مريح.
- يتناسب نموذج JavaScript جيدًا مع بنية nginx.
"لذا تم اعتبار لوا أيضًا؟" هل هذا بسبب البداية والنهاية؟
- بالفعل هناك مشروع OpenResty جاهز من جهة خارجية. إذا لم تدخل في التفاصيل ، فهذا أساسًا هو nginx + Lua ، لكن له بنية تتعارض مع nginx. أردنا تجنب التقاطعات مع هذا النظام البيئي. بالإضافة إلى ذلك ، هناك عدة أسباب أخرى:
- لوا لديها بناء جملة مثل باسكال.
- يتم فهرسة المصفوفات من 1.
- لوا لا تزال لغة برمجة متخصصة.
- كيف يقارن njs مع المنافسين؟
- قمنا بتصنيف njs مقارنة بالمحركات المعروفة - V8 و SpiderMonkey. إنها غير فعالة للمهام داخل nginx ، لأنها شحذتها المتصفحات ووزنها الثقيل للغاية ، وتتطلب nginx سرعة عالية. بالإضافة إلى ذلك ، كلا هذين المحركين يتطوران بسرعة ، API الخاصة بهم غير مستقرة. أخيرًا ، يمكن دمج njs بشكل أكثر كفاءة في nginx:
عدد السياقات التي تم إنشاؤها في الثانية- ما هي المعايير التي يدعمها njs؟
- في الوقت الحالي ، يتم تنفيذ جميع العناصر الأساسية تقريبًا لمواصفات ECMAScript 5.1 مع بعض التداخل بين عناصر المواصفات 6 و 7. أي الكائنات القياسية مثل Object ، Array ، String ، Number ، Date ، RegExp ، JSON. عمليات الإغلاق والوظائف المجهولة والعمل مع الاستثناءات مدعومة بالكامل.
نحن لا نضع هدفنا الأساسي الامتثال الكامل لمواصفات اللغة. حتى الآن لا يوجد دعم
للتقييم () ، وحتى الآن لا نخطط لإضافته. ولكننا نخطط لإضافة دعم للثابت وترك الكلمات الرئيسية ، بالإضافة إلى وظائف الأسهم.
ما هو قادر وما لا يستطيع njs في الوقت الحاضرمن المهم ذكر شيء آخر: نقص جمع القمامة. تراقب معظم اللغات الحديثة بشكل مستقل عمر الأشياء. إذا لم يعد الكائن مستخدمًا ، فسيتم حذفه تلقائيًا. لا يمكنك الاستغناء عن هذه الآلية ، ولكن عادةً ما يتعين عليك التضحية بشيء من أجلها - يتباطأ عمل البرنامج أو يتوقف حتى. في njs ، لا يتم تحرير الذاكرة حتى يتم تحرير كائن الطلب.
هذا النهج له إيجابياته وسلبياته. العيب الرئيسي هو أنه لا يسمح لك بالعمل بفعالية مع الاستفسارات الطويلة. لذلك ، نخطط في المستقبل لإضافة جمع القمامة كخيار لتمكينها حسب الحاجة.
- ما هو njs لا؟
- قبل الإجابة على هذا السؤال ، أود أن أكرر مرة أخرى أن المهمة الرئيسية لـ njs هي توسيع قدرات التكوين المرن لـ nginx وحل المهام على جانب الوكيل.
الآن السؤال نفسه. ما الذي يجب مراعاته مسبقا؟
- njs ليس بديلاً عن Node.js.
- حزمة nginx + njs ليست خادم تطبيقات.
- لا يقوم njs بتطبيق معايير ECMAScript بشكل كامل ، نظرًا لعدم وجود دعم للتقييم ().
إذا كان هذا الموضوع وثيق الصلة بك للغاية وتتوق إلى مزيد من التفاصيل ، فنحن نوصي بمشاهدة تسجيل الفيديو لتقرير ديمتري فولينتسيف في HighLoad ++ Siberia 2018 ، حيث كشف عنه من جميع الجهات.
كما ندعو جميع المحترفين لتقديم تقاريرهم إلى مؤتمر
HighLoad ++ 2018 لشهر نوفمبر ، الذي سيعقد في سكولكوفو يومي 8 و 9 نوفمبر. إذا كانت لديك تجربة فريدة ومثيرة للاهتمام وكنت مستعدًا لمشاركتها - فقم بالتسجيل قبل 1 سبتمبر واملأ
النموذج .
إذا كنت تخشى التحدث علنًا ، فلدينا ما يسمى
بمدرسة للمتحدثين ، حيث نساعد في ضخ هذه المهارات مجانًا.