เช เชฒเซเชเชฎเชพเช เชนเซเช NJS เชธเชพเชฅเซ เชฎเชพเชฐเซ เช
เชจเซเชญเชต เชถเซเชฐ เชเชฐเชตเชพ เชฎเชพเชเชเซ เชเซเช, Nginx Inc เชฆเซเชตเชพเชฐเชพ เชตเชฟเชเชธเชฟเชค Nginx เชฎเชพเชเซ JavaScript เชฆเซเชญเชพเชทเชฟเชฏเชพ, เชตเชพเชธเซเชคเชตเชฟเช เชเชฆเชพเชนเชฐเชฃเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชคเซเชจเซ เชฎเซเชเซเชฏ เชเซเชทเชฎเชคเชพเชเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซ เชเซ. NJS เช JavaScript เชจเซ เชธเชฌเชธเซเช เชเซ เชเซ เชคเชฎเชจเซ Nginx เชจเซ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพเชจเซ เชตเชฟเชธเซเชคเชพเชฐเชตเชพ เชฆเซ เชเซ. เชชเซเชฐเชถเซเชจ เชฎเชพเชเซ
เชเชฃเชพเช เชธเชฎเชฏ เชชเชนเซเชฒเชพโฆ
เชฎเชพเชฐเซ เชเซเชฒเซเชฒเซ เชจเซเชเชฐเซ เชชเชฐ, เชฎเชจเซ เชกเซเชเชฐ-เชเชเชชเซเช, เชกเซเชเชก เช
เชจเซ เช
เชจเซเชฏ เชเชจเชเชฆ เชธเชพเชฅเซ เชธเชเชเซเชฏเชพเชฌเชเชง เชฎเซเชเชฒเซ CI/CD เชชเชพเชเชชเชฒเชพเชเชจเซเชธ เชธเชพเชฅเซ เชเชฟเชเชฒเซเชฌ เชตเชพเชฐเชธเชพเชฎเชพเช เชฎเชณเซ เชนเชคเซ, เชเซ เชเชจเชฟเชเซ เชฐเซเชฒเซเชธเชฎเชพเช เชเซเชฐเชพเชจเซเชธเชซเชฐ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ. CI เชฎเชพเช เช
เชเชพเช เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพเชคเซ เชเชฌเซเช เชคเซเชฎเชจเชพ เชฎเซเชณ เชธเซเชตเชฐเซเชชเชฎเชพเช เชเชธเซเชกเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ. เชคเซเช เชคเซ เชฆเชฟเชตเชธ เชธเซเชงเซ เชฏเซเชเซเชฏ เชฐเซเชคเซ เชเชพเชฎ เชเชฐเชคเชพ เชนเชคเชพ เชเซเชฏเชพเช เชธเซเชงเซ เช
เชฎเชพเชฐเซเช เชเชฟเชเชฒเซเชฌ IP เชฌเชฆเชฒเชพเชฏเซเช เช
เชจเซ CI เชเซเชณเชพเชฎเชพเช เชซเซเชฐเชตเชพเช เชเชฏเซเช. เชธเชฎเชธเซเชฏเชพ เช เชนเชคเซ เชเซ CI เชฎเชพเช เชญเชพเช เชฒเซเชคเซ เชกเซเชเชฐ เชเชฎเซเชเชฎเชพเชเชจเซ เชเช เชชเชพเชธเซ git เชนเชคเซ, เชเซ Python เชฎเซเชกเซเชฏเซเชฒเซเชจเซ ssh เชฆเซเชตเชพเชฐเชพ เชเซเชเชเซ เชเซ. ssh เชฎเชพเชเซ เชคเชฎเชพเชฐเซ เชเชพเชจเชเซ เชเซเชจเซ เชเชฐเซเชฐ เชเซ เช
เชจเซ... เชคเซ เชเชพเชฃเซเชคเชพ_เชนเซเชธเซเชเชจเซ เชธเชพเชฅเซ เชเชฎเซเชเชฎเชพเช เชนเชคเซ. เช
เชจเซ เชตเชพเชธเซเชคเชตเชฟเช IP เช
เชจเซ เชเชพเชฃเซเชคเชพ_เชนเซเชธเซเชเชฎเชพเช เชเชฒเซเชฒเซเชเชฟเชค เชเช เชตเชเซเชเซ เชฎเซเชณ เชเชพเชคเซ เชจ เชนเซเชตเชพเชจเซ เชเชพเชฐเชฃเซ เชเซเชเชชเชฃ CI เชฎเซเชเซเชฏ เชเชเชพเชธเชฃเซ เชญเซเชฒ เชธเชพเชฅเซ เชจเชฟเชทเซเชซเชณ เชฅเชฏเซเช. เชนเชพเชฒเชจเซ เชกเซเชเชซเชพเชเชฒเซเชธเชฎเชพเชเชฅเซ เชเช เชจเชตเซ เชเชฎเซเช เชเชกเชชเชฅเซ เชเชธเซเชฎเซเชฌเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ เช
เชจเซ เชตเชฟเชเชฒเซเชช เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ StrictHostKeyChecking no
. เชชเชฐเชเชคเซ เชเชฐเชพเชฌ เชธเซเชตเชพเชฆ เชฐเชนเซเชฏเซ เช
เชจเซ เชฒเชฟเชฌเซเชธเชจเซ เชเชพเชจเชเซ PyPI เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชเชธเซเชกเชตเชพเชจเซ เชเชเซเชเชพ เชนเชคเซ. เชเช เชตเชงเชพเชฐเชพเชจเซเช เชฌเซเชจเชธ, เชเชพเชจเชเซ PyPI เชชเชฐ เชธเซเชตเชฟเช เชเชฐเซเชฏเชพ เชชเชเซ, เชเช เชธเชฐเชณ เชชเชพเชเชชเชฒเชพเชเชจ เช
เชจเซ เชเชฐเซเชฐเชฟเชฏเชพเชคเซเชจเซเช เชธเชพเชฎเชพเชจเซเชฏ เชตเชฐเซเชฃเชจ เชนเชคเซเช.txt
เชชเชธเชเชฆเชเซ เชฅเช เชเช เชเซ, เชธเชเซเชเชจเซ!
เช เชฎเซ เชฌเชงเซเช เชเซเชฒเชพเชเชกเซเชธ เช เชจเซ เชเซเชฌเชฐเชจเซเชเซเชธเชฎเชพเช เชเชฒเชพเชตเซเช เชเซเช เช เชจเซ เช เชเชคเซ เช เชฎเซ เชเช เชจเชพเชจเซ เชธเซเชตเชพ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซเช เชเซเช เชเซ เชฌเชพเชนเซเชฏ เชธเซเชเซเชฐเซเช เชธเชพเชฅเซ เชธเซเชเซเชเชฒเซเชธ เชเชจเซเชเซเชจเชฐ เชนเชคเซเช. เช เซเช เชเซ, เชเชพเชฐเชฃ เชเซ เช เชฎเซ S3 เชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช, เชคเซเชจเซ เชชเซเชฐเชพเชฅเชฎเชฟเชเชคเชพ เชเชชเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ. เช เชจเซ, เชเซ เชถเชเซเชฏ เชนเซเชฏ เชคเซ, เชเชฟเชเชฒเซเชฌเชฎเชพเช เชชเซเชฐเชฎเชพเชฃเซเชเชฐเชฃ เชธเชพเชฅเซ (เชเซ เชเชฐเซเชฐเซ เชนเซเชฏ เชคเซ เชคเชฎเซ เชคเซเชจเซ เชเชพเชคเซ เชเชฎเซเชฐเซ เชถเชเซ เชเซ).
เชเชกเชชเซ เชถเซเชงเชฅเซ เชเชฃเชพ เชชเชฐเชฟเชฃเชพเชฎเซ เชฎเชณเซเชฏเชพ: s3pypi, pypicloud เช เชจเซ เชธเชฒเชเชฎ เชฎเชพเชเซ html เชซเชพเชเชฒเซเชจเซ "เชฎเซเชจเซเชฏเซเช เชฒ" เชฐเชเชจเชพ เชธเชพเชฅเซเชจเซ เชตเชฟเชเชฒเซเชช. เชเซเชฒเซเชฒเซ เชตเชฟเชเชฒเซเชช เชชเซเชคเซ เช เช เชฆเซเชถเซเชฏ เชฅเช เชเชฏเซ.
s3pypi: S3 เชนเซเชธเซเชเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเซเชจเซ เช เชเซเชฒเชฟ เชเซ. เช เชฎเซ เชซเชพเชเชฒเซ เช เชชเชฒเซเชก เชเชฐเซเช เชเซเช, html เชเชจเชฐเซเช เชเชฐเซเช เชเซเช เช เชจเซ เชคเซเชจเซ เชธเชฎเชพเชจ เชฌเชเซเชเชฎเชพเช เช เชชเชฒเซเชก เชเชฐเซเช เชเซเช. เชเชฐ เชตเชชเชฐเชพเชถ เชฎเชพเชเซ เชฏเซเชเซเชฏ.
pypicloud: เชคเซ เชเช เชฐเชธเชชเซเชฐเชฆ เชชเซเชฐเซเชเซเชเซเช เชเซเชตเซเช เชฒเชพเชเชคเซเช เชนเชคเซเช, เชชเชฐเชเชคเซ เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ เชตเชพเชเชเซเชฏเชพ เชชเชเซ เชนเซเช เชจเชฟเชฐเชพเชถ เชฅเชฏเซ. เชธเชพเชฐเชพ เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ เช เชจเซ เชคเชฎเชพเชฐเซ เชเชฐเซเชฐเชฟเชฏเชพเชคเซเชจเซ เช เชจเซเชฐเซเชช เชตเชฟเชธเซเชคเชฐเชฃ เชเชฐเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ เชนเซเชตเชพ เชเชคเชพเช, เชตเชพเชธเซเชคเชตเชฎเชพเช เชคเซ เชจเชฟเชฐเชฐเซเชฅเช เช เชจเซ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเชตเซเช เชฎเซเชถเซเชเซเชฒ เชฌเชจเซเชฏเซเช. เชคเชฎเชพเชฐเชพ เชเชพเชฐเซเชฏเซเชจเซ เช เชจเซเชฐเซเชช เชเซเชกเชจเซ เชธเซเชงเชพเชฐเชตเชพเชฎเชพเช, เชคเซ เชธเชฎเชฏเซเชจเชพ เช เชเชฆเชพเช เชฎเซเชเชฌ, 3-5 เชฆเชฟเชตเชธเชจเซ เชธเชฎเชฏ เชฒเชพเชเชถเซ. เชธเซเชตเชพเชจเซ เชกเซเชเชพเชฌเซเชเชจเซ เชชเชฃ เชเชฐเซเชฐ เชเซ. เช เชฎเชจเซ เชฌเซเชเซเช เชเชเช เชจ เชฎเชณเซ เชคเซ เช เชฎเซ เชคเซเชจเซ เชเซเชกเซ เชฆเซเชงเซเช.
เชตเชงเซ เชเชเชกเชพเชฃเชชเซเชฐเซเชตเชเชจเซ เชถเซเชงเชฎเชพเช Nginx, ngx_aws_auth เชฎเชพเชเซ เชฎเซเชกเซเชฏเซเชฒ เชฎเชณเซเชฏเซเช. เชคเซเชจเชพ เชชเชฐเซเชเซเชทเชฃเชจเซเช เชชเชฐเชฟเชฃเชพเชฎ XML เชฌเซเชฐเชพเชเชเชฐเชฎเชพเช เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชฅเชฏเซเช เชนเชคเซเช, เชเซ S3 เชฌเชเซเชเชจเซ เชธเชพเชฎเชเซเชฐเซ เชฆเชฐเซเชถเชพเชตเซ เชเซ. เชถเซเชง เชธเชฎเชฏเซ เชเซเชฒเซเชฒเซ เชเชฎเชฟเช เชเช เชตเชฐเซเชท เชชเชนเซเชฒเชพ เชนเชคเซ. เชญเชเชกเชพเชฐ เชคเซเชฏเชเซ เชเชฏเซเชฒเซ เชฆเซเชเชพเชคเซ เชนเชคเซ.
เชธเซเชคเซเชฐเซเชค เชชเชฐ เชเชเชจเซ เชตเชพเชเชเชตเซเช
เช เชเชฆเชพเชนเชฐเชฃเชจเซ เชเชงเชพเชฐ เชคเชฐเซเชเซ เชฒเซเชคเชพ, เชเช เชเชฒเชพเช เชชเชเซ เชฎเซเช เชฎเชพเชฐเชพ เชฌเซเชฐเชพเชเชเชฐเชฎเชพเช ngx_aws_auth เชฎเซเชกเซเชฏเซเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเชคเซ เชตเชเชคเซ เชธเชฎเชพเชจ XML เชเซเชฏเซเช, เชชเชฐเชเชคเซ เชฌเชงเซเช เชชเชนเซเชฒเซเชฅเซ เช JS เชฎเชพเช เชฒเชเซเชฒเซเช เชนเชคเซเช.
เชฎเชจเซ เชเชฐเซเชเชฐ nginx เชธเซเชฒเซเชฏเซเชถเชจ เชเชฎเซเชฏเซเช. เชชเซเชฐเชฅเชฎ, เชธเชพเชฐเชพ เชฆเชธเซเชคเชพเชตเซเชเซ เช เชจเซ เชเชฃเชพ เชเชฆเชพเชนเชฐเชฃเซ, เชฌเซเชเซเช, เช เชฎเชจเซ เชซเชพเชเชฒเซ (เชฌเซเชเซเชธเชจเซ เชฌเชนเชพเชฐ) เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ Nginx เชจเซ เชฌเชงเซ เชเซเชกเซเช เชฎเชณเซ เชเซ, เชคเซเชฐเซเชเซเช, Nginx เชฎเชพเชเซ เชฐเซเชชเชฐเซเชเชพเช เชเซเชตเซ เชฐเซเชคเซ เชฒเชเชตเซ เชคเซ เชเชพเชฃเชจเชพเชฐ เชเซเชเชชเชฃ เชตเซเชฏเชเซเชคเชฟ เชถเซเช เชเซ เชคเซ เชถเซเชงเซ เชถเชเชถเซ. เชชเชพเชฏเชฅเซเชจ เช เชฅเชตเชพ เชเซ (เชเซ เชคเชฎเซ เชถเชฐเซเชเชคเชฅเซ เชฒเชเซ เชเซ) เชจเซ เชคเซเชฒเชจเชพเชฎเชพเช, เชฎเชพเชฐเชพ เชฎเชพเชเซ เชเช เชตเชคเซเชคเชพ เชฎเชฟเชจเชฟเชฎเชฒเชฟเชเชฎ เชเซ, เชจเซเชเซเชธเชธเชจเซ เชเชฒเซเชฒเซเช เชจ เชเชฐเชตเซ.
TL;DR 2 เชฆเชฟเชตเชธ เชชเชเซ, PyPi เชจเซเช เชชเชฐเซเชเซเชทเชฃ เชธเชเชธเซเชเชฐเชฃ CI เชฎเชพเช เชชเชนเซเชฒเซเชฅเซ เช เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพเชฏเซเช เชนเชคเซเช.
เชคเซ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฎ เชเชฐเซ เชเซ?
เชฎเซเชกเซเชฏเซเชฒ Nginx เชฎเชพเช เชฒเซเชก เชฅเชฏเซเชฒ เชเซ ngx_http_js_module
, เชธเชคเซเชคเชพเชตเชพเชฐ เชกเซเชเชฐ เชเชฎเซเชเชฎเชพเช เชถเชพเชฎเซเชฒ เชเซ. เช
เชฎเซ เชกเชพเชฏเชฐเซเชเซเชเชฟเชตเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เช
เชฎเชพเชฐเซ เชธเซเชเซเชฐเชฟเชชเซเช เชเชฏเชพเชค เชเชฐเซเช เชเซเช js_import
Nginx เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชฎเชพเชเซ. เชเชพเชฐเซเชฏเชจเซ เชจเชฟเชฐเซเชฆเซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชเชนเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ js_content
. เชกเชพเชฏเชฐเซเชเซเชเชฟเชตเชจเซ เชเชชเชฏเซเช เชเชฒเซ เชธเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชฅเชพเชฏ เชเซ js_set
, เชเซ เชซเชเซเชค เชธเซเชเซเชฐเชฟเชชเซเชเชฎเชพเช เชตเชฐเซเชฃเชตเซเชฒ เชเชพเชฐเซเชฏเชจเซ เชฆเชฒเซเชฒ เชคเชฐเซเชเซ เชฒเซ เชเซ. เชชเชฐเชเชคเซ เช
เชฎเซ NJS เชฎเชพเช เชฎเชพเชคเซเชฐ Nginx เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชธเชฌเชเซเชตเซเชฐเซเช เชเชเซเชเชฟเชเซเชฏเซเช เชเชฐเซ เชถเชเซเช เชเซเช, เชเซเช 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)
, เชเซเชฏเชพเชฐเซ เช เชซเชเชเซเชถเชจเชจเซ เชฌเซเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชคเซเชฏเชพเชฐเซ เชเชฐเซเชญเชฟเชค เชฐเซเชคเซ เชชเชธเชพเชฐ เชฅเชพเชฏ เชเซ. เชธเชฌ-เชฐเชฟเชเซเชตเซเชธเซเช เชชเซเชฐเชคเชฟเชธเชพเชฆ เชซเชเชเซเชถเชจเชฎเชพเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ 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
, เชเซ เชกเชฟเชฐเซเชเซเชเชฐเซเช (PyPI เชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชฌเชงเชพ เชชเซเชเซเชเซเชจเซ เชธเซเชเชฟ) เชจเซ เช
เชจเซเชฐเซเชช, เชคเชฎเชพเชฎ CommonPrefixes xml เชเชเชเซเชจเซ เชธเซเชเชฟ เชชเชฐเชค เชเชฐเชถเซ. เชเซ เชคเชฎเชพเชฐเซ เชเซเชเซเชเชธ เชจเชฟเชฐเซเชฆเซเชถเชฟเชเชพเชฎเชพเช เชธเชฎเชพเชตเชฟเชทเซเชเซเชจเซ เชธเซเชเชฟ เชฎเซเชณเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชนเซเชฏ (เชฌเชงเชพ เชชเซเชเซเช เชธเชเชธเซเชเชฐเชฃเซเชจเซ เชธเซเชเชฟ), เชคเซ เชชเชเซ uri เชตเชฟเชจเชเชคเซเชฎเชพเช เชกเชฟเชฐเซเชเซเชเชฐเซ (เชชเซเชเซเช) เชจเชพ เชจเชพเชฎ เชธเชพเชฅเซเชจเซ เชเชชเชธเชฐเซเช เชซเซเชฒเซเชก เชนเซเชตเซ เชเชตเชถเซเชฏเช เชเซ เชเซ เชธเซเชฒเซเชถ / เชธเชพเชฅเซ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เชเซ. เชจเชนเชฟเชเชคเชฐ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชกเชฟเชฐเซเชเซเชเชฐเซเชจเชพ เชธเชฎเชพเชตเชฟเชทเซเชเซเชจเซ เชตเชฟเชจเชเชคเซ เชเชฐเชคเซ เชตเชเชคเซ เช
เชฅเชกเชพเชฎเชฃ เชถเชเซเชฏ เชเซ. เชคเซเชฏเชพเช เชกเชฟเชฐเซเชเซเชเชฐเซเช aiohttp-request เช
เชจเซ aiohttp-เชตเชฟเชจเชเชคเซ เชเซ เช
เชจเซ เชเซ เชตเชฟเชจเชเชคเซ เชธเซเชชเชทเซเช เชเชฐเซ เชเซ /?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
.
เชเซ เชฌเชพเชเซ เชเซ เชคเซ เชชเชฐเชฟเชฃเชพเชฎเซ 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="/gu/${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 เชชเชฐเชค เชเชฐเชถเซ เช เชจเซ เชชเซเชเซเชเชจเซ เช เชชเชฒเซเชก/เชกเชพเชเชจเชฒเซเชก เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเชตเชพเชฎเชพเช เชเชตเชถเซ. เชถเชพ เชฎเชพเชเซ เชเช เชธเชฌเชเซเชตเซเชฐเซเชจเซ เชเชชเชฏเซเช เชจ เชเชฐเซ เช เชจเซ เชคเชฐเชค เช เชเชฟเชเชฒเซเชฌเชจเซ เชกเซเชเชพ เชฎเซเชเชฒเซ? เชเชพเชฐเชฃ เชเซ เชชเชเซ เชเชชเชฃเซ เชเซเชฏเชพเชฐเซ เชชเชฃ เช เชงเชฟเชเซเชคเชคเชพเชฎเชพเช เชเซเชเชชเชฃ เชซเซเชฐเชซเชพเชฐ เชเชฐเซเช เชคเซเชฏเชพเชฐเซ Nginx เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชซเชพเชเชฒเชจเซ เชธเชเชชเชพเชฆเชฟเชค เชเชฐเชตเซ เชชเชกเชถเซ, เช เชจเซ เช เชเช เชเซเชฌ เช เชเชเชเชพเชณเชพเชเชจเช เชเชพเชฐเซเชฏ เชเซ. เชเชชเชฐเชพเชเชค, เชเซ Kubernetes เชฎเชพเชคเซเชฐ-เชตเชพเชเชเซ เชถเชเชพเชฏ เชคเซเชตเซ เชฐเซเช เชซเชพเชเชฒเชธเชฟเชธเซเชเชฎ เชจเซเชคเชฟเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ, เชคเซ nginx.conf เชจเซ configmap เชฆเซเชตเชพเชฐเชพ เชฌเชฆเชฒเชคเซ เชตเชเชคเซ เช เชตเชงเซ เชเชเชฟเชฒเชคเชพ เชเชฎเซเชฐเซ เชเซ. เช เชจเซ configmap เชฆเซเชตเชพเชฐเชพ Nginx เชจเซ เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเชตเซเช เชเชเชฆเชฎ เช เชถเชเซเชฏ เชฌเชจเซ เชเชพเชฏ เชเซ เชเซเชฏเชพเชฐเซ เชเชเชธเชพเชฅเซ เชชเซเชฒเชฟเชธเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เชเซ เชตเซเชฒเซเชฏเซเชฎเซเชธ (pvc) เช เชจเซ เชซเชเซเชค เชตเชพเชเชเชตเชพ เชฎเชพเชเซเชจเชพ เชฐเซเช เชซเชพเชเชฒเชธเชฟเชธเซเชเชฎเชจเชพ เชเซเชกเชพเชฃเชจเซ เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชเชฐเซ เชเซ (เช เชชเชฃ เชฅเชพเชฏ เชเซ).
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เชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชถเชเซเชฏ เชเซ. เชนเซเช Chrome (v3) เช เชฅเชตเชพ njs เชเชจเซเชธเซเชฒ เชเซเชฒเชฎเชพเช เชเซเชเชฒเซเช เชธเซเชเซเชฐเชฟเชชเซเชเซเชธเชจเซ เชกเซเชฌเช เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช เชเซเช, เชชเชฐเชเชคเซ เชคเซเชฏเชพเช เชฌเชงเซเช เช เชคเชชเชพเชธเซ เชถเชเชพเชคเซเช เชจเชฅเซ. เชเซเชก เชกเซเชฌเช เชเชฐเชคเซ เชตเชเชคเซ, เชเชฐเซเชซเซ เชเชพเชฐเซเชฏเชพเชคเซเชฎเช เชชเชฐเซเชเซเชทเชฃ, เชเชคเชฟเชนเชพเชธ เชเชเชเช เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ:
docker-compose restart nginx
curl localhost:8080/
docker-compose logs --tail 10 nginx
เช เชจเซ เชเชตเชพ เชธเซเชเชเชกเซ เชธเชฟเชเซเชตเชจเซเชธ เชนเซเช เชถเชเซ เชเซ.
เชคเซเชฎเชจเชพ เชฎเชพเชเซ เชธเชฌเชเซเชตเซเชฐเซเช เช เชจเซ เชตเซเชฐเชฟเชฏเซเชฌเชฒเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเซเชก เชฒเชเชตเชพเชฅเซ เชเซเชเชเชตเชฃเชญเชฐเซ เชเซเชเชเชฎเชพเช เชซเซเชฐเชตเชพเชฏ เชเซ. เชเซเชเชฒเซเชเชตเชพเชฐ เชคเชฎเซ เชคเชฎเชพเชฐเชพ เชเซเชกเชจเซ เชเซเชฐเชฟเชฏเชพเชเชจเซ เชเซเชฐเชฎ เชถเซเชงเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเชจเซ เชตเชฟเชตเชฟเชง IDE เชตเชฟเชจเซเชกเซเชจเซ เชเชธเชชเชพเชธ เชฆเซเชกเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซ เชเซ. เชคเซ เชฎเซเชถเซเชเซเชฒ เชจเชฅเซ, เชชเชฐเชเชคเซ เชเซเชเชฒเซเชเชตเชพเชฐ เชคเซ เชเซเชฌ เช เชนเซเชฐเชพเชจ เชเชฐเซ เชเซ.
ES6 เชฎเชพเชเซ เชเซเช เชธเชเชชเซเชฐเซเชฃ เชธเชฎเชฐเซเชฅเชจ เชจเชฅเซ.
เชเซเชเชฒเซเช เช เชจเซเชฏ เชเชพเชฎเซเช เชนเซเช เชถเชเซ เชเซ, เชชเชฐเชเชคเซ เชฎเชจเซ เชฌเซเชเซเช เชเชเชเชชเชฃ เชฎเชณเซเชฏเซเช เชจเชฅเซ. เชเซ เชคเชฎเชจเซ NJS เชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชจเชเชพเชฐเชพเชคเซเชฎเช เช เชจเซเชญเชต เชนเซเชฏ เชคเซ เชฎเชพเชนเชฟเชคเซ เชถเซเชฐ เชเชฐเซ.
เชจเชฟเชทเซเชเชฐเซเชท
NJS เช เชนเชณเชตเชพ เชตเชเชจเชจเชพ เชเชชเชจ-เชธเซเชฐเซเชธ เชฆเซเชญเชพเชทเชฟเชฏเชพ เชเซ เชเซ เชคเชฎเชจเซ Nginx เชฎเชพเช เชตเชฟเชตเชฟเชง JavaScript เชธเซเชเซเชฐเชฟเชชเซเชเซ เช เชฎเชฒเชฎเชพเช เชฎเซเชเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ. เชคเซเชจเชพ เชตเชฟเชเชพเชธ เชฆเชฐเชฎเชฟเชฏเชพเชจ, เชชเซเชฐเชฆเชฐเซเชถเชจ เชชเชฐ เชเซเชฌ เชงเซเชฏเชพเชจ เชเชชเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช. เช เชฒเชฌเชคเซเชค, เชนเชเซ เชชเชฃ เชเชฃเซเช เชเซเชเซ เชเซ, เชชเชฐเชเชคเซ เชชเซเชฐเซเชเซเชเซเช เชเช เชจเชพเชจเซ เชเซเชฎ เชฆเซเชตเชพเชฐเชพ เชตเชฟเชเชธเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชฐเชนเซเชฏเซ เชเซ เช เชจเซ เชคเซเช เชธเชเซเชฐเชฟเชฏเชชเชฃเซ เชจเชตเซ เชธเซเชตเชฟเชงเชพเช เชเชฎเซเชฐเซ เชฐเชนเซเชฏเชพ เชเซ เช เชจเซ เชญเซเชฒเซเชจเซ เช เซเช เชเชฐเซ เชฐเชนเซเชฏเชพเช เชเซ. เชนเซเช เชเชถเชพ เชฐเชพเชเซเช เชเซเช เชเซ เชเซเช เชฆเชฟเชตเชธ NJS เชคเชฎเชจเซ เชฌเชพเชนเซเชฏ เชฎเซเชกเซเชฏเซเชฒเซเชจเซ เชเชจเซเชเซเช เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเชถเซ, เชเซ Nginx เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพเชจเซ เชฒเชเชญเช เช เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฌเชจเชพเชตเชถเซ. เชชเชฐเชเชคเซ เชคเซเชฏเชพเช เชเชจเชเซเชเชเชเชจเชเชเซเชธ เชชเซเชฒเชธ เชเซ เช เชจเซ เชธเชเชญเชตเชคเช เชคเซเชฏเชพเช เชเซเช เชธเซเชตเชฟเชงเชพเช เชนเชถเซ เชจเชนเซเช!
เชธเซเชฐเซเชธ: www.habr.com