How do I add the Lua module for nginx on Alpine linux?
Asked Answered
D

6

25

I'd like to have a lean Docker image for nginx with the Lua module enabled. How can I create this based on Alpine linux?

Divergency answered 18/11, 2017 at 12:41 Comment(0)
D
24

Here is a Dockerfile:

FROM alpine:3.6

RUN apk add --no-cache nginx-mod-http-lua

# Delete default config
RUN rm -r /etc/nginx/conf.d && rm /etc/nginx/nginx.conf

# Create folder for PID file
RUN mkdir -p /run/nginx

# Add our nginx conf
COPY ./nginx.conf /etc/nginx/nginx.conf

CMD ["nginx"]

Installing the nginx-mod-http-lua package will also install nginx and luajit, among others.

The nginx.conf should contain at least this:

load_module /usr/lib/nginx/modules/ndk_http_module.so;
load_module /usr/lib/nginx/modules/ngx_http_lua_module.so;

pcre_jit on;

events {
  worker_connections 1024;
}

daemon off;
Divergency answered 18/11, 2017 at 13:3 Comment(6)
These load_module are not needed if you don’t remove include /etc/nginx/modules/*.conf; from the default nginx.conf.Tricksy
@Marian: How do we install luarocks in this case? I did find include path for luajit.Efflorescent
load_module" directive is not allowed here in /etc/nginx/conf.dHamblin
Why the --no-cache flag?Minutia
@Minutia That's explained well in https://mcmap.net/q/126008/-alpine-dockerfile-advantages-of-no-cache-vs-rm-var-cache-apkDivergency
Lots of failures! Building from source code is Absolutely necessary!Distill
M
7

Dockerfile:

FROM nginx:1.15-alpine
RUN  mkdir -p /run/nginx
RUN  apk add --no-cache nginx-mod-http-lua
COPY nginx_conf/ /etc/nginx/ # Your nginx conf
COPY lua/ /etc/lua/          # Your lua files 

First line of nginx conf:

load_module /usr/lib/nginx/modules/ndk_http_module.so;
load_module /usr/lib/nginx/modules/ngx_http_lua_module.so;
pcre_jit on;
Madrigal answered 5/5, 2019 at 16:27 Comment(6)
nginx: [emerg] module "/usr/lib/nginx/modules/ndk_http_module.so" version 1016001 instead of 1018000 in /etc/nginx/nginx.conf:1Distill
weird... that was not happening last year. Try with FROM nginx:1.15-alpine I checked and is working. If you do the research to make it works with latest version please let me know the results. Anyways I edited the original answer. Thank you for the feedback.Madrigal
The Nginx version does not match the module version, It seems that apk add cannot specify a version number.Distill
Current alpine version is 1.21 - is there another solution apart from going back several nginx versions?Shawana
You can use the tag stable-alpine (nginx version 1.20.2). But I have another error module "/usr/lib/nginx/modules/ndk_http_module.so" is not binary compatible . Do you have any clue to resolve it?Hinshelwood
@Hinshelwood same error for me.Thurston
M
3

We use Openresty, a platform that integrates nginx and Lua.

In the default nginx file, you could call Lua like so:

server {
    listen 80;
    listen 443 ssl; # 'ssl' parameter tells NGINX to decrypt the traffic

    # 1
    location ~ /api/(.*) {
        resolver xxx.x.x.xx;

    rewrite_by_lua_block {
        ngx.req.set_header("x-header", "12345678901234567")

    }
}

The alpine image here: https://github.com/openresty/docker-openresty/tree/master/

There is also an alpine-fat that had make, git and other libraries that can help you build within your Docker image.

Mycorrhiza answered 24/5, 2018 at 23:6 Comment(0)
P
3

See: "Adding third-party modules to nginx official image" At: https://github.com/nginxinc/docker-nginx/tree/master/modules

"It's possible to extend a mainline image with third-party modules either from your own instuctions following a simple filesystem layout/syntax using build_module.sh helper script, or failing back to package sources from pkg-oss."

$ docker build --build-arg ENABLED_MODULES="ndk lua" -t my-nginx-with-lua .
Pita answered 23/9, 2021 at 13:55 Comment(0)
W
0

Building on Luc Chauvin's answer, here's a full walkthrough using the information from the guide on GitHub as well as the changes necessary to get it working with docker compose. This guide assumes that you previously used the provided alpine nginx image with the service set up like:

services:
  nginx:
    image: nginx:alpine
  1. Download the base builder dockerfile: https://github.com/nginxinc/docker-nginx/blob/master/modules/Dockerfile.alpine (there is also a debian based version available).

  2. Update the service in your docker-compose.yaml file to build the modules. Use the folder containing the dockerfile for the context, for this example I've placed it alongside the compose file:

    services:
      nginx:
        build:
          context: ./
          args:
            ENABLED_MODULES: ndk lua
    
  3. Add the following to the top of your nginx.conf to load the modules:

    load_module modules/ndk_http_module.so;
    load_module modules/ngx_http_lua_module.so;
    
  4. Build the container with docker compose build. This will take a while, but at the end you should be able to docker compose up without issue.

Warrior answered 4/5, 2023 at 18:53 Comment(0)
P
-4

You look on the Docker Hub

https://hub.docker.com/

and you find an Nginx image, based on Alpine Linux, with Lua support

Some examples

https://hub.docker.com/r/ilagnev/alpine-nginx-lua/

or

https://hub.docker.com/r/firesh/nginx-lua/

Have a look at the Dockerfile for more details

Pertinent answered 18/11, 2017 at 13:2 Comment(1)
I found both of these, but found that none of the two was up to date (last pushed a year ago). In addition, they are lacking the information on how to enable the module.Divergency

© 2022 - 2024 — McMap. All rights reserved.