ืฉื—ืจื•ืจ ืฉืœ nginx 1.19.7, njs 0.5.1 ื•-NGINX Unit 1.22.0

ื”ืขื ืฃ ื”ืจืืฉื™ ืฉืœ nginx 1.19.7 ืฉื•ื—ืจืจ, ืฉื‘ืชื•ื›ื• ื ืžืฉืš ื”ืคื™ืชื•ื— ืฉืœ ืชื›ื•ื ื•ืช ื—ื“ืฉื•ืช (ื‘ืกื ื™ืฃ ื”ื™ืฆื™ื‘ ื”ื ืชืžืš ื”ืžืงื‘ื™ืœ 1.18, ืžืชื‘ืฆืขื™ื ืจืง ืฉื™ื ื•ื™ื™ื ื”ืงืฉื•ืจื™ื ืœื‘ื™ื˜ื•ืœ ืฉื’ื™ืื•ืช ื•ืคื’ื™ืขื•ื™ื•ืช ื—ืžื•ืจื•ืช).

ืฉื™ื ื•ื™ื™ื ืขื™ืงืจื™ื™ื:

  • ื›ืืฉืจ ืชื”ืœื™ืš ืขื•ื‘ื“ ืื•ื–ืœ ืžื”ื—ื™ื‘ื•ืจื™ื ื”ืคื ื•ื™ื™ื, nginx ืกื•ื’ืจ ื›ืขืช ืœื ืจืง ื—ื™ื‘ื•ืจื™ Keepalive, ืืœื ื’ื ื—ื™ื‘ื•ืจื™ื ืฉืžืžืชื™ื ื™ื ืœืกื’ื™ืจืช ื”ืฉืงืข ("ืกื’ื™ืจื” ืžืชืžืฉื›ืช").
  • ืงื•ื“ ืขื™ื‘ื•ื“ ื”ื—ื™ื‘ื•ืจ ื‘-HTTP/2 ืงืจื•ื‘ ืœืžื™ืžื•ืฉ HTTP/1.x. ื”ืชืžื™ื›ื” ื‘ื”ื’ื“ืจื•ืช ื”ืื™ืฉื™ื•ืช "http2_recv_timeout", "http2_idle_timeout" ื•-"http2_max_requests" ื”ื•ืคืกืงื” ืœื˜ื•ื‘ืช ื”ื”ื ื—ื™ื•ืช ื”ื›ืœืœื™ื•ืช "keepalive_timeout" ื•-"keepalive_requests".
  • ื”ื”ื’ื“ืจื•ืช "http2_max_field_size" ื•-"http2_max_header_size" ื”ื•ืกืจื• ื•ื‘ืžืงื•ื ื–ืืช ื™ืฉ ืœื”ืฉืชืžืฉ ื‘-"large_client_header_buffers".

ื‘ืžืงื‘ื™ืœ, ืฉื•ื—ืจืจ njs 0.5.1, ืžืชื•ืจื’ืžืŸ JavaScript ืขื‘ื•ืจ ืฉืจืช ื”ืื™ื ื˜ืจื ื˜ nginx. ืžืชื•ืจื’ืžืŸ njs ืžื™ื™ืฉื ืชืงื ื™ ECMAScript ื•ืžืืคืฉืจ ืœืš ืœื”ืจื—ื™ื‘ ืืช ื”ื™ื›ื•ืœืช ืฉืœ nginx ืœืขื‘ื“ ื‘ืงืฉื•ืช ื‘ืืžืฆืขื•ืช ืกืงืจื™ืคื˜ื™ื ื‘ืชืฆื•ืจื”. ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืกืงืจื™ืคื˜ื™ื ื‘ืงื•ื‘ืฅ ืชืฆื•ืจื” ื›ื“ื™ ืœื”ื’ื“ื™ืจ ืœื•ื’ื™ืงื” ืžืชืงื“ืžืช ืœืขื™ื‘ื•ื“ ื‘ืงืฉื•ืช, ื™ืฆื™ืจืช ืชืฆื•ืจื”, ื™ืฆื™ืจื” ื“ื™ื ืžื™ืช ืฉืœ ืชื’ื•ื‘ื”, ืฉื™ื ื•ื™ ื‘ืงืฉื”/ืชื’ื•ื‘ื”, ืื• ื™ืฆื™ืจื” ืžื”ื™ืจื” ืฉืœ ืงื˜ืขื™ื ืœืคืชืจื•ืŸ ื‘ืขื™ื•ืช ื‘ื™ื™ืฉื•ืžื™ ืื™ื ื˜ืจื ื˜.

