🛠️

NGINXでnjs(JavaScript)を利用して、ログやfastcgi_paramに利用する方法

2024/02/15に公開

いままで、会社のブログで紹介したCloudFront導入とCognitoで認証した話 でNGINXでHTTPヘッダを操作する際に、Lua moduleを利用していました

NGINXのオフィシャルのDockerイメージそのままではLua moduleは利用できないため、オフィシャルのドキュメントをもとにビルドしました

ビルドに時間がかかるので他に良い方法がないかなと思っていたらnjsというJavaScriptのサブセット(ECMAScript 5.1 (strict mode)に準拠、ECMAScript 6以降の拡張も一部含まれている)があることに気づきました

njsはLua moduleとは違いオフィシャルのDockerイメージにすでに含まれているため、ビルドする必要もありませんでした(1.10.0の時代からすでに含まれていました)

普段LuaよりもJavaScriptを書く機会の方が多いのでメンテナンスもしやすいです

CloudFront-Viewer-Address, CloudFront-Forwarded-Proto ヘッダをログに出力する例

nginx.conf
load_module modules/ngx_http_js_module.so;
# 中略
http {
  js_path "/etc/nginx/njs/";
  js_import main from header.js;
  js_set $real_ip main.realIp;
  js_set $request_scheme main.requestScheme;
  # 中略
  log_format ltsv "remote_addr:$real_ip\t"
                  "scheme:$request_scheme\t";
}
example.js
function realIp(r) {
  const cloudFrontViewerAddress = r.headersIn['CloudFront-Viewer-Address'];
  if (cloudFrontViewerAddress) {
    return cloudFrontViewerAddress.split(':')[0];
  }
  return r.remoteAddress;
}


function requestScheme(r) {
  const cloudForwardedProto = r.headersIn['CloudFront-Forwarded-Proto'];
  if (cloudForwardedProto) {
    return cloudForwardedProto;
  }
  return r.headersIn['X-Forwarded-Proto'];
}

export default {realIp, requestScheme}

Discussion