Open2
nginxでbrotliを使いたい

残念ながらnginxはbrotliに対応していない。
しかしnginxは3rd party moduleを使うと機能を拡張できるので、Googleが公開している以下のmoduleを使うとよい。
READMEに書かれている通りにやれば動く。
nginx-buildでも動かすことができる。ただしnginx-build側に問題があって直したので、v0.15.0以上を利用してください。
nginx-buildは3rd party moduleの設定はjsonで渡すので、以下のjsonを用意する。
[
{
"name": "ngx_brotli",
"form": "git",
"url": "https://github.com/google/ngx_brotli.git",
"shprov": "cd deps/brotli && mkdir -p out && cd out && cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_C_FLAGS=\"-Ofast -m64 -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections\" -DCMAKE_CXX_FLAGS=\"-Ofast -m64 -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections\" -DCMAKE_INSTALL_PREFIX=./installed .. && cmake --build . --config Release --target brotlienc",
"shprovdir": "."
}
]
これで例えば以下のような設定を渡す。
./nginx-build -c ./config/configure.example -m ./config/modules.json.brotli -d work -pcre -zlib -openssl
configureの設定を渡す必要があるので、いい感じのconfigureを渡す。もし分からなければOSのpackage経由でnginxを入れて、nginx -V
するとconfigureのオプションが見れるので、コピペするとよい。

ISUCON本にも書いたし、以下の記事でも紹介したが
・圧縮レベルによるがgzipよりも圧縮に時間がかかるため、gzipのようにリクエストされたタイミングで動的に圧縮するという使い方は難しいと考えられる
・事前に圧縮しておける静的ファイルの配信では利用できる
という感じなので、Brotli有効にしたのでgzipの代わりにガンガン使ってやろう、と考えるのはおすすめしない。gzip_static相当のbrotli_staticが使えるので、圧縮済みのファイルを配置するとかの方が安全。