āĻāĻ āύāĻŋāĻŦāύā§āϧ⧠āĻāĻŽāĻŋ NJS-āĻāϰ āϏāĻžāĻĨā§ āĻāĻŽāĻžāϰ āĻ āĻāĻŋāĻā§āĻāϤāĻž āĻļā§āϝāĻŧāĻžāϰ āĻāϰāϤ⧠āĻāĻžāĻ, Nginx Inc āĻĻā§āĻŦāĻžāϰāĻž āϤā§āϰāĻŋ Nginx-āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻĻā§āĻāĻžāώā§, āĻāĻāĻāĻŋ āĻŦāĻžāϏā§āϤāĻŦ āĻāĻĻāĻžāĻšāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϰ āĻĒā§āϰāϧāĻžāύ āĻā§āώāĻŽāϤāĻžāĻā§āϞāĻŋ āĻŦāϰā§āĻŖāύāĻž āĻāϰā§āĨ¤ NJS āĻšāϞ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āϰ āĻāĻāĻāĻŋ āĻāĻĒāϏā§āĻ āϝāĻž āĻāĻĒāύāĻžāĻā§ Nginx āĻāϰ āĻāĻžāϰā§āϝāĻāĻžāϰāĻŋāϤāĻž āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāϤ⧠āĻĻā§āϝāĻŧāĨ¤ āĻĒā§āϰāĻļā§āύ āĻāϰāϤ⧠āĻĻāĻŋāĻŽāĻŋāϤā§āϰāĻŋ āĻāϞāĻŋāύā§āĻāϏā§āĻ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāϤā§āϤāϰ āĻĻāĻŋāϝāĻŧā§āĻā§āύāĨ¤ āϏāĻāĻā§āώā§āĻĒā§: NJS āĻšāϞ nginx-āĻāϝāĻŧā§, āĻāĻŦāĻ JavaScript āĻāϰāĻ āĻĒā§āϰāĻāϤāĻŋāĻļā§āϞ, "āύā§āĻāĻŋāĻ" āĻāĻŦāĻ GC āĻāĻžāĻĄāĻŧāĻžāĻ, Lua āĻĨā§āĻā§ āĻāĻŋāύā§āύāĨ¤
āĻ āύā§āĻ āĻĻāĻŋāύ āĻāĻā§âĻ
āĻāĻŽāĻžāϰ āĻļā§āώ āĻāĻžāĻāϰāĻŋāϤā§, āĻāĻŽāĻŋ āĻāϤā§āϤāϰāĻžāϧāĻŋāĻāĻžāϰāϏā§āϤā§āϰ⧠āĻāĻŋāĻāϞā§āϝāĻžāĻŦ āĻĒā§āϝāĻŧā§āĻāĻŋāϞāĻžāĻŽ āĻĄāĻāĻžāϰ-āĻāĻŽā§āĻĒā§āĻ, āĻĄāĻŋāύā§āĻĄ āĻāĻŦāĻ āĻ
āύā§āϝāĻžāύā§āϝ āĻāύāύā§āĻĻ āϏāĻš āĻŦā§āĻļ āĻāϝāĻŧā§āĻāĻāĻŋ āĻŽā§āĻāϞāĻŋ āϏāĻŋāĻāĻ/āϏāĻŋāĻĄāĻŋ āĻĒāĻžāĻāĻĒāϞāĻžāĻāύ āϏāĻš, āϝā§āĻā§āϞāĻŋ āĻāĻžāύāĻŋāĻā§ āϰā§āϞ⧠āϏā§āĻĨāĻžāύāĻžāύā§āϤāϰāĻŋāϤ āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āĻĒā§āϰā§āĻŦā§ CI āϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻāĻŦāĻŋāĻā§āϞāĻŋāĻā§ āϤāĻžāĻĻā§āϰ āĻāϏāϞ āĻāĻāĻžāϰ⧠āϏāϰāĻžāύ⧠āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āϝā§āĻĻāĻŋāύ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻŋāĻāϞā§āϝāĻžāĻŦ āĻāĻāĻĒāĻŋ āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻšāϝāĻŧ āĻāĻŦāĻ āϏāĻŋāĻāĻ āĻā§āĻŽāĻĄāĻŧāĻžāϝāĻŧ āĻĒāϰāĻŋāĻŖāϤ āĻšāϝāĻŧ āϏā§āĻ āĻĻāĻŋāύ āĻĒāϰā§āϝāύā§āϤ āϤāĻžāϰāĻž āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§āĻāĻŋāϞāĨ¤ āϏāĻŽāϏā§āϝāĻžāĻāĻŋ āĻāĻŋāϞ āϏāĻŋāĻāĻ-āϤ⧠āĻ
āĻāĻļāĻā§āϰāĻšāĻŖāĻāĻžāϰ⧠āĻĄāĻāĻžāϰ āĻāĻŽā§āĻāĻā§āϞāĻŋāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋāϤ⧠āĻāĻŋāĻ āĻāĻŋāϞ, āϝāĻž ssh āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒāĻžāĻāĻĨāύ āĻŽāĻĄāĻŋāĻāϞ āĻā§āύā§āĻāĻŋāϞāĨ¤ ssh āĻāϰ āĻāύā§āϝ āĻāĻĒāύāĻžāϰ āĻāĻāĻāĻŋ āĻĒā§āϰāĻžāĻāĻā§āĻ āĻā§ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻŦāĻ... āĻāĻāĻŋ āĻĒāϰāĻŋāĻāĻŋāϤ_āĻšā§āϏā§āĻā§āϰ āϏāĻžāĻĨā§ āĻāĻŽā§āĻā§ āĻāĻŋāϞāĨ¤ āĻāĻŦāĻ āĻāϏāϞ āĻāĻāĻĒāĻŋ āĻāĻŦāĻ āĻĒāϰāĻŋāĻāĻŋāϤ_āĻšā§āϏā§āĻā§ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāĻž āĻāĻāĻāĻŋāϰ āĻŽāϧā§āϝ⧠āĻ
āĻŽāĻŋāϞā§āϰ āĻāĻžāϰāĻŖā§ āϝā§āĻā§āύ āϏāĻŋāĻāĻ āĻāĻāĻāĻŋ āĻŽā§āϞ āϝāĻžāĻāĻžāĻāĻāϰāĻŖ āϤā§āϰā§āĻāĻŋāϰ āϏāĻžāĻĨā§ āĻŦā§āϝāϰā§āĻĨ āĻšāϝāĻŧā§āĻā§āĨ¤ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻĄāĻāĻĢāĻžāĻāϞāϏ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āύāϤā§āύ āĻāĻŋāϤā§āϰ āĻĻā§āϰā§āϤ āĻāĻāϤā§āϰāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ āĻāĻŦāĻ āĻŦāĻŋāĻāϞā§āĻĒāĻāĻŋ āϝā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ StrictHostKeyChecking no. āĻāĻŋāύā§āϤ⧠āĻāĻžāϰāĻžāĻĒ āϏā§āĻŦāĻžāĻĻ āĻĨā§āĻā§ āϝāĻžāϝāĻŧ āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ PyPI āϏāĻāĻā§āϰāĻšāϏā§āĻĨāϞ⧠libs āϏāϰāĻžāύā§āϰ āĻāĻā§āĻāĻž āĻāĻŋāϞāĨ¤ āĻāĻāĻāĻŋ āĻ
āϤāĻŋāϰāĻŋāĻā§āϤ āĻŦā§āύāĻžāϏ, āĻŦā§āϝāĻā§āϤāĻŋāĻāϤ PyPI-āϤ⧠āϏā§āϝā§āĻāĻ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻāĻāĻŋ āϏāĻšāĻ āĻĒāĻžāĻāĻĒāϞāĻžāĻāύ āĻāĻŦāĻ requirements.txt-āĻāϰ āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻŦāĻŋāĻŦāϰāĻŖ āĻāĻŋāϞ
āĻĒāĻāύā§āĻĻ āĻšāϝāĻŧā§āĻā§, āĻāĻĻā§āϰāϞā§āĻ!
āĻāĻŽāϰāĻž āĻŽā§āĻ āĻāĻŦāĻ āĻā§āĻŦāĻžāϰāύā§āĻā§ āϏāĻŦāĻāĻŋāĻā§ āĻāĻžāϞāĻžāĻ, āĻāĻŦāĻ āĻļā§āώ āĻĒāϰā§āϝāύā§āϤ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻā§āĻ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻĒā§āϤ⧠āĻā§āϝāĻŧā§āĻāĻŋāϞāĻžāĻŽ āϝāĻž āĻŦāĻšāĻŋāϰāĻžāĻāϤ āϏā§āĻā§āϰā§āĻ āϏāĻš āĻāĻāĻāĻŋ āϰāĻžāώā§āĻā§āϰāĻšā§āύ āϧāĻžāϰāĻ āĻāĻŋāϞāĨ¤ āĻ āĻŋāĻ āĻāĻā§, āϝā§āĻšā§āϤ⧠āĻāĻŽāϰāĻž S3 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋ, āϤāĻžāĻ āĻāĻāĻŋāĻā§ āĻ āĻā§āϰāĻžāϧāĻŋāĻāĻžāϰ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āĻāĻŦāĻ, āϝāĻĻāĻŋ āϏāĻŽā§āĻāĻŦ āĻšāϝāĻŧ, āĻāĻŋāĻāϞā§āϝāĻžāĻŦā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āϏāĻš (āĻĒā§āϰāϝāĻŧā§āĻāύ⧠āĻāĻĒāύāĻŋ āύāĻŋāĻā§āĻ āĻāĻāĻŋ āϝā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ)āĨ¤
āĻāĻāĻāĻŋ āĻĻā§āϰā§āϤ āĻ āύā§āϏāύā§āϧāĻžāύ āĻŦā§āĻļ āĻāϝāĻŧā§āĻāĻāĻŋ āĻĢāϞāĻžāĻĢāϞ āĻĻāĻŋāϝāĻŧā§āĻā§: s3pypi, pypicloud āĻāĻŦāĻ āĻļāĻžāϞāĻāĻŽā§āϰ āĻāύā§āϝ html āĻĢāĻžāĻāϞ āϤā§āϰāĻŋāϰ "āĻŽā§āϝāĻžāύā§āϝāĻŧāĻžāϞ" āĻŦāĻŋāĻāϞā§āĻĒ āϏāĻšāĨ¤ āĻļā§āώ āĻŦāĻŋāĻāϞā§āĻĒāĻāĻŋ āύāĻŋāĻā§āĻ āĻ āĻĻā§āĻļā§āϝ āĻšāϝāĻŧā§ āĻā§āĻā§āĨ¤
s3pypi: āĻāĻāĻŋ S3 āĻšā§āϏā§āĻāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ cli. āĻāĻŽāϰāĻž āĻĢāĻžāĻāϞ āĻāĻĒāϞā§āĻĄ āĻāϰāĻŋ, āĻāĻāĻāĻāĻŋāĻāĻŽāĻāϞ āϤā§āϰāĻŋ āĻāϰāĻŋ āĻāĻŦāĻ āĻāĻāĻ āĻŦāĻžāϞāϤāĻŋāϤ⧠āĻāĻĒāϞā§āĻĄ āĻāϰāĻŋāĨ¤ āĻŦāĻžāĻĄāĻŧāĻŋāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāύā§āϝ āĻāĻĒāϝā§āĻā§āϤāĨ¤
āĻĒāĻžāĻāĻĒāĻŋāĻā§āϞāĻžāĻāĻĄ: āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻŽāϤ⧠āĻŽāύ⧠āĻšāϝāĻŧā§āĻāĻŋāϞ, āĻāĻŋāύā§āϤ⧠āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĒāĻĄāĻŧāĻžāϰ āĻĒāϰ⧠āĻāĻŽāĻŋ āĻšāϤāĻžāĻļ āĻšāϝāĻŧā§āĻāĻŋāĨ¤ āĻāĻžāϞ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻ āύā§āϏāĻžāϰ⧠āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāĻžāϰ āĻā§āώāĻŽāϤāĻž āĻĨāĻžāĻāĻž āϏāϤā§āϤā§āĻŦā§āĻ, āĻŦāĻžāϏā§āϤāĻŦā§ āĻāĻāĻŋ āĻ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻāĻŦāĻ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻž āĻāĻ āĻŋāύ āĻšāϝāĻŧā§ āĻāĻ ā§āĻā§āĨ¤ āϏā§āĻ āϏāĻŽāϝāĻŧā§āϰ āĻ āύā§āĻŽāĻžāύ āĻ āύā§āϝāĻžāϝāĻŧā§ āĻāĻĒāύāĻžāϰ āĻāĻžāĻā§āϰ āĻāύā§āϝ āĻā§āĻĄāĻāĻŋ āϏāĻāĻļā§āϧāύ āĻāϰāϤ⧠3-5 āĻĻāĻŋāύ āϏāĻŽāϝāĻŧ āϞāĻžāĻāϤāĨ¤ āĻĒāϰāĻŋāώā§āĻŦāĻžāĻāĻŋāϰāĻ āĻāĻāĻāĻŋ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤ āĻāĻŽāϰāĻž āĻ āύā§āϝ āĻāĻŋāĻā§ āύāĻž āĻĒāĻžāĻāϝāĻŧāĻžāϝāĻŧ āĻāĻāĻŋ āĻā§āĻĄāĻŧā§ āĻĻāĻŋāϝāĻŧā§āĻāĻŋāĨ¤
āĻāϰāĻ āĻāĻā§āϰ āĻ āύā§āϏāύā§āϧāĻžāύ⧠Nginx, ngx_aws_auth-āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻŽāĻĄāĻŋāĻāϞ āĻĒāĻžāĻāϝāĻŧāĻž āĻā§āĻā§āĨ¤ āϤāĻžāϰ āĻĒāϰā§āĻā§āώāĻžāϰ āĻĢāϞāĻžāĻĢāϞ āĻŦā§āϰāĻžāĻāĻāĻžāϰ⧠āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ XML āĻāĻŋāϞ, āϝāĻž S3 āĻŦāĻžāϞāϤāĻŋāϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻĻā§āĻāĻžāϝāĻŧāĨ¤ āĻ āύā§āϏāύā§āϧāĻžāύā§āϰ āϏāĻŽāϝāĻŧ āĻļā§āώ āĻĒā§āϰāϤāĻŋāĻļā§āϰā§āϤāĻŋāĻāĻŋ āĻāĻŋāϞ āĻāĻ āĻŦāĻāϰ āĻāĻā§āĨ¤ āĻāĻžāύā§āĻĄāĻžāϰāĻāĻŋ āĻĒāϰāĻŋāϤā§āϝāĻā§āϤ āĻĻā§āĻāĻžāĻā§āĻāĻŋāϞāĨ¤
āĻā§āϏ⧠āĻāĻŋāϝāĻŧā§ āĻĒāĻĄāĻŧā§ āĻāĻŽāĻŋ āĻŦā§āĻāϤ⧠āĻĒā§āϰā§āĻāĻŋ āϝ⧠āĻāĻā§āϏāĻāĻŽāĻāϞ āĻĢā§āϞāĻžāĻāϤ⧠āĻāĻāĻāĻāĻŋāĻāĻŽāĻāϞ-āĻ āϰā§āĻĒāĻžāύā§āϤāϰāĻŋāϤ āĻšāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŦāĻ āĻĒāĻŋāĻĒ-āĻ āĻĻā§āĻāϝāĻŧāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ Nginx āĻāĻŦāĻ S3 āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻāĻŋāĻā§ āĻā§āĻāϞ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻŽāĻŋ Nginx-āĻāϰ āĻāύā§āϝ JS-āĻ āϞā§āĻāĻž S3-āϤ⧠āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖā§āϰ āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĒā§āϝāĻŧā§āĻāĻŋāĨ¤ āĻāĻāĻžāĻŦā§āĻ āĻāĻŽāĻŋ āĻāύāĻā§āĻāϏā§āϰ āϏāĻžāĻĨā§ āĻĻā§āĻāĻž āĻāϰā§āĻāĻŋāĨ¤
āĻāĻ āĻāĻĻāĻžāĻšāϰāĻŖāĻāĻŋāĻā§ āĻāĻŋāϤā§āϤāĻŋ āĻšāĻŋāϏāĻžāĻŦā§ āĻā§āϰāĻšāĻŖ āĻāϰā§, āĻāĻ āĻāύā§āĻāĻž āĻĒāϰ⧠āĻāĻŽāĻŋ āĻāĻŽāĻžāϰ āĻŦā§āϰāĻžāĻāĻāĻžāϰ⧠ngx_aws_auth āĻŽāĻĄāĻŋāĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻāĻ XML āĻĻā§āĻā§āĻāĻŋ, āϤāĻŦā§ āϏāĻŦāĻāĻŋāĻā§ āĻāϤāĻŋāĻŽāϧā§āϝ⧠JS-āĻ āϞā§āĻāĻž āĻāĻŋāϞāĨ¤
āĻāĻŽāĻŋ āϏāϤā§āϝāĻŋāĻ nginx āϏāĻŽāĻžāϧāĻžāύ āĻĒāĻāύā§āĻĻ āĻāϰā§āĻāĻŋāĨ¤ āĻĒā§āϰāĻĨāĻŽāϤ, āĻāĻžāϞ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻāĻŦāĻ āĻ āύā§āĻ āĻāĻĻāĻžāĻšāϰāĻŖ, āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧāϤ, āĻāĻŽāϰāĻž āĻĢāĻžāĻāϞāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ (āĻŦāĻžāĻā§āϏā§āϰ āĻŦāĻžāĻāϰā§) Nginx-āĻāϰ āϏāĻŽāϏā§āϤ āĻāĻŋāύāĻŋāϏāĻĒāϤā§āϰ āĻĒāĻžāĻ, āϤā§āϤā§āϝāĻŧāϤ, āϝ⧠āĻā§āĻ Nginx-āĻāϰ āĻāύā§āϝ āĻāύāĻĢāĻŋāĻāĻžāϰāĻā§āϞāĻŋ āĻā§āĻāĻžāĻŦā§ āϞāĻŋāĻāϤ⧠āĻšāϝāĻŧ āϤāĻž āĻāĻžāύ⧠āϤāĻžāϰāĻž āĻā§ āĻā§ āϤāĻž āĻŦā§āĻāϤ⧠āϏāĻā§āώāĻŽ āĻšāĻŦā§āĨ¤ āĻĒāĻžāĻāĻĨāύ āĻŦāĻž āĻā§ (āϝāĻĻāĻŋ āϏā§āĻā§āϰā§āϝāĻžāĻ āĻĨā§āĻā§ āϞā§āĻāĻž āĻšāϝāĻŧ) āĻāϰ āϤā§āϞāύāĻžāϝāĻŧ āĻŽāĻŋāύāĻŋāĻŽāĻžāϞāĻŋāĻāĻŽ āĻāĻŽāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒā§āϞāĻžāϏ, āύā§āĻā§āϏāĻžāϏā§āϰ āĻāĻĨāĻž āĻāϞā§āϞā§āĻ āύāĻž āĻāϰā§āĨ¤
TL;DR 2 āĻĻāĻŋāύ āĻĒāϰ, PyPi-āĻāϰ āĻĒāϰā§āĻā§āώāĻžāĻŽā§āϞāĻ āϏāĻāϏā§āĻāϰāĻŖāĻāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ CI-āϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤
āĻāĻāĻž āĻāĻŋāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§?
āĻŽāĻĄāĻŋāĻāϞāĻāĻŋ Nginx āĻ āϞā§āĻĄ āĻāϰāĻž āĻšāϝāĻŧ ngx_http_js_module, āĻ
āĻĢāĻŋāϏāĻŋāϝāĻŧāĻžāϞ āĻĄāĻāĻžāϰ āĻāĻŽā§āĻ āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ. āĻāĻŽāϰāĻž āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŽāĻžāĻĻā§āϰ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰāĻŋ js_importNginx āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύā§āĨ¤ āĻĢāĻžāĻāĻļāύ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻā§āĻļ āĻĻā§āĻŦāĻžāϰāĻž āĻŦāϞāĻž āĻšāϝāĻŧ js_content. āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻžāĻāĻŋ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āϏā§āĻ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ js_set, āϝāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ āĻŦāϰā§āĻŖāĻŋāϤ āĻĢāĻžāĻāĻļāύāĻāĻŋāĻā§ āĻāĻāĻāĻŋ āϝā§āĻā§āϤāĻŋ āĻšāĻŋāϏāĻžāĻŦā§ āύā§āϝāĻŧ⧎ āĻāĻŋāύā§āϤ⧠āĻāĻŽāϰāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ Nginx āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠NJS-āĻ āϏāĻžāĻŦāĻā§āϝāĻŧā§āϰāĻŋ āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰāĻŋ, āĻā§āύ⧠XMLHttpRequest āύāϝāĻŧāĨ¤ āĻāĻāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ, āϏāĻāĻļā§āϞāĻŋāώā§āĻ āĻ
āĻŦāϏā§āĻĨāĻžāύāĻāĻŋ Nginx āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ⧠āϝā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āĻāĻŦāĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāĻ āĻ
āĻŦāϏā§āĻĨāĻžāύā§āϰ āĻāĻāĻāĻŋ subrequest āĻŦāϰā§āĻŖāύāĻž āĻāϰāĻž āĻāĻŦāĻļā§āϝāĻ. Nginx āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāϤā§, āĻĢāĻžāĻāĻļāύā§āϰ āύāĻžāĻŽāĻāĻŋ āϏā§āĻā§āϰāĻŋāĻĒā§āĻā§āĻ āϰāĻĒā§āϤāĻžāύāĻŋ āĻāϰāϤ⧠āĻšāĻŦā§ 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 āĻāĻāĻāĻŋ subquery āĻāϰāĻž āĻšāϝāĻŧ 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, āϝāĻž āϏāĻāϞ āĻāĻŽāύāĻĒā§āϰāĻŋāĻĢāĻŋāĻā§āϏ xml āĻāĻĒāĻžāĻĻāĻžāύāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āϤāĻžāϞāĻŋāĻāĻž āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻŦā§, āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āϏāĻŽā§āĻĒāϰā§āĻāĻŋāϤ (PyPI āĻāϰ āĻā§āώā§āϤā§āϰā§, āϏāĻŽāϏā§āϤ āĻĒā§āϝāĻžāĻā§āĻā§āϰ āĻāĻāĻāĻŋ āϤāĻžāϞāĻŋāĻāĻž)āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāϤ⧠āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤā§āϰ āĻāĻāĻāĻŋ āϤāĻžāϞāĻŋāĻāĻž āĻĒā§āϤ⧠āĻāĻžāύ (āϏāĻŽāϏā§āϤ āĻĒā§āϝāĻžāĻā§āĻ āϏāĻāϏā§āĻāϰāĻŖā§āϰ āĻāĻāĻāĻŋ āϤāĻžāϞāĻŋāĻāĻž), āϤāĻžāĻšāϞ⧠uri āĻ
āύā§āϰā§āϧ⧠āĻ
āĻŦāĻļā§āϝāĻ āĻāĻāĻāĻŋ āĻĒā§āϰāĻŋāĻĢāĻŋāĻā§āϏ āĻā§āώā§āϤā§āϰ āĻĨāĻžāĻāϤ⧠āĻšāĻŦā§ āϝāĻžāϰ āύāĻžāĻŽ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋ (āĻĒā§āϝāĻžāĻā§āĻ) āĻ
āĻāϤā§āϝāĻž āĻāĻāĻāĻŋ āϏā§āϞā§āϝāĻžāĻļ / āĻĻāĻŋāϝāĻŧā§ āĻļā§āώ āĻšāĻŦā§āĨ¤ āĻ
āύā§āϝāĻĨāĻžāϝāĻŧ, āĻāĻāĻāĻŋ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻ
āύā§āϰā§āϧ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āϏāĻāĻāϰā§āώ āϏāĻŽā§āĻāĻŦ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒāĨ¤ aiohttp-request āĻāĻŦāĻ 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 āĻāĻāĻžāϰ⧠āĻāϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤā§āĻ āĻĒāĻžāĻŦ:
āĻāĻāĻāĻŋ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāϤ⧠āĻĢāĻžāĻāϞā§āϰ āϤāĻžāϞāĻŋāĻāĻž
<?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>"00000000000000000000000000000000-1"</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>"b2d76df4aeb4493c5456366748218093"</ETag>
<Size>93183</Size>
<Owner>
<ID>02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4</ID>
<DisplayName></DisplayName>
</Owner>
<StorageClass>STANDARD</StorageClass>
</Contents>
</ListBucketResult>āĻĢāĻžāĻāϞā§āϰ āϤāĻžāϞāĻŋāĻāĻž āĻĨā§āĻā§ āĻāĻŽāϰāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻĒāĻžāĻĻāĻžāύ āύā§āĻŦ Key.
āϝāĻž āĻ āĻŦāĻļāĻŋāώā§āĻ āĻĨāĻžāĻā§ āϤāĻž āĻšāϞ āĻĢāϞāĻžāĻĢāϞā§āϰ XML āĻĒāĻžāϰā§āϏ āĻāϰāĻž āĻāĻŦāĻ āĻāĻāĻŋāĻā§ 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="/bn/${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:8080CI-āϤā§, āĻāĻāĻāĻŋ āĻĒā§āϝāĻžāĻā§āĻ āϤā§āϰāĻŋ āĻāĻŦāĻ āϞā§āĻĄ āĻāϰāĻž āĻāĻāϰāĻāĻŽ āĻĻā§āĻāĻžāϝāĻŧ:
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}"āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ
āĻāĻŋāĻāϞā§āϝāĻžāĻŦā§ āĻŦāĻšāĻŋāϰāĻžāĻāϤ āĻĒāϰāĻŋāώā§āĻŦāĻžāĻā§āϞāĻŋāϰ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ/āĻ āύā§āĻŽā§āĻĻāύā§āϰ āĻāύā§āϝ JWT āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϏāĻŽā§āĻāĻŦāĨ¤ Nginx-āĻ auth_request āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āĻāĻŽāϰāĻž āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻĄā§āĻāĻžāĻā§ āϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻāϞ āϏāĻŽā§āĻŦāϞāĻŋāϤ āϏāĻžāĻŦāϰāĻŋāĻā§āϝāĻŧā§āϏā§āĻā§ āĻĒā§āύāĻāύāĻŋāϰā§āĻĻā§āĻļ āĻāϰāĻŦāĨ¤ āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻāĻŋ āĻāĻŋāĻāϞā§āϝāĻžāĻŦ āĻāĻāĻāϰāĻāϞ⧠āĻāϰā§āĻāĻāĻŋ āϏāĻžāĻŦ-āϰāĻŋāĻā§āϝāĻŧā§āϏā§āĻ āĻāϰāĻŦā§ āĻāĻŦāĻ āϝāĻĻāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻĄā§āĻāĻž āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāĻž āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧠āĻāĻŋāĻāϞā§āϝāĻžāĻŦ āĻā§āĻĄ 200 āĻĢā§āϰāϤ āĻĻā§āĻŦā§ āĻāĻŦāĻ āĻĒā§āϝāĻžāĻā§āĻ āĻāĻĒāϞā§āĻĄ/āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāĻžāϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§āĻāϝāĻŧāĻž āĻšāĻŦā§āĨ¤ āĻā§āύ āĻāĻāĻāĻŋ āϏāĻžāĻŦāĻā§āϝāĻŧā§āϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ āύāĻž āĻāĻŦāĻ āĻ āĻŦāĻŋāϞāĻŽā§āĻŦā§ āĻāĻŋāĻāϞā§āϝāĻžāĻŦā§ āĻĄā§āĻāĻž āĻĒāĻžāĻ āĻžāĻŦā§āύ? āĻāĻžāϰāĻŖ āϤāĻžāϰāĻĒāϰ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻ āύā§āĻŽā§āĻĻāύ⧠āĻā§āύ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻŽāĻžāĻĻā§āϰ Nginx āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻĢāĻžāĻāϞāĻāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰāϤ⧠āĻšāĻŦā§ āĻāĻŦāĻ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻŦāϰāĻ āĻā§āϞāĻžāύā§āϤāĻŋāĻāϰ āĻāĻžāĻāĨ¤ āĻāĻāĻžāĻĄāĻŧāĻžāĻ, āϝāĻĻāĻŋ Kubernetes āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒāĻ āύāϝā§āĻā§āϝ āϰā§āĻ āĻĢāĻžāĻāϞ āϏāĻŋāϏā§āĻā§āĻŽ āύā§āϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āϤāĻžāĻšāϞ⧠configmap-āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ nginx.conf āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻāĻŋ āĻāϰāĻ āĻāĻāĻŋāϞāϤāĻž āϝā§āĻ āĻāϰā§āĨ¤ āĻāĻŦāĻ āĻāĻāĻ āϏāĻžāĻĨā§ āĻāϞāĻŋāĻāĻŽ (āĻĒāĻŋāĻāĻŋāϏāĻŋ) āĻāĻŦāĻ āĻĒāĻ āύāϝā§āĻā§āϝ āϰā§āĻ āĻĢāĻžāĻāϞ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āϏāĻāϝā§āĻ āύāĻŋāώāĻŋāĻĻā§āϧ āĻāϰāĻžāϰ āύā§āϤāĻŋāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāύāĻĢāĻŋāĻāĻžāϰāĻŽā§āϝāĻžāĻĒā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ Nginx āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻž āĻāĻā§āĻŦāĻžāϰā§āĻ āĻ āϏāĻŽā§āĻāĻŦ āĻšāϝāĻŧā§ āĻĒāĻĄāĻŧā§ (āĻāĻāĻŋāĻ āĻāĻā§)āĨ¤
NJS āĻāύā§āĻāĻžāϰāĻŽāĻŋāĻĄāĻŋāϝāĻŧā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āĻāĻŽāϰāĻž āĻĒāϰāĻŋāĻŦā§āĻļā§āϰ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠nginx āĻāύāĻĢāĻŋāĻāĻžāϰ⧠āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻžāϰ āϏā§āϝā§āĻ āĻĒāĻžāĻ āĻāĻŦāĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻā§ āĻāĻŋāĻā§ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻŋ (āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāĻāĻŋ āĻā§āϞāĻāĻžāĻŦā§ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ 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 = require('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-āĻ āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻžāĻāĻžāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰāϤ⧠āĻĻā§āϝāĻŧāĨ¤ āĻāϰ āĻŦāĻŋāĻāĻžāĻļā§āϰ āϏāĻŽāϝāĻŧ, āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāύā§āϏā§āϰ āĻĻāĻŋāĻā§ āĻĻā§āϰā§āĻĻāĻžāύā§āϤ āĻŽāύā§āϝā§āĻ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āĻ āĻŦāĻļā§āϝāĻ, āĻāĻāύāĻ āĻ āύā§āĻ āĻāĻŋāĻā§ āĻ āύā§āĻĒāϏā§āĻĨāĻŋāϤ, āĻāĻŋāύā§āϤ⧠āĻĒā§āϰāĻāϞā§āĻĒāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āĻ āĻĻāϞ āĻĻā§āĻŦāĻžāϰāĻž āϤā§āϰāĻŋ āĻāϰāĻž āĻšāĻā§āĻā§ āĻāĻŦāĻ āϤāĻžāϰāĻž āϏāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āύāϤā§āύ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āϝā§āĻ āĻāϰāĻā§ āĻāĻŦāĻ āĻŦāĻžāĻāĻā§āϞāĻŋ āĻ āĻŋāĻ āĻāϰāĻā§ā§ˇ āĻāĻŽāĻŋ āĻāĻļāĻž āĻāϰāĻŋ āϝ⧠āĻāĻāĻĻāĻŋāύ NJS āĻāĻĒāύāĻžāĻā§ āĻŦāĻžāĻšā§āϝāĻŋāĻ āĻŽāĻĄāĻŋāĻāϞāĻā§āϞāĻŋāĻā§ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻžāϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§āĻŦā§, āϝāĻž Nginx āĻāĻžāϰā§āϝāĻāĻžāϰāĻŋāϤāĻžāĻā§ āĻĒā§āϰāĻžāϝāĻŧ āϏā§āĻŽāĻžāĻšā§āύ āĻāϰ⧠āϤā§āϞāĻŦā§āĨ¤ āĻāĻŋāύā§āϤ⧠NGINX āĻĒā§āϞāĻžāϏ āĻāĻā§ āĻāĻŦāĻ āĻā§āĻŦ āϏāĻŽā§āĻāĻŦāϤ āĻā§āύ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻĨāĻžāĻāĻŦā§ āύāĻž!
и
/ āϏā§āύā§āĻ āĻšāĻžāĻāϞā§āĻĄ++ 2019-āĻ āĻĻāĻŋāĻŽāĻŋāϤā§āϰāĻŋ āĻāϞāύāĻŋāĻā§āϰ āĻŦāĻā§āϤā§āϤāĻž
/ HighLoad++ 2019 āĻ āĻā§āϝāĻžāϏāĻŋāϞāĻŋ āϏā§āĻļāύāĻŋāĻāĻā§āϰ āĻŦāĻā§āϤā§āϤāĻž
āĻāϤā§āϏ: www.habr.com
