مون اختيار ۽ S3 سان پنهنجو PyPI مخزن ٺاهيو. Nginx تي

ھن آرٽيڪل ۾ مان پنھنجي تجربي کي NJS سان حصيداري ڪرڻ چاھيان ٿو، Nginx لاء ھڪڙو جاوا اسڪرپٽ مترجم Nginx Inc پاران ٺاھيو ويو آھي، ھڪڙو حقيقي مثال استعمال ڪندي پنھنجي مکيه صلاحيتن کي بيان ڪري ٿو. NJS جاوا اسڪرپٽ جو ھڪڙو ذيلي سيٽ آھي جيڪو توھان کي Nginx جي ڪارڪردگي کي وڌائڻ جي اجازت ڏئي ٿو. سوال ڏانهن توهان جو پنهنجو مترجم ڇو؟؟؟ دمتري Volyntsev تفصيل سان جواب ڏنو. مختصر ۾: NJS nginx-way آهي، ۽ JavaScript وڌيڪ ترقي پسند، "ملي" ۽ GC کان سواء، لوا جي برعڪس.

گهڻو وقت پهريان…

منهنجي آخري نوڪريءَ تي، مون کي وراثت ۾ مليل گٽليب سان گڏ ڪيتريون ئي موٽلي CI/CD پائيپ لائينون ڊاڪر ڪمپوز، ڊينڊ ۽ ٻيون لذتون، جن کي ڪنيڪو ريل ۾ منتقل ڪيو ويو. تصويرون جيڪي اڳ ۾ CI ۾ استعمال ڪيون ويون آهن انهن جي اصل شڪل ۾ منتقل ڪيون ويون آهن. انهن ڏينهن تائين صحيح طريقي سان ڪم ڪيو جڏهن اسان جي گيتلاب IP تبديل ٿي وئي ۽ CI ڪدو ۾ تبديل ٿي وئي. مسئلو اهو هو ته ڊاکر تصويرن مان هڪ آهي جنهن ۾ حصو ورتو ويو CI ۾ گٽ، جيڪو پٿن ماڊلز کي ssh ذريعي ڇڪايو. ssh لاءِ توھان کي ھڪڙي خانگي چاٻي جي ضرورت آھي ۽... اھا تصوير ۾ ڄاڻايل_hosts سان گڏ ھئي. ۽ ڪو به CI ناڪام ٿيو هڪ اهم تصديق جي غلطي سان حقيقي IP ۽ هڪ جي وچ ۾ هڪ مطابقت جي ڪري ڄاڻايل_hosts. موجوده ڊاک فائلن مان هڪ نئين تصوير جلدي گڏ ڪئي وئي ۽ اختيار شامل ڪيو ويو StrictHostKeyChecking no. پر خراب ذائقو رهيو ۽ هڪ خانگي PyPI مخزن ڏانهن libs منتقل ڪرڻ جي خواهش هئي. هڪ اضافي بونس، پرائيويٽ PyPI تي سوئچ ڪرڻ کان پوءِ، هڪ سادي پائپ لائن ۽ Requiments.txt جي عام وضاحت هئي.

اختيار ڪيو ويو آهي، حضرات!

اسان بادل ۽ ڪبرنيٽس ۾ هر شي کي هلائيندا آهيون، ۽ آخر ۾ اسان هڪ ننڍڙي خدمت حاصل ڪرڻ چاهيندا هئاسين جيڪا ٻاهرين اسٽوريج سان هڪ بي رياست ڪنٽينر هئي. خير، جيئن ته اسان S3 استعمال ڪندا آهيون، ان کي ترجيح ڏني وئي هئي. ۽، جيڪڏهن ممڪن هجي، گٽليب ۾ تصديق سان (جيڪڏهن ضروري هجي ته توهان پنهنجو پاڻ کي شامل ڪري سگهو ٿا).

هڪ تڪڙي ڳولا ڪيترائي نتيجا پيدا ڪيا: s3pypi، pypicloud ۽ هڪ اختيار سان گڏ "دستي" ٺاھڻ جي html فائلن جي ٺاھڻ لاء. آخري اختيار پاڻ ئي غائب ٿي ويو.

s3pypi: هي S3 هوسٽنگ استعمال ڪرڻ لاءِ هڪ ڪلائي آهي. اسان فائلون اپلوڊ ڪندا آهيون، html ٺاهيندا آهيون ۽ ان کي ساڳئي بالٽ تي اپلوڊ ڪندا آهيون. گھر جي استعمال لاء مناسب.

pypicloud: اهو هڪ دلچسپ منصوبو وانگر لڳي، پر دستاويز پڙهڻ کان پوء مون کي مايوس ٿي ويو. سٺي دستاويز جي باوجود ۽ توهان جي ضرورتن کي پورو ڪرڻ جي صلاحيت وڌائڻ جي باوجود، حقيقت ۾ اهو نڪتو ۽ ترتيب ڏيڻ ڏکيو آهي. توهان جي ڪمن جي مطابق ڪوڊ کي درست ڪرڻ، ان وقت جي اندازي مطابق، 3-5 ڏينهن لڳن ها. خدمت کي پڻ ڊيٽابيس جي ضرورت آهي. اسان ان کي ڇڏي ڏنو جيڪڏهن اسان کي ٻيو ڪجهه نه مليو.

هڪ وڌيڪ ڳوڙها ڳولها Nginx، ngx_aws_auth لاء هڪ ماڊل پيدا ڪئي. هن جي جاچ جو نتيجو برائوزر ۾ ڏيکاريل XML هو، جنهن ۾ S3 بالٽ جو مواد ڏيکاريو ويو. ڳولا جي وقت تي آخري انجام هڪ سال اڳ هو. ذخيرو ڇڏيل نظر آيو.

ذريعن ڏانهن وڃڻ ۽ پڙهڻ سان پي اي پي-503 مون محسوس ڪيو ته ايڪس ايم ايل کي فلائي تي HTML ۾ تبديل ڪري سگھجي ٿو ۽ پائپ کي ڏنو ويو. نينگڪس ۽ S3 بابت ٿورو وڌيڪ گوگل ڪرڻ کان پوءِ، مون وٽ آيو هڪ مثال جي تصديق جو S3 ۾ لکيل JS ۾ Nginx لاءِ. اهڙي طرح منهنجي ملاقات NJS سان ٿي.

هن مثال کي بنياد طور کڻڻ، هڪ ڪلاڪ بعد مون پنهنجي برائوزر ۾ ساڳيو XML ڏٺو جڏهن ngx_aws_auth ماڊل استعمال ڪندي، پر سڀ ڪجهه اڳ ۾ ئي JS ۾ لکيل هو.

مون واقعي پسند ڪيو nginx حل. پهرين، سٺي دستاويز ۽ ڪيترائي مثال، ٻيو، اسان فائلن سان ڪم ڪرڻ لاء نينڪسڪس جون سڀئي شيون حاصل ڪيون ٿا (باڪس کان ٻاهر)، ٽيون، جيڪو به ڄاڻي ٿو ته نينگڪس لاء ترتيب ڪيئن لکڻو آهي اهو معلوم ڪرڻ جي قابل هوندو ته ڇا آهي. پٿون يا گو (جيڪڏهن شروع کان لکيل هجي) جي مقابلي ۾، مون لاءِ Minimalism پڻ هڪ پلس آهي، نڪاح جو ذڪر نه ڪرڻ.

TL؛ DR 2 ڏينهن کان پوء، PyPi جو ٽيسٽ ورزن اڳ ۾ ئي استعمال ڪيو ويو CI ۾.

ان کي ڪيئن ڪم ڪندو؟

ماڊل Nginx ۾ لوڊ ڪيو ويو آهي ngx_http_js_module، سرڪاري ڊاکر تصوير ۾ شامل. اسان هدايتون استعمال ڪندي اسان جي اسڪرپٽ درآمد ڪريون ٿا js_importNginx ترتيب ڏيڻ لاء. فنڪشن کي هدايت جي ذريعي سڏيو ويندو آهي js_content. ھدايت متغير مقرر ڪرڻ لاء استعمال ڪيو ويندو آھي js_set، جيڪو هڪ دليل طور وٺندو آهي صرف رسم الخط ۾ بيان ڪيل فنڪشن. پر اسان NJS ۾ صرف Nginx استعمال ڪندي ذيلي سوالن تي عمل ڪري سگھون ٿا، نه ڪي XMLHttpRequest. هن کي ڪرڻ لاء، لاڳاپيل هنڌ شامل ڪيو وڃي Nginx ترتيب ۾. ۽ اسڪرپٽ کي لازمي طور تي بيان ڪرڻ گهرجي هڪ ذيلي درخواست هن جڳهه تي. Nginx config کان فنڪشن تائين رسائي حاصل ڪرڻ لاء، فنڪشن جو نالو اسڪرپٽ ۾ برآمد ڪيو وڃي export default.

