เบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบซเบเปเบฒเบเบฝเบง (SPA) เปเบกเปเบเบเบธเบเบเบญเบเปเบเบฅเป JavaScript เปเบฅเบฐ HTML เบเบปเบเบเบตเป, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบฎเบนเบเบเบฒเบเปเบฅเบฐเบเบฑเบเบเบฐเบเบฒเบเบญเบเบญเบทเปเบเป. เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเบงเบเปเบเบปเบฒเบเปเปเบเปเบฝเบเปเบเบเปเบเบเปเบเบทเปเบญเบเปเบซเบง, เบเบฒเบเปเบเบตเบเปเบเปเบเบงเบเบกเบฑเบเบญเบญเบเปเบฅเบเปเปเบกเปเบเบเปเบฒเบเบซเบผเบฒเบ. เบกเบตเบเปเบฒเบเบงเบเบซเบฅเบฒเบเบเบญเบเบฅเบฒเบเบฒเบเบทเบเปเบฅเบฐเปเบกเปเบเบฐเบเบฑเปเบเบเปเบฅเบดเบเบฒเบเบเบฃเบตเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเป, เปเบฅเบตเปเบกเบเบปเปเบเบเปเบงเบเบซเบเปเบฒ GitHub เบเปเบฒเบเบเบฒเบ (เปเบฅเบฐเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเปเบเบดเบเปเบกเปเบเบงเปเบฒเบกเบต narod.ru) เปเบฅเบฐเบชเบดเปเบเบชเบธเบเบเปเบงเบ CDN เปเบเบฑเปเบ Amazon S3. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเปเบญเบเบเบฒเบเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบญเบทเปเบ.
เบเปเบญเบเบเปเบญเบเบเบฒเบเบฎเบนเบเบเบฒเบ Docker เบเบฑเบ SPA เปเบเบทเปเบญเปเบซเปเบกเบฑเบเบชเบฒเบกเบฒเบเปเบเบตเบเบเบปเบงเปเบเปเบขเปเบฒเบเบเปเบฒเบเบเบฒเบเบเบฑเบเปเบเบเบฒเบเบเบฐเบฅเบดเบเปเบเบฑเบเบชเปเบงเบเบซเบเบถเปเบเบเบญเบเบเบธเปเบก Kubernetes, เปเบฅเบฐเบขเบนเปเปเบเปเบเบทเปเบญเบเบเบญเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒ back-end เบเบนเปเบเบตเปเบเปเปเบฎเบนเปเบงเปเบฒ SPA เปเบกเปเบเบซเบเบฑเบ.
เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเปเบฒเบเบปเบเบเบงเบฒเบกเบเปเบญเบเบเบฒเบเบฎเบนเบเบเบฒเบเบเปเปเปเบเบเบตเปเบชเปเบฒเบฅเบฑเบเบเบปเบเปเบญเบ:
- เบเบงเบฒเบกเบเปเบฒเบเบเบญเบเบเบฒเบเบเปเบฒเปเบเป (เปเบเปเบเปเปเปเบกเปเบเบเบฒเบเบเบฐเบเบญเบ);
- เบเบฐเบซเบเบฒเบเบเปเบฒเปเบชเบธเบเบเบตเปเบเบฑเบเปเบเปเบเปเบเบญเบเปเบเปเบเปเบฅเบฐ RAM;
- เบเบฒเบเบเบฑเปเบเบเปเบฒเปเบเบเบเปเบฒเบเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกเปเบเบทเปเบญเปเบซเปเบฎเบนเบเบเบฒเบเบชเบฒเบกเบฒเบเบเบทเบเบเปเบฒเปเบเปเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบ;
- เบเบฒเบเปเบเบเบขเบฒเบเปเบเบฅเปเบเบตเปเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบเบซเบผเบฒเบเบเบตเปเบชเบธเบ.
เบกเบทเปเบเบตเปเบเปเบญเบเบเบฐเบเบญเบเปเบเบปเปเบฒเบงเปเบฒ:
- gut nginx;
- เบชเปเบฒเบ brotli เบเบฒเบเปเบซเบผเปเบ;
- เบชเบญเบเปเบเบฅเปเบชเบฐเบเบดเบเปเบเบทเปเบญเปเบเบปเปเบฒเปเบเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบก;
- เปเบฅเบฐเปเบเปเบเบญเบเบงเบดเบเบตเบเบฒเบเบเบฐเบเบญเบเบฎเบนเบเบเบฒเบ Docker เบเบฒเบเบเบฑเบเบซเบกเบปเบเบเบตเป.
เบเบธเบเบเบฐเบชเบปเบเบเบญเบเบเบปเบเบเบงเบฒเบกเบเบตเปเปเบกเปเบเปเบเบทเปเบญเปเบเปเบเบเบฑเบเบเบฐเบชเบปเบเบเบฒเบเบเบญเบเบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบฅเบฐ provoke เบชเบฐเบกเบฒเบเบดเบเบเบธเบกเบเบปเบเบเบตเปเบกเบตเบเบฐเบชเบปเบเบเบฒเบเปเบเบเบฒเบเบงเบดเบเบฒเบเบงเบดเบเบฒเบเบเบฒเบเบเปเปเบชเปเบฒเบ.
เบเบฒเบเบชเปเบฒเบเบฎเบนเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบเบญเบ
เปเบเบทเปเบญเปเบฎเบฑเบเปเบซเปเบฎเบนเบเบเบฒเบ Docker เบชเบธเบเบเปเบฒเบเบกเบตเบเบฐเบซเบเบฒเบเบเปเบญเบ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเบฐเบเบดเบเบฑเบเบเบฒเบกเบเบปเบเบฅเบฐเบเบฝเบเบชเบญเบเบขเปเบฒเบ: เบเบฑเปเบเบเปเปเบฒเบเบญเบเบเบฑเปเบเปเบฅเบฐเบฎเบนเบเบเบฒเบเบเบทเปเบเบเบฒเบเบซเบเปเบญเบ. เบซเบเบถเปเบเปเบเบฎเบนเบเบเบฒเบเบเบทเปเบเบเบฒเบเบเบตเปเบเปเบญเบเบเบตเปเบชเบธเบเปเบกเปเบเบฎเบนเบเบเบฒเบ Alpine Linux, เบเบฑเปเบเบเบฑเปเบเบเปเบญเบเบเบฐเปเบฅเบทเบญเบ. เบเบฒเบเบเบปเบเบญเบฒเบเบเบฐเปเบเปเบเบฝเบเบงเปเบฒ Alpine เบเปเปเปเบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฐเบฅเบดเบ, เปเบฅเบฐเบเบงเบเปเบเบปเบฒเบญเบฒเบเบเบฐเบเบทเบเบเปเบญเบ. เปเบเปเบชเปเบงเบเบเบปเบง, เบเปเบญเบเบเปเปเปเบเบตเบเบกเบตเบเบฑเบเบซเบฒเบเบฑเบเบฅเบฒเบงเปเบฅเบฐเบเปเปเบกเบตเบเบฒเบเปเบเปเบเบฝเบเบเบฑเบเบฅเบฒเบง.
เปเบเบทเปเบญเปเบซเปเบกเบตเบเบฑเปเบเบซเบเปเบญเบ, เบเปเบญเบเบเบฐเบเบฐเบเบญเบเบฎเบนเบเบเบฒเบเปเบ 2 เบเบฑเปเบเบเบญเบ. เบเปเบฒเบญเบดเบเปเบกเปเบเบฎเปเบฒเบ; เบญเบธเบเบฐเบเบญเบเบเปเบงเบเปเบฅเบฐเปเบเบฅเปเบเบปเปเบงเบเบฒเบงเบเบฑเบเบซเบกเบปเบเบเบฐเบเบฑเบเบเบปเบเบขเบนเปเปเบเบกเบฑเบ. เปเบฅเบฐเปเบเบเบฑเปเบเบเบญเบเบชเบธเบเบเปเบฒเบเบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบเบฝเบเบเบฝเบเปเบเปเบชเบฐเบเบฑเบเบชเบธเบเบเปเบฒเบเบเบญเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบ.
เปเบซเปเปเบฅเบตเปเบกเบเบปเปเบเบเปเบงเบเบฎเบนเบเบเบฒเบเปเบชเบตเบก.
เปเบเบทเปเบญเบฅเบงเบเบฅเบงเบกเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบ SPA, เบเบปเบเบเบฐเบเบดเปเบฅเปเบงเบเปเบฒเบเบเปเบญเบเบเบฒเบ node.js. เบเปเบญเบเบเบฐเปเบญเบปเบฒเบฎเบนเบเบเบฒเบเบเบตเปเปเบเบฑเบเบเบฒเบเบเบฒเบ, เปเบเบดเปเบเบกเบฒเบเปเบญเบกเบเบฑเบ npm เปเบฅเบฐเบเบนเปเบเบฑเบเบเบฒเบเบเบธเบเปเบชเบฑเปเบเบเปเบฒเบ. เปเบเบเบฒเบกเบเบญเบเบเปเบญเบเปเบญเบ, เบเปเบญเบเบเบฐเปเบเบตเปเบก node-gyp, เปเบเบดเปเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบชเปเบฒเบเบเบฒเบเปเบเบฑเบเปเบเบฑเบ npm, เปเบฅเบฐเปเบเบทเปเบญเบเบญเบฑเบ Brotli เบเบฒเบ Google, เปเบเบดเปเบเบเบฐเปเบเบฑเบเบเบฐเปเบซเบเบเบเปเปเบเบงเบเปเบฎเบปเบฒเบเปเปเบกเบฒ.
Dockerfile เบเบฑเบเบเปเบฒเปเบซเบฑเบ.
# ะะฐะทะพะฒัะน ะพะฑัะฐะท
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
เปเบฅเปเบงเบขเบนเปเบเบตเปเบเบตเปเบเปเบญเบเบเปเบฒเบฅเบฑเบเบชเบนเปเบเบฑเบเบชเปเบฒเบฅเบฑเบ minimalism, เบเบฑเปเบเบเบฑเปเบเบฎเบนเบเบเบฒเบเปเบเปเบเบทเบเปเบญเบปเบฒเปเบเปเบชเปเบฎเปเบงเบกเบเบฑเบเปเบเบเบเบตเบกเบเบฒเบเปเบซเบเปเบซเบเบถเปเบ.
เบฎเบนเบเบเบฒเบเบชเปเบฒเปเบฅเบฑเบเบฎเบนเบเบชเบฒเบกเบฒเบเบเบปเบเปเบเปเบเบตเปเบเบตเป:
nginx
เบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเปเบเปเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบเปเบงเบฑเบเปเบเบเปเปเบเบซเบเบถเปเบเปเบเบทเปเบญเปเบเบเบขเบฒเบเปเบเบทเปเบญเบซเบฒเบเบตเปเบชเบฐเบเบดเบ. เบเปเบญเบเปเบเบตเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบ nginx, เบชเบฐเบเบฑเปเบเบเปเบญเบเบเบฐเปเบเปเบกเบฑเบเบเบฝเบงเบเบตเป.
Nginx เบกเบตเบฎเบนเบเบเบฒเบ Docker เบขเปเบฒเบเปเบเบฑเบเบเบฒเบเบเบฒเบ, เปเบเปเบกเบฑเบเบกเบตเปเบกเบเบนเบเบซเบผเบฒเบเปเบเบตเบเปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบเบขเบฒเบเปเบเบเบเบปเบเบเบตเปเบเปเบฒเบเบเบฒเบ. เบญเบฑเบเปเบเบเบตเปเบเบทเบเบฅเบงเบกเบขเบนเปเปเบเบเบฒเบเบเบฑเบเบชเบปเปเบเบชเบฒเบกเบฒเบเปเบซเบฑเบเปเบเปเปเบเบเบเบตเบกเบเบฒเบเบเบดเปเบชเบเบซเบผเบทเปเบ Dockerfile เบขเปเบฒเบเปเบเบฑเบเบเบฒเบเบเบฒเบ.
$ 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
เบเปเบญเบเบเบฐเปเบเป Dockerfile เปเบเบฑเบเบเบทเปเบเบเบฒเบ, เปเบเปเบเปเบญเบเบเบฐเบญเบญเบเบเบฒเบเบกเบฑเบเบเบฝเบเปเบเปเบชเบดเปเบเบเบตเปเบเปเบฒเปเบเบฑเบเปเบเบทเปเบญเปเบเบเบขเบฒเบเปเบเบทเปเบญเบซเบฒเบเบตเปเบชเบฐเบเบดเบ. เบชเบฐเบเบฑเบเบเบญเบเบเปเบญเบเบเบฐเบเปเปเบชเบฒเบกเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเปเบฒเบ HTTPS, เบเบฐเบเปเปเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบ, เปเบฅเบฐเบญเบทเปเบเปเบญเบตเบ. เปเบเปเบชเบฐเบเบฑเบเบเบญเบเบเปเบญเบเบเบฐเบชเบฒเบกเบฒเบเปเบเบเบขเบฒเบเปเบเบฅเปเบเบตเปเบเบทเบเบเบตเบเบญเบฑเบเบเปเบงเบ Brotli algorithm, เปเบเบดเปเบเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบเบซเบผเบฒเบเบเปเบงเบฒ 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 เปเบเบเปเบเปเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบก.
เปเบเปเบเบญเบ, เปเบเบฅเปเบเบปเบเบเบตเปเบเบปเบเปเบญเบเบเปเปเปเบเบปเปเบฒเปเบเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกเปเบเป. เปเบเบฒเบฐเบชเบฐเบเบฑเปเบ, เบเปเบฒเบเบเบฐเบเปเบญเบเปเบเป trick เปเบเป. เปเบเบฎเบนเบเบชเบธเบเบเปเบฒเบ, เบเปเบญเบเบเบฐเบเปเปเปเบเบตเบเบเบปเบง nginx, เปเบเปเบกเบตเบชเบฐเบเบดเบ shell เบเบดเปเบชเบเบเบตเปเบเบฐเบญเปเบฒเบเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบก, เบเบฝเบเบเบงเบเบกเบฑเบเปเบชเปเปเบเบฅเปเบเบปเบเบเบตเป, เบเบตเบเบญเบฑเบเบเบงเบเบกเบฑเบ, เปเบฅเบฐเบเบฝเบเปเบเปเปเบญเบเบเบฒเบเบเบงเบเบเบธเบกเปเบเบซเบฒ nginx.
เบชเปเบฒเบฅเบฑเบเบเบธเบเบเบฐเบชเบปเบเบเบตเป, Dockerfile เบชเบฐเบซเบเบญเบเบเบฒเบฅเบฒเบกเบดเปเบเบต ENTRYPOINT. เบเปโเปเบซเปโเบฅเบฒเบงโเบเบฝเบโเบเบปเบโเบเปเปโเปเบโเบเบตเป (เปเบเป Angular เปเบเบฑเบโเบเบปเบงโเบขเปเบฒเบ):
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}
.เบกเบฑเบเปเบเบฑเบเบกเบนเบเบเปเบฒเบเบตเปเบชเบฑเบเปเบเบเบงเปเบฒ SPAs เบเบตเปเบเบฑเบเบชเบฐเปเบซเบกเบชเปเบงเบเปเบซเบเปเปเบเบตเปเบก hashes เบเบฑเบเปเบเบฅเปเบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบเปเบงเบฅเบฒเบเบตเปเบเบฒเบเบเปเปเบชเปเบฒเบ. เบเบตเปเปเบกเปเบเบชเบดเปเบเบเปเบฒเปเบเบฑเบเปเบเบทเปเบญเปเบซเปเบเบปเบงเบเปเบญเบเปเบงเบฑเบเบชเบฒเบกเบฒเบเปเบเบฑเบเปเบเบฅเปเปเบเปเบขเปเบฒเบเบเบญเบเปเบเปเบเปเบงเบฅเบฒเบเบปเบเบเบฒเบ. เบเปเบฒเปเบเบฅเปเบกเบตเบเบฒเบเบเปเบฝเบเปเบเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ hash เบเบญเบเบกเบฑเบเบเบฐเบเปเบฝเบเปเบเบ, เปเบเบดเปเบเบเบฐเปเบฎเบฑเบเปเบซเปเบเบปเบงเบเปเบญเบเปเบงเบฑเบเบเบฒเบงเปเบซเบฅเบเปเบเบฅเปเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบ.
เปเบเปเบซเบเปเบฒเปเบชเบเบเบฒเบ, เปเบเบงเบดเบเบตเบเบฒเบเบเบญเบเบเปเบญเบ, เบเบฒเบเบเปเบฝเบเปเบเบเบเบฒเบเบเบฑเปเบเบเปเบฒเปเบเบเบเปเบฒเบเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกเบเปเปเปเบเปเบเปเบฒเปเบเบชเบนเปเบเบฒเบเบเปเบฝเบเปเบเบเบเบญเบเปเบเบฅเป hash, เบเบถเปเบเบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒ cache เบเบญเบเบเบปเบงเบเปเบญเบเปเบงเบฑเบเบเปเบญเบเบเปเปเบเบทเบเบเปเบญเบเปเบเบเบฒเบเบญเบทเปเบ. เบเปเบญเบเบเปเปเบกเบตเบเบฑเบเบซเบฒเบเบตเปเปเบเบฒเบฐเบงเปเบฒเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบเบเบทเบเบเปเบฒเปเบเปเบเปเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกเบเบตเปเปเบเบเบเปเบฒเบเบเบฑเบ.
เปเบญเบปเบฒเบฎเบนเบเบชเบธเบเบเปเบฒเบเบฎเปเบงเบกเบเบฑเบ
เบชเบธเบเบเปเบฒเบ.
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