In order to save server bandwidth and speed up pages, we want to enable the Brotli plugin for Nginx. I found out that Brotli, a very popular lossless compression plugin, is still not included in the official Nginx docker image, so we have to do it ourselves.
1. Results
I pushed the built image to Github’s Docker registry, which can be used directly if you are too lazy to toss it.
You can pull it with the following statement.
1
|
docker pull ghcr.io/zvonimirsun/nginx:stable-alpine-brotli
|
I used the latest stable version of Nginx, because I don’t keep up with Nginx versions and updates may not be up to date.
2. Solution
The general idea is to compile google/ngx_brotli
with the corresponding version of Nginx, and then stuff the compiled plugin so file into the official image so that we can load the module dynamically.
A little note on Dockerfile:
build-base
: add compile-related tools
git
: for cloning the google/ngx_brotli
library
pcre-dev
: required for http rewrite module
openssl-dev
: required for the ssl module
zlib-dev
: required for the gzip module
linux-headers
: required for with-file-ato
- The configure parameters are exactly the same as the official image parameters, except for add-dynamic-module which is used to add brotli
Dockerfile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
ARG version=1.20.2
FROM nginx:${version}-alpine AS builder
ARG version
WORKDIR /root/
RUN apk add --update --no-cache build-base git pcre-dev openssl-dev zlib-dev linux-headers \
&& wget http://nginx.org/download/nginx-${version}.tar.gz \
&& tar zxf nginx-${version}.tar.gz \
&& git clone https://github.com/google/ngx_brotli.git \
&& cd ngx_brotli \
&& git submodule update --init --recursive \
&& cd ../nginx-${version} \
&& ./configure \
--add-dynamic-module=../ngx_brotli \
--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 -g' \
--with-ld-opt=-Wl,--as-needed,-O1,--sort-common \
&& make modules
FROM nginx:${version}-alpine
ARG version
ENV TIME_ZONE=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone
COPY --from=builder /root/nginx-${version}/objs/ngx_http_brotli_filter_module.so /usr/lib/nginx/modules/
COPY --from=builder /root/nginx-${version}/objs/ngx_http_brotli_static_module.so /usr/lib/nginx/modules/
|
3. Enable Brotli
Make sure you use my image or the image built from the Dockerfile above. At this point, the Brotli module file has been added to the image and can be introduced dynamically.
Add the following to the beginning of nginx.conf
1
2
|
load_module /usr/lib/nginx/modules/ngx_http_brotli_filter_module.so;
load_module /usr/lib/nginx/modules/ngx_http_brotli_static_module.so;
|
Add to the http
section to enable that gzip and Brotli can coexist.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
# brotli
brotli on;
brotli_comp_level 6;
brotli_buffers 16 8k;
brotli_min_length 20;
brotli_types
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/vnd.ms-fontobject
application/wasm
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/bmp
image/svg+xml
text/cache-manifest
text/calendar
text/css
text/javascript
text/markdown
text/plain
text/xml
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;
|
After checking the configuration with nginx -t
, apply the configuration with nginx -s reload
.
Reference https://www.iszy.cc/posts/e/