เดธเดฟเดเดเดฟเตพ-เดชเตเดเต เดเดชเตเดฒเดฟเดเตเดเตเดทเตป (SPA) เดเดจเตเดจเดคเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต JavaScript, HTML เดซเดฏเดฒเตเดเดณเตเดเตเดฏเตเด เดเดฟเดคเตเดฐเดเตเดเดณเตเดเตเดฏเตเด เดฎเดฑเตเดฑเต เดเดฑเดตเดฟเดเดเตเดเดณเตเดเตเดฏเตเด เดเดฐเต เดเตเดเตเดเดฎเดพเดฃเต. เด เดต เดเดฒเดจเดพเดคเตเดฎเดเดฎเดพเดฏเดฟ เดฎเดพเดฑเดพเดคเตเดคเดคเดฟเดจเดพเตฝ, เด เดต เดเตบเดฒเตเดจเดฟเตฝ เดชเตเดฐเดธเดฟเดฆเตเดงเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเต เดตเดณเดฐเต เดเดณเตเดชเตเดชเดฎเดพเดฃเต. เดฒเดณเดฟเดคเดฎเดพเดฏ GitHub เดชเตเดเตเดเดณเดฟเตฝ เดคเตเดเดเตเดเดฟ (เดเดฟเดฒเตผเดเตเดเต narod.ru-เตฝ เดชเตเดฒเตเด) เดเดฎเดธเตเตบ S3 เดชเตเดฒเตเดฏเตเดณเตเดณ CDN-เตฝ เด เดตเดธเดพเดจเดฟเดเตเดเตเดจเตเดจ เดตเดฟเดฒเดเตเดฑเดเตเดเดคเตเด เดธเตเดเดจเตเดฏเดตเตเดฎเดพเดฏ เดจเดฟเดฐเดตเดงเดฟ เดธเตเดตเดจเดเตเดเตพ เดเดคเดฟเดจเดพเดฏเดฟ เดฒเดญเตเดฏเดฎเดพเดฃเต. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เดเดจเดฟเดเตเดเต เดฎเดฑเตเดฑเตเดจเตเดคเตเดเตเดเดฟเดฒเตเด เดเดตเดถเตเดฏเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต.
เดเดจเดฟเดเตเดเต SPA เดเดณเตเดณ เดเดฐเต เดกเตเดเตเดเตผ เดเดฎเตเดเต เดเดตเดถเตเดฏเดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด เดคเตเดตเดดเดฟ เดเดฐเต เดเตเดฌเตผเดจเตเดฑเตเดฑเดธเต เดเตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดจเตเดฑเต เดญเดพเดเดฎเดพเดฏเตเดณเตเดณ เดจเดฟเตผเดฎเตเดฎเดพเดฃเดคเตเดคเดฟเดฒเตเด SPA เดเดจเตเดคเดพเดฃเตเดจเตเดจเต เด เดฑเดฟเดฏเดพเดคเตเดค เดเดฐเต เดฌเดพเดเตเดเต-เดเตปเดกเต เดกเตเดตเดฒเดชเตเดชเดฑเตเดเต เดฎเตเดทเตเดจเดฟเดฒเตเด เดเดคเต เดเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเดพเดจเดพเดเตเด.
เดเดจเดฟเดเตเดเดพเดฏเดฟ เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดเดฟเดคเตเดฐ เดเดตเดถเตเดฏเดเดคเดเตพ เดเดพเตป เดจเดฟเตผเดฃเตเดฃเดฏเดฟเดเตเดเต:
- เดเดชเดฏเตเดเดคเตเดคเดฟเดจเตเดฑเต เดเดณเตเดชเตเดชเด (เดชเดเตเดทเต เด เดธเดเดฌเตเดฒเดฟ เด เดฒเตเดฒ);
- เดกเดฟเดธเตเดเดฟเดจเตเดฑเตเดฏเตเด เดฑเดพเดฎเดฟเดจเตเดฑเตเดฏเตเด เดเดพเดฐเตเดฏเดคเตเดคเดฟเตฝ เดเดฑเตเดฑเดตเตเด เดเตเดฑเดเตเด เดตเดฒเตเดชเตเดชเด;
- เดเตปเดตเดฏเตเตบเดฎเตเดจเตเดฑเต เดตเตเดฐเดฟเดฏเดฌเดฟเดณเตเดเตพ เดตเดดเดฟเดฏเตเดณเตเดณ เดเตเตบเดซเดฟเดเดฑเตเดทเตป, เด เดคเดฟเดฒเตเดเต เดเดฟเดคเตเดฐเด เดตเตเดฏเดคเตเดฏเดธเตเดค เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดเดณเดฟเตฝ เดเดชเดฏเตเดเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด;
- เดซเดฏเดฒเตเดเดณเตเดเต เดเดฑเตเดฑเดตเตเด เดเดพเดฐเตเดฏเดเตเดทเดฎเดฎเดพเดฏ เดตเดฟเดคเดฐเดฃเด.
เดเดเตเดเดจเตเดฏเตเดจเตเดจเต เดเดจเตเดจเต เดเดพเตป เดจเดฟเดเตเดเดณเตเดเต เดชเดฑเดฏเตเด:
- เดเตเดเตฝ nginx;
- เดเดฑเดตเดฟเดเดเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฌเตเดฐเตเดเตเดเตเดฒเดฟ เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเตเด;
- เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดตเตเดฐเดฟเดฏเดฌเดฟเดณเตเดเตพ เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเดพเตป เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดซเดฏเดฒเตเดเตพ เดชเด เดฟเดชเตเดชเดฟเดเตเดเตเด;
- เดคเตเตผเดเตเดเดฏเดพเดฏเตเด เดเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดฒเตเดฒเดพเด เดเดฐเต เดกเตเดเตเดเตผ เดเดฎเตเดเต เดเดเตเดเดจเต เดเตเดเตเดเดฟเดเตเดเตเตผเดเตเดเดพเด.
เด เดฒเตเดเดจเดคเตเดคเดฟเดจเตเดฑเต เดเดฆเตเดฆเตเดถเด เดเดจเตเดฑเต เด เดจเตเดญเดตเด เดชเดเตเดเตเดตเดฏเตเดเตเดเตเดเดฏเตเด เด เดจเตเดญเดตเดชเดฐเดฟเดเดฏเดฎเตเดณเตเดณ เดเดฎเตเดฎเตเดฏเตเดฃเดฟเดฑเตเดฑเดฟ เด เดเดเดเตเดเดณเต เดเตเดฐเดฟเดฏเดพเดคเตเดฎเดเดฎเดพเดฏ เดตเดฟเดฎเตผเดถเดจเดคเตเดคเดฟเดจเต เดชเตเดฐเตเดฐเดฟเดชเตเดชเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด เดเดจเตเดจเดคเดพเดฃเต.
เด เดธเดเดฌเตเดฒเดฟเดเตเดเดพเดฏเดฟ เดเดฐเต เดเดฎเตเดเต เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเตเดจเตเดจเต
เด เดตเดธเดพเดจ เดกเตเดเตเดเตผ เดเดฎเตเดเต เดตเดฒเตเดชเตเดชเดคเตเดคเดฟเตฝ เดเตเดฑเตเดคเดพเดเตเดเดพเตป, เดจเดฟเดเตเดเตพ เดฐเดฃเตเดเต เดจเดฟเดฏเดฎเดเตเดเตพ เดชเดพเดฒเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต: เดเตเดฑเดเตเดเดคเต เดฒเตเดฏเดฑเตเดเดณเตเด เดฎเดฟเดจเดฟเดฎเดฒเดฟเดธเตเดฑเตเดฑเดฟเดเต เด เดเดฟเดธเตเดฅเดพเดจ เดเดฟเดคเตเดฐเดตเตเด. เดเดฑเตเดฑเดตเตเด เดเตเดฑเดฟเดฏ เด เดเดฟเดธเตเดฅเดพเดจ เดเดฟเดคเตเดฐเดเตเดเดณเดฟเดฒเตเดจเตเดจเดพเดฃเต เดเตฝเดชเตเตป เดฒเดฟเดจเดเตเดธเต เดเดฎเตเดเต, เด เดคเดฟเดจเดพเตฝ เดเดพเตป เด เดคเต เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเด. เดเตฝเดชเตเตป เดเตฝเดชเดพเดฆเดจเดคเตเดคเดฟเดจเต เด เดจเตเดฏเตเดเตเดฏเดฎเดฒเตเดฒเตเดจเตเดจเต เดเดฟเดฒเตผ เดตเดพเดฆเดฟเดเตเดเตเดเตเดเดพเด, เด เดต เดถเดฐเดฟเดฏเดพเดฏเดฟเดฐเดฟเดเตเดเดพเด. เดเดจเตเดจเดพเตฝ เดตเตเดฏเดเตเดคเดฟเดชเดฐเดฎเดพเดฏเดฟ, เดเดจเดฟเดเตเดเต เด เดฆเตเดฆเตเดนเดตเตเดฎเดพเดฏเดฟ เดเดฐเต เดชเตเดฐเดถเตโเดจเดตเตเด เดเดฃเตเดเดพเดฏเดฟเดเตเดเดฟเดฒเตเดฒ, เด เดฆเตเดฆเตเดนเดคเตเดคเดฟเดจเตเดคเดฟเดฐเต เดตเดพเดฆเดเตเดเดณเตเดจเตเดจเตเดฎเดฟเดฒเตเดฒ.
เดเตเดฑเดเตเดเต เดฒเตเดฏเดฑเตเดเตพ เดฒเดญเดฟเดเตเดเดพเตป, เดเดพเตป เดเดฟเดคเตเดฐเด 2 เดเดเตเดเดเตเดเดณเดฟเดฒเดพเดฏเดฟ เดเตเดเตเดเดฟเดเตเดเตเตผเดเตเดเตเด. เดเดฆเตเดฏเดคเตเดคเตเดคเต เดเดฐเต เดกเตเดฐเดพเดซเตเดฑเตเดฑเดพเดฃเต; เดเดฒเตเดฒเดพ เดธเดนเดพเดฏ เดฏเตเดเตเดเดฟเดฒเดฟเดฑเตเดฑเดฟเดเดณเตเด เดคเดพเตฝเดเตเดเดพเดฒเดฟเด เดซเดฏเดฒเตเดเดณเตเด เด เดคเดฟเตฝ เดจเดฟเดฒเดจเดฟเตฝเดเตเดเตเด. เด เดตเดธเดพเดจ เดเดเตเดเดคเตเดคเดฟเตฝ เดเดพเตป เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดฑเต เด เดตเดธเดพเดจ เดชเดคเดฟเดชเตเดชเต เดฎเดพเดคเตเดฐเดฎเต เดเดดเตเดคเตเดเดฏเตเดณเตเดณเต.
เดธเดนเดพเดฏ เดเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฎเตเดเตเดเต เดเดฐเดเดญเดฟเดเตเดเดพเด.
เดเดฐเต SPA เดเดชเตเดฒเดฟเดเตเดเตเดทเตป เดเดเดชเตเตฝ เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเดเตเดเตพเดเตเดเต เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ node.js เดเดตเดถเตเดฏเดฎเดพเดฃเต. npm, เดจเตเตฝ เดชเดพเดเตเดเตเดเต เดฎเดพเดจเตเดเตผเดฎเดพเตผเดเตเดเตเดชเตเดชเด เดตเดฐเตเดจเตเดจ เดเดฆเตเดฏเตเดเดฟเด เดเดฟเดคเตเดฐเด เดเดพเตป เดเดเตเดเตเดเตเด. เดเดจเตเดฑเต เดชเตเดฐเดฟเตฝ, เดเดพเตป เดเดฟเดฒ npm เดชเดพเดเตเดเตเดเตเดเตพ เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเดพเตป เดเดตเดถเตเดฏเดฎเดพเดฏ node-gyp เดเด Google-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ Brotli เดเดเดชเตเดฐเดธเตเดธเดฑเตเด เดเตเตผเดเตเดเตเด, เด เดคเต เดชเดฟเดจเตเดจเตเดเต เดเดเตเดเตพเดเตเดเต เดเดชเดฏเตเดเดชเตเดฐเดฆเดฎเดพเดเตเด.
เด เดญเดฟเดชเตเดฐเดพเดฏเดเตเดเดณเตเดณเตเดณ เดกเตเดเตเดเตผเดซเดฏเตฝ.
# ะะฐะทะพะฒัะน ะพะฑัะฐะท
FROM node:12-alpine
LABEL maintainer="Aleksey Maydokin <[email protected]>"
ENV BROTLI_VERSION 1.0.7
# ะะฐะบะตัั, ะบะพัะพััะต ะฝัะถะฝั, ััะพะฑั ัะพะฑัะฐัั ะธะท ะธัั
ะพะดะฝะธะบะพะฒ Brotli
RUN apk add --no-cache --virtual .build-deps
bash
gcc
libc-dev
make
linux-headers
cmake
curl
&& mkdir -p /usr/src
# ะัั
ะพะดะฝะธะบะธ Brotli ัะบะฐัะธะฒะฐะตะผ ะธะท ะพัะธัะธะฐะปัะฝะพะณะพ ัะตะฟะพะทะธัะพัะธั
&& curl -LSs https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src
&& cd /usr/src/brotli-$BROTLI_VERSION
# ะะพะผะฟะธะปะธััะตะผ Brotli
&& ./configure-cmake --disable-debug && make -j$(getconf _NPROCESSORS_ONLN) && make install
# ะะพะฑะฐะฒะปัะตะผ node-gyp
&& yarn global add node-gyp
# ะฃะฑะธัะฐะตะผ ะทะฐ ัะพะฑะพะน ะผััะพั
&& apk del .build-deps && yarn cache clean && rm -rf /usr/src
เดเดคเดฟเดจเดเด เดเดตเดฟเดเต เดเดพเตป เดฎเดฟเดจเดฟเดฎเดฒเดฟเดธเดคเตเดคเดฟเดจเดพเดฏเดฟ เดชเตเดฐเดพเดเตเดเดฏเดพเดฃเต, เด เดคเดฟเดจเดพเตฝ เดเดฐเต เดตเดฒเดฟเดฏ เดเตเดฎเดพเดฃเต เดเดฟเดคเตเดฐเด เดเดฐเตเดฎเดฟเดเตเดเต เดเตเตผเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเต.
เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏ เดเดฟเดคเตเดฐเด เดเดตเดฟเดเต เดเดพเดฃเดพเด:
nginx
เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดเดณเตเดณเดเดเตเดเด เดตเดฟเดคเดฐเดฃเด เดเตเดฏเตเดฏเดพเตป เดจเดฟเดเตเดเตพเดเตเดเต เดเดคเต เดตเตเดฌเต เดธเตเตผเดตเดฑเตเด เดเดชเดฏเตเดเดฟเดเตเดเดพเด. เดเดพเตป nginx-เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเต เดชเดคเดฟเดตเดพเดฃเต, เด เดคเดฟเดจเดพเตฝ เดเดพเตป เดเดชเตเดชเตเตพ เด เดคเต เดเดชเดฏเตเดเดฟเดเตเดเตเด.
Nginx-เดจเต เดเดฐเต เดเดฆเตเดฏเตเดเดฟเด เดกเตเดเตเดเตผ เดเดฎเตเดเต เดเดฃเตเดเต, เดเดจเตเดจเดพเตฝ เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดกเดฟเดธเตเดเตเดฐเดฟเดฌเตเดฏเตเดทเดจเตเดตเตเดฃเตเดเดฟ เดเดคเดฟเดจเต เดงเดพเดฐเดพเดณเด เดฎเตเดกเตเดฏเตเดณเตเดเตพ เดเดฃเตเดเต. เดกเตเดฒเดฟเดตเดฑเดฟเดฏเดฟเตฝ เดเตพเดชเตเดชเตเดเตเดคเตเดคเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดต เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดเตเดฎเดฟเดจเต เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฆเตเดฏเตเดเดฟเด เดกเตเดเตเดเตผเดซเดฏเดฒเดฟเตฝ เดเดพเดฃเดพเตป เดเดดเดฟเดฏเตเด.
$ เดกเตเดเตเดเตผ เดฑเตบ --rm nginx:1-alpine nginx -V
nginx version: nginx/1.17.9
built by gcc 8.3.0 (Alpine 8.3.0)
built with OpenSSL 1.1.1d 10 Sep 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-perl_modules_path=/usr/lib/perl5/vendor_perl --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-Os -fomit-frame-pointer' --with-ld-opt=-Wl,--as-needed
เดเดพเตป เดกเตเดเตเดเตผเดซเดฏเตฝ เดเดฐเต เด เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดฏเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเด, เดเดจเตเดจเดพเตฝ เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดเดณเตเดณเดเดเตเดเด เดตเดฟเดคเดฐเดฃเด เดเตเดฏเตเดฏเดพเตป เดเดตเดถเตเดฏเดฎเตเดณเตเดณเดคเต เดฎเดพเดคเตเดฐเด เดเดพเตป เด เดคเดฟเตฝ เดเดเตเด. เดเดจเตเดฑเต เดชเดคเดฟเดชเตเดชเดฟเดจเต HTTPS-เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ, เด เดเดเตเดเดพเดฐเดคเตเดคเต เดชเดฟเดจเตเดคเตเดฃเดฏเตเดเตเดเดฟเดฒเตเดฒ, เดเตเดเดพเดคเต เดฎเดฑเตเดฑเต เดชเดฒเดคเตเด. เดเดจเตเดจเดพเตฝ เดเดจเตเดฑเต เดชเดคเดฟเดชเตเดชเดฟเดจเต เดฌเตเดฐเตเดเตโเดฒเดฟ เด เตฝเดเตเดฐเดฟเดคเด เดเดชเดฏเตเดเดฟเดเตเดเต เดเดเดชเตเดฐเดธเต เดเตเดฏเตโเดค เดซเดฏเดฒเตเดเตพ เดตเดฟเดคเดฐเดฃเด เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเตเด, เด เดคเต gzip-เดจเตเดเตเดเดพเตพ เด เตฝเดชเตเดชเด เดเตเดเตเดคเตฝ เดเดพเดฐเตเดฏเดเตเดทเดฎเดฎเดพเดฃเต. เดเดเตเดเตพ เดซเดฏเดฒเตเดเตพ เดเดฐเดฟเดเตเดเตฝ เดเดเดชเตเดฐเดธเตเดธเตเดเตเดฏเตเดฏเตเด; เดเดเตเดเดฏเดฟเตฝ เดเดคเต เดเตเดฏเตเดฏเตเดฃเตเดเดคเดฟเดฒเตเดฒ.
เดเดคเดพเดฃเต เดเดพเตป เด เดตเดธเดพเดจเดฟเดชเตเดชเดฟเดเตเด Dockerfile. เดฑเดทเตเดฏเตป เดญเดพเดทเดฏเดฟเดฒเตเดณเตเดณ เด เดญเดฟเดชเตเดฐเดพเดฏเดเตเดเตพ เดเดจเตเดฑเตเดคเดพเดฃเต, เดเดเดเตเดฒเตเดทเดฟเตฝ - เดเดฑเดฟเดเดฟเดจเดฒเดฟเตฝ เดจเดฟเดจเตเดจเต.
Dockerfile
# ะะฐะทะพะฒัะน ะพะฑัะฐะท ัะฝะพะฒะฐ Alpine
FROM alpine:3.9
LABEL maintainer="Aleksey Maydokin <[email protected]>"
ENV NGINX_VERSION 1.16.0
ENV NGX_BROTLI_VERSION 0.1.2
ENV BROTLI_VERSION 1.0.7
RUN set -x
&& addgroup -S nginx
&& adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx
# ะฃััะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฟะฐะบะตัั, ะบะพัะพััะต ะฝัะถะฝั ััะพะฑั ัะพะฑัะฐัั nginx ะธ ะผะพะดัะปั ngx_brotli ะบ ะฝะตะผั
&& apk add --no-cache --virtual .build-deps
gcc
libc-dev
make
linux-headers
curl
&& mkdir -p /usr/src
# ะกะบะฐัะธะฒะฐะตะผ ะธัั
ะพะดะฝะธะบะธ
&& curl -LSs https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz | tar xzf - -C /usr/src
&& curl -LSs https://github.com/eustas/ngx_brotli/archive/v$NGX_BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src
&& curl -LSs https://github.com/google/brotli/archive/v$BROTLI_VERSION.tar.gz | tar xzf - -C /usr/src
&& rm -rf /usr/src/ngx_brotli-$NGX_BROTLI_VERSION/deps/brotli/
&& ln -s /usr/src/brotli-$BROTLI_VERSION /usr/src/ngx_brotli-$NGX_BROTLI_VERSION/deps/brotli
&& cd /usr/src/nginx-$NGINX_VERSION
&& CNF="
--prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--modules-path=/usr/lib/nginx/modules
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
--user=nginx
--group=nginx
--without-http_ssi_module
--without-http_userid_module
--without-http_access_module
--without-http_auth_basic_module
--without-http_mirror_module
--without-http_autoindex_module
--without-http_geo_module
--without-http_split_clients_module
--without-http_referer_module
--without-http_rewrite_module
--without-http_proxy_module
--without-http_fastcgi_module
--without-http_uwsgi_module
--without-http_scgi_module
--without-http_grpc_module
--without-http_memcached_module
--without-http_limit_conn_module
--without-http_limit_req_module
--without-http_empty_gif_module
--without-http_browser_module
--without-http_upstream_hash_module
--without-http_upstream_ip_hash_module
--without-http_upstream_least_conn_module
--without-http_upstream_keepalive_module
--without-http_upstream_zone_module
--without-http_gzip_module
--with-http_gzip_static_module
--with-threads
--with-compat
--with-file-aio
--add-dynamic-module=/usr/src/ngx_brotli-$NGX_BROTLI_VERSION
"
# ะกะพะฑะธัะฐะตะผ
&& ./configure $CNF
&& make -j$(getconf _NPROCESSORS_ONLN)
&& make install
&& rm -rf /usr/src/
# ะฃะดะฐะปัะตะผ ะดะธะฝะฐะผะธัะตัะบะธะน brotli ะผะพะดัะปั, ะพััะฐะฒะปัั ัะพะปัะบะพ ััะฐัะธัะตัะบะธะน
&& rm /usr/lib/nginx/modules/ngx_http_brotli_filter_module.so
&& sed -i '$ d' /etc/apk/repositories
# Bring in gettext so we can get `envsubst`, then throw
# the rest away. To do this, we need to install `gettext`
# then move `envsubst` out of the way so `gettext` can
# be deleted completely, then move `envsubst` back.
&& apk add --no-cache --virtual .gettext gettext
&& mv /usr/bin/envsubst /tmp/
&& runDeps="$(
scanelf --needed --nobanner /usr/sbin/nginx /usr/lib/nginx/modules/*.so /tmp/envsubst
| awk '{ gsub(/,/, "nso:", $2); print "so:" $2 }'
| sort -u
| xargs -r apk info --installed
| sort -u
)"
&& apk add --no-cache $runDeps
&& apk del .build-deps
&& apk del .gettext
&& mv /tmp/envsubst /usr/local/bin/
# Bring in tzdata so users could set the timezones through the environment
# variables
&& apk add --no-cache tzdata
# forward request and error logs to docker log collector
&& ln -sf /dev/stdout /var/log/nginx/access.log
&& ln -sf /dev/stderr /var/log/nginx/error.log
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]
เดเดพเตป เดเดเดจเดเดฟ nginx.conf เดถเดฐเดฟเดฏเดพเดเตเดเตเด, เด เดเตเดเดจเต gzip, brotli เดเดจเตเดจเดฟเดต เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดฎเดพเดเตเดเตเด. เดเดพเดทเดฟเดเดเต เดนเตเดกเดฑเตเดเดณเตเด เดเดพเตป เดเตพเดชเตเดชเตเดเตเดคเตเดคเตเด, เดเดพเดฐเดฃเด เดเดเตเดเตพ เดเดฐเดฟเดเตเดเดฒเตเด เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดฎเดพเดฑเตเดฑเดฟเดฒเตเดฒ. เดเดฒเตเดฒเดพ 404 เด เดญเตเดฏเตผเดคเตเดฅเดจเดเดณเตเด index.html-เดฒเตเดเตเดเต เดฑเตเดกเดฏเดฑเดเตโเดเต เดเตเดฏเตเดฏเตเด เดเดจเตเดจเดคเดพเดฃเต เด เดตเดธเดพเดจ เดธเตเดชเตผเดถเดจเด, SPA-เดฏเดฟเดฒเต เดจเดพเดตเดฟเดเตเดทเดจเต เดเดคเต เดเดตเดถเตเดฏเดฎเดพเดฃเต.
nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
load_module /usr/lib/nginx/modules/ngx_http_brotli_static_module.so;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
gzip_static on;
brotli_static on;
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root html;
try_files $uri /index.html;
etag on;
expires max;
add_header Cache-Control public;
location = /index.html {
expires 0;
add_header Cache-Control "no-cache, public, must-revalidate, proxy-revalidate";
}
}
}
}
เดชเตเตผเดคเตเดคเดฟเดฏเดพเดฏ เดเดฟเดคเตเดฐเด เดจเดฟเดเตเดเตพเดเตเดเต เดเดตเดฟเดเต เดกเตเตบเดฒเตเดกเต เดเตเดฏเตเดฏเดพเด:
เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดตเตเดฐเดฟเดฏเดฌเดฟเดณเตเดเตพ เดฎเดจเดธเดฟเดฒเดพเดเตเดเดพเตป เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเตเดธเต เดชเด เดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต
เดเดจเตเดคเตเดเตเดฃเตเดเต SPA-เดฏเดฟเตฝ เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเตพ เดเดตเดถเตเดฏเดฎเดพเดฏเดฟ เดตเดจเตเดจเตเดเตเดเดพเด? เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดคเต RESTful API เดเดชเดฏเตเดเดฟเดเตเดเดฃเดฎเตเดจเตเดจเต เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเตเดจเตเดจเดคเดฟเดจเต. เดธเดพเดงเดพเดฐเดฃเดเดคเดฟเดฏเดฟเตฝ, เดเดตเดถเตเดฏเดฎเตเดณเตเดณ เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดเตเดเตเดณเตเดณ เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเตพ เดฌเดฟเตฝเดกเต เดเดเตเดเดคเตเดคเดฟเตฝ SPA-เดฏเดฟเดฒเตเดเตเดเต เดฎเดพเดฑเตเดฑเตเดจเตเดจเต. เดจเดฟเดเตเดเตพเดเตเดเต เดเดจเตเดคเตเดเตเดเดฟเดฒเตเด เดฎเดพเดฑเตเดฑเดฃเดฎเตเดเตเดเดฟเตฝ, เดจเดฟเดเตเดเตพ เดเดชเตเดฒเดฟเดเตเดเตเดทเตป เดชเตเดจเตผเดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต. เดเดจเดฟเดเตเดเต เด เดคเต เดตเตเดฃเตเด. CI เดเดเตเดเดคเตเดคเดฟเตฝ เดเดฐเดฟเดเตเดเตฝ เดเดชเตเดฒเดฟเดเตเดเตเดทเตป เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเดฃเดฎเตเดจเตเดจเตเด, เดเตปเดตเดฏเตเตบเดฎเตเดจเตเดฑเต เดตเตเดฐเดฟเดฏเดฌเดฟเดณเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต CD เดเดเตเดเดคเตเดคเดฟเตฝ เดเดตเดถเตเดฏเดฎเตเดณเตเดณเดคเตเดฐ เดเตเตบเดซเดฟเดเตผ เดเตเดฏเตเดฏเดฃเดฎเตเดจเตเดจเตเด เดเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเต.
เดคเตเตผเดเตเดเดฏเดพเดฏเตเด, เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดซเดฏเดฒเตเดเตพเดเตเดเต เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดตเตเดฐเดฟเดฏเดฌเดฟเดณเตเดเดณเตเดจเตเดจเตเด เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดจเตเดจเดฟเดฒเตเดฒ. เด เดคเดฟเดจเดพเตฝ, เดจเดฟเดเตเดเตพ เดเดฐเต เดคเดจเตเดคเตเดฐเด เดเดชเดฏเตเดเดฟเดเตเดเตเดฃเตเดเดฟเดตเดฐเตเด. เด เดตเดธเดพเดจ เดเดฟเดคเตเดฐเดคเตเดคเดฟเตฝ, เดเดพเตป nginx เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเดฟเดฒเตเดฒ, เดฎเดฑเดฟเดเตเดเต เดเตปเดตเดฏเตเตบเดฎเตเดจเตเดฑเต เดตเตเดฐเดฟเดฏเดฌเดฟเดณเตเดเตพ เดตเดพเดฏเดฟเดเตเดเตเดเดฏเตเด เด เดต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเดเต เดซเดฏเดฒเตเดเดณเดฟเดฒเตเดเตเดเต เดเดดเตเดคเตเดเดฏเตเด เด เดตเดฏเต เดเดเดชเตเดฐเดธเต เดเตเดฏเตเดฏเตเดเดฏเตเด เดคเตเดเตผเดจเตเดจเต เดฎเดพเดคเตเดฐเด เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด nginx-เดฒเตเดเตเดเต เดฎเดพเดฑเตเดฑเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจ เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดทเตเตฝ เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเต.
เด เดเดตเดถเตเดฏเดคเตเดคเดฟเดจเดพเดฏเดฟ, เดกเตเดเตเดเตผเดซเดฏเตฝ ENTRYPOINT เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเตผ เดจเตฝเดเตเดจเตเดจเต. เดจเดฎเตเดเตเดเต เดเดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เดจเตฝเดเดพเด (เดเตเดฃเดฟเด เดเดฐเต เดเดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเต):
docker-entrypoint.sh
#!/bin/sh set -e FLAG_FILE="/configured" TARGET_DIR="/etc/nginx/html" replace_vars () { ENV_VARS='$(awk 'BEGIN{for(v in ENVIRON) print "
quot;v}')'
# ะ Angular ะธัะตะผ ะฟะปะตะนัั ะพะปะดะตัั ะฒ main-ัะฐะนะปะฐั
for f in "$TARGET_DIR"/main*.js; do
# envsubst ะทะฐะผะตะฝัะตั ะฒ ัะฐะนะปะฐั ะฟะปะตะนัั ะพะปะดะตัั ะฝะฐ ะทะฝะฐัะตะฝะธั ะธะท ะฟะตัะตะผะตะฝะฝัั ะพะบััะถะตะฝะธั
echo "$(envsubst "$ENV_VARS" < "$f")" > "$f"
done
}
compress () {
for i in $(find "$TARGET_DIR" | grep -E ".css$|.html$|.js$|.svg$|.txt$|.ttf
quot;); do
# ะัะฟะพะปัะทัะตะผ ะผะฐะบัะธะผะฐะปัะฝัั ััะตะฟะตะฝั ัะถะฐัะธั
gzip -9kf "$i" && brotli -fZ "$i"
done
}
if [ "$1" = 'nginx' ]; then
# ะคะปะฐะณ ะฝัะถะตะฝ, ััะพะฑั ะฒัะฟะพะปะฝะธัั ัะบัะธะฟั ัะพะปัะบะพ ะฟัะธ ัะฐะผะพะผ ะฟะตัะฒะพะผ ะทะฐะฟััะบะต
if [ ! -e "$FLAG_FILE" ]; then
echo "Running init script"
echo "Replacing env vars"
replace_vars
echo "Compressing files"
compress
touch $FLAG_FILE
echo "Done"
fi
fi
exec "$@"
เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เด เดคเดฟเดจเตเดฑเต เดเตเดฒเดฟ เดจเดฟเตผเดตเดนเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเตพ เด เดซเตเดฎเดฟเตฝ js เดซเดฏเดฒเตเดเดณเดฟเตฝ เดเดดเตเดคเดฃเด:${API_URL}
.เดฎเดฟเดเตเด เดเดงเตเดจเดฟเด SPA-เดเดณเตเด เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเตเดฎเตเดชเตเตพ เด เดตเดฐเตเดเต เดซเดฏเดฒเตเดเดณเดฟเตฝ เดนเดพเดทเตเดเตพ เดเตเตผเดเตเดเตเดจเตเดจเต เดเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเดเตเดเตเดฃเตเดเดคเดพเดฃเต. เดฌเตเดฐเตเดธเดฑเดฟเดจเต เดตเดณเดฐเตเดเตเดเดพเดฒเด เดซเดฏเตฝ เดธเตเดฐเดเตเดทเดฟเดคเดฎเดพเดฏเดฟ เดเดพเดทเต เดเตเดฏเตเดฏเดพเตป เดเดคเต เดเดตเดถเตเดฏเดฎเดพเดฃเต. เดซเดฏเตฝ เดฎเดพเดฑเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เด เดคเดฟเดจเตเดฑเต เดนเดพเดทเต เดฎเดพเดฑเตเด, เด เดคเต เดซเดฏเตฝ เดตเตเดฃเตเดเตเด เดกเตเตบเดฒเตเดกเต เดเตเดฏเตเดฏเดพเตป เดฌเตเดฐเตเดธเดฑเดฟเดจเต เดชเตเดฐเตเดฐเดฟเดชเตเดชเดฟเดเตเดเตเด.
เดจเดฟเตผเดญเดพเดเตเดฏเดตเดถเดพเตฝ, เดเดจเตเดฑเต เดฐเตเดคเดฟเดฏเดฟเตฝ, เดเตปเดตเดฏเตเตบเดฎเตเดจเตเดฑเต เดตเตเดฐเดฟเดฏเดฌเดฟเดณเตเดเตพ เดตเดดเดฟ เดเตเตบเดซเดฟเดเดฑเตเดทเตป เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเต เดซเดฏเตฝ เดนเดพเดทเดฟเตฝ เดเดฐเต เดฎเดพเดฑเตเดฑเดคเตเดคเดฟเดฒเตเดเตเดเต เดจเดฏเดฟเดเตเดเดฟเดฒเตเดฒ, เด เดคเดพเดฏเดคเต เดฌเตเดฐเตเดธเตผ เดเดพเดทเต เดฎเดฑเตเดฑเตเดคเตเดเตเดเดฟเดฒเตเด เดฐเตเดคเดฟเดฏเดฟเตฝ เด เดธเดพเดงเตเดตเดพเดเตเดเดฃเด. เดตเตเดฏเดคเตเดฏเดธเตเดค เดเตเตบเดซเดฟเดเดฑเตเดทเดจเตเดเตพ เดตเตเดฏเดคเตเดฏเดธเตเดค เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดเดณเดฟเตฝ เดตเดฟเดจเตเดฏเดธเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเตฝ เดเดจเดฟเดเตเดเต เด เดชเตเดฐเดถเตโเดจเดฎเดฟเดฒเตเดฒ.
เด เดจเตเดคเดฟเดฎ เดเดฟเดคเตเดฐเด เดเดฐเตเดฎเดฟเดเตเดเต เดเตเตผเดเตเดเตเดจเตเดจเต
เดเดเตเดตเดฟเตฝ.
Dockerfile
# ะะตัะฒัะน ะฑะฐะทะพะฒัะน ะพะฑัะฐะท ะดะปั ัะฑะพัะบะธ FROM alexxxnf/spa-builder as builder # ะงัะพะฑั ัััะบัะธะฒะฝะตะต ะธัะฟะพะปัะทะพะฒะฐัั ะบัั Docker-ะฐ, ัะฝะฐัะฐะปะฐ ัััะฐะฝะฐะฒะปะธะฒะฐะตะผ ัะพะปัะบะพ ะทะฐะฒะธัะธะผะพััะธ COPY ./package.json ./package-lock.json /app/ RUN cd /app && npm ci --no-audit # ะะพัะพะผ ัะพะฑะธัะฐะตะผ ัะฐะผะพ ะฟัะธะปะพะถะตะฝะธะต COPY . /app RUN cd /app && npm run build -- --prod --configuration=docker # ะัะพัะพะน ะฑะฐะทะพะฒัะน ะพะฑัะฐะท ะดะปั ัะฐะทะดะฐัะธ FROM alexxxnf/nginx-spa # ะะฐะฑะธัะฐะตะผ ะธะท ะฟะตัะฒะพะณะพ ะพะฑัะฐะทะฐ ัะฝะฐัะฐะปะฐ ะบะพะผะฟัะตััะพั COPY --from=builder /usr/local/bin/brotli /usr/local/bin # ะะพัะพะผ ะดะพะฑะฐะฒะปัะตะผ ััะดะพ-ัะบัะธะฟั COPY ./docker/docker-entrypoint.sh /docker-entrypoint.sh # ะ ะฒ ะบะพะฝัะต ะทะฐะฑะธัะฐะตะผ ัะฐะผะพ ะฟัะธะปะพะถะตะฝะธะต COPY --from=builder /app/dist/app /etc/nginx/html/ ENTRYPOINT ["/docker-entrypoint.sh"] CMD ["nginx", "-g", "daemon off;"]
เดเดชเตเดชเตเตพ เดคเดคเตเดซเดฒเดฎเดพเดฏเตเดฃเตเดเดพเดเตเดจเตเดจ เดเดฟเดคเตเดฐเด เดเตเดเตเดเดฟเดเตเดเตเตผเดเตเดเดพเดจเตเด เดเดตเดฟเดเตเดฏเตเด เดเดชเดฏเตเดเดฟเดเตเดเดพเดจเตเด เดเดดเดฟเดฏเตเด.
เด เดตเดฒเดเดฌเด: www.habr.com