NGINX + LUA Compile

From UVOO Tech Wiki
Jump to navigation Jump to search

Shameless rip from here. Will clean this up later. - https://tarunlalwani.com/post/building-nginx-with-lua/

Building Nginx from source with LuaJIT Nginx is a great webserver. But it has no scripting capabilities. To add scripting capabilities in Nginx, one needs to build it from source with the necessary add-ons.

In this article I will showcase how we can build Nginx with Lua inside Docker. There are two ways to do it

  1. OpenResty OpenRestry® is a full-fledged web platform that integrates the standard Nginx core, LuaJIT, many carefully written Lua libraries, lots of high quality 3rd-party Nginx modules

The easiest way to use OpenRestry is to use its docker image

$ docker pull openresty/openresty:alpine-fat This image comes with most of the stuff loaded. We are not going to go in depth of this, as we are more interested in building Nginx from source ourself

  1. Building Nginx from source Building the package from source has some prerequistes like gcc, make and few more things.

Prerequistes Centos yum install -y wget unzip gcc make openssl-devel pcre-devel zlib-devel Ubuntu

 apt update 
 apt install -y wget unzip make libssl-dev libpcre3-dev gcc make zlib1g-dev

Alpine

 apk add --no-cache \
   ca-certificates \
   libressl \
   pcre \
   zlib \
   build-base \
   linux-headers \
   libressl-dev \
   pcre-dev \
   wget \
   zlib-dev 

Downloading the source We need 4 packages to build Nginx with Lua

LuaJIT Nginx Source Code Nginx Devel Kit Nginx Lua Module $ mkdir /tmp/nginx $ cd /tmp/nginx $ wget http://nginx.org/download/nginx-1.13.0.tar.gz $ wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz $ wget -O nginx_devel_kit.tar.gz https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz $ wget -O nginx_lua_module.tar.gz https://github.com/openresty/lua-nginx-module/archive/v0.10.8.tar.gz Extract all the tar files

$ tar xvf LuaJIT-2.0.4.tar.gz $ tar xvf nginx-1.11.10.tar.gz $ tar xvf nginx_devel_kit.tar.gz $ tar xvf nginx_lua_module.tar.gz Building LuaJIT To build Nginx with LuaJIT, we need to build LuaJIT first. This is as simple as a make command

$ cd /tmp/nginx/LuaJIT-2.0.4 $ make install

Building LuaJIT 2.0.4

make -C src make[1]: Entering directory `/tmp/nginx/LuaJIT-2.0.4/src' ... ... ln -sf luajit-2.0.4 /usr/local/bin/luajit

Successfully installed LuaJIT 2.0.4 to /usr/local

Building Nginx Next we build configure the Nginx build. We also need to set the environment variables to specifcy the location of the LuaJIT library

$ cd /tmp/nginx/nginx-1.11.10 $ LUAJIT_LIB=/usr/local/lib LUAJIT_INC=/usr/local/include/luajit-2.0 \ ./configure \ --user=nobody \ --group=nobody \ --prefix=/etc/nginx \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/run/nginx.lock \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-pcre \ --with-file-aio \ --with-http_realip_module \ --without-http_scgi_module \ --without-http_uwsgi_module \ --without-http_fastcgi_module ${NGINX_DEBUG:+--debug} \ --with-cc-opt=-O2 --with-ld-opt='-Wl,-rpath,/usr/local/lib' \ --add-module=/tmp/nginx/ngx_devel_kit-0.3.0 \ --add-module=/tmp/nginx/lua-nginx-module-0.10.8 $ make install $ nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful Note: We have used Nginx 1.11.10 instead of the latest 1.13.0 because a open issue 1051 with nginx lua module

Now let put the Nginx Lua to a test.

Nginx Lua Testing We will build a simple lua endpoint http://localhost/sum?a=&b=, which sums two numbers passed through the url get parameters

location /sum {

 content_by_lua_block {
   local args = ngx.req.get_uri_args();
   ngx.say(args.a + args.b)
 }

} Insert the above lines of code in the \etc\nginx\nginx.conf inside the server block. Then start nginx in background

$ nginx & $ curl "http://localhost/sum/?a=10&b=20" 30 For building the same in centos, ubuntu or alpine please follow my code in the tarunlalwani/nginx-lua-docker repository