<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Majal Mirasol</title>
    <description>The latest articles on DEV Community by Majal Mirasol (@majal).</description>
    <link>https://dev.to/majal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F242435%2Fdbfbe61b-4aa8-4243-9dc4-21d2a42f142d.jpeg</url>
      <title>DEV Community: Majal Mirasol</title>
      <link>https://dev.to/majal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/majal"/>
    <language>en</language>
    <item>
      <title>Adding Brotli to an Already-built NGINX Instance</title>
      <dc:creator>Majal Mirasol</dc:creator>
      <pubDate>Sun, 26 May 2019 08:27:29 +0000</pubDate>
      <link>https://dev.to/majal/adding-brotli-to-an-already-built-nginx-instance-1bje</link>
      <guid>https://dev.to/majal/adding-brotli-to-an-already-built-nginx-instance-1bje</guid>
      <description>&lt;p&gt;Do you have a running instance of NGINX and wanted to add Brotli compression? What if you don’t want to recompile a custom web server from source or replace your auto-updating repo-installed version? You can create dynamic &lt;strong&gt;Brotli modules which upgrade whenever NGINX does.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The bash script below explains the installation steps. Feel free to study and execute the codes step-by-step. That may help you troubleshoot any peculiarities in your system. Otherwise, simply run the script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;# https://www.majlovesreg.one/tag/code/&lt;/span&gt;
&lt;span class="c"&gt;# https://www.majlovesreg.one/adding-brotli-to-a-built-nginx-instance&lt;/span&gt;
&lt;span class="c"&gt;# https://github.com/majal/maj-server/tree/master/nginx-modules-brotli&lt;/span&gt;

&lt;span class="c"&gt;# Install needed development packages if not yet installed in the system&lt;/span&gt;
&lt;span class="c"&gt;# sudo apt -y install git libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev&lt;/span&gt;

&lt;span class="c"&gt;# For predefined NGINX version, use:&lt;/span&gt;
&lt;span class="c"&gt;# ngver=1.17.1&lt;/span&gt;

&lt;span class="c"&gt;# For passing the version via the command line (i.e.: user@server:~$ ./mkbrotli 1.17.1), use:&lt;/span&gt;
&lt;span class="nv"&gt;ngver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;

&lt;span class="c"&gt;# For automated detection of currently installed NGINX version (not to be used for auto-updating, see hooks in post), use:&lt;/span&gt;
&lt;span class="c"&gt;# ngver=$(nginx -v 2&amp;gt;&amp;amp;1 | grep -o '[0-9\.]*')&lt;/span&gt;

&lt;span class="c"&gt;# Get configure parameters of installed NGINX. Not needed if NGINX was configured '--with-compat'.&lt;/span&gt;
&lt;span class="c"&gt;# Uncomment one of the lines below if the script sucessfully builds modules but NGINX throws a "not binary compatible" error.&lt;/span&gt;
&lt;span class="c"&gt;# confparams=$(nginx -V 2&amp;gt;&amp;amp;1 | grep -o -- '--prefix='.*)&lt;/span&gt;
&lt;span class="c"&gt;# confparams=$(nginx -V 2&amp;gt;&amp;amp;1 | grep -o -- '--[^with]'.*)&lt;/span&gt;
&lt;span class="c"&gt;# confparams=$(nginx -V 2&amp;gt;&amp;amp;1 | grep -- '--' | sed "s/.*' //")&lt;/span&gt;

&lt;span class="c"&gt;# To manually set NGINX modules directory:&lt;/span&gt;
&lt;span class="c"&gt;# moddir=/path/to/modules/directory&lt;/span&gt;

&lt;span class="c"&gt;# To automatically select NGINX modules directory:&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; /usr/share/nginx/modules &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share/nginx/modules
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;nginx &lt;span class="nt"&gt;-V&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'prefix=[^ ]*'&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/prefix=//'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/modules &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;nginx &lt;span class="nt"&gt;-V&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'prefix=[^ ]*'&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/prefix=//'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/modules"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;nginx &lt;span class="nt"&gt;-V&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'modules-path=[^ ]*'&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/modules-path=//'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;nginx &lt;span class="nt"&gt;-V&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'modules-path=[^ ]*'&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/modules-path=//'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'!! missing modules directory, exiting...'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Set temporary directory and build on it&lt;/span&gt;
&lt;span class="nv"&gt;builddir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;mktemp&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;builddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo
echo&lt;/span&gt; &lt;span class="s1"&gt;'################################################################################'&lt;/span&gt;
&lt;span class="nb"&gt;echo
echo&lt;/span&gt; &lt;span class="s2"&gt;"Building Brotli for NGINX &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ngver&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Temporary build directory: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;builddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Modules directory: &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;

