เชธเชฟเชเชเชฒ-เชชเซเช เชเชชเซเชฒเชฟเชเซเชถเชจ (SPA) เช เชธเซเชเซเชเชฟเช JavaScript เช เชจเซ HTML เชซเชพเชเชฒเซ เชคเซเชฎเช เชเชฎเซเชเซเชธ เช เชจเซ เช เชจเซเชฏ เชธเชเชธเชพเชงเชจเซเชจเซ เชธเชฎเซเชน เชเซ. เชเชพเชฐเชฃ เชเซ เชคเซเช เชเชคเชฟเชถเซเชฒ เชฐเซเชคเซ เชฌเชฆเชฒเชพเชคเชพ เชจเชฅเซ, เชคเซเชฎเชจเซ เชเชจเชฒเชพเชเชจ เชชเซเชฐเชเชพเชถเชฟเชค เชเชฐเชตเซเช เชเซเชฌ เช เชธเชฐเชณ เชเซ. เชเชจเชพ เชฎเชพเชเซ เชฎเซเชเซ เชธเชเชเซเชฏเชพเชฎเชพเช เชธเชธเซเชคเซ เช เชจเซ เชฎเชซเชค เชธเซเชตเชพเช เชชเชฃ เชเซ, เชเซ เชธเชพเชฆเชพ GitHub เชชเซเชทเซเช เซเชฅเซ เชถเชฐเซ เชฅเชพเชฏ เชเซ (เช เชจเซ เชเซเชเชฒเชพเช เชฎเชพเชเซ narod.ru เชธเชพเชฅเซ เชชเชฃ) เช เชจเซ เชเชฎเซเชเซเชจ S3 เชเซเชตเชพ CDN เชธเชพเชฅเซ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เชเซ. เชเซ เชเซ, เชฎเชพเชฐเซ เชเชเชเช เชฌเซเชเซเช เชเซเชเช เชเซ.
เชฎเชจเซ SPA เชธเชพเชฅเซ เชกเซเชเชฐ เชเชฎเซเชเชจเซ เชเชฐเซเชฐ เชนเชคเซ เชเซเชฅเซ เชเชฐเซเชจเซ เชคเซเชจเซ เชเซเชฌเชฐเชจเซเชเซเชธ เชเซเชฒเชธเซเชเชฐเชจเชพ เชญเชพเช เชฐเซเชชเซ เชเชคเซเชชเชพเชฆเชจเชฎเชพเช เช เชจเซ เชฌเซเช-เชเชจเซเชก เชกเซเชตเชฒเชชเชฐเชจเชพ เชฎเชถเซเชจ เชชเชฐ เชธเชฐเชณเชคเชพเชฅเซ เชฒเซเชจเซเช เชเชฐเซ เชถเชเชพเชฏ เชเซ เชเซเชจเซ SPA เชถเซเช เชเซ เชคเซเชจเซ เชเซเช เชเชพเชฃ เชจเชฅเซ.
เชฎเซเช เชฎเชพเชฐเชพ เชฎเชพเชเซ เชจเซเชเซเชจเซ เชเชฌเซ เชเชตเชถเซเชฏเชเชคเชพเช เชจเชเซเชเซ เชเชฐเซ เชเซ:
- เชเชชเชฏเซเชเชฎเชพเช เชธเชฐเชณเชคเชพ (เชชเชฐเชเชคเซ เชเชธเซเชฎเซเชฌเชฒเซ เชจเชนเซเช);
- เชกเชฟเชธเซเช เช เชจเซ เชฐเซเชฎ เชฌเชเชจเซเชจเซ เชฆเซเชฐเชทเซเชเชฟเช เชจเซเชฏเซเชจเชคเชฎ เชเชฆ;
- เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเชฒเซ เชฆเซเชตเชพเชฐเชพ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชเซเชฅเซ เชเชฌเซเชจเซ เชเชชเชฏเซเช เชตเชฟเชตเชฟเชง เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช เชฅเช เชถเชเซ;
- เชซเชพเชเชฒเซเชจเซเช เชธเซเชฅเซ เชเชพเชฐเซเชฏเชเซเชทเชฎ เชตเชฟเชคเชฐเชฃ.
เชเชเซ เชนเซเช เชคเชฎเชจเซ เชเชนเซเชถ เชเซ เชเซเชตเซ เชฐเซเชคเซ:
- เชเชเชคเชฐเชกเชพ nginx;
- เชธเซเชคเซเชฐเซเชคเซเชฎเชพเชเชฅเซ เชฌเซเชฐเซเชเชฒเซ เชฌเชจเชพเชตเซ;
- เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเชฒเซเชจเซ เชธเชฎเชเชตเชพ เชฎเชพเชเซ เชธเซเชฅเชฟเชฐ เชซเชพเชเชฒเซเชจเซ เชถเซเชเชตเซ;
- เช เชจเซ เช เชฒเชฌเชคเซเชค เช เชฌเชงเชพเชฎเชพเชเชฅเซ เชกเซเชเชฐ เชเชฎเซเช เชเซเชตเซ เชฐเซเชคเซ เชเชธเซเชฎเซเชฌเชฒ เชเชฐเชตเซ.
เช เชฒเซเชเชจเซ เชนเซเชคเซ เชฎเชพเชฐเชพ เช เชจเซเชญเชตเชจเซ เชถเซเชฐ เชเชฐเชตเชพเชจเซ เช เชจเซ เช เชจเซเชญเชตเซ เชธเชฎเซเชฆเชพเชฏเชจเชพ เชธเชญเซเชฏเซเชจเซ เชฐเชเชจเชพเชคเซเชฎเช เชเซเชเชพ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชถเซเชเซเชฐเชตเชพเชจเซ เชเซ.
เชเชธเซเชฎเซเชฌเชฒเซ เชฎเชพเชเซ เชเช เชเชฌเซ เชฌเชจเชพเชตเชตเซ
เช เชเชคเชฟเชฎ เชกเซเชเชฐ เชเชฎเซเชเชจเซ เชเชฆเชฎเชพเช เชจเชพเชจเซ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชฌเซ เชจเชฟเชฏเชฎเซเชจเซเช เชชเชพเชฒเชจ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ: เชจเซเชฏเซเชจเชคเชฎ เชธเซเชคเชฐเซ เช เชจเซ เชจเซเชฏเซเชจเชคเชฎ เชฌเซเช เชเชฎเซเช. เชธเซเชฅเซ เชจเชพเชจเซ เชฌเซเช เชเชฎเซเชเชฎเชพเชเชจเซ เชเช เชเชฒเซเชชเชพเชเชจ เชฒเชฟเชจเชเซเชธ เชเชฎเซเช เชเซ, เชคเซเชฅเซ เชนเซเช เชคเซ เช เชชเชธเชเชฆ เชเชฐเซเชถ. เชเซเชเชฒเชพเช เชเชตเซ เชฆเชฒเซเชฒ เชเชฐเซ เชถเชเซ เชเซ เชเซ เชเชฒเซเชชเชพเชเชจ เชเชคเซเชชเชพเชฆเชจ เชฎเชพเชเซ เชฏเซเชเซเชฏ เชจเชฅเซ, เช เชจเซ เชคเซ เชฏเซเชเซเชฏ เชนเซเช เชถเชเซ เชเซ. เชชเชฐเชเชคเซ เชตเซเชฏเชเซเชคเชฟเชเชค เชฐเซเชคเซ, เชฎเชจเซ เชคเซเชจเซ เชธเชพเชฅเซ เชเซเชฏเชพเชฐเซเชฏ เชเซเช เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ เช เชจเซ เชคเซเชจเซ เชธเชพเชฎเซ เชเซเช เชฆเชฒเซเชฒเซ เชจเชฅเซ.
เชเชเชพ เชธเซเชคเชฐเซ เชฐเชพเชเชตเชพ เชฎเชพเชเซ, เชนเซเช เชเชฎเซเชเชจเซ 2 เชคเชฌเชเซเชเชพเชฎเชพเช เชเชธเซเชฎเซเชฌเชฒ เชเชฐเซเชถ. เชชเซเชฐเชฅเชฎ เชกเซเชฐเชพเชซเซเช เชเซ; เชฌเชงเซ เชธเชนเชพเชฏเช เชเชชเชฏเซเชเชฟเชคเชพเช เช เชจเซ เช เชธเซเชฅเชพเชฏเซ เชซเชพเชเชฒเซ เชคเซเชฎเชพเช เชฐเชนเซเชถเซ. เช เชจเซ เช เชเชคเชฟเชฎ เชคเชฌเชเซเชเชพเชฎเชพเช เชนเซเช เชซเชเซเชค เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซเช เช เชเชคเชฟเชฎ เชธเชเชธเซเชเชฐเชฃ เชฒเชเซเชถ.
เชเชพเชฒเซ เชธเชนเชพเชฏเช เชเชฌเซ เชธเชพเชฅเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเซเช.
SPA เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชฎเซเชชเชพเชเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ node.js เชจเซ เชเชฐเซเชฐ เชชเชกเซ เชเซ. เชนเซเช เชธเชคเซเชคเชพเชตเชพเชฐ เชเชฌเซ เชฒเชเชถ, เชเซ npm เช เชจเซ เชฏเชพเชฐเซเชจ เชชเซเชเซเช เชฎเซเชจเซเชเชฐเซ เชธเชพเชฅเซ เชชเชฃ เชเชตเซ เชเซ. เชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชตเชคเซ, เชนเซเช เชจเซเชก-เชเซเชช เชเชฎเซเชฐเซเชถ, เชเซ เชเซเชเชฒเชพเช npm เชชเซเชเซเชเซ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชเซ, เช เชจเซ 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 เชชเชพเชธเซ เชธเชคเซเชคเชพเชตเชพเชฐ เชกเซเชเชฐ เชเชฎเซเช เชเซ, เชชเชฐเชเชคเซ เชคเซเชฎเชพเช เชธเชฐเชณ เชธเซเชฅเชฟเชฐ เชตเชฟเชคเชฐเชฃ เชฎเชพเชเซ เชเชฃเชพ เชฌเชงเชพ เชฎเซเชกเซเชฏเซเชฒเซ เชเซ. เชกเชฟเชฒเชฟเชตเชฐเซเชฎเชพเช เชเซเชฏเชพเชจเซ เชธเชฎเชพเชตเซเชถ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชเซ เชคเซ เชตเชฟเชถเซเชท เชเซเชฎ เชฆเซเชตเชพเชฐเชพ เช เชฅเชตเชพ เชธเชคเซเชคเชพเชตเชพเชฐ เชกเซเชเชฐเชซเชพเชเชฒเชฎเชพเช เชเซเช เชถเชเชพเชฏ เชเซ.
$ docker เชฐเชจ --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 เช เชจเซ 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 เชฎเชพเช เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฟเชค เชฅเชพเชฏ เชเซ. เชเซ เชคเชฎเชพเชฐเซ เชเชเชเช เชฌเชฆเชฒเชตเชพเชจเซ เชเชฐเซเชฐ เชนเซเชฏ, เชคเซ เชคเชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชซเชฐเซเชฅเซ เชฌเชจเชพเชตเชตเซ เชชเชกเชถเซ. เชฎเชพเชฐเซ เชคเซ เชจเชฅเซ เชเซเชเชคเซเช. เชนเซเช เชเชเซเชเซเช เชเซเช เชเซ เชเชชเซเชฒเซเชเซเชถเชจ เชธเซเชเช เชธเซเชเซเช เชชเชฐ เชเชเชตเชพเชฐ เชฌเชจเซ เช เชจเซ เชธเซเชกเซ เชธเซเชเซเช เชชเชฐ เชเชจเซเชตเชพเชฏเชฐเซเชจเชฎเซเชจเซเช เชตเซเชฐเซเชเชฌเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชฐเซเชฐเซ เชนเซเชฏ เชคเซเชเชฒเซเช เชฐเซเชชเชฐเซเชเชพเชเชเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ.
เช เชฒเชฌเชคเซเชค, เชธเซเชเซเชเชฟเช เชซเชพเชเชฒเซ เชชเซเชคเซ เชเซเชเชชเชฃ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเชฒเซเชจเซ เชธเชฎเชเซ เชถเชเชคเซ เชจเชฅเซ. เชคเซเชฅเซ, เชคเชฎเชพเชฐเซ เชฏเซเชเซเชคเชฟเชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชชเชกเชถเซ. เช เชเชคเชฟเชฎ เชเชฎเซเชเชฎเชพเช, เชนเซเช 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