LoginSignup
6
4

More than 5 years have passed since last update.

docker hub 公式のnginx Dockerfileを元にしてAlpine Linux環境でlua-nginx-moduleをビルドしたメモ

Posted at

nginxでrequest_bodyの内容によって挙動を変えるような処理をしたかった時に、lua-nginx-moduleを導入した際のメモ。

この記事は以下環境を利用しました。
docker hub 公式のnginx
( https://hub.docker.com/_/nginx/ )
1.15.8-alpine tagのDockerfile
( https://github.com/nginxinc/docker-nginx/blob/2364fdc54af554d28ef95b7be381677d10987986/mainline/alpine/Dockerfile )

lua-nginx-modul導入の大枠の流れとしては以下の手順を参考にして進めています。
https://github.com/openresty/lua-nginx-module#installation
http://luajit.org/install.html
https://github.com/simplresty/ngx_devel_kit#usage-for-users

主な変更、差分

インストールバージョンと環境変数の指定
DIFF1
  ENV NGINX_VERSION 1.15.8

+ ENV LUAJIT2_VERSION 2.1-20190131
+ ENV NGX_DEVEL_KIT_VERSION 0.3.1rc1
+ ENV LUA_NGINX_MODULE_VERSION 0.10.14rc5
+
+ ENV LUAJIT_LIB /usr/local/lib
+ ENV LUAJIT_INC /usr/local/include/luajit-2.1
+
  RUN GPG_KEYS=B0F4253373F8F6F510D42178520A9993A1C052F8 \
各モジュール追加のためのコンフィグオプション部分
DIFF2
                --with-http_v2_module \
+               --with-ld-opt='-Wl,-rpath,/usr/local/lib' \
+               --add-module=/usr/src/ngx_devel_kit-$NGX_DEVEL_KIT_VERSION \
+               --add-module=/usr/src/lua-nginx-module-$LUA_NGINX_MODULE_VERSION \
        " \
モジュールのソースコードダウンロード
DIFF3
        && curl -fSL https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz.asc  -o nginx.tar.gz.asc \
+       && curl -fSL https://github.com/openresty/luajit2/archive/v$LUAJIT2_VERSION.tar.gz -o luajit2.tar.gz \
+       && curl -fSL https://github.com/simplresty/ngx_devel_kit/archive/v$NGX_DEVEL_KIT_VERSION.tar.gz -o ngx_devel_kit.tar.gz \
+       && curl -fSL https://github.com/openresty/lua-nginx-module/archive/v$LUA_NGINX_MODULE_VERSION.tar.gz -o lua-nginx-module.tar.gz \
        && export GNUPGHOME="$(mktemp -d)" \
ソースコードの展開とluajit2のインストール、利用後ファイルの削除
DIFF4
        && tar -zxC /usr/src -f nginx.tar.gz \
!       && tar -zxC /usr/src -f luajit2.tar.gz \
!       && tar -zxC /usr/src -f ngx_devel_kit.tar.gz \
!       && tar -zxC /usr/src -f lua-nginx-module.tar.gz \
!       && rm nginx.tar.gz luajit2.tar.gz ngx_devel_kit.tar.gz lua-nginx-module.tar.gz \
!       && cd /usr/src/luajit2-$LUAJIT2_VERSION \
!       && make \
!       && make install \
        && cd /usr/src/nginx-$NGINX_VERSION \
利用後ディレクトリの削除
DIFF5
        && strip /usr/lib/nginx/modules/*.so \
!       && rm -rf /usr/src/nginx-$NGINX_VERSION /usr/src/luajit2-$LUAJIT2_VERSION /usr/src/ngx_devel_kit-$NGX_DEVEL_KIT_VERSION /usr/src/lua-nginx-module-$LUA_NGINX_MODULE_VERSION  \
        \
挙動に必要なライブラリの追加
DIFF6
        && ln -sf /dev/stderr /var/log/nginx/error.log

+ RUN apk add --no-cache libgcc
+
  COPY nginx.conf /etc/nginx/nginx.conf

つまずいた部分

つまずいた部分として、上記のようにlibgccを入れておかないと起動時に以下エラーで落ちてしまった点。

Error loading shared library libgcc_s.so.1: No such file or directory (needed by /usr/local/lib/libluajit-5.1.so.2)
Error relocating /usr/local/lib/libluajit-5.1.so.2: _Unwind_DeleteException: symbol not found
Error relocating /usr/local/lib/libluajit-5.1.so.2: _Unwind_SetGR: symbol not found
Error relocating /usr/local/lib/libluajit-5.1.so.2: _Unwind_SetIP: symbol not found
Error relocating /usr/local/lib/libluajit-5.1.so.2: _Unwind_GetCFA: symbol not found
Error relocating /usr/local/lib/libluajit-5.1.so.2: _Unwind_RaiseException: symbol not found

元々のDockerfileの流れだとコンパイル時に使っていたパッケージを削除してしまうので、lua-nginx-module導入に関連して必要ライブラリが参照できなくてエラーになっていました。

OpenRestyの方でも似たような議論が昔あったのを参考に、libgccを追加するようにしてみました。
https://github.com/openresty/docker-openresty/issues/5

Dockerfile全体

Dockerfile
FROM alpine:3.9

ENV NGINX_VERSION 1.15.8

ENV LUAJIT2_VERSION 2.1-20190131
ENV NGX_DEVEL_KIT_VERSION 0.3.1rc1
ENV LUA_NGINX_MODULE_VERSION 0.10.14rc5

ENV LUAJIT_LIB /usr/local/lib
ENV LUAJIT_INC /usr/local/include/luajit-2.1

RUN GPG_KEYS=B0F4253373F8F6F510D42178520A9993A1C052F8 \
    && CONFIG="\
        --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 \
        --with-http_ssl_module \
        --with-http_realip_module \
        --with-http_addition_module \
        --with-http_sub_module \
        --with-http_dav_module \
        --with-http_flv_module \
        --with-http_mp4_module \
        --with-http_gunzip_module \
        --with-http_gzip_static_module \
        --with-http_random_index_module \
        --with-http_secure_link_module \
        --with-http_stub_status_module \
        --with-http_auth_request_module \
        --with-http_xslt_module=dynamic \
        --with-http_image_filter_module=dynamic \
        --with-http_geoip_module=dynamic \
        --with-threads \
        --with-stream \
        --with-stream_ssl_module \
        --with-stream_ssl_preread_module \
        --with-stream_realip_module \
        --with-stream_geoip_module=dynamic \
        --with-http_slice_module \
        --with-mail \
        --with-mail_ssl_module \
        --with-compat \
        --with-file-aio \
        --with-http_v2_module \
        --with-ld-opt='-Wl,-rpath,/usr/local/lib' \
        --add-module=/usr/src/ngx_devel_kit-$NGX_DEVEL_KIT_VERSION \
        --add-module=/usr/src/lua-nginx-module-$LUA_NGINX_MODULE_VERSION \
    " \
    && addgroup -S nginx \
    && adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx \
    && apk add --no-cache --virtual .build-deps \
        gcc \
        libc-dev \
        make \
        openssl-dev \
        pcre-dev \
        zlib-dev \
        linux-headers \
        curl \
        gnupg1 \
        libxslt-dev \
        gd-dev \
        geoip-dev \
    && curl -fSL https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz -o nginx.tar.gz \
    && curl -fSL https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz.asc  -o nginx.tar.gz.asc \
    && curl -fSL https://github.com/openresty/luajit2/archive/v$LUAJIT2_VERSION.tar.gz -o luajit2.tar.gz \
    && curl -fSL https://github.com/simplresty/ngx_devel_kit/archive/v$NGX_DEVEL_KIT_VERSION.tar.gz -o ngx_devel_kit.tar.gz \
    && curl -fSL https://github.com/openresty/lua-nginx-module/archive/v$LUA_NGINX_MODULE_VERSION.tar.gz -o lua-nginx-module.tar.gz \
    && export GNUPGHOME="$(mktemp -d)" \
    && found=''; \
    for server in \
        ha.pool.sks-keyservers.net \
        hkp://keyserver.ubuntu.com:80 \
        hkp://p80.pool.sks-keyservers.net:80 \
        pgp.mit.edu \
    ; do \
        echo "Fetching GPG key $GPG_KEYS from $server"; \
        gpg --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$GPG_KEYS" && found=yes && break; \
    done; \
    test -z "$found" && echo >&2 "error: failed to fetch GPG key $GPG_KEYS" && exit 1; \
    gpg --batch --verify nginx.tar.gz.asc nginx.tar.gz \
    && rm -rf "$GNUPGHOME" nginx.tar.gz.asc \
    && mkdir -p /usr/src \
    && tar -zxC /usr/src -f nginx.tar.gz \
    && tar -zxC /usr/src -f luajit2.tar.gz \
    && tar -zxC /usr/src -f ngx_devel_kit.tar.gz \
    && tar -zxC /usr/src -f lua-nginx-module.tar.gz \
    && rm nginx.tar.gz luajit2.tar.gz ngx_devel_kit.tar.gz lua-nginx-module.tar.gz \
    && cd /usr/src/luajit2-$LUAJIT2_VERSION \
    && make \
    && make install \
    && cd /usr/src/nginx-$NGINX_VERSION \
    && ./configure $CONFIG --with-debug \
    && make -j$(getconf _NPROCESSORS_ONLN) \
    && mv objs/nginx objs/nginx-debug \
    && mv objs/ngx_http_xslt_filter_module.so objs/ngx_http_xslt_filter_module-debug.so \
    && mv objs/ngx_http_image_filter_module.so objs/ngx_http_image_filter_module-debug.so \
    && mv objs/ngx_http_geoip_module.so objs/ngx_http_geoip_module-debug.so \
    && mv objs/ngx_stream_geoip_module.so objs/ngx_stream_geoip_module-debug.so \
    && ./configure $CONFIG \
    && make -j$(getconf _NPROCESSORS_ONLN) \
    && make install \
    && rm -rf /etc/nginx/html/ \
    && mkdir /etc/nginx/conf.d/ \
    && mkdir -p /usr/share/nginx/html/ \
    && install -m644 html/index.html /usr/share/nginx/html/ \
    && install -m644 html/50x.html /usr/share/nginx/html/ \
    && install -m755 objs/nginx-debug /usr/sbin/nginx-debug \
    && install -m755 objs/ngx_http_xslt_filter_module-debug.so /usr/lib/nginx/modules/ngx_http_xslt_filter_module-debug.so \
    && install -m755 objs/ngx_http_image_filter_module-debug.so /usr/lib/nginx/modules/ngx_http_image_filter_module-debug.so \
    && install -m755 objs/ngx_http_geoip_module-debug.so /usr/lib/nginx/modules/ngx_http_geoip_module-debug.so \
    && install -m755 objs/ngx_stream_geoip_module-debug.so /usr/lib/nginx/modules/ngx_stream_geoip_module-debug.so \
    && ln -s ../../usr/lib/nginx/modules /etc/nginx/modules \
    && strip /usr/sbin/nginx* \
    && strip /usr/lib/nginx/modules/*.so \
    && rm -rf /usr/src/nginx-$NGINX_VERSION /usr/src/luajit2-$LUAJIT2_VERSION /usr/src/ngx_devel_kit-$NGX_DEVEL_KIT_VERSION /usr/src/lua-nginx-module-$LUA_NGINX_MODULE_VERSION  \
    \
    # 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 --format '%n#p' /usr/sbin/nginx /usr/lib/nginx/modules/*.so /tmp/envsubst \
            | tr ',' '\n' \
            | sort -u \
            | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
    )" \
    && apk add --no-cache --virtual .nginx-rundeps $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

RUN apk add --no-cache libgcc

COPY nginx.conf /etc/nginx/nginx.conf
COPY nginx.vh.default.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

STOPSIGNAL SIGTERM

CMD ["nginx", "-g", "daemon off;"]
6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4