அங்கீகாரம் மற்றும் S3 உடன் எனது சொந்த PyPI களஞ்சியத்தை உருவாக்கினேன். Nginx இல்

இந்தக் கட்டுரையில், Nginx Inc ஆல் உருவாக்கப்பட்ட Nginx இன் ஜாவாஸ்கிரிப்ட் மொழிபெயர்ப்பாளரான NJS உடனான எனது அனுபவத்தைப் பகிர்ந்து கொள்ள விரும்புகிறேன், உண்மையான உதாரணத்தைப் பயன்படுத்தி அதன் முக்கிய திறன்களை விவரிக்கிறேன். NJS என்பது ஜாவாஸ்கிரிப்ட்டின் துணைக்குழு ஆகும், இது Nginx இன் செயல்பாட்டை நீட்டிக்க உங்களை அனுமதிக்கிறது. என்ற கேள்விக்கு ஏன் உங்கள் சொந்த மொழிபெயர்ப்பாளர்??? டிமிட்ரி வோலின்ட்சேவ் விரிவாக பதிலளித்தார். சுருக்கமாக: NJS என்பது nginx-வே, மேலும் ஜாவாஸ்கிரிப்ட் மிகவும் முற்போக்கானது, "சொந்தமானது" மற்றும் GC இல்லாமல், லுவாவைப் போலல்லாமல்.

நீண்ட காலத்திற்கு முன்பு…

எனது கடைசி வேலையில், டோக்கர்-கம்போஸ், டிண்ட் மற்றும் பிற டிலைட்களுடன் கூடிய பல மோட்லி சிஐ/சிடி பைப்லைன்களுடன் கூடிய கிட்லாப்பை நான் மரபுரிமையாகப் பெற்றேன், அவை கனிகோ ரெயில்களுக்கு மாற்றப்பட்டன. CI இல் முன்பு பயன்படுத்தப்பட்ட படங்கள் அவற்றின் அசல் வடிவத்தில் நகர்த்தப்பட்டன. எங்கள் கிட்லாப் ஐபி மாறி சிஐ பூசணிக்காயாக மாறும் நாள் வரை அவை சரியாக வேலை செய்தன. சிக்கல் என்னவென்றால், CI இல் பங்கேற்ற டாக்கர் படங்களில் ஒன்று ஜிட் இருந்தது, இது பைதான் தொகுதிகளை ssh வழியாக இழுத்தது. ssh க்கு உங்களுக்கு ஒரு தனிப்பட்ட விசை தேவை மற்றும்... அது தெரிந்த_ஹோஸ்ட்களுடன் படத்தில் இருந்தது. உண்மையான ஐபிக்கும் தெரிந்த_ஹோஸ்ட்களில் குறிப்பிடப்பட்டதற்கும் இடையே உள்ள பொருந்தாத காரணத்தால் எந்த CIயும் முக்கிய சரிபார்ப்புப் பிழையால் தோல்வியடைந்தது. தற்போதுள்ள டாக்ஃபைல்களில் இருந்து ஒரு புதிய படம் விரைவாகச் சேகரிக்கப்பட்டது மற்றும் விருப்பம் சேர்க்கப்பட்டது StrictHostKeyChecking no. ஆனால் மோசமான சுவை இருந்தது மற்றும் லிப்களை ஒரு தனியார் PyPI களஞ்சியத்திற்கு நகர்த்த விருப்பம் இருந்தது. தனிப்பட்ட PyPI க்கு மாறிய பிறகு கூடுதல் போனஸ், எளிமையான பைப்லைன் மற்றும் தேவைகள்.txt பற்றிய இயல்பான விளக்கமாகும்.

தேர்வு செய்யப்பட்டுள்ளது, ஜென்டில்மென்!

மேகங்கள் மற்றும் குபெர்னெட்ஸில் அனைத்தையும் நாங்கள் இயக்குகிறோம், இறுதியில் வெளிப்புற சேமிப்பகத்துடன் கூடிய நிலையற்ற கொள்கலனாக இருக்கும் ஒரு சிறிய சேவையைப் பெற விரும்பினோம். சரி, நாங்கள் S3 ஐப் பயன்படுத்துவதால், அதற்கு முன்னுரிமை கொடுக்கப்பட்டது. மேலும், முடிந்தால், gitlab இல் அங்கீகாரத்துடன் (தேவைப்பட்டால் அதை நீங்களே சேர்க்கலாம்).

விரைவான தேடல் பல முடிவுகளை அளித்தது: s3pypi, pypicloud மற்றும் டர்னிப்களுக்கான html கோப்புகளை "கைமுறையாக" உருவாக்குவதற்கான விருப்பம். கடைசி விருப்பம் தானாகவே மறைந்துவிட்டது.

