เจเจธ เจฒเฉเจ เจตเจฟเฉฑเจ เจฎเฉเจ เจเจชเจฃเฉ เจคเจเจผเจฐเจฌเฉ เจจเฉเฉฐ NJS เจจเจพเจฒ เจธเจพเจเจเจพ เจเจฐเจจเจพ เจเจพเจนเจพเจเจเจพ, Nginx Inc เจฆเฉเจเจฐเจพ เจตเจฟเจเจธเจค Nginx เจฒเจ เจเฉฑเจ JavaScript เจฆเฉเจญเจพเจธเจผเฉเจ, เจเฉฑเจ เจ
เจธเจฒ เจเจฆเจพเจนเจฐเจฃ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจเจธเจฆเฉเจเจ เจฎเฉเฉฑเจ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจฆเจพ เจตเจฐเจฃเจจ เจเจฐเจฆเฉ เจนเฉเจเฅค NJS JavaScript เจฆเจพ เจเฉฑเจ เจธเจฌเจธเฉเฉฑเจ เจนเฉ เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ Nginx เจฆเฉ เจเจพเจฐเจเจธเจผเฉเจฒเจคเจพ เจจเฉเฉฐ เจตเจงเจพเจเจฃ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค เจธเจตเจพเจฒ เจจเฉเฉฐ
เจฌเจนเฉเจค เจเจฟเจฐ เจชเจนเจฟเจฒเจพเจโฆ
เจฎเฉเจฐเฉ เจเจเจฐเฉ เจจเฉเจเจฐเฉ 'เจคเฉ, เจฎเฉเจจเฉเฉฐ เจกเฉเจเจฐ-เจเฉฐเจชเฉเจเจผ, เจกเจฟเฉฐเจก เจ
เจคเฉ เจนเฉเจฐ เจชเฉเจฐเจธเฉฐเจจเจคเจพเจตเจพเจ เจฆเฉ เจจเจพเจฒ เจเจ เจฎเฉเจเจฒเฉ CI/CD เจชเจพเจเจชเจฒเจพเจเจจเจพเจ เจฆเฉ เจจเจพเจฒ เจเจฟเจเจฒเฉเจฌ เจตเจฟเจฐเจพเจธเจค เจตเจฟเฉฑเจ เจฎเจฟเจฒเฉ, เจเจฟเจจเฉเจนเจพเจ เจจเฉเฉฐ เจเจจเฉเจเฉ เจฐเฉเจฒเจพเจ เจตเจฟเฉฑเจ เจคเจฌเจฆเฉเจฒ เจเฉเจคเจพ เจเจฟเจ เจธเฉเฅค เจเจน เจเจฟเฉฑเจคเจฐ เจเฉ เจชเจนเจฟเจฒเจพเจ CI เจตเจฟเฉฑเจ เจตเจฐเจคเฉ เจเจ เจธเจจ เจเจนเจจเจพเจ เจฆเฉ เจ
เจธเจฒ เจฐเฉเจช เจตเจฟเฉฑเจ เจเจฒเฉ เจเจ เจธเจจเฅค เจเจจเฉเจนเจพเจ เจจเฉ เจเจธ เจฆเจฟเจจ เจคเฉฑเจ เจธเจนเฉ เจขเฉฐเจ เจจเจพเจฒ เจเฉฐเจฎ เจเฉเจคเจพ เจเจฆเฉเจ เจธเจพเจกเจพ เจเจฟเจเจฒเฉเจฌ เจเจเจชเฉ เจฌเจฆเจฒ เจเจฟเจ เจ
เจคเฉ เจธเฉเจเจ เจเฉฑเจ เจชเฉเจ เจพ เจตเจฟเฉฑเจ เจฌเจฆเจฒ เจเจฟเจ. เจธเจฎเฉฑเจธเจฟเจ เจเจน เจธเฉ เจเจฟ เจธเฉเจเจ เจตเจฟเฉฑเจ เจนเจฟเฉฑเจธเจพ เจฒเฉเจฃ เจตเจพเจฒเฉ เจกเฉเจเจฐ เจเจฟเฉฑเจคเจฐเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจตเจฟเฉฑเจ git เจธเฉ, เจเฉ เจชเจพเจเจฅเจจ เจฎเฉเจกเฉเจเจฒ เจจเฉเฉฐ ssh เจฆเฉเจเจฐเจพ เจเจฟเฉฑเจเจฆเจพ เจธเฉเฅค ssh เจฒเจ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉฑเจ เจชเฉเจฐเจพเจเจตเฉเจ เจเฉเฉฐเจเฉ เจฆเฉ เจฒเฉเฉ เจนเฉ เจ
เจคเฉ... เจเจน เจเจพเจฃเจฟเจ_เจนเฉเจธเจ เจฆเฉ เจจเจพเจฒ เจเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจ เจธเฉเฅค เจ
เจคเฉ เจเฉเจ เจตเฉ CI เจ
เจธเจฒ IP เจ
เจคเฉ known_hosts เจตเจฟเฉฑเจ เจฆเจฐเจธเจพเจ เจเจ เจเฉฑเจ เจตเจฟเฉฑเจ เจฎเฉเจฒ เจจเจพ เจนเฉเจฃ เจเจพเจฐเจจ เจเฉฑเจ เจฎเฉเฉฑเจ เจคเจธเจฆเฉเจ เจเจฒเจคเฉ เจจเจพเจฒ เจ
เจธเจซเจฒ เจนเฉเจเจเฅค เจฎเฉเจเฉเจฆเจพ เจกเฉเจเจซเจพเจเจฒเจพเจ เจคเฉเจ เจเฉฑเจ เจจเจตเฉเจ เจเจฟเฉฑเจคเจฐ เจจเฉเฉฐ เจคเฉเจเจผเฉ เจจเจพเจฒ เจเจเฉฑเจ เจพ เจเฉเจคเจพ เจเจฟเจ เจธเฉ เจ
เจคเฉ เจตเจฟเจเจฒเจช เจธเจผเจพเจฎเจฒ เจเฉเจคเจพ เจเจฟเจ เจธเฉ StrictHostKeyChecking no
. เจชเจฐ เจฎเจพเฉเจพ เจธเฉเจเจฆ เจฌเจฃเจฟเจ เจฐเจฟเจนเจพ เจ
เจคเฉ เจฒเจฟเจฌเจธ เจจเฉเฉฐ เจเฉฑเจ เจชเฉเจฐเจพเจเจตเฉเจ PyPI เจฐเจฟเจชเฉเจเจผเจเจฐเฉ เจตเจฟเฉฑเจ เจฒเจฟเจเจพเจฃ เจฆเฉ เจเฉฑเจเจพ เจธเฉเฅค เจเฉฑเจ เจตเจพเจงเฉ เจฌเฉเจจเจธ, เจชเฉเจฐเจพเจเจตเฉเจ PyPI 'เจคเฉ เจเจพเจฃ เจคเฉเจ เจฌเจพเจ
เจฆ, เจเฉฑเจ เจธเจฐเจฒ เจชเจพเจเจชเจฒเจพเจเจจ เจธเฉ เจ
เจคเฉ เจฒเฉเฉเจพเจ เจฆเจพ เจเฉฑเจ เจธเจงเจพเจฐเจจ เจตเจฐเจฃเจจ เจธเฉ.txt
เจเฉเจฃ เจเฉเจคเฉ เจเจ เจนเฉ, เจธเฉฑเจเจฃ!
เจ เจธเฉเจ เจนเจฐ เจเฉเจเจผ เจจเฉเฉฐ เจเจฒเจพเจเจก เจ เจคเฉ เจเฉเจฌเจฐเจจเฉเจเจธ เจตเจฟเฉฑเจ เจเจฒเจพเจเจเจฆเฉ เจนเจพเจ, เจ เจคเฉ เจ เฉฐเจค เจตเจฟเฉฑเจ เจ เจธเฉเจ เจเฉฑเจ เจเฉเจเฉ เจเจฟเจนเฉ เจธเฉเจตเจพ เจชเฉเจฐเจพเจชเจค เจเจฐเจจเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจธเฉ เจเฉ เจฌเจพเจนเจฐเฉ เจธเจเฉเจฐเฉเจ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจธเจเฉเจเจฒเฉเฉฑเจธ เจเฉฐเจเฉเจจเจฐ เจธเฉเฅค เจเฉเจฐ, เจเจฟเจเจเจเจฟ เจ เจธเฉเจ S3 เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจ, เจเจธ เจจเฉเฉฐ เจคเจฐเจเฉเจน เจฆเจฟเฉฑเจคเฉ เจเจ เจธเฉเฅค เจ เจคเฉ, เจเฉ เจธเฉฐเจญเจต เจนเฉเจตเฉ, gitlab เจตเจฟเฉฑเจ เจชเฉเจฐเจฎเจพเจฃเจฟเจเจคเจพ เจฆเฉ เจจเจพเจฒ (เจเฉ เจฒเฉเฉ เจนเฉเจตเฉ เจคเจพเจ เจคเฉเจธเฉเจ เจเจธเจจเฉเฉฐ เจเจชเจฃเฉ เจเจช เจเฉเฉ เจธเจเจฆเฉ เจนเฉ)เฅค
เจเฉฑเจ เจคเฉเจเจผ เจเฉเจ เจจเฉ เจเจ เจจเจคเฉเจเฉ เจชเฉเจฐเจพเจชเจค เจเฉเจคเฉ: s3pypi, pypicloud เจ เจคเฉ turnips เจฒเจ html เจซเจพเจเจฒเจพเจ เจฆเฉ "เจฎเฉเจจเฉเจ เจฒ" เจฐเจเจจเจพ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจตเจฟเจเจฒเจชเฅค เจเจเจฐเฉ เจตเจฟเจเจฒเจช เจเจชเจฃเฉ เจเจช เจ เจฒเฉเจช เจนเฉ เจเจฟเจ.
s3pypi: เจเจน S3 เจนเฉเจธเจเจฟเฉฐเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฒเจ เจเฉฑเจ เจเจฒเฉ เจนเฉเฅค เจ เจธเฉเจ เจซเจพเจเจฒเจพเจ เจจเฉเฉฐ เจ เจชเจฒเฉเจก เจเจฐเจฆเฉ เจนเจพเจ, html เจคเจฟเจเจฐ เจเจฐเจฆเฉ เจนเจพเจ เจ เจคเฉ เจเจธเจจเฉเฉฐ เจเจธเฉ เจฌเจพเจฒเจเฉ เจตเจฟเฉฑเจ เจ เจชเจฒเฉเจก เจเจฐเจฆเฉ เจนเจพเจเฅค เจเจฐเฉเจฒเฉ เจตเจฐเจคเฉเจ เจฒเจ เจขเฉเจเจตเจพเจเฅค
pypicloud: เจเจน เจเฉฑเจ เจฆเจฟเจฒเจเจธเจช เจชเฉเจฐเฉเจเฉเจเจ เจฆเฉ เจคเจฐเฉเจนเจพเจ เจเจพเจชเจฆเจพ เจธเฉ, เจชเจฐ เจฆเจธเจคเจพเจตเฉเจเจผเจพเจ เจจเฉเฉฐ เจชเฉเฉเจนเจจ เจคเฉเจ เจฌเจพเจ เจฆ เจฎเฉเจ เจจเจฟเจฐเจพเจธเจผ เจนเฉ เจเจฟเจ เจธเฉเฅค เจเฉฐเจเฉ เจฆเจธเจคเจพเจตเฉเจเจผเจพเจ เจ เจคเฉ เจคเฉเจนเจพเจกเฉเจเจ เจเจผเจฐเฉเจฐเจคเจพเจ เจจเฉเฉฐ เจชเฉเจฐเจพ เจเจฐเจจ เจฒเจ เจตเจฟเจธเจคเจพเจฐ เจเจฐเจจ เจฆเฉ เจฏเฉเจเจคเจพ เจฆเฉ เจฌเจพเจตเจเฉเจฆ, เจ เจธเจฒ เจตเจฟเฉฑเจ เจเจน เจฌเฉเจฒเฉเฉเจพ เจ เจคเฉ เจเฉเจเจซเจฟเจเจฐ เจเจฐเจจเจพ เจฎเฉเจธเจผเจเจฒ เจธเจพเจฌเจค เจนเฉเจเจเฅค เจเจธ เจธเจฎเฉเจ เจฆเฉ เจ เจจเฉเจฎเจพเจจเจพเจ เจ เจจเฉเจธเจพเจฐ, เจคเฉเจนเจพเจกเฉ เจเจพเจฐเจเจพเจ เจฆเฉ เจ เจจเฉเจเฉเจฒ เจเฉเจก เจจเฉเฉฐ เจ เฉเจ เจเจฐเจจ เจตเจฟเฉฑเจ 3-5 เจฆเจฟเจจ เจฒเฉฑเจ เจเจพเจฃเจเฉเฅค เจธเฉเจตเจพ เจจเฉเฉฐ เจเฉฑเจ เจกเฉเจเจพเจฌเฉเจธ เจฆเฉ เจตเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค เจ เจธเฉเจ เจเจธเจจเฉเฉฐ เจเฉฑเจก เจฆเจฟเฉฑเจคเจพ เจเฉ เจธเจพเจจเฉเฉฐ เจนเฉเจฐ เจเฉเจ เจจเจนเฉเจ เจฎเจฟเจฒเจฟเจเฅค
เจเฉฑเจ เจนเฉเจฐ เจกเฉเฉฐเจเจพเจ เจจเจพเจฒ เจเฉเจ เจจเฉ Nginx, ngx_aws_auth เจฒเจ เจเฉฑเจ เจฎเฉเจกเฉเจเจฒ เจชเฉเจฐเจพเจชเจค เจเฉเจคเจพเฅค เจเจธเจฆเฉ เจเจพเจเจ เจฆเจพ เจจเจคเฉเจเจพ เจฌเฉเจฐเจพเจเจเจผเจฐ เจตเจฟเฉฑเจ XML เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจเฉเจคเจพ เจเจฟเจ เจธเฉ, เจเจฟเจธ เจตเจฟเฉฑเจ S3 เจฌเจพเจฒเจเฉ เจฆเฉ เจธเจฎเฉฑเจเจฐเฉ เจฆเจฟเจเจพเจ เจเจ เจธเฉเฅค เจเฉเจ เจฆเฉ เจธเจฎเฉเจ เจเจเจฐเฉ เจตเจเจจเจฌเฉฑเจงเจคเจพ เจเฉฑเจ เจธเจพเจฒ เจชเจนเจฟเจฒเจพเจ เจธเฉ. เจญเฉฐเจกเจพเจฐ เจเฉฑเจกเจฟเจ เจนเฉเจเจ เจฆเจฟเจเจพเจ เจฆเฉ เจฐเจฟเจนเจพ เจธเฉเฅค
เจธเจฐเฉเจค เจคเฉ เจเจพ เจเฉ เจชเฉเฉเจนเจจเจพ
เจเจธ เจเจฆเจพเจนเจฐเจจ เจจเฉเฉฐ เจเจงเจพเจฐ เจตเจเฉเจ เจฒเฉเจเจฆเฉ เจนเฉเจ, เจเฉฑเจ เจเฉฐเจเฉ เจฌเจพเจ เจฆ เจฎเฉเจ เจเจชเจฃเฉ เจฌเฉเจฐเจพเจเจเจผเจฐ เจตเจฟเฉฑเจ เจเจนเฉ XML เจฆเฉเจเจฟเจ เจเจฟเจตเฉเจ เจเจฟ ngx_aws_auth เจฎเฉเจกเฉเจเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจธเจฎเฉเจ, เจชเจฐ เจธเจญ เจเฉเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ JS เจตเจฟเฉฑเจ เจฒเจฟเจเจฟเจ เจเจฟเจ เจธเฉ.
เจฎเฉเจจเฉเฉฐ เจธเฉฑเจเจฎเฉเฉฑเจ nginx เจนเฉฑเจฒ เจชเจธเฉฐเจฆ เจเจเจ. เจชเจนเจฟเจฒเจพเจ, เจเฉฐเจเฉ เจฆเจธเจคเจพเจตเฉเจเจผ เจ เจคเฉ เจฌเจนเฉเจค เจธเจพเจฐเฉเจเจ เจเจฆเจพเจนเจฐเจฃเจพเจ, เจฆเฉเจเจพ, เจธเจพเจจเฉเฉฐ เจซเจพเจเจฒเจพเจ (เจฌเจพเจเจธ เจคเฉเจ เจฌเจพเจนเจฐ) เจจเจพเจฒ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ Nginx เจฆเฉเจเจ เจธเจพเจฐเฉเจเจ เจเฉเจเจผเจพเจ เจฎเจฟเจฒเจฆเฉเจเจ เจนเจจ, เจคเฉเจเจพ, เจเฉเจ เจตเฉ เจเฉ เจเจพเจฃเจฆเจพ เจนเฉ เจเจฟ Nginx เจฒเจ เจธเฉฐเจฐเจเจจเจพ เจเจฟเจตเฉเจ เจฒเจฟเจเจฃเฉ เจนเฉ, เจเจน เจชเจคเจพ เจฒเจเจพเจเจฃ เจฆเฉ เจฏเฉเจ เจนเฉเจตเฉเจเจพ เจเจฟ เจเฉ เจนเฉ. เจชเจพเจเจฅเจจ เจเจพเจ เจเฉ (เจเฉเจเจฐ เจธเจเฉเจฐเฉเจ เจคเฉเจ เจฒเจฟเจเจฟเจ เจเจฟเจ เจนเฉ) เจฆเฉ เจฎเฉเจเจพเจฌเจฒเฉ, เจเจ เจเฉเฉ เจฆเจพ เจเจผเจฟเจเจฐ เจจเจพ เจเจฐเจจ เจฒเจ, เจเฉฑเจเฉ เจเฉฑเจเจตเจพเจฆ เจตเฉ เจฎเฉเจฐเฉ เจฒเจ เจเฉฑเจ เจชเจฒเฉฑเจธ เจนเฉเฅค
TL;DR 2 เจฆเจฟเจจเจพเจ เจฌเจพเจ เจฆ, PyPi เจฆเจพ เจเฉเจธเจ เจตเจฐเจเจจ เจชเจนเจฟเจฒเจพเจ เจนเฉ CI เจตเจฟเฉฑเจ เจตเจฐเจคเจฟเจ เจเจฟเจ เจธเฉเฅค
เจเจธ เจจเฉเฉฐ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ?
เจฎเฉเจกเฉเจเจฒ Nginx เจตเจฟเฉฑเจ เจฒเฉเจก เจเฉเจคเจพ เจเจฟเจ เจนเฉ ngx_http_js_module
, เจ
เจงเจฟเจเจพเจฐเจค เจกเฉเจเจฐ เจเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจเฉเจคเจพ เจเจฟเจ เจนเฉเฅค เจ
เจธเฉเจ เจกเจพเจเจฐเฉเจเจเจฟเจต เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจชเจฃเฉ เจธเจเฉเจฐเจฟเจชเจ เจจเฉเฉฐ เจเจฏเจพเจค เจเจฐเจฆเฉ เจนเจพเจ js_import
Nginx เจธเฉฐเจฐเจเจจเจพ เจฒเจ. เจซเฉฐเจเจธเจผเจจ เจจเฉเฉฐ เจเฉฑเจ เจจเจฟเจฐเจฆเฉเจธเจผ เจฆเฉเจเจฐเจพ เจฌเฉเจฒเจพเจเจ เจเจพเจเจฆเจพ เจนเฉ js_content
. เจกเจพเจเจฐเฉเจเจเจฟเจต เจฆเฉ เจตเจฐเจคเฉเจ เจตเฉเจฐเฉเจเจฌเจฒ เจธเฉเฉฑเจ เจเจฐเจจ เจฒเจ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ js_set
, เจเฉ เจเจฟ เจธเจฟเจฐเจซ เจธเจเฉเจฐเจฟเจชเจ เจตเจฟเฉฑเจ เจตเจฐเจฃเจฟเจค เจซเฉฐเจเจธเจผเจจ เจจเฉเฉฐ เจเฉฑเจ เจเจฐเจเฉเจฎเฉเจเจ เจตเจเฉเจ เจฒเฉเจเจฆเจพ เจนเฉเฅค เจชเจฐ เจ
เจธเฉเจ เจธเจฟเจฐเจซ Nginx เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ NJS เจตเจฟเฉฑเจ เจธเจฌเจเจตเฉเจฐเฉเจเจ เจจเฉเฉฐ เจเจฒเจพ เจธเจเจฆเฉ เจนเจพเจ, เจจเจพ เจเจฟ เจเฉเจ XMLHttpRequest. เจ
เจเจฟเจนเจพ เจเจฐเจจ เจฒเจ, เจ
เจจเฉเจธเจพเจฐเฉ เจธเจฅเจพเจจ เจจเฉเฉฐ Nginx เจธเฉฐเจฐเจเจจเจพ เจตเจฟเฉฑเจ เจเฉเฉเจฟเจ เจเจพเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ. เจ
เจคเฉ เจธเจเฉเจฐเจฟเจชเจ เจจเฉเฉฐ เจเจธ เจเจฟเจเจพเจฃเฉ เจฒเจ เจธเจฌ-เจฐเจฟเจตเฉเจธเจ เจฆเจพ เจตเจฐเจฃเจจ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเฅค 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
เจฒเจ เจเฉฑเจ เจธเจฌเจเจตเฉเจฐเฉ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ location = /sub-query
, เจเฉฑเจ เจตเจฟเจงเฉ เจจเจพเจฒ (เจฎเฉเจเฉเจฆเจพ เจเจฆเจพเจนเจฐเจจ GET เจตเจฟเฉฑเจ) เจเจฐเจเฉเจฎเฉเจเจ เจคเฉเจ เจชเฉเจฐเจพเจชเจค เจเฉเจคเฉ เจเจ เจนเฉ (r)
, เจเจฆเฉเจ เจเจธ เจซเฉฐเจเจธเจผเจจ เจจเฉเฉฐ เจฌเฉเจฒเจพเจเจ เจเจพเจเจฆเจพ เจนเฉ เจคเจพเจ เจธเจชเจธเจผเจ เจคเฉเจฐ 'เจคเฉ เจชเจพเจธ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉเฅค subrequest เจเจตเจพเจฌ เจซเฉฐเจเจธเจผเจจ เจตเจฟเฉฑเจ เจเจพเจฐเจตเจพเจ เจเฉเจคเฉ เจเจพเจตเฉเจเฉ 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 เจจเฉเฉฐ เจฌเฉเจจเจคเฉ เจเจฐเจฆเจพ เจนเฉเฅค เจเฉเจเจฐ เจคเฉเจนเจพเจจเฉเฉฐ "เจฐเฉเจ" เจฆเฉ เจธเจฎเจเจฐเฉ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ, เจคเจพเจ เจคเฉเจนเจพเจจเฉเฉฐ เจกเฉเจฒเฉเจฎเฉเจเจฐ เจจเฉเฉฐ เจฆเจฐเจธเจพเจเจเจฆเฉ เจเฉฑเจ เจฏเฉเจฐเฉ เจฌเฉเจจเจคเฉ เจฌเจฃเจพเจเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค delimiter
, เจเฉ เจเจฟ เจกเจพเจเจฐเฉเจเจเจฐเฉเจเจ (PyPI เจฆเฉ เจฎเจพเจฎเจฒเฉ เจตเจฟเฉฑเจ, เจธเจพเจฐเฉ เจชเฉเจเฉเจเจพเจ เจฆเฉ เจธเฉเจเฉ) เจฆเฉ เจ
เจจเฉเจธเจพเจฐเฉ, เจธเจพเจฐเฉ CommonPrefixes xml เจคเฉฑเจคเจพเจ เจฆเฉ เจเฉฑเจ เจธเฉเจเฉ เจตเจพเจชเจธ เจเจฐเฉเจเจพเฅค เจเฉเจเจฐ เจคเฉเจนเจพเจจเฉเฉฐ เจเจฟเจธเฉ เจเจพเจธ เจกเจพเจเจฐเฉเจเจเจฐเฉ (เจธเจพเจฐเฉ เจชเฉเจเฉเจ เจธเฉฐเจธเจเจฐเจฃเจพเจ เจฆเฉ เจธเฉเจเฉ) เจตเจฟเฉฑเจ เจธเจฎเฉฑเจเจฐเฉ เจฆเฉ เจเฉฑเจ เจธเฉเจเฉ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ, เจคเจพเจ uri เจฌเฉเจจเจคเฉ เจตเจฟเฉฑเจ เจกเจพเจเจฐเฉเจเจเจฐเฉ (เจชเฉเจเฉเจ) เจฆเฉ เจจเจพเจฎ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจ
เจเฉเจคเจฐ เจเฉเจคเจฐ เจนเฉเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ เจเฉ เจเจผเจฐเฉเจฐเฉ เจคเฉเจฐ 'เจคเฉ เจธเจฒเฉเจธเจผ / เจจเจพเจฒ เจเจคเจฎ เจนเฉเฉฐเจฆเจพ เจนเฉเฅค เจจเจนเฉเจ เจคเจพเจ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจกเจพเจเจฐเฉเจเจเจฐเฉ เจฆเฉ เจธเจฎเฉฑเจเจฐเฉ เจฆเฉ เจฌเฉเจจเจคเฉ เจเจฐเจจ เจตเฉเจฒเฉ เจเฉฑเจเจฐ เจธเฉฐเจญเจต เจนเฉเฅค เจกเจพเจเจฐเฉเจเจเจฐเฉเจเจ เจนเจจ aiohttp-request เจ
เจคเฉ aiohttp-requests เจ
เจคเฉ เจเฉเจเจฐ เจฌเฉเจจเจคเฉ เจจเจฟเจธเจผเจเจฟเจค เจเจฐเจฆเฉ เจนเฉ /?prefix=aiohttp-request
, เจซเจฟเจฐ เจเจตเจพเจฌ เจตเจฟเฉฑเจ เจฆเฉเจตเฉเจ เจกเจพเจเจฐเฉเจเจเจฐเฉเจเจ เจฆเฉ เจธเจฎเฉฑเจเจฐเฉ เจธเจผเจพเจฎเจฒ เจนเฉเจตเฉเจเฉเฅค เจเฉ เจ
เฉฐเจค เจตเจฟเฉฑเจ เจเฉฑเจ เจธเจฒเฉเจธเจผ เจนเฉ, /?prefix=aiohttp-request/
, เจซเจฟเจฐ เจเจตเจพเจฌ เจตเจฟเฉฑเจ เจธเจฟเจฐเจซเจผ เจฒเฉเฉเฉเจเจฆเฉ เจกเจพเจเจฐเฉเจเจเจฐเฉ เจนเฉเจตเฉเจเฉเฅค เจ
เจคเฉ เจเฉเจเจฐ เจ
เจธเฉเจ เจเฉฑเจ เจซเจพเจเจฒ เจฆเฉ เจฌเฉเจจเจคเฉ เจเจฐเจฆเฉ เจนเจพเจ, เจคเจพเจ เจจเจคเฉเจเจพ uri เจ
เจธเจฒ เจเฉฑเจ เจคเฉเจ เจตเฉฑเจเจฐเจพ เจจเจนเฉเจ เจนเฉเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเฅค
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
.
เจธเจญ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจธเจฎเฉฑเจเจฐเฉ-เจเจฟเจธเจฎ เจฆเฉ เจธเจฟเจฐเจฒเฉเจ เจจเฉเฉฐ เจเฉเจเจธเจ/html เจจเจพเจฒ เจฌเจฆเจฒ เจเฉ, เจจเจคเฉเจเฉ เจตเจเฉเจ 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="/pa/${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 เจธเฉฐเจฐเจเจจเจพ เจซเจพเจเจฒ เจจเฉเฉฐ เจนเจฐ เจตเจพเจฐ เจธเฉฐเจชเจพเจฆเจฟเจค เจเจฐเจจเจพ เจชเจเจเจพ เจเจฆเฉเจ เจ เจธเฉเจ เจ เจงเจฟเจเจพเจฐ เจตเจฟเฉฑเจ เจเฉเจ เจฌเจฆเจฒเจพเจ เจเจฐเจฆเฉ เจนเจพเจ, เจ เจคเฉ เจเจน เจเฉฑเจ เจฌเจนเฉเจค เจฎเฉเจธเจผเจเจฒ เจเฉฐเจฎ เจนเฉ. เจจเจพเจฒ เจนเฉ, เจเฉเจเจฐ เจเฉเจฌเจฐเจจเฉเจเจธ เจเฉฑเจ เจฐเฉเจก-เจเจจเจฒเฉ เจฐเฉเจ เจซเจพเจเจฒ เจธเจฟเจธเจเจฎ เจจเฉเจคเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเจพ เจนเฉ, เจคเจพเจ เจเจน nginx.conf เจจเฉเฉฐ configmap เจฆเฉเจเจฐเจพ เจคเจฌเจฆเฉเจฒ เจเจฐเจจ เจตเฉเจฒเฉ เจนเฉเจฐ เจตเฉ เจเฉเฉฐเจเจฒเจฆเจพเจฐเจคเจพ เจเฉเฉเจฆเจพ เจนเฉเฅค เจ เจคเฉ เจเฉฑเจเฉ เจธเจฎเฉเจ เจตเจพเจฒเฉเจ เจฎ (เจชเฉเจตเฉเจธเฉ) เจ เจคเฉ เจฐเฉเจก-เจเจจเจฒเฉ เจฐเฉเจ เจซเจพเจเจฒ เจธเจฟเจธเจเจฎ (เจเจน เจตเฉ เจนเฉเฉฐเจฆเจพ เจนเฉ) เจฆเฉ เจเฉเจจเฉเจเจธเจผเจจ เจจเฉเฉฐ เจฐเฉเจเจฃ เจตเจพเจฒเฉเจเจ เจจเฉเจคเฉเจเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจธเฉฐเจฐเจเจจเจพเจฎเฉเจช เจฆเฉเจเจฐเจพ 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 เจตเจฟเฉฑเจ "เจชเฉเจฐเจฟเฉฐเจเจธ" เจฐเจพเจนเฉเจ เจนเฉ เจธเฉฐเจญเจต เจนเฉเฅค เจธเฉเฉฑเจ เจฒเฉเจเจฟเฉฐเจ เจชเฉฑเจงเจฐ เจฆเฉ เจเจพเจฃเจเจพเจฐเฉ, เจเฉเจคเจพเจตเจจเฉ เจเจพเจ เจเจฒเจคเฉ 'เจคเฉ เจจเจฟเจฐเจญเจฐ เจเจฐเจฆเจฟเจเจ, เจเฉเจฐเจฎเจตเจพเจฐ 3 เจตเจฟเจงเฉเจเจ r.log, r.warn, r.error เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจเจพ เจธเฉฐเจญเจต เจนเฉเฅค เจฎเฉเจ 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 เจชเจฒเฉฑเจธ เจนเฉ เจ เจคเฉ เจเจผเจฟเจเจฆเจพเจคเจฐ เจธเฉฐเจญเจพเจตเจจเจพ เจนเฉ เจเจฟ เจเฉเจ เจตเจฟเจธเจผเฉเจธเจผเจคเจพเจตเจพเจ เจจเจนเฉเจ เจนเฉเจฃเจเฉเจเจ!
เจธเจฐเฉเจค: www.habr.com