ΠΡΡΠ½Π°Ρ Π΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΡ ΠΊΠ»ΠΎΠ½ Π½Π° nginx 1.19.7, Π² ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ (Π² ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡ ΡΡΠ°Π±ΠΈΠ»Π΅Π½ ΠΊΠ»ΠΎΠ½ 1.18 ΡΠ΅ ΠΏΡΠ°Π²ΡΡ ΡΠ°ΠΌΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΡΠΈΠΎΠ·Π½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ).
ΠΡΠ½ΠΎΠ²Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
- ΠΠΎΠ³Π°ΡΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΡ ΠΏΡΠΎΡΠ΅Ρ ΠΈΠ·ΡΠ΅ΡΠΏΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΈΡΠ΅ Π²ΡΡΠ·ΠΊΠΈ, nginx ΡΠ΅Π³Π° Π·Π°ΡΠ²Π°ΡΡ Π½Π΅ ΡΠ°ΠΌΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΡΠΈΡΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΈ Π²ΡΡΠ·ΠΊΠΈ, Π½ΠΎ ΠΈ Π²ΡΡΠ·ΠΊΠΈΡΠ΅, ΡΠ°ΠΊΠ°ΡΠΈ Π·Π°ΡΠ²Π°ΡΡΠ½Π΅ΡΠΎ Π½Π° ΡΠΎΠΊΠ΅ΡΠ° (βΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ Π·Π°ΡΠ²Π°ΡΡΠ½Π΅β).
- ΠΠΎΠ΄ΡΡ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π² 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: ΡΡΠ½ΠΊΡΠΈΡ filter(r) { var cookies = r.headersOut['Set-Cookie']; var len = r.args.len? Π§ΠΈΡΠ»ΠΎ (r.args.len) : 0; r.headersOut['Set-Cookie'] = cookies.filter(v=>v.length > len); } Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Π½Π΅ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ {ΡΠΈΠ»ΡΡΡ};
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ ΠΌΠ΅ΡΠΎΠ΄ΡΡ ngx.fetch(), ΠΊΠΎΠΉΡΠΎ Π²Π½Π΅Π΄ΡΡΠ²Π° Fetch API, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ Π½Π° HTTP ΠΊΠ»ΠΈΠ΅Π½Ρ. ΠΠ΅ΡΠΎΠ΄ΡΡ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΎΠΏΡΠΈΠΈΡΠ΅ body, headers, buffer_size ΠΈ max_response_body_size. ΠΡΡΠ½Π°ΡΠΈΡΡ ΠΎΠ±Π΅ΠΊΡ Response ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° arrayBuffer(), bodyUsed, json(), headers, ok, redirect, status, statusText, text(), type ΠΈ url ΠΌΠ΅ΡΠΎΠ΄ΠΈ, Π° ΠΎΠ±Π΅ΠΊΡΡΡ Header ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° get(), getAll() ΠΈ has() ΠΌΠ΅ΡΠΎΠ΄ΠΈ. ΡΡΠ½ΠΊΡΠΈΡ 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 ΡΠ΅ ΡΠΎΠΊΡΡΠΈΡΠ° Π²ΡΡΡ
Ρ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠ°Π±ΠΈΠ»Π½ΠΎΡΡΡΠ°, ΡΠ°Π·ΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈΡΠ΅ Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅ ΠΈ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ. Π ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅, Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ Π·Π° Linux, ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ ΠΈ Π³ΡΡΠΏΠ°ΡΠ°, ΠΏΠΎΠ΄ ΠΊΠΎΠΈΡΠΎ ΡΠ°Π±ΠΎΡΠΈ NGINX Unit, ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΈ. ΠΠΌΠ΅ΡΡΠΎ Π½ΠΈΠΊΠΎΠΉ:Π½ΠΈΠΊΠΎΠΉ, ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π²Π΅ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΏΠΎΠ΄ ΠΎΡΠ΄Π΅Π»Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈ ΠΌΠΎΠ΄ΡΠ» Π² Π³ΡΡΠΏΠΎΠ²ΠΈΡ ΠΌΠΎΠ΄ΡΠ». ΠΡΠΈΠ³ΡΡΠ΅Π½Π° ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡ Ρ Stream API Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈΡΠ΅ ServerRequest ΠΈ ServerResponse ΠΎΡ ΠΌΠΎΠ΄ΡΠ»Π° Node.js. ΠΠΏΡΠΈΡΡΠ° "path" Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Python ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru