เจธเจฟเฉฐเจเจฒ-เจชเฉเจ เจเจชเจฒเฉเจเฉเจธเจผเจจ (SPA) เจธเจฅเจฟเจฐ JavaScript เจ เจคเฉ HTML เจซเจพเจเจฒเจพเจ เจฆเฉ เจจเจพเจฒ-เจจเจพเจฒ เจเจฟเฉฑเจคเจฐเจพเจ เจ เจคเฉ เจนเฉเจฐ เจธเจฐเฉเจคเจพเจ เจฆเจพ เจเฉฑเจ เจธเจฎเฉเจน เจนเฉเฅค เจเจฟเจเจเจเจฟ เจเจน เจเจคเฉเจธเจผเฉเจฒ เจฐเฉเจช เจตเจฟเฉฑเจ เจจเจนเฉเจ เจฌเจฆเจฒเจฆเฉ, เจเจนเจจเจพเจ เจจเฉเฉฐ เจเจจเจฒเจพเจเจจ เจชเฉเจฐเจเจพเจธเจผเจฟเจค เจเจฐเจจเจพ เจฌเจนเฉเจค เจเจธเจพเจจ เจนเฉเฅค เจเจธเจฆเฉ เจฒเจ เจฌเจนเฉเจค เจธเจพเจฐเฉเจเจ เจธเจธเจคเฉเจเจ เจ เจคเฉ เจเฉฑเจฅเฉเจ เจคเฉฑเจ เจเจฟ เจฎเฉเจซเจค เจธเฉเจตเจพเจตเจพเจ เจนเจจ, เจเฉฑเจ เจธเจงเจพเจฐเจจ GitHub เจชเฉฐเจจเจฟเจเจ เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจนเฉเฉฐเจฆเฉเจเจ เจนเจจ (เจ เจคเฉ เจเฉเจ เจฒเจ narod.ru เจจเจพเจฒ เจตเฉ) เจ เจคเฉ เจเจฎเจพเจเจผเจพเจจ S3 เจตเจฐเจเฉ CDN เจจเจพเจฒ เจเจคเจฎ เจนเฉเฉฐเจฆเฉเจเจ เจนเจจเฅค เจนเจพเจฒเจพเจเจเจฟ, เจฎเฉเจจเฉเฉฐ เจเฉเจ เจนเฉเจฐ เจเจพเจนเฉเจฆเจพ เจธเฉเฅค
เจฎเฉเจจเฉเฉฐ SPA เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจกเฉเจเจฐ เจเจฟเฉฑเจคเจฐ เจฆเฉ เจฒเฉเฉ เจธเฉ เจคเจพเจ เจเฉ เจเจธเจจเฉเฉฐ เจเฉเจฌเจฐเจจเฉเจเจธ เจเจฒเฉฑเจธเจเจฐ เจฆเฉ เจนเจฟเฉฑเจธเฉ เจตเจเฉเจ เจเจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจ เจเจธเจพเจจเฉ เจจเจพเจฒ เจฒเจพเจเจ เจเฉเจคเจพ เจเจพ เจธเจเฉ, เจ เจคเฉ เจเฉฑเจ เจฌเฉเจ-เจเจเจก เจกเจฟเจตเฉเจฒเจชเจฐ เจฆเฉ เจฎเจธเจผเฉเจจ 'เจคเฉ เจเจฟเจธ เจจเฉเฉฐ เจเจน เจจเจนเฉเจ เจชเจคเจพ เจเจฟ SPA เจเฉ เจนเฉเฅค
เจฎเฉเจ เจเจชเจฃเฉ เจฒเจ เจนเฉเจ เจฒเจฟเจเฉเจเจ เจเจฟเฉฑเจคเจฐ เจฒเฉเฉเจพเจ เจจเจฟเจฐเจงเจพเจฐเจค เจเฉเจคเฉเจเจ เจนเจจ:
- เจตเจฐเจคเจฃ เจฆเฉ เจธเฉเจ (เจชเจฐ เจ เจธเฉเจเจฌเจฒเฉ เจจเจนเฉเจ);
- เจกเจฟเจธเจ เจ เจคเฉ เจฐเฉเจฎ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจเฉฑเจเฉ-เจเฉฑเจ เจเจเจพเจฐ;
- เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉเจฐเฉเจเจฌเจฒ เจฆเฉเจเจฐเจพ เจธเฉฐเจฐเจเจจเจพ เจคเจพเจ เจเฉ เจเจฟเฉฑเจคเจฐ เจจเฉเฉฐ เจตเฉฑเจ-เจตเฉฑเจ เจตเจพเจคเจพเจตเจฐเจฃเจพเจ เจตเจฟเฉฑเจ เจตเจฐเจคเจฟเจ เจเจพ เจธเจเฉ;
- เจซเจพเจเจฒเจพเจ เจฆเฉ เจธเจญ เจคเฉเจ เจเฉเจธเจผเจฒ เจตเฉฐเจก.
เจ เฉฑเจ เจฎเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ เจฆเฉฑเจธเจพเจเจเจพ เจเจฟ เจเจฟเจตเฉเจ:
- gut nginx;
- เจธเจฐเฉเจคเจพเจ เจคเฉเจ เจฌเจฐเฉเจเจฒเฉ เจฌเจฃเจพเจ;
- เจธเจฅเจฟเจฐ เจซเจพเจเจฒเจพเจ เจจเฉเฉฐ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉเจฐเฉเจเจฌเจฒ เจจเฉเฉฐ เจธเจฎเจเจฃ เจฒเจ เจธเจฟเจเจพเจ;
- เจ เจคเฉ เจฌเฉเจธเจผเจ เจเจธ เจธเจญ เจคเฉเจ เจเฉฑเจ เจกเฉเจเจฐ เจเจฟเฉฑเจคเจฐ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจเจเฉฑเจ เจพ เจเจฐเจจเจพ เจนเฉ.
เจเจธ เจฒเฉเจ เจฆเจพ เจเจฆเฉเจธเจผ เจฎเฉเจฐเฉ เจ เจจเฉเจญเจต เจจเฉเฉฐ เจธเจพเจเจเจพ เจเจฐเจจเจพ เจ เจคเฉ เจคเจเจฐเจฌเฉเจเจพเจฐ เจญเจพเจเจเจพเจฐเฉ เจฆเฉ เจฎเฉเจเจฌเจฐเจพเจ เจจเฉเฉฐ เจเจธเจพเจฐเฉ เจเจฒเฉเจเจจเจพ เจฒเจ เจเจเจธเจพเจเจฃเจพ เจนเฉเฅค
เจ เจธเฉเจเจฌเจฒเฉ เจฒเจ เจเฉฑเจ เจเจฟเฉฑเจคเจฐ เจฌเจฃเจพเจเจฃเจพ
เจซเจพเจเจจเจฒ เจกเฉเจเจฐ เจเจฟเฉฑเจคเจฐ เจจเฉเฉฐ เจเจเจพเจฐ เจตเจฟเฉฑเจ เจเฉเจเจพ เจฌเจฃเจพเจเจฃ เจฒเจ, เจคเฉเจนเจพเจจเฉเฉฐ เจฆเฉ เจจเจฟเจฏเจฎเจพเจ เจฆเฉ เจชเจพเจฒเจฃเจพ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ: เจเฉฑเจเฉ-เจเฉฑเจ เจฒเฉเจ เจฐเจพเจ เจ เจคเฉ เจเฉฑเจ เจเฉฑเจเฉ-เจเฉฑเจ เจ เจงเจพเจฐ เจเจฟเฉฑเจคเจฐเฅค เจธเจญ เจคเฉเจ เจเฉเจเฉเจเจ เจฌเฉเจธ เจเจฟเฉฑเจคเจฐเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจ เจฒเจชเจพเจเจจ เจฒเฉเจจเจเจธ เจเจฟเฉฑเจคเจฐ เจนเฉ, เจเจธเจฒเจ เจเจน เจเจนเฉ เจนเฉ เจเฉ เจฎเฉเจ เจเฉเจฃเจพเจเจเจพเฅค เจเฉเจ เจฒเฉเจ เจเจน เจฆเจฒเฉเจฒ เจฆเฉ เจธเจเจฆเฉ เจนเจจ เจเจฟ เจเจฒเจชเจพเจเจจ เจเจคเจชเจพเจฆเจจ เจฒเจ เจขเฉเจเจตเฉเจ เจจเจนเฉเจ เจนเฉ, เจ เจคเฉ เจเจน เจธเจนเฉ เจนเฉ เจธเจเจฆเฉ เจนเจจเฅค เจชเจฐ เจจเจฟเฉฑเจเฉ เจคเฉเจฐ 'เจคเฉ, เจฎเฉเจจเฉเฉฐ เจเจธ เจจเจพเจฒ เจเจฆเฉ เจเฉเจ เจธเจฎเฉฑเจธเจฟเจ เจจเจนเฉเจ เจเจ เจ เจคเฉ เจจเจพ เจนเฉ เจเจธ เจตเจฟเจฐเฉเฉฑเจง เจเฉเจ เจฆเจฒเฉเจฒ เจนเฉเฅค
เจเฉฑเจ เจฒเฉเจ เจฐเจพเจ เจฐเฉฑเจเจฃ เจฒเจ, เจฎเฉเจ เจเจฟเฉฑเจคเจฐ เจจเฉเฉฐ 2 เจชเฉเจพเจตเจพเจ เจตเจฟเฉฑเจ เจเจเฉฑเจ เจพ เจเจฐเจพเจเจเจพเฅค เจชเจนเจฟเจฒเจพ เจเฉฑเจ เจกเจฐเจพเจซเจ เจนเฉ; เจธเจพเจฐเฉเจเจ เจธเจนเจพเจเจ เจธเจนเฉเจฒเจคเจพเจ เจ เจคเฉ เจ เจธเจฅเจพเจ เจซเจพเจเจฒเจพเจ เจเจธ เจตเจฟเฉฑเจ เจฐเจนเจฟเจฃเจเฉเจเจเฅค เจ เจคเฉ เจ เฉฐเจคเจฎ เจชเฉเจพเจ เจตเจฟเฉฑเจ เจฎเฉเจ เจธเจฟเจฐเจซ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฆเจพ เจ เฉฐเจคเจฎ เจธเฉฐเจธเจเจฐเจฃ เจฒเจฟเจเจพเจเจเจพเฅค
เจเจ เจธเจนเจพเจเจ เจเจฟเฉฑเจคเจฐ เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจเจฐเฉเจเฅค
เจเฉฑเจ SPA เจเจชเจฒเฉเจเฉเจธเจผเจจ เจจเฉเฉฐ เจเฉฐเจชเจพเจเจฒ เจเจฐเจจ เจฒเจ, เจคเฉเจนเจพเจจเฉเฉฐ เจเจฎ เจคเฉเจฐ 'เจคเฉ node.js เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค เจฎเฉเจ เจ เจงเจฟเจเจพเจฐเจค เจเจฟเฉฑเจคเจฐ เจฒเจตเจพเจเจเจพ, เจเฉ เจเจฟ เจเจจเจชเฉเจเจฎ เจ เจคเฉ เจงเจพเจเฉ เจฆเฉ เจชเฉเจเฉเจ เจชเฉเจฐเจฌเฉฐเจงเจเจพเจ เจฆเฉ เจจเจพเจฒ เจตเฉ เจเจเจเจฆเจพ เจนเฉเฅค เจฎเฉเจฐเฉ เจเจชเจฃเฉ เจคเจฐเจซเฉเจ, เจฎเฉเจ เจจเฉเจก-เจเจฟเจช เจจเฉเฉฐ เจเฉเฉเจพเจเจเจพ, เจเฉ เจเจฟ เจเฉเจ เจเจจเจชเฉเจเจฎ เจชเฉเจเฉเจ เจฌเจฃเจพเจเจฃ เจฒเจ เจฒเฉเฉเฉเจเจฆเจพ เจนเฉ, เจ เจคเฉ เจเฉเจเจฒ เจคเฉเจ เจฌเจฐเฉเจเจฒเฉ เจเฉฐเจชเฉเจฐเฉเจธเจฐ, เจเฉ เจฌเจพเจ เจฆ เจตเจฟเฉฑเจ เจธเจพเจกเฉ เจฒเจ เจฒเจพเจญเจฆเจพเจเจ เจนเฉเจตเฉเจเจพ.
เจเจฟเฉฑเจชเจฃเฉเจเจ เจฆเฉ เจจเจพเจฒ เจกเฉเจเจฐเจซเจพเจเจฒ.
# ะะฐะทะพะฒัะน ะพะฑัะฐะท
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 เจเฉเจฒ เจเฉฑเจ เจ เจงเจฟเจเจพเจฐเจค เจกเฉเจเจฐ เจเจฟเฉฑเจคเจฐ เจนเฉ, เจชเจฐ เจเจธ เจตเจฟเฉฑเจ เจธเจงเจพเจฐเจจ เจธเจฅเจฟเจฐ เจตเฉฐเจก เจฒเจ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจฎเฉเจกเฉเจเจฒ เจนเจจ. เจกเจฟเจฒเฉเจตเจฐเฉ เจตเจฟเฉฑเจ เจเจฟเจนเฉเฉ เจฒเฉเจ เจธเจผเจพเจฎเจฒ เจนเจจ, เจเฉฑเจ เจตเจฟเจธเจผเฉเจธเจผ เจเฉเจฎ เจฆเฉเจเจฐเจพ เจเจพเจ เจ เจงเจฟเจเจพเจฐเจค เจกเฉเจเจฐเจซเจพเจเจฒ เจตเจฟเฉฑเจ เจฆเฉเจเจฟเจ เจเจพ เจธเจเจฆเจพ เจนเฉเฅค
$ docker run --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 เจจเจพเจฒเฉเจ เจฅเฉเฉเฉเจนเจพ เจตเจงเฉเจฐเฉ เจเฉเจธเจผเจฒ เจนเฉ. เจ เจธเฉเจ เจซเจพเจเจฒเจพเจ เจจเฉเฉฐ เจเฉฑเจ เจตเจพเจฐ เจธเฉฐเจเฉเจเจฟเจค เจเจฐเจพเจเจเฉ; เจซเจฒเจพเจ 'เจคเฉ เจ เจเจฟเจนเจพ เจเจฐเจจ เจฆเฉ เจเฉเจ เจฒเฉเฉ เจจเจนเฉเจ เจนเฉเฅค
เจเจน เจเจน เจกเฉเจเจฐเจซเจพเจเจฒ เจนเฉ เจเจฟเจธ เจจเจพเจฒ เจฎเฉเจ เจเจคเจฎ เจนเฉเจเจ เจธเฉ. เจฐเฉเจธเฉ เจตเจฟเฉฑเจ เจเจฟเฉฑเจชเจฃเฉเจเจ เจฎเฉเจฐเฉเจเจ เจนเจจ, เจ เฉฐเจเจฐเฉเจเจผเฉ เจตเจฟเฉฑเจ - เจฎเฉเจฒ เจคเฉเจเฅค
เจกเฉเจเจฐเจซเจพเจเจฒ
# ะะฐะทะพะฒัะน ะพะฑัะฐะท ัะฝะพะฒะฐ 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 เจ เจคเฉ เจฌเจฐเฉเจเจฒเฉ เจฎเฉเจฒ เจฐเฉเจช เจตเจฟเฉฑเจ เจธเจฎเจฐเฉฑเจฅ เจนเฉ เจเจพเจฃเฅค เจฎเฉเจ เจเฉเจเจฟเฉฐเจ เจนเฉเจกเจฐ เจตเฉ เจธเจผเจพเจฎเจฒ เจเจฐเจพเจเจเจพ, เจเจฟเจเจเจเจฟ เจ เจธเฉเจ เจเจฆเฉ เจตเฉ เจธเจฅเจฟเจฐ เจจเจนเฉเจ เจฌเจฆเจฒเจพเจเจเฉ. เจ เจคเฉ เจ เฉฐเจคเจฎ เจธเฉฐเจชเจฐเจ เจธเจพเจฐเฉเจเจ 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 เจฌเจฃเจพเจเจเจฆเฉ เจธเจฎเฉเจ เจเจชเจฃเฉเจเจ เจซเจพเจเจฒเจพเจ เจตเจฟเฉฑเจ เจนเฉเจธเจผ เจเฉเฉเจฆเฉ เจนเจจเฅค เจเจน เจเจผเจฐเฉเจฐเฉ เจนเฉ เจคเจพเจ เจเฉ เจฌเฉเจฐเจพเจเจเจผเจฐ เจฒเฉฐเจฌเฉ เจธเจฎเฉเจ เจฒเจ เจซเจพเจเจฒ เจจเฉเฉฐ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจขเฉฐเจ เจจเจพเจฒ เจเฉเจธเจผ เจเจฐ เจธเจเฉเฅค เจเฉเจเจฐ เจซเจพเจเจฒ เจฌเจฆเจฒเจฆเฉ เจนเฉ, เจคเจพเจ เจเจธเจฆเจพ เจนเฉเจธเจผ เจฌเจฆเจฒ เจเจพเจตเฉเจเจพ, เจเฉ เจฌเจฆเจฒเฉ เจตเจฟเฉฑเจ เจฌเฉเจฐเจพเจเจเจผเจฐ เจจเฉเฉฐ เจซเจพเจเจฒ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจกเจพเจเจจเจฒเฉเจก เจเจฐเจจ เจฒเจ เจฎเจเจฌเฉเจฐ เจเจฐเฉเจเจพเฅค
เจฌเจฆเจเจฟเจธเจฎเจคเฉ เจจเจพเจฒ, เจฎเฉเจฐเฉ เจตเจฟเจงเฉ เจตเจฟเฉฑเจ, เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉเจฐเฉเจเจฌเจฒ เจฆเฉเจเจฐเจพ เจธเฉฐเจฐเจเจจเจพ เจจเฉเฉฐ เจฌเจฆเจฒเจฃ เจจเจพเจฒ เจซเจพเจเจฒ เจนเฉเจธเจผ เจตเจฟเฉฑเจ เจเฉเจ เจคเจฌเจฆเฉเจฒเฉ เจจเจนเฉเจ เจนเฉเฉฐเจฆเฉ, เจเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉ เจเจฟ เจฌเฉเจฐเจพเจเจเจผเจฐ เจเฉเจธเจผ เจจเฉเฉฐ เจเจฟเจธเฉ เจนเฉเจฐ เจคเจฐเฉเจเฉ เจจเจพเจฒ เจ เจตเฉเจง เจเฉเจคเจพ เจเจพเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเฅค เจฎเฉเจจเฉเฉฐ เจเจน เจธเจฎเฉฑเจธเจฟเจ เจจเจนเฉเจ เจนเฉ เจเจฟเจเจเจเจฟ เจตเฉฑเจ-เจตเฉฑเจ เจธเฉฐเจฐเจเจจเจพเจตเจพเจ เจตเฉฑเจ-เจตเฉฑเจ เจตเจพเจคเจพเจตเจฐเจฃเจพเจ เจตเจฟเฉฑเจ เจคเฉเจจเจพเจค เจเฉเจคเฉเจเจ เจเจเจเจ เจนเจจเฅค
เจ เฉฐเจคเจฟเจฎ เจเจฟเฉฑเจคเจฐ เจจเฉเฉฐ เจเจเฉฑเจ เจพ เจเจฐเจจเจพ
เจ เฉฐเจค เจตเจฟเฉฑเจ.
เจกเฉเจเจฐเจซเจพเจเจฒ
# ะะตัะฒัะน ะฑะฐะทะพะฒัะน ะพะฑัะฐะท ะดะปั ัะฑะพัะบะธ 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