s3pypi: இது S3 ஹோஸ்டிங்கைப் பயன்படுத்துவதற்கான ஒரு cli ஆகும். நாங்கள் கோப்புகளைப் பதிவேற்றுகிறோம், html ஐ உருவாக்கி அதே வாளியில் பதிவேற்றுகிறோம். வீட்டு உபயோகத்திற்கு ஏற்றது.

pypicloud: இது ஒரு சுவாரஸ்யமான திட்டமாகத் தோன்றியது, ஆனால் ஆவணங்களைப் படித்த பிறகு நான் ஏமாற்றமடைந்தேன். நல்ல ஆவணங்கள் மற்றும் உங்கள் தேவைகளுக்கு ஏற்ப விரிவுபடுத்தும் திறன் இருந்தபோதிலும், உண்மையில் அது தேவையற்றதாகவும் கட்டமைக்க கடினமாகவும் மாறியது. உங்கள் பணிகளுக்கு ஏற்றவாறு குறியீட்டை சரிசெய்வதற்கு, அப்போதைய மதிப்பீடுகளின்படி, 3-5 நாட்கள் எடுத்திருக்கும். சேவைக்கு ஒரு தரவுத்தளமும் தேவை. வேறு எதுவும் கிடைக்கவில்லை என்றால் நாங்கள் அதை விட்டுவிட்டோம்.

இன்னும் ஆழமான தேடலில் Nginx, ngx_aws_auth க்கான ஒரு தொகுதி கிடைத்தது. அவரது சோதனையின் விளைவாக எக்ஸ்எம்எல் உலாவியில் காட்டப்பட்டது, இது S3 வாளியின் உள்ளடக்கங்களைக் காட்டியது. தேடுதலின் போது கடைசி கமிட் ஒரு வருடத்திற்கு முன்பு. களஞ்சியம் கைவிடப்பட்டதாகக் காணப்பட்டது.

மூலத்திற்குச் சென்று படிப்பதன் மூலம் PEP-503 XML ஐ HTML ஆக மாற்றி, pipக்கு கொடுக்கலாம் என்பதை உணர்ந்தேன். Nginx மற்றும் S3 பற்றி இன்னும் கொஞ்சம் கூகுள் செய்த பிறகு, Nginx க்காக JS இல் எழுதப்பட்ட S3 இல் அங்கீகாரத்திற்கான உதாரணத்தை நான் கண்டேன். அப்படித்தான் நான் என்.ஜே.எஸ்.

இந்த உதாரணத்தை அடிப்படையாக எடுத்துக் கொண்டால், ஒரு மணி நேரம் கழித்து எனது உலாவியில் ngx_aws_auth தொகுதியைப் பயன்படுத்தும் போது அதே XML ஐப் பார்த்தேன், ஆனால் அனைத்தும் ஏற்கனவே JS இல் எழுதப்பட்டது.

nginx தீர்வு எனக்கு மிகவும் பிடித்திருந்தது. முதலாவதாக, நல்ல ஆவணங்கள் மற்றும் பல எடுத்துக்காட்டுகள், இரண்டாவதாக, கோப்புகளுடன் (பெட்டிக்கு வெளியே) பணிபுரிவதற்காக Nginx இன் அனைத்து நன்மைகளையும் நாங்கள் பெறுகிறோம், மூன்றாவதாக, Nginx க்கான கட்டமைப்புகளை எழுதத் தெரிந்த எவரும் என்ன என்பதைக் கண்டுபிடிக்க முடியும். Python அல்லது Go (புதிதாக எழுதப்பட்டால்) உடன் ஒப்பிடும்போது, ​​மினிமலிசமும் எனக்கு ஒரு ப்ளஸ் ஆகும்.

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 Sign 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: இது ஒரு மாறி, இது ஆரம்ப யூரியைப் பொறுத்து, S3க்கு ஒரு கோரிக்கையை உருவாக்குகிறது. "ரூட்" இன் உள்ளடக்கங்களை நீங்கள் பெற வேண்டும் என்றால், பிரிப்பானைக் குறிக்கும் யூரி கோரிக்கையை நீங்கள் உருவாக்க வேண்டும். delimiter, இது கோப்பகங்களுடன் தொடர்புடைய அனைத்து CommonPrefixes xml உறுப்புகளின் பட்டியலை வழங்கும் (PyPI விஷயத்தில், அனைத்து தொகுப்புகளின் பட்டியல்). நீங்கள் ஒரு குறிப்பிட்ட கோப்பகத்தில் உள்ள உள்ளடக்கங்களின் பட்டியலைப் பெற வேண்டும் என்றால் (அனைத்து தொகுப்பு பதிப்புகளின் பட்டியல்), பின்னர் uri கோரிக்கையானது கோப்பகத்தின் (தொகுப்பு) பெயருடன் ஒரு முன்னொட்டு புலத்தைக் கொண்டிருக்க வேண்டும். இல்லையெனில், ஒரு கோப்பகத்தின் உள்ளடக்கங்களைக் கோரும்போது மோதல்கள் சாத்தியமாகும், எடுத்துக்காட்டாக. கோப்பகங்கள் உள்ளன aiohttp-கோரிக்கை மற்றும் aiohttp-கோரிக்கைகள் மற்றும் கோரிக்கை குறிப்பிட்டால் /?prefix=aiohttp-request, பின்னர் பதில் இரண்டு கோப்பகங்களின் உள்ளடக்கங்களைக் கொண்டிருக்கும். முடிவில் ஒரு சாய்வு இருந்தால், /?prefix=aiohttp-request/, பின்னர் பதிலில் தேவையான அடைவு மட்டுமே இருக்கும். நாம் ஒரு கோப்பைக் கோரினால், அதன் விளைவாக வரும் யூரி அசல் ஒன்றிலிருந்து வேறுபடக்கூடாது.

Nginx ஐ சேமித்து மறுதொடக்கம் செய்யுங்கள். உலாவியில் எங்கள் 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 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="/ta/${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

நாங்கள் எங்கள் லிப்களுடன் மீண்டும் சொல்கிறோம்.

# Создаем для тестов новое окружение
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ஐப் பயன்படுத்த முடியும். Nginx இல் உள்ள auth_request கட்டளையைப் பயன்படுத்தி, அங்கீகாரத் தரவை ஸ்கிரிப்ட்டில் செயல்பாட்டு அழைப்பைக் கொண்ட துணைக் கோரிக்கைக்கு திருப்பி விடுவோம். ஸ்கிரிப்ட் Gitlab urlக்கு மற்றொரு துணைக் கோரிக்கையை உருவாக்கும், மேலும் அங்கீகாரத் தரவு சரியாகக் குறிப்பிடப்பட்டிருந்தால், Gitlab 200 குறியீட்டை வழங்கும் மற்றும் தொகுப்பின் பதிவேற்றம்/பதிவிறக்கம் அனுமதிக்கப்படும். ஏன் ஒரு துணை வினவலைப் பயன்படுத்தி உடனடியாக டேட்டாவை Gitlab க்கு அனுப்பக்கூடாது? ஏனென்றால், ஒவ்வொரு முறையும் அங்கீகாரத்தில் ஏதேனும் மாற்றங்களைச் செய்யும்போது Nginx உள்ளமைவு கோப்பைத் திருத்த வேண்டும், மேலும் இது மிகவும் கடினமான பணியாகும். மேலும், Kubernetes படிக்க-மட்டும் ரூட் கோப்பு முறைமைக் கொள்கையைப் பயன்படுத்தினால், nginx.conf ஐ configmap வழியாக மாற்றும் போது இது இன்னும் சிக்கலைச் சேர்க்கிறது. தொகுதிகள் (பிவிசி) மற்றும் படிக்க-மட்டும் ரூட் கோப்பு முறைமை (இதுவும் நடக்கும்) இணைப்புகளை தடைசெய்யும் கொள்கைகளை ஒரே நேரத்தில் பயன்படுத்தும் போது configmap வழியாக Nginx ஐ உள்ளமைப்பது முற்றிலும் சாத்தியமற்றது.

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 தொகுதிகளை இறக்குமதி செய்ய இயலாமை ஒரு விரும்பத்தகாத, ஆனால் எதிர்பார்க்கப்பட்ட அம்சமாக மாறியது. தேவை ('கிரிப்டோ') என்பது மேலே உள்ள எடுத்துக்காட்டில் விவரிக்கப்பட்டுள்ளது உள்ளமைக்கப்பட்ட தொகுதிகள் மேலும் அவர்களுக்கான படைப்புகள் மட்டுமே தேவை. ஸ்கிரிப்ட்களிலிருந்து குறியீட்டை மீண்டும் பயன்படுத்த எந்த வழியும் இல்லை, நீங்கள் அதை வெவ்வேறு கோப்புகளில் நகலெடுத்து ஒட்ட வேண்டும். என்றாவது ஒருநாள் இந்தச் செயல்பாடு செயல்படுத்தப்படும் என்று நம்புகிறேன்.

Nginx இல் தற்போதைய திட்டத்திற்கான சுருக்கமும் முடக்கப்பட வேண்டும் gzip off;

ஏனெனில் NJS இல் gzip தொகுதி இல்லை மற்றும் அதை இணைக்க இயலாது; எனவே, சுருக்கப்பட்ட தரவுகளுடன் வேலை செய்ய வழி இல்லை. உண்மை, இது உண்மையில் இந்த வழக்கில் ஒரு மைனஸ் அல்ல. நிறைய உரை இல்லை, மற்றும் மாற்றப்பட்ட கோப்புகள் ஏற்கனவே சுருக்கப்பட்டுள்ளன மற்றும் கூடுதல் சுருக்கம் அவர்களுக்கு உதவாது. மேலும், இது போன்ற ஏற்றப்பட்ட அல்லது முக்கியமான சேவை அல்ல, சில மில்லி விநாடிகள் வேகமாக உள்ளடக்கத்தை வழங்குவதில் நீங்கள் கவலைப்பட வேண்டியிருக்கும்.

ஸ்கிரிப்ட் பிழைத்திருத்தம் நீண்ட நேரம் எடுக்கும் மற்றும் error.log இல் உள்ள "அச்சுகள்" மூலம் மட்டுமே சாத்தியமாகும். பதிவு நிலைத் தகவல், எச்சரிக்கை அல்லது பிழையைப் பொறுத்து முறையே r.log, r.warn, r.error ஆகிய 3 முறைகளைப் பயன்படுத்தலாம். நான் Chrome (v8) அல்லது njs கன்சோல் கருவியில் சில ஸ்கிரிப்ட்களை பிழைத்திருத்த முயற்சிக்கிறேன், ஆனால் எல்லாவற்றையும் அங்கு சரிபார்க்க முடியாது. குறியீட்டை பிழைத்திருத்தம் செய்யும்போது, ​​​​அதாவது செயல்பாட்டு சோதனை, வரலாறு இப்படி இருக்கும்:

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

மேலும் இதுபோன்ற நூற்றுக்கணக்கான தொடர்கள் இருக்கலாம்.

அவற்றுக்கான துணை வினவல்கள் மற்றும் மாறிகளைப் பயன்படுத்தி குறியீட்டை எழுதுவது சிக்கலான சிக்கலாக மாறும். சில நேரங்களில் நீங்கள் உங்கள் குறியீட்டின் செயல்களின் வரிசையைக் கண்டுபிடிக்க பல்வேறு IDE சாளரங்களைச் சுற்றி விரைகிறீர்கள். இது கடினம் அல்ல, ஆனால் சில நேரங்களில் அது மிகவும் எரிச்சலூட்டும்.

ES6 க்கு முழு ஆதரவு இல்லை.

வேறு சில குறைபாடுகள் இருக்கலாம், ஆனால் நான் வேறு எதையும் சந்திக்கவில்லை. NJS ஐப் பயன்படுத்தி உங்களுக்கு எதிர்மறை அனுபவம் இருந்தால் தகவலைப் பகிரவும்.

முடிவுக்கு

NJS என்பது இலகுரக திறந்த மூல மொழிபெயர்ப்பாளர் ஆகும், இது Nginx இல் பல்வேறு JavaScript ஸ்கிரிப்ட்களை செயல்படுத்த உங்களை அனுமதிக்கிறது. அதன் வளர்ச்சியின் போது, ​​செயல்திறனில் அதிக கவனம் செலுத்தப்பட்டது. நிச்சயமாக, இன்னும் நிறைய காணவில்லை, ஆனால் திட்டம் ஒரு சிறிய குழுவால் உருவாக்கப்பட்டு வருகிறது, மேலும் அவர்கள் தீவிரமாக புதிய அம்சங்களைச் சேர்த்து பிழைகளை சரிசெய்கிறார்கள். ஒரு நாள் NJS உங்களை வெளிப்புற தொகுதிகளை இணைக்க அனுமதிக்கும் என்று நம்புகிறேன், இது Nginx செயல்பாட்டை கிட்டத்தட்ட வரம்பற்றதாக மாற்றும். ஆனால் NGINX பிளஸ் உள்ளது மற்றும் பெரும்பாலும் எந்த அம்சங்களும் இருக்காது!

கட்டுரைக்கான முழு குறியீட்டுடன் களஞ்சியம்

AWS Sign v4 ஆதரவுடன் njs-pypi

ngx_http_js_module தொகுதியின் கட்டளைகளின் விளக்கம்

அதிகாரப்பூர்வ NJS களஞ்சியம் и ஆவணங்கள்

Dmitry Volintsev இலிருந்து NJS ஐப் பயன்படுத்துவதற்கான எடுத்துக்காட்டுகள்

njs - nginx இல் உள்ள சொந்த ஜாவாஸ்கிரிப்ட் ஸ்கிரிப்டிங் / Saint HighLoad++ 2019 இல் Dmitry Volnyev ஆற்றிய உரை

தயாரிப்பில் NJS / HighLoad++ 2019 இல் Vasily Soshnikov உரை

AWS இல் REST கோரிக்கைகளில் கையொப்பமிடுதல் மற்றும் அங்கீகரித்தல்

ஆதாரம்: www.habr.com