ื”ื’ืจืกื” ื”ื—ื“ืฉื” ืžื•ืกื™ืคื” ืืช ื”ื”ื ื—ื™ื” "js_header_filter", ื”ืžืืคืฉืจืช ืœืš ืœื”ื’ื“ื™ืจ ืคื•ื ืงืฆื™ื™ืช JavaScript ืœืกื™ื ื•ืŸ ื•ืฉื™ื ื•ื™ ื›ื•ืชืจื•ืช ืชื’ื•ื‘ื•ืช ืฉืจื™ืจื•ืชื™ื•ืช: js_import foo.js; ืžื™ืงื•ื / { js_header_filter foo.filter; proxy_pass http://127.0.0.1:8081/; } foo.js: function filter(r) { var cookies = r.headersOut['Set-Cookie']; var len = r.args.len ? Number(r.args.len) : 0; r.headersOut['Set-Cookie'] = cookies.filter(v=>v.length > len); } ื™ื™ืฆื•ื ื‘ืจื™ืจืช ืžื—ื“ืœ {ืžืกื ืŸ};

ื ื•ืกืคื” ื’ื ืฉื™ื˜ืช ngx.fetch(), ื”ืžื™ื™ืฉืžืช ืืช ื”-Fetch API, ื”ืžืกืคืง ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืฉืœ ืœืงื•ื— HTTP. ื”ืฉื™ื˜ื” ืชื•ืžื›ืช ื‘ืขื™ื‘ื•ื“ ืฉืœ ืืคืฉืจื•ื™ื•ืช ื’ื•ืฃ, ื›ื•ืชืจื•ืช, buffer_size ื•-max_response_body_size. ืื•ื‘ื™ื™ืงื˜ ื”-Response ื”ืžื•ื—ื–ืจ ืชื•ืžืš ื‘-arrayBuffer(), bodyUsed, json(), headers, ok, redirect, status, statusText, text(), type ื•-url, ื•ืื•ื‘ื™ื™ืงื˜ Header ืชื•ืžืš ื‘-get(), getAll() ื•- has() ืฉื™ื˜ื•ืช . function fetch(r) { ngx.fetch('http://nginx.org/') .then(reply => reply.text()) .then(body => r.return(200, body)) .catch (e => r.return(501, e.message)); }

ื›ืžื• ื›ืŸ, ื ื™ืชืŸ ืœืฆื™ื™ืŸ ืืช ืคืจืกื•ื ืฉืจืช ื”ื™ื™ืฉื•ืžื™ื NGINX Unit 1.22, ื”ืžืฆื™ืข ืคืชืจื•ืŸ ืœื”ืคืขืœืช ืืคืœื™ืงืฆื™ื•ืช ืื™ื ื˜ืจื ื˜ ื‘ืฉืคื•ืช ืชื›ื ื•ืช ืฉื•ื ื•ืช (Python, PHP, Perl, Ruby, Go, JavaScript/Node.js ื•-Java). NGINX Unit ื™ื›ื•ืœื” ืœื”ืจื™ืฅ ื‘ื• ื–ืžื ื™ืช ืžืกืคืจ ื™ื™ืฉื•ืžื™ื ื‘ืฉืคื•ืช ืชื›ื ื•ืช ืฉื•ื ื•ืช, ืฉืืช ืคืจืžื˜ืจื™ ื”ื”ืฉืงื” ืฉืœื”ืŸ ื ื™ืชืŸ ืœืฉื ื•ืช ื‘ืื•ืคืŸ ื“ื™ื ืžื™ ืœืœื ืฆื•ืจืš ืœืขืจื•ืš ืงื‘ืฆื™ ืชืฆื•ืจื” ื•ืœื”ืคืขื™ืœ ืžื—ื“ืฉ. ื”ืงื•ื“ ื›ืชื•ื‘ ื‘-C ื•ืžื•ืคืฅ ืชื—ืช ืจื™ืฉื™ื•ืŸ Apache 2.0.

ื”ืžื”ื“ื•ืจื” ื”ื—ื“ืฉื” ืฉืœ NGINX Unit ื”ืชืžืงื“ื” ื‘ืฉื™ืคื•ืจ ื”ื™ืฆื™ื‘ื•ืช, ื”ืจื—ื‘ืช ื›ืœื™ ื”ื‘ื“ื™ืงื” ื•ืชื™ืงื•ืŸ ื‘ืื’ื™ื. ื‘ื—ื‘ื™ืœื•ืช ืฉื ื•ืฆืจื• ืขื‘ื•ืจ ืœื™ื ื•ืงืก, ื”ืฉืชื ื• ื”ืžืฉืชืžืฉ ื•ื”ืงื‘ื•ืฆื” ืฉืชื—ืชื™ื”ื ืคื•ืขืœืช NGINX Unit. ื‘ืžืงื•ื nobody:nobody, ืชื”ืœื™ื›ื™ื ืคื•ืขืœื™ื ื›ืขืช ืชื—ืช ื™ื—ื™ื“ืช ื”ืžืฉืชืžืฉ ื”ื‘ื•ื“ื“ืช ื‘ืงื‘ื•ืฆืช ื”ื™ื—ื™ื“ื•ืช. ืžื•ื‘ื˜ื—ืช ืชืื™ืžื•ืช ืœ- Stream API ืฉืœ ื”ืื•ื‘ื™ื™ืงื˜ื™ื ServerRequest ื•- ServerResponse ืžื”ืžื•ื“ื•ืœ Node.js. ืืคืฉืจื•ืช ื”"ื ืชื™ื‘" ืขื‘ื•ืจ ื™ื™ืฉื•ืžื™ Python ืžืืคืฉืจืช ืœืฆื™ื™ืŸ ืžืกืคืจ ืกืคืจื™ื•ืช.

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”