others-How to load dynamic module in nginx?

1. Purpose

In this post, I would demonstrate how to load dynamic module into nginx, I would compile the module from source code, and then load it to the nginx.



2. The solution

Say if we what to load a module named echo to nginx.

2.1 Download source of the nginx

First, we need the source code of currently running nginx , we would use that code to compile our module’s source code.

Check the version of current nginx:

$ nginx -v
nginx version: nginx/1.20.0

Then we can get the source code of nginx 1.20 from official site of nginx:

wget https://github.com/nginx/nginx/archive/release-1.20.0.tar.gz

After downloaded, unzip it:

tar zxvf release-1.20.0.tar.gz



2.2 Download source of module

Download the tarball:

wget https://github.com/openresty/echo-nginx-module/archive/refs/tags/v0.62.tar.gz

And then extract it to module_sources directory of the nginx source, then we got this directory structure:

The root is nginx source directory:

.
|-- auto
|   |-- cc
|   |-- define
|   |-- endianness
|   |-- feature
|   |-- have
|   |-- have_headers
|   |-- os
|   |-- sources
|   |-- stubs
|   |-- summary
|   |-- threads
|   |-- types
|   `-- unix
|-- CHANGES
|-- CHANGES.ru
|-- conf
|   |-- fastcgi.conf
|   |-- fastcgi_params
|   |-- koi-utf
|   |-- koi-win
|   |-- mime.types
|   |-- nginx.conf
|   |-- scgi_params
|   |-- uwsgi_params
|   `-- win-utf
|-- configure
|-- contrib
|   |-- geo2nginx.pl
|   |-- README
|   |-- unicode2nginx
|   `-- vim
|-- html
|   |-- 50x.html
|   `-- index.html
|-- LICENSE
|-- Makefile
|-- man
|   `-- nginx.8
|-- module_sources
|   |-- echo-nginx-module-0.62
|   `-- v0.62.tar.gz
|-- objs
|   |-- addon
|   |-- autoconf.err
|   |-- Makefile
|   |-- nginx
|   |-- nginx.8
|   |-- ngx_auto_config.h
|   |-- ngx_auto_headers.h
|   |-- ngx_http_echo_module_modules.c
|   |-- ngx_http_echo_module_modules.o
|   |-- ngx_http_echo_module.so
|   |-- ngx_http_image_filter_module_modules.c
|   |-- ngx_http_image_filter_module_modules.o
|   |-- ngx_http_image_filter_module.so
|   |-- ngx_modules.c
|   |-- ngx_modules.o
|   |-- ngx_stream_module_modules.c
|   |-- ngx_stream_module_modules.o
|   |-- ngx_stream_module.so
|   `-- src
|-- README
`-- src
    |-- core
    |-- event
    |-- http
    |-- mail
    |-- misc
    |-- os
    `-- stream

24 directories, 57 files


2.3 Compile the source of module

Install the dependencies:

sudo apt install make gcc zlib1g-dev libpcre3-dev libssl-dev

Get the currently running nginx’s build options:

nginx -V

then compile the module with --add-dynamic-module and original options:

./configure --add-dynamic-module=./module_sources/echo-nginx-module-0.62 --with-http_ssl_module --with-http_image_filter_module=dynamic --modules-path=/etc/nginx/modules --with-http_v2_module --with-stream=dynamic --with-http_addition_module --with-http_mp4_module

Then

make modules

Then we got the module’s .so files in the objs directory:

root@launch-advisor-20191120:~/nginx_source/nginx-release-1.20.0# ll objs/ngx_http_echo_module*
-rwxr-xr-x 1 root root 500464 Jan 17 11:15 objs/ngx_http_echo_module.so*
-rw-r--r-- 1 root root    339 Jan 17 11:15 objs/ngx_http_echo_module_modules.c
-rw-r--r-- 1 root root  35424 Jan 17 11:15 objs/ngx_http_echo_module_modules.o


2.4 Deploy the module in nginx

copy the module to nginx modules path: say if your module path is /etc/nginx/modules:

 ⚡ root@launch-advisor-20191120  ~/nginx_source/nginx-1.20.0  cp objs/ngx_http_echo_module.so /etc/nginx/modules/

 ⚡ root@launch-advisor-20191120  ~/nginx_source/nginx-1.20.0  ll /etc/nginx/modules
total 1.6M
-rwxr-xr-x 1 root root 544K Jan 18 17:03 ngx_http_echo_module.so
-rwxr-xr-x 1 root root 135K Jan 18 16:46 ngx_http_image_filter_module.so
-rwxr-xr-x 1 root root 937K Jan 18 16:46 ngx_stream_module.so

change /etc/nginx/nginx.conf,add this line to main block:

load_module modules/ngx_http_echo_module.so


2.5 Test the module

Now check if the module is correctly installed:

nginx -t
nginx -s reload

We should see this:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

It works!


3. Summary

In this post, I demonstrated how to add dynamic module to nginx by building from module’s source code . That’s it, thanks for your reading.