nginx.conf

load_module modules/ngx_http_js_module.so;
http {
  js_import   imported_name  from script.js;

server {
  listen 8080;
  ...
  location = /sub-query {
    internal;

    proxy_pass http://upstream;
  }

  location / {
    js_content imported_name.request;
  }
}

script.js

function request(r) {
  function call_back(resp) {
    // handler's code
    r.return(resp.status, resp.responseBody);
  }

  r.subrequest('/sub-query', { method: r.method }, call_back);
}

export default {request}

جڏهن برائوزر ۾ درخواست ڪئي وئي http://localhost:8080/ اسان داخل ٿي وڃون ٿا location /جنهن ۾ هدايت js_content هڪ فنڪشن سڏي ٿو request اسان جي اسڪرپٽ ۾ بيان ڪيو ويو آهي script.js. موڙ ۾، فنڪشن ۾ request هڪ ذيلي پڇا ڳاڇا ڪئي وئي آهي location = /sub-query, هڪ طريقي سان (موجوده مثال GET ۾) دليل مان حاصل ڪيل (r)، واضح طور تي گذري ويو جڏهن هن فنڪشن کي سڏيو ويندو آهي. ذيلي درخواست جي جواب تي عمل ڪيو ويندو فنڪشن ۾ call_back.

ڪوشش ڪري رهيو آهي S3

خانگي S3 اسٽوريج لاء درخواست ڪرڻ لاء، اسان کي ضرورت آهي:

ACCESS_KEY

SECRET_KEY

S3_BUCKET

استعمال ٿيل http طريقي مان، موجوده تاريخ/وقت، S3_NAME ۽ URI، هڪ خاص قسم جي اسٽرنگ ٺاهي ٿي، جيڪا SECRET_KEY استعمال ڪندي (HMAC_SHA1) تي دستخط ٿيل آهي. اڳيان هڪ لڪير وانگر آهي AWS $ACCESS_KEY:$HASH, اجازت ڏيڻ واري هيڊر ۾ استعمال ڪري سگھجي ٿو. ساڳئي تاريخ/وقت جيڪو استعمال ڪيو ويو هو اڳئين قدم ۾ اسٽرنگ ٺاهڻ لاءِ هيڊر ۾ شامل ڪيو وڃي X-amz-date. ڪوڊ ۾ اهو هن وانگر ڏسڻ ۾ اچي ٿو:

nginx.conf

load_module modules/ngx_http_js_module.so;
http {
  js_import   s3      from     s3.js;

  js_set      $s3_datetime     s3.date_now;
  js_set      $s3_auth         s3.s3_sign;

server {
  listen 8080;
  ...
  location ~* /s3-query/(?<s3_path>.*) {
    internal;

    proxy_set_header    X-amz-date     $s3_datetime;
    proxy_set_header    Authorization  $s3_auth;

    proxy_pass          $s3_endpoint/$s3_path;
  }

  location ~ "^/(?<prefix>[w-]*)[/]?(?<postfix>[w-.]*)$" {
    js_content s3.request;
  }
}

s3.js(AWS سائن v2 اختيار ڪرڻ جو مثال، تبديل ٿيل فرسوده حالت ۾)

var crypt = require('crypto');

var s3_bucket = process.env.S3_BUCKET;
var s3_access_key = process.env.S3_ACCESS_KEY;
var s3_secret_key = process.env.S3_SECRET_KEY;
var _datetime = new Date().toISOString().replace(/[:-]|.d{3}/g, '');

function date_now() {
  return _datetime
}

function s3_sign(r) {
  var s2s = r.method + 'nnnn';

  s2s += `x-amz-date:${date_now()}n`;
  s2s += '/' + s3_bucket;
  s2s += r.uri.endsWith('/') ? '/' : r.variables.s3_path;

  return `AWS ${s3_access_key}:${crypt.createHmac('sha1', s3_secret_key).update(s2s).digest('base64')}`;
}

function request(r) {
  var v = r.variables;

  function call_back(resp) {
    r.return(resp.status, resp.responseBody);
  }

  var _subrequest_uri = r.uri;
  if (r.uri === '/') {
    // root
    _subrequest_uri = '/?delimiter=/';

  } else if (v.prefix !== '' && v.postfix === '') {
    // directory
    var slash = v.prefix.endsWith('/') ? '' : '/';
    _subrequest_uri = '/?prefix=' + v.prefix + slash;
  }

  r.subrequest(`/s3-query${_subrequest_uri}`, { method: r.method }, call_back);
}

export default {request, s3_sign, date_now}

جي باري ۾ ٿورو وضاحت _subrequest_uri: هي هڪ متغير آهي، جيڪو ابتدائي uri تي منحصر ڪري ٿو، S3 ڏانهن درخواست ٺاهي ٿو. جيڪڏهن توهان کي "روٽ" جو مواد حاصل ڪرڻ جي ضرورت آهي، ته پوء توهان کي هڪ uri درخواست ٺاهڻ جي ضرورت آهي جيڪا ڊيليميٽر کي اشارو ڪندي. delimiter, جيڪو سڀني CommonPrefixes xml عناصر جي فهرست واپس ڪندو، ڊائريڪٽرن سان لاڳاپيل (PyPI جي صورت ۾، سڀني پيڪيجز جي فهرست). جيڪڏهن توهان کي ڪنهن مخصوص ڊاريڪٽري ۾ مواد جي فهرست حاصل ڪرڻ جي ضرورت آهي (سڀني پيڪيج جي نسخن جي هڪ فهرست)، ته پوءِ uri درخواست ۾ لازمي طور تي ڊاريڪٽري (پيڪيج) جي نالي سان هڪ اڳياڙي فيلڊ هجڻ گهرجي، لازمي طور تي سليش / سان ختم ٿئي. ٻي صورت ۾، ٽڪر ممڪن آهي جڏهن ڊائريڪٽري جي مواد جي درخواست ڪري، مثال طور. هتي ڊائريڪٽريون آهن aiohttp-request ۽ aiohttp-requests ۽ جيڪڏهن درخواست بيان ڪري ٿي /?prefix=aiohttp-request، پوءِ جواب ۾ ٻنهي ڊائريڪٽرن جي مواد تي مشتمل هوندو. جيڪڏهن آخر ۾ هڪ سليش آهي، /?prefix=aiohttp-request/، پوءِ جواب ۾ صرف گهربل ڊاريڪٽري شامل هوندي. ۽ جيڪڏهن اسان هڪ فائل جي درخواست ڪريون ٿا، ته نتيجو uri اصل کان مختلف نه هجڻ گهرجي.

محفوظ ڪريو ۽ شروع ڪريو Nginx. برائوزر ۾ اسان اسان جي نينڪسڪس جو پتو داخل ڪيو، درخواست جو نتيجو XML ٿيندو، مثال طور:

ڊائريڪٽرن جي فهرست

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Name>myback-space</Name>
  <Prefix></Prefix>
  <Marker></Marker>
  <MaxKeys>10000</MaxKeys>
  <Delimiter>/</Delimiter>
  <IsTruncated>false</IsTruncated>
  <CommonPrefixes>
    <Prefix>new/</Prefix>
  </CommonPrefixes>
  <CommonPrefixes>
    <Prefix>old/</Prefix>
  </CommonPrefixes>
</ListBucketResult>

ڊائريڪٽرن جي فهرست مان توهان کي صرف عناصر جي ضرورت پوندي CommonPrefixes.

ڊاريڪٽري کي شامل ڪرڻ سان اسان کي برائوزر ۾ اسان جي ايڊريس تي ضرورت آهي، اسان ان جو مواد پڻ حاصل ڪنداسين XML فارم ۾:

ڊاريڪٽري ۾ فائلن جي فهرست

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <Name> myback-space</Name>
  <Prefix>old/</Prefix>
  <Marker></Marker>
  <MaxKeys>10000</MaxKeys>
  <Delimiter></Delimiter>
  <IsTruncated>false</IsTruncated>
  <Contents>
    <Key>old/giphy.mp4</Key>
    <LastModified>2020-08-21T20:27:46.000Z</LastModified>
    <ETag>&#34;00000000000000000000000000000000-1&#34;</ETag>
    <Size>1350084</Size>
    <Owner>
      <ID>02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4</ID>
      <DisplayName></DisplayName>
    </Owner>
    <StorageClass>STANDARD</StorageClass>
  </Contents>
  <Contents>
    <Key>old/hsd-k8s.jpg</Key>
    <LastModified>2020-08-31T16:40:01.000Z</LastModified>
    <ETag>&#34;b2d76df4aeb4493c5456366748218093&#34;</ETag>
    <Size>93183</Size>
    <Owner>
      <ID>02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4</ID>
      <DisplayName></DisplayName>
    </Owner>
    <StorageClass>STANDARD</StorageClass>
  </Contents>
</ListBucketResult>

فائلن جي لسٽ مان اسان صرف عناصر کڻنداسين Key.

باقي اهو آهي ته نتيجو XML کي پارس ڪرڻ ۽ ان کي HTML طور موڪليو، پهرين مواد جي قسم جي هيڊر کي متن/html سان تبديل ڪيو.

function request(r) {
  var v = r.variables;

  function call_back(resp) {
    var body = resp.responseBody;

    if (r.method !== 'PUT' && resp.status < 400 && v.postfix === '') {
      r.headersOut['Content-Type'] = "text/html; charset=utf-8";
      body = toHTML(body);
    }

    r.return(resp.status, body);
  }
  
  var _subrequest_uri = r.uri;
  ...
}

function toHTML(xml_str) {
  var keysMap = {
    'CommonPrefixes': 'Prefix',
    'Contents': 'Key',
  };

  var pattern = `<k>(?<v>.*?)</k>`;
  var out = [];

  for(var group_key in keysMap) {
    var reS;
    var reGroup = new RegExp(pattern.replace(/k/g, group_key), 'g');

    while(reS = reGroup.exec(xml_str)) {
      var data = new RegExp(pattern.replace(/k/g, keysMap[group_key]), 'g');
      var reValue = data.exec(reS);
      var a_text = '';

      if (group_key === 'CommonPrefixes') {
        a_text = reValue.groups.v.replace(///g, '');
      } else {
        a_text = reValue.groups.v.split('/').slice(-1);
      }

      out.push(`<a href="/sd/${reValue.groups.v}">${a_text}</a>`);
    }
  }

  return '<html><body>n' + out.join('</br>n') + 'n</html></body>'
}

ڪوشش ڪري رهيو آهي PyPI

اسان چيڪ ڪريون ٿا ته پيڪيجز تي ڪٿي به ڪا به ڀڃڪڙي نه آهي جيڪي ڪم ڪرڻ لاء سڃاتل آهن.

# Создаем для тестов новое окружение
python3 -m venv venv
. ./venv/bin/activate

# Скачиваем рабочие пакеты.
pip download aiohttp

# Загружаем в приватную репу
for wheel in *.whl; do curl -T $wheel http://localhost:8080/${wheel%%-*}/$wheel; done

rm -f *.whl

# Устанавливаем из приватной репы
pip install aiohttp -i http://localhost:8080

اسان کي اسان جي libs سان ورجائي.

# Создаем для тестов новое окружение
python3 -m venv venv
. ./venv/bin/activate

pip install setuptools wheel
python setup.py bdist_wheel
for wheel in dist/*.whl; do curl -T $wheel http://localhost:8080/${wheel%%-*}/$wheel; done

pip install our_pkg --extra-index-url http://localhost:8080

CI ۾، هڪ پيڪيج ٺاهڻ ۽ لوڊ ڪرڻ هن طرح نظر اچي ٿو:

pip install setuptools wheel
python setup.py bdist_wheel

curl -sSfT dist/*.whl -u "gitlab-ci-token:${CI_JOB_TOKEN}" "https://pypi.our-domain.com/${CI_PROJECT_NAME}"

تصديق

Gitlab ۾ اهو ممڪن آهي JWT استعمال ڪرڻ لاءِ خارجي خدمتن جي تصديق / اجازت ڏيڻ. استعمال ڪندي auth_request هدايت Nginx ۾، اسان تصديق واري ڊيٽا کي ريڊائريڪٽ ڪنداسين هڪ ذيلي درخواست تي جنهن ۾ اسڪرپٽ ۾ فنڪشن ڪال شامل آهي. اسڪرپٽ Gitlab url ڏانهن هڪ ٻي ذيلي درخواست ڪندو ۽ جيڪڏهن تصديق واري ڊيٽا صحيح نموني بيان ڪئي وئي ته پوءِ گٽلاب ڪوڊ 200 واپس ڪندو ۽ پيڪيج کي اپلوڊ/ڊائون لوڊ ڪرڻ جي اجازت ڏني ويندي. ڇو نه هڪ ذيلي سوال استعمال ڪريو ۽ فوري طور تي ڊيٽا Gitlab ڏانهن موڪليو؟ ڇو ته پوءِ اسان کي Nginx ترتيب واري فائل کي ايڊٽ ڪرڻو پوندو هر دفعي اسان اختيار ۾ ڪا به تبديلي ڪندا آهيون، ۽ اهو هڪ بلڪه مشڪل ڪم آهي. انهي سان گڏ، جيڪڏهن ڪبرنيٽس استعمال ڪري ٿو صرف پڙهڻ لاءِ روٽ فائل سسٽم پاليسي، پوءِ اهو اڃا به وڌيڪ پيچيدگي وڌائيندو آهي جڏهن nginx.conf کي configmap ذريعي تبديل ڪيو وڃي. ۽ اهو بلڪل ناممڪن ٿي وڃي ٿو نينگڪس کي ترتيب واري نقشي ذريعي ترتيب ڏيو جڏهن ته ساڳئي وقت پاليسين کي استعمال ڪندي حجم جي ڪنيڪشن کي روڪيو وڃي (پي وي سي) ۽ صرف پڙهڻ لاءِ روٽ فائل سسٽم (اهو پڻ ٿئي ٿو).

NJS وچولي استعمال ڪندي، اسان کي ماحول جي متغيرن کي استعمال ڪندي nginx config ۾ مخصوص پيٽرولر کي تبديل ڪرڻ جو موقعو مليو ۽ اسڪرپٽ ۾ ڪجهه چيڪ ڪريو (مثال طور، غلط طور تي مخصوص URL).

nginx.conf

location = /auth-provider {
  internal;

  proxy_pass $auth_url;
}

location = /auth {
  internal;

  proxy_set_header Content-Length "";
  proxy_pass_request_body off;
  js_content auth.auth;
}

location ~ "^/(?<prefix>[w-]*)[/]?(?<postfix>[w-.]*)$" {
  auth_request /auth;

  js_content s3.request;
}

s3.js

var env = process.env;
var env_bool = new RegExp(/[Tt]rue|[Yy]es|[Oo]n|[TtYy]|1/);
var auth_disabled  = env_bool.test(env.DISABLE_AUTH);
var gitlab_url = env.AUTH_URL;

function url() {
  return `${gitlab_url}/jwt/auth?service=container_registry`
}

function auth(r) {
  if (auth_disabled) {
    r.return(202, '{"auth": "disabled"}');
    return null
  }

  r.subrequest('/auth-provider',
                {method: 'GET', body: ''},
                function(res) {
                  r.return(res.status, "");
                });
}

export default {auth, url}

گهڻو ڪري سوال پيدا ٿئي ٿو: -ڇو نه تيار ٿيل ماڊل استعمال ڪريو؟ اتي سڀ ڪجهه اڳ ۾ ئي ٿي چڪو آهي! مثال طور، var AWS = گهربل ('aws-sdk') ۽ S3 جي تصديق سان "سائيڪل" لکڻ جي ڪا ضرورت ناهي!

اچو ته نقصانن ڏانهن وڃو

مون لاء، ٻاهرين JS ماڊلز کي درآمد ڪرڻ جي ناڪامي هڪ ناپسنديده، پر متوقع خصوصيت بڻجي وئي. مٿي ڏنل مثال ۾ بيان ڪيل ضرورت ('crypto') آهي تعمير ٿيل ماڊلز ۽ صرف انهن لاء ڪم جي ضرورت آهي. اسڪرپٽ مان ڪوڊ ٻيهر استعمال ڪرڻ جو ڪو طريقو ناهي ۽ توهان کي ان کي مختلف فائلن ۾ ڪاپي ۽ پيسٽ ڪرڻو پوندو. مون کي اميد آهي ته ڪنهن ڏينهن هن ڪارڪردگي تي عمل ڪيو ويندو.

Nginx ۾ موجوده منصوبي لاء ڪمپريشن پڻ بند ڪيو وڃي gzip off;

ڇاڪاڻ ته NJS ۾ ڪو به gzip ماڊل نه آهي ۽ ان کي ڳنڍڻ ناممڪن آهي؛ تنهن ڪري، کمپريس ٿيل ڊيٽا سان ڪم ڪرڻ جو ڪو طريقو ناهي. سچ پچ، هي واقعي هن ڪيس لاء هڪ منٽ نه آهي. هتي تمام گهڻو متن نه آهي، ۽ منتقل ٿيل فائلون اڳ ۾ ئي ٺهيل آهن ۽ اضافي ڪمپريشن انهن کي گهڻو مدد نه ڏيندو. انهي سان گڏ، هي اهڙي لوڊ ٿيل يا نازڪ خدمت ناهي جنهن کي توهان کي مواد پهچائڻ سان پريشان ڪرڻو پوندو ڪجهه ملي سيڪنڊ تيز.

اسڪرپٽ کي ڊيبگ ڪرڻ ۾ گهڻو وقت لڳندو آهي ۽ اهو صرف error.log ۾ ”پرنٽ“ ذريعي ئي ممڪن آهي. مقرر ٿيل لاگنگ سطح جي معلومات تي مدار رکندي، ڊيڄاريندڙ يا غلطي، اهو ممڪن آهي 3 طريقا استعمال ڪرڻ لاء r.log، r.warn، r.error. مان ڪروم (v8) يا njs ڪنسول ٽول ۾ ڪجھ اسڪرپٽ ڊيبگ ڪرڻ جي ڪوشش ڪريان ٿو، پر اتي سڀ ڪجھ چيڪ نه ٿو ڪري سگھجي. جڏهن ڊيبگنگ ڪوڊ، عرف فنڪشنل ٽيسٽ، تاريخ هن طرح ڪجهه ڏسڻ ۾ اچي ٿي:

docker-compose restart nginx
curl localhost:8080/
docker-compose logs --tail 10 nginx

۽ اهڙا سوين سلسلو ٿي سگهن ٿا.

انهن لاءِ ذيلي سوالن ۽ متغيرن کي استعمال ڪندي ڪوڊ لکڻ هڪ ٽنگيل ٽنگ ۾ بدلجي ٿو. ڪڏهن ڪڏهن توهان پنهنجي ڪوڊ جي عملن جي ترتيب کي معلوم ڪرڻ جي ڪوشش ڪندي مختلف IDE ونڊوز جي چوڌاري ڊوڙڻ شروع ڪندا آهيو. اهو ڏکيو ناهي، پر ڪڏهن ڪڏهن اهو تمام گهڻو پريشان آهي.

ES6 لاءِ مڪمل سپورٽ ناهي.

ٿي سگهي ٿو ته ڪي ٻيون به خاميون هجن، پر مون کي ٻيو ڪجهه به نه مليو آهي. معلومات حصيداري ڪريو جيڪڏھن توھان وٽ منفي تجربو آھي NJS استعمال ڪندي.

ٿڪل

NJS هڪ هلڪو وزن وارو اوپن سورس مترجم آهي جيڪو توهان کي Nginx ۾ مختلف جاوا اسڪرپٽ اسڪرپٽ لاڳو ڪرڻ جي اجازت ڏئي ٿو. ان جي ترقي دوران، وڏي ڌيان ڪارڪردگي تي ادا ڪيو ويو. يقينن، اڃا تائين تمام گهڻو غائب آهي، پر پروجيڪٽ هڪ ننڍڙي ٽيم پاران ترقي ڪئي وئي آهي ۽ اهي فعال طور تي نوان خاصيتون شامل ڪري رهيا آهن ۽ ڪيچ کي درست ڪري رهيا آهن. مون کي اميد آهي ته ڪنهن ڏينهن NJS توهان کي خارجي ماڊلز کي ڳنڍڻ جي اجازت ڏيندو، جيڪا Nginx ڪارڪردگي کي تقريبا لامحدود بڻائي سگهندي. پر اتي NGINX پلس آهي ۽ گهڻو ڪري اتي ڪا به خاصيتون نه هوندي!

مضمون لاءِ مڪمل ڪوڊ سان گڏ مخزن

njs-pypi AWS سائن v4 سپورٽ سان

ngx_http_js_module ماڊل جي هدايتن جي وضاحت

سرڪاري NJS مخزن и دستاويز

دمتري Volintsev کان NJS استعمال ڪرڻ جا مثال

njs - nginx ۾ اصلي جاوا اسڪرپٽ اسڪرپٽ / تقرير دمتري وولنيف پاران سينٽ هاء لوڊ ++ 2019 تي

پيداوار ۾ NJS / واسيلي سوشنڪوف پاران HighLoad++ 2019 تي تقرير

AWS ۾ REST درخواستن تي دستخط ۽ تصديق ڪرڻ

جو ذريعو: www.habr.com