Search form

Recompile Nginx Installed With Apt

---------------
Update, August 2016: This article refers to Nginx 1.5.x. As of version 1.9.11, Nginx supports loading modules dynamically at runtime, so I'd suggest that route instead. If you still want to recompile Nginx, an updated tutorial for recompiling Nginx 1.9+ installed with Apt on Ubuntu 16.04 is available here. Meanwhile, an updated tutorial for compiling Nginx 1.9+ from source on Ubuntu 16.04, without Apt, can be found here.
---------------

One minor inconvenience with Nginx, as compared to Apache, is that Nginx has no hook for dynamically adding new modules. Instead you have to recompile Nginx to add them, and the problem there is that recompiling packages by hand can begin to cause problems with your Linux package manager.

To add a new module, you could apt-get purge your existing Nginx installation, then download the source from Nginx.org and recompile Nginx, but you don't want to blow away your existing configuration files and directories. Ideally you'd just need to add a couple of compiler switches to the binary created by the Ubuntu packaging system while leaving everything else intact.

Grab the Source

One way to do this is to recompile Nginx into a .deb package with the modules you want and install that instead. So download the Nginx source from the ppa repository:

$ cd /opt
$ apt-get build-dep nginx
$ apt-get source nginx

Download one or more modules you want to compile in (we'll use the push-stream module).

$ cd /opt/nginx-1.5.10/debian/modules
$ git clone https://github.com/wandenberg/nginx-push-stream-module.git

Edit /opt/nginx-1.5.10/debian/rules, find the list of compiler arguments and additional modules, and under 'full', add your new modules:

            [...] 
            --with-http_sub_module \
            --with-http_xslt_module \
            --with-ipv6 \
            --with-mail \
            --with-mail_ssl_module \
            --add-module=$(MODULESDIR)/nginx-auth-pam \
            --add-module=$(MODULESDIR)/nginx-dav-ext-module \
            --add-module=$(MODULESDIR)/nginx-echo \
            --add-module=$(MODULESDIR)/nginx-upstream-fair \
            --add-module=$(MODULESDIR)/ngx_http_substitutions_filter_module \
            # add your new modules
            --add-module=$(MODULESDIR)/nginx-push-stream-module \

Recompile Nginx

$ cd /opt/nginx-1.5.10
$ dpkg-buildpackage -uc -b

After everything has compiled, you'll see the new *.deb packages in the parent directory:

$ ls -al /opt

-rw-r--r--  1 root root   69282 Mar  2 06:24 nginx_1.5.10-1~precise0_all.deb
-rw-r--r--  1 root root    4956 Mar  2 06:26 nginx_1.5.10-1~precise0_amd64.changes
-rw-r--r--  1 root root   83054 Mar  2 06:24 nginx-common_1.5.10-1~precise0_all.deb
-rw-r--r--  1 root root   81786 Mar  2 06:24 nginx-doc_1.5.10-1~precise0_all.deb
-rw-r--r--  1 root root  685964 Mar  2 06:26 nginx-extras_1.5.10-1~precise0_amd64.deb
-rw-r--r--  1 root root 4833698 Mar  2 06:26 nginx-extras-dbg_1.5.10-1~precise0_amd64.deb
-rw-r--r--  1 root root  521218 Mar  2 06:26 nginx-full_1.5.10-1~precise0_amd64.deb
-rw-r--r--  1 root root 3237026 Mar  2 06:26 nginx-full-dbg_1.5.10-1~precise0_amd64.deb
-rw-r--r--  1 root root  348926 Mar  2 06:26 nginx-light_1.5.10-1~precise0_amd64.deb
-rw-r--r--  1 root root 2086840 Mar  2 06:26 nginx-light-dbg_1.5.10-1~precise0_amd64.deb
-rw-r--r--  1 root root  391920 Mar  2 06:26 nginx-naxsi_1.5.10-1~precise0_amd64.deb
-rw-r--r--  1 root root 2241926 Mar  2 06:26 nginx-naxsi-dbg_1.5.10-1~precise0_amd64.deb
-rw-r--r--  1 root root  357934 Mar  2 06:24 nginx-naxsi-ui_1.5.10-1~precise0_all.deb

Remove Nginx:

$ apt-get remove nginx

Make sure you don't do apt-get purge, or you may lose all your config files.

Since you updated nginx-full, install it:

$ dpkg --install /opt/nginx-full_1.5.10-1~precise0_amd64.deb

Run nginx -V to ensure the Nginx binary shows your new module:

[...] --add-module=/opt/nginx-1.5.10/debian/modules/nginx-push-stream-module

Finally, you want to block further updates from apt-get, or else it'll just overwrite your custom Nginx packages.

$ apt-mark hold nginx-full

If you want to update Nginx again with apt-get, just run apt-mark unhold nginx-full.

Categories: