Ndenze indawo yam yokugcina yePyPI ngokugunyaziswa kunye ne-S3. KwiNginx

Kule nqaku ndingathanda ukwabelana ngamava am kunye ne-NJS, ​​itoliki yeJavaScript ye-Nginx ephuhliswe ngu-Nginx Inc, echaza amandla ayo aphambili usebenzisa umzekelo wangempela. I-NJS iseti esezantsi yeJavaScript ekuvumela ukuba wandise ukusebenza kweNginx. Kumbuzo kutheni itoliki yakho??? UDmitry Volyntsev waphendula ngokweenkcukacha. Ngamafutshane: I-NJS yi-nginx-way, kwaye iJavaScript iqhubela phambili, "imveli" kwaye ngaphandle kweGC, ngokungafani neLua.

Kudala dala kakhulu…

Kumsebenzi wam wokugqibela, ndizuze ilifa le-gitlab kunye nenani lemibhobho ye-motley CI / CD ene-docker-compose, i-dind kunye nezinye izinto eziyolisayo, eziye zatshintshelwa kwi-kaniko rails. Imifanekiso ebikade isetyenziswa kwi-CI yasuswa ngohlobo lwayo lwangaphambili. Basebenza ngokufanelekileyo de kube yimini apho i-IP yethu ye-gitlab itshintshile kwaye i-CI yajika yaba yithanga. Ingxaki yayikukuba omnye wemifanekiso ye-docker ethathe inxaxheba kwi-CI yayine-git, eyatsala iimodyuli zePython nge-ssh. Kwi-ssh udinga isitshixo sabucala kwaye... ibisemfanekisweni kunye neenginginya ezaziwayo. Kwaye nayiphi na i-CI ayiphumelelanga ngemposiso engundoqo yokuqinisekisa ngenxa yokungahambelani phakathi kwe-IP yokwenyani kunye naleyo ichazwe kwiihostele ezaziwayo. Umfanekiso omtsha wadityaniswa ngokukhawuleza kwiiDockfiles ezikhoyo kwaye ukhetho longeziwe StrictHostKeyChecking no. Kodwa incasa embi yahlala kwaye kwakukho umnqweno wokuhambisa i-libs kwindawo yokugcina i-PyPI yangasese. Ibhonasi eyongezelelweyo, emva kokutshintshela kwi-PyPI yangasese, yayingumbhobho olula kunye nenkcazo eqhelekileyo yeemfuno.txt

Ukhetho lwenziwe, Manene!

Siqhuba yonke into emafini kunye ne-Kubernetes, kwaye ekugqibeleni sasifuna ukufumana inkonzo encinci eyayiyisitya esingenammiselo kunye nokugcinwa kwangaphandle. Ewe, kuba sisebenzisa i-S3, eyona nto iphambili yanikwa yona. Kwaye, ukuba kunokwenzeka, ngokuqinisekiswa kwi-gitlab (ungayongeza ngokwakho ukuba kuyimfuneko).

Uphendlo olukhawulezayo luvelise iziphumo ezininzi: i-s3pypi, ipypicloud kunye nokhetho olunokwenziwa β€œngemanuwali” yeefayile zehtml zetheniphu. Inketho yokugqibela yanyamalala ngokwayo.

s3pypi: Le yi-cli yokusebenzisa ukusingathwa kwe-S3. Silayisha iifayile, sivelise i-html kwaye siyilayishe kwibhakethi enye. Ilungele ukusetyenziswa ekhaya.

pypicloud: Kwakubonakala ngathi yiprojekthi enomdla, kodwa emva kokufunda amaxwebhu ndaphoxeka. Ngaphandle kwamaxwebhu alungileyo kunye nokukwazi ukwandisa ukuhambelana neemfuno zakho, eneneni kuye kwabonakala kungafuneki kwaye kunzima ukuyiqwalasela. Ukulungisa ikhowudi ukuze ihambelane nemisebenzi yakho, ngokoqikelelo lwelo xesha, bekuya kuthatha iintsuku ezi-3-5. Inkonzo ikwafuna uvimba weenkcukacha. Sayishiya ukuba asiyifumani enye into.

Ukukhangela nzulu ngakumbi kuvelise imodyuli ye-Nginx, ngx_aws_auth. Isiphumo sovavanyo lwakhe sasiyi-XML eboniswe kwisikhangeli, esibonisa imixholo yebhakethi ye-S3. Isibophelelo sokugqibela ngexesha lokukhangelwa kwaba ngunyaka odlulileyo. Indawo yokugcina izinto ibonakale ilahliwe.

Ngokuya kumthombo kunye nokufunda IPHEPHA-503 Ndabona ukuba i-XML inokuguqulwa ibe yi-HTML ngokubhabha kwaye inikwe i-pip. Emva kokuhamba kancinci malunga ne-Nginx kunye ne-S3, ndifumene umzekelo wokuqinisekisa kwi-S3 ebhalwe kwi-JS ye-Nginx. Ndadibana ngolo hlobo ke noNJS.

Ukuthatha lo mzekelo njengesiseko, iyure kamva ndabona kwisikhangeli sam iXML efanayo naxa usebenzisa imodyuli ethi ngx_aws_auth, kodwa yonke into yayisele ibhaliwe kwi-JS.

Ndisithande kakhulu isisombululo se nginx. Okokuqala, amaxwebhu amahle kunye nemizekelo emininzi, okwesibini, sifumana zonke izinto ezilungileyo ze-Nginx zokusebenza kunye neefayile (ngaphandle kwebhokisi), okwesithathu, nabani na owaziyo ukubhala i-configs ye-Nginx uya kukwazi ukufumanisa ukuba yintoni na. I-Minimalism nayo idibanisa kum, xa kuthelekiswa nePython okanye i-Go (ukuba ibhalwe ukusuka ekuqaleni), singasathethi ke nge-nexus.

TL;DR Emva kweentsuku ezi-2, inguqulelo yovavanyo yePyPi yayisele isetyenziswe kwiCI.

Isebenza njani?

Imodyuli ilayishwe kwiNginx ngx_http_js_module, ibandakanyiwe kumfanekiso wedokhi esemthethweni. Singenisa isikripthi sethu sisebenzisa umyalelo js_importkuqwalaselo lweNginx. Umsebenzi ubizwa ngokuba ngumyalelo js_content. Umyalelo usetyenziselwa ukuseta iinguqu js_set, ethatha njengengxoxo kuphela umsebenzi ochazwe kwiscript. Kodwa sinokusebenzisa ii-subqueries kwi-NJS kuphela sisebenzisa i-Nginx, hayi nayiphi na i-XMLHttpRequest. Ukwenza oku, indawo ehambelanayo kufuneka yongezwe kuqwalaselo lweNginx. Kwaye iscript kufuneka sichaze isicelo esincinci kule ndawo. Ukuze ukwazi ukufikelela kumsebenzi ovela kuqwalaselo lweNginx, igama lomsebenzi kufuneka lithunyelwe ngaphandle kwiskripthi ngokwaso 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}

Xa iceliwe kwisikhangeli http://localhost:8080/ singena location /apho umyalelo js_content ibiza umsebenzi request ichazwe kwiskripthi sethu script.js. Ngokulandelayo, kumsebenzi request i subquery yenziwe location = /sub-query, ngendlela (kumzekelo wangoku iGET) efunyenwe kwimpikiswano (r), igqithiswe ngokungafihlisiyo xa lo msebenzi ubizwa. Impendulo yesicelo esingaphantsi iya kuqhutyelwa phambili kumsebenzi call_back.

Ukuzama i-S3

Ukwenza isicelo kwindawo yokugcina i-S3 yabucala, sifuna:

ACCESS_KEY

SECRET_KEY

S3_BUCKET

Ukusuka kwindlela esetyenzisiweyo ye-http, umhla/ixesha langoku, i-S3_NAME kunye ne-URI, uhlobo oluthile lomtya luyenziwa, olusayinwe (HMAC_SHA1) kusetyenziswa i-SECRET_KEY. Okulandelayo ngumgca onje AWS $ACCESS_KEY:$HASH, ingasetyenziswa kwiheda yogunyaziso. Umhla/ixesha elifanayo elisetyenziselwe ukuvelisa umtya kwinqanaba langaphambili kufuneka longezwe kwiheda X-amz-date. Kwikhowudi ibonakala ngolu hlobo:

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(Umzekelo we-AWS Sign v2 wogunyaziso, utshintshelwe kwisimo esiyekiweyo)

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}

Ingcaciso encinci malunga _subrequest_uri: oku kuguquguquka ukuba, ngokuxhomekeke kwi-uri yokuqala, yenza isicelo kwi-S3. Ukuba ufuna ukufumana imixholo "yengcambu", ngoko kufuneka udale isicelo se-uri esibonisa i-delimiter. delimiter, eya kubuyisela uluhlu lwazo zonke ii-CommonPrefixes xml element, ezihambelana nabalawuli (kwimeko yePyPI, uluhlu lwazo zonke iipakethe). Ukuba ufuna ukufumana uluhlu lwemixholo kulawulo oluthile (uluhlu lwazo zonke iinguqulelo zephakheji), ngoko isicelo se-uri kufuneka siqulathe indawo yesimaphambili esinegama likavimba weefayili (umqulu) ophela ngosilayidi /. Kungenjalo, ungqubano lunokwenzeka xa ucela imixholo yolawulo, umzekelo. Kukho abalawuli aiohttp-request kunye ne-aiohttp-izicelo kwaye ukuba isicelo siyachaza /?prefix=aiohttp-request, emva koko impendulo iya kuqulatha imixholo yabo bobabini abalawuli. Ukuba kukho i-slash ekugqibeleni, /?prefix=aiohttp-request/, ngoko impendulo iya kuqulatha kuphela uvimba weefayili ofunekayo. Kwaye ukuba sicela ifayile, ngoko i-uri ebangelwayo ayifanele ihluke kwiyokuqala.

Gcina kwaye uqalise kwakhona iNginx. Kwisiphequluli sifaka idilesi yeNginx yethu, umphumo wesicelo uya kuba yi-XML, umzekelo:

Uluhlu lwabalawuli

<?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>

Kuluhlu lwabalawuli uya kufuna kuphela izakhi CommonPrefixes.

Ngokudibanisa uluhlu esiludingayo kwidilesi yethu kwisikhangeli, siya kufumana imixholo yalo kwifomu ye-XML:

Uluhlu lweefayile kuluhlu

<?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>

Kuluhlu lweefayile siya kuthatha izinto kuphela Key.

Ekuphela kwento eseleyo kukucazulula iXML enesiphumo kwaye uyithumele njenge HTML, ubuyisele kuqala umxholo wohlobo lomxholo ngombhalo/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="/xh/${reValue.groups.v}">${a_text}</a>`);
    }
  }

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

Ukuzama iPyPI

Sijonga ukuba akukho nto iphula naphi na kwiiphakheji ezaziwa ngokusebenza.

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ для тСстов Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅
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

Siphinda kunye ne-libs yethu.

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ для тСстов Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅
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

Kwi-CI, ukwenza kunye nokulayisha ipakethe kujongeka ngolu hlobo:

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}"

Uqinisekiso

Kwi-Gitlab kunokwenzeka ukusebenzisa i-JWT yokuqinisekisa / ugunyaziso lweenkonzo zangaphandle. Ukusebenzisa i-auth_request i-directive kwi-Nginx, siya kuqondisa kwakhona idatha yokuqinisekisa kwi-subrequest equlethe umnxeba wokusebenza kwiskripthi. Isikripthi siya kwenza enye i-subrequest kwi-url ye-Gitlab kwaye ukuba idatha yokuqinisekisa ichazwe ngokuchanekileyo, ngoko i-Gitlab iya kubuyisela ikhowudi ye-200 kwaye ukulayishwa / ukukhutshelwa kwephakheji kuya kuvunyelwa. Kutheni ungasebenzisi i-subquery enye kwaye ngokukhawuleza uthumele idatha kwi-Gitlab? Kuba ke kuya kufuneka sihlele ifayile yoqwalaselo yeNginx ngalo lonke ixesha sisenza naluphi na utshintsho kugunyaziso, kwaye lo ngumsebenzi odinayo. Kwakhona, ukuba iKubernetes isebenzisa umgaqo-nkqubo wefayile yefayile yokufunda-kuphela, oku kongeza ukuntsokotha ngakumbi xa ususa nginx.conf nge configmap. Kwaye iba yinto engenakwenzeka kwaphela ukuqwalasela i-Nginx nge-configmap ngelixa ngaxeshanye usebenzisa imigaqo-nkqubo ethintela uxhulumaniso lwemithamo (pvc) kunye nenkqubo yefayile yokufunda-kuphela (oku kuyenzeka kwakhona).

Ukusebenzisa i-NJS ephakathi, sifumana ithuba lokutshintsha iiparamitha ezikhankanyiweyo kwi-nginx config usebenzisa izinto eziguquguqukayo zendalo kwaye wenze ezinye iitshekhi kwiskripthi (umzekelo, i-URL echazwe ngokungachanekanga).

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}

Okunokwenzeka ukuba umbuzo uyavuthwa: -Kutheni ungasebenzisi iimodyuli esele zenziwe? Yonke into sele yenziwe apho! Umzekelo, var AWS = kufuna('aws-sdk') kwaye akukho mfuneko yokubhala β€œibhayisekile” enobubhali be-S3!

Masiqhubele phambili kwi-cons

Kum, ukungakwazi ukungenisa iimodyuli zangaphandle ze-JS zaba yinto engathandekiyo, kodwa elindelekileyo. Ichazwe kumzekelo ongentla kufuna('crypto') yi iimodyuli zokwakha ngaphakathi kwaye ufuna imisebenzi kuphela kubo. Akukho ndlela yokusebenzisa kwakhona ikhowudi evela kwizikripthi kwaye kufuneka uyikopishe kwaye uyincamathisele kwiifayile ezahlukeneyo. Ndiyathemba ukuba ngenye imini lo msebenzi uya kuphunyezwa.

Uxinzelelo kufuneka luvaliwe kwiprojekthi yangoku kwiNginx gzip off;

Ngenxa yokuba akukho modyuli ye-gzip kwi-NJS kwaye akunakwenzeka ukuyidibanisa; ngoko ke, akukho ndlela yokusebenza ngedatha ecinezelweyo. Yinyani, oku akuyonto ngenene yokuthabatha kweli tyala. Akukho mbhalo omninzi, kwaye iifayile ezigqithisiweyo sele zixinzelelwe kwaye ucinezelo olongezelelweyo aluyi kubanceda kakhulu. Kwakhona, oku akusiyo inkonzo elayishiweyo okanye ebaluleke kakhulu ukuba kufuneka ukhathazeke ngokuhambisa umxholo kwii-millisecond ezimbalwa ngokukhawuleza.

Ukucocwa kweskripthi kuthatha ixesha elide kwaye kunokwenzeka kuphela ngee "prints" kwi error.log. Ngokuxhomekeke kwiseti yolwazi lwenqanaba lokungena, isilumkiso okanye impazamo, kunokwenzeka ukuba kusetyenziswe iindlela ezi-3 r.log, r.warn, r.error ngokulandelanayo. Ndizama ukulungisa ezinye izikripthi kwiChrome (v8) okanye isixhobo se-njs console, kodwa ayizizo zonke izinto ezinokujongwa apho. Xa ikhowudi yokulungisa ingxaki, uvavanyo olusebenzayo, imbali ijongeka ngolu hlobo:

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

kwaye kunokubakho amakhulu olandelelwano olunjalo.

Ikhowudi yokubhala usebenzisa i-subqueries kunye ne-variables kubo ijika ibe yi-tangled tangle. Ngamanye amaxesha uqala ukukhawuleza ujikeleze iifestile ezahlukeneyo ze-IDE uzama ukubona ukulandelelana kweentshukumo zekhowudi yakho. Akunzima, kodwa ngamanye amaxesha kuyacaphukisa kakhulu.

Akukho nkxaso ipheleleyo ye-ES6.

Kusenokubakho ezinye iintsilelo, kodwa andidibananga nenye into. Yabelana ngolwazi ukuba unamava angalunganga usebenzisa i-NJS.

isiphelo

I-NJS yitoliki yomthombo ovulekileyo elula ekuvumela ukuba usebenzise izikripthi ezahlukeneyo zeJavaScript kwiNginx. Ngethuba lokuphuhliswa kwayo, ingqwalasela enkulu yahlawulwa ekusebenzeni. Ewe kunjalo, kuninzi okulahlekileyo, kodwa iprojekthi iphuhliswa liqela elincinci kwaye longeza izinto ezintsha kunye nokulungisa iziphene. Ndiyathemba ukuba ngenye imini i-NJS iya kukuvumela ukuba udibanise iimodyuli zangaphandle, eziza kwenza ukuba i-Nginx isebenze phantse ingenasiphelo. Kodwa kukho i-NGINX Plus kwaye ngokuqinisekileyo akuyi kubakho iimpawu!

Indawo yokugcina enekhowudi epheleleyo yenqaku

njs-pypi nge-AWS Sign v4 inkxaso

Inkcazelo yezikhokelo zemodyuli ye-ngx_http_js_modyuli

Uvimba osemthethweni we-NJS ΠΈ amaxwebhu

Imizekelo yokusebenzisa i-NJS evela kuDmitry Volintsev

njs -ukubhalwa kweJavaScript yemveli kwi nginx / Intetho kaDmitry Volnyev eSaint HighLoad++ 2019

NJS kwimveliso / Intetho kaVasily Soshnikov kwi-HighLoad++ 2019

Ukutyikitya kunye nokuQinisekisa izicelo ze-REST kwi-AWS

umthombo: www.habr.com