&lt;span class="c"&gt;# Download and unpack NGINX&lt;/span&gt;
wget https://nginx.org/download/nginx-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ngver&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.tar.gz &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;tar &lt;/span&gt;zxf nginx-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ngver&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.tar.gz &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm &lt;/span&gt;nginx-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ngver&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;.tar.gz&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'!! download failed, exiting...'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Download, initialize, and make Brotli dynamic modules&lt;/span&gt;
git clone https://github.com/google/ngx_brotli.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ngx_brotli &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git submodule update &lt;span class="nt"&gt;--init&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ../nginx-&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ngver&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;confparams&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;nice&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 19 ionice &lt;span class="nt"&gt;-c&lt;/span&gt; 3 ./configure &lt;span class="nt"&gt;--add-dynamic-module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;../ngx_brotli &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;confparams&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;nice&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 19 ionice &lt;span class="nt"&gt;-c&lt;/span&gt; 3 ./configure &lt;span class="nt"&gt;--with-compat&lt;/span&gt; &lt;span class="nt"&gt;--add-dynamic-module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;../ngx_brotli
&lt;span class="nb"&gt;nice&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 19 ionice &lt;span class="nt"&gt;-c&lt;/span&gt; 3 make modules &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'!! configure or make failed, exiting...'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;4&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Replace Brotli in modules directory&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/ngx_http_brotli_filter_module.so"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo mv&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/ngx_http_brotli_filter_module.so"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/ngx_http_brotli_filter_module.so.old"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/ngx_http_brotli_static_module.so"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo mv&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/ngx_http_brotli_static_module.so"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/ngx_http_brotli_static_module.so.old"&lt;/span&gt;
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;objs/&lt;span class="k"&gt;*&lt;/span&gt;.so &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/ngx_http_brotli_filter_module.so"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'!! module permissions failed, exiting...'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/ngx_http_brotli_static_module.so"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'!! module permissions failed, exiting...'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;6&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# Clean up build files&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;builddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.."&lt;/span&gt;
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;builddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/ngx_brotli"&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;builddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo
echo&lt;/span&gt; &lt;span class="s2"&gt;"Sucessfully built and installed latest Brotli for NGINX &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ngver&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Modules can be found in &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;moddir&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Next step: Configure dynamic modules and reload/restart NGINX."&lt;/span&gt;
&lt;span class="nb"&gt;echo
echo&lt;/span&gt; &lt;span class="s1"&gt;'################################################################################'&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt;

&lt;span class="c"&gt;# Start/restart NGINX.&lt;/span&gt;
&lt;span class="c"&gt;# Not recommended if script is hooked since NGINX is automatically restarted by the package manager (e.g. apt) after an upgrade.&lt;/span&gt;
&lt;span class="c"&gt;# Restarting NGINX before the upgrade could cause a module version mismatch.&lt;/span&gt;
&lt;span class="c"&gt;# sudo nginx -t &amp;amp;&amp;amp; { systemctl is-active nginx &amp;amp;&amp;amp; sudo systemctl restart nginx || sudo systemctl start nginx; } || true&lt;/span&gt;
&lt;span class="c"&gt;# echo&lt;/span&gt;
&lt;span class="c"&gt;# systemctl --no-pager status nginx&lt;/span&gt;
&lt;span class="c"&gt;# echo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You may choose to automate the installation by simply running the script above. In its default settings, it will process the version number you will pass to it. To get your &lt;strong&gt;NGINX’s version number&lt;/strong&gt; run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;nginx &lt;span class="nt"&gt;-v&lt;/span&gt;
  nginx version: nginx/1.17.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Since the &lt;strong&gt;version&lt;/strong&gt; number in this example is 1.17.1, after you have downloaded the bash script above, go to the directory where the script is and run these commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x mkbrotli
&lt;span class="nv"&gt;$ &lt;/span&gt;./mkbrotli 1.17.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You may now chill and relax as the script automagically downloads, builds, and installs the dynamic modules for you. If the script runs through errors please let me know in the comments so I may make adjustments to it.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;center&gt;Activating the modules&lt;/center&gt;
&lt;/h3&gt;

&lt;p&gt;Now that we have the modules, there are two configuration steps needed to activate Brotli compression. First, &lt;strong&gt;load the modules&lt;/strong&gt; in NGINX’s main configuration file (mine was at &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt;). You can get your &lt;strong&gt;config file path&lt;/strong&gt; by running this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;nginx &lt;span class="nt"&gt;-V&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'conf-path=[^ ]*'&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/conf-path=//'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now edit NGINX’s conf file. Outside any &lt;em&gt;&lt;code&gt;block { ... }&lt;/code&gt;&lt;/em&gt;, maybe on the top section of the file, add these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# nginx/nginx.conf&lt;/span&gt;

load_module modules/ngx_http_brotli_filter_module.so&lt;span class="p"&gt;;&lt;/span&gt;
load_module modules/ngx_http_brotli_static_module.so&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# http {&lt;/span&gt;
&lt;span class="c"&gt;#   ...&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Second, &lt;strong&gt;activate Brotli&lt;/strong&gt; (and set its &lt;a href="https://github.com/google/ngx_brotli"&gt;configuration directives, aka settings&lt;/a&gt;) either inside the &lt;code&gt;http&lt;/code&gt; block of NGINX’s conf file, or the &lt;code&gt;server&lt;/code&gt; block of your domain configs (e.g. files in &lt;code&gt;nginx/sites-enabled/&lt;/code&gt;). As for me, I placed these directives in the &lt;code&gt;nginx/snippets/&lt;/code&gt; folder and called them via &lt;code&gt;include&lt;/code&gt; in my domain configs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# nginx/nginx.conf&lt;/span&gt;

&lt;span class="c"&gt;# http {&lt;/span&gt;
&lt;span class="c"&gt;#   ...&lt;/span&gt;

  brotli on&lt;span class="p"&gt;;&lt;/span&gt;
  brotli_static on&lt;span class="p"&gt;;&lt;/span&gt;
  brotli_types
    text/plain
    text/css
    text/xml
    text/javascript
    text/x-component
    application/xml
    application/xml+rss
    application/javascript
    application/json
    application/atom+xml
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-font-opentype
    application/x-font-truetype
    application/x-web-app-manifest+json
    application/xhtml+xml
    application/octet-stream
    font/opentype
    font/truetype
    font/eot
    font/otf
    image/svg+xml
    image/x-icon
    image/vnd.microsoft.icon
    image/bmp&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;#   ...&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;center&gt;Auto-update with NGINX&lt;/center&gt;
&lt;/h3&gt;

&lt;p&gt;One potential problem with dynamic modules is when NGINX automatically upgrades via a package manager (e.g. &lt;code&gt;apt&lt;/code&gt;, &lt;code&gt;yum&lt;/code&gt;, or &lt;code&gt;pacman&lt;/code&gt;). If you’re like me, all upgrades in my server are automated by scripts. You see, dynamic modules are version-specific. NGINX is set &lt;strong&gt;not&lt;/strong&gt; to load modules that were built for a different version. So how will Brotli modules &lt;strong&gt;automatically upgrade&lt;/strong&gt; together with NGINX?&lt;/p&gt;

&lt;p&gt;The answer is to hook on the package manager during upgrades. In &lt;code&gt;apt&lt;/code&gt; this may be a two- or three-step process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hook&lt;/strong&gt; to &lt;code&gt;apt&lt;/code&gt; and call a worker script. (Alternatively, the hook could directly call &lt;code&gt;mkbrotli&lt;/code&gt; and thus skip the need for a worker script.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;worker&lt;/strong&gt; script calls one or more build scripts to update the dynamic modules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build scripts&lt;/strong&gt; will build and install the new modules right before NGINX upgrades.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is my &lt;strong&gt;hook file&lt;/strong&gt; in &lt;code&gt;/etc/apt/apt.conf.d/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/apt/apt.conf.d/05nginxmodules&lt;/span&gt;

// Hook to build and &lt;span class="nb"&gt;install &lt;/span&gt;dynamic modules before NGINX upgrades
// Script calls individual build scripts and passes back error codes
// Place this file &lt;span class="k"&gt;in&lt;/span&gt; /etc/apt/apt.conf.d/

DPkg::Pre-Install-Pkgs &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"/usr/local/sbin/nginx-mod-preinstall"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The worker script I use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# /usr/local/sbin/nginx-mod-preinstall&lt;/span&gt;

&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# Call NGINX module build scripts and pass error codes to apt hook&lt;/span&gt;

&lt;span class="c"&gt;# Get NGINX version to upgrade to&lt;/span&gt;
&lt;span class="nb"&gt;read &lt;/span&gt;ngfile &amp;lt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'/nginx_'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;span class="nv"&gt;ngver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$ngfile&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/-.*//'&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/.*_//'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# List of build scripts to run:&lt;/span&gt;
/usr/local/sbin/mkbrotli &lt;span class="nv"&gt;$ngver&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;span class="c"&gt;# /usr/local/sbin/mkmodsec $ngver || exit $?&lt;/span&gt;
&lt;span class="c"&gt;# /usr/local/sbin/mkpagespeed $ngver || exit $?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And finally the &lt;strong&gt;build script&lt;/strong&gt; for this one is… (drum roll please)… of course &lt;code&gt;mkbrotli&lt;/code&gt;. 😉 I hope that Brotli could be natively supported by NGINX in the future. It’s awesome. For now, we have this workaround. Enjoy the compression!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;center&gt;Google PageSpeed&lt;/center&gt;
&lt;/h3&gt;

&lt;p&gt;Another project that aims to speed things up on the web is Google’s best-practices optimization called &lt;a href="https://developers.google.com/speed/pagespeed/module/"&gt;PageSpeed&lt;/a&gt;. I also made a Bash script to automate installation of PageSpeed on a running NGINX server. If you’re interested, check out this post: &lt;a href="https://www.majlovesreg.one/adding-pagespeed-to-a-running-nginx-instance"&gt;Adding PageSpeed to an Already-running NGINX Instance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.majlovesreg.one/adding-brotli-to-a-built-nginx-instance"&gt;Adding Brotli to an Already-built NGINX Instance&lt;/a&gt; appeared first on &lt;a href="https://www.majlovesreg.one"&gt;Maj Loves Reg&lt;/a&gt; and was published by &lt;a href="https://www.majlovesreg.one/author/majal"&gt;Majal Mirasol&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>brotli</category>
      <category>nginx</category>
      <category>bash</category>
      <category>server</category>
    </item>
  </channel>
</rss>
