Fixing Nginx Error: [emerg] module is not binary compatible

intermediate Nginx2026-05-12| Ubuntu 20.04/22.04, Debian 11/12, CentOS 7/8, Nginx 1.18.0+

Error Message

nginx: [emerg] module "/etc/nginx/modules/ngx_http_geoip_module.so" is not binary compatible
#nginx#dynamic-module#geoip#compatibility#emerg

The Error Scenario

You might encounter this error immediately after a system update (apt upgrade or yum update) or after manually migrating Nginx configurations between servers. When you try to start or reload Nginx, it fails, and running nginx -t reveals a critical message:

nginx: [emerg] module "/etc/nginx/modules/ngx_http_geoip_module.so" is not binary compatible
nginx: configuration file /etc/nginx/nginx.conf test failed

This error prevents Nginx from starting, effectively taking your website offline. It commonly happens with modules like GeoIP, Image Filter, or PageSpeed when the Nginx core binary and the dynamic module (.so file) are out of sync.

Why Binary Compatibility Matters

Unlike some applications that use stable Plugins/APIs, Nginx dynamic modules are tightly coupled to the Nginx binary. Nginx uses an internal structure called the Application Binary Interface (ABI). Every time Nginx is compiled, its signature is baked into the modules.

If you update your Nginx version from 1.18.0 to 1.20.1, but keep the old ngx_http_geoip_module.so file from the 1.18.0 build, the memory structures won't match. Nginx detects this mismatch during the load_module directive execution and stops the process to prevent memory corruption or unpredictable crashes.

Step 1: Diagnose the Version Mismatch

Before applying a fix, confirm which version of Nginx you are running and compare it with the expected version of the module.

nginx -V

Look for the --with-compat flag in the output. If Nginx was compiled with --with-compat, it has a slightly higher tolerance for version differences, but major updates will still break modules. Take note of the version number (e.g., 1.24.0).

Solution A: Synchronize via Package Manager (Easiest)

If you installed Nginx using a package manager like apt or yum, the mismatch usually occurs because the module package was held back or updated from a different repository. The most reliable fix is to reinstall the specific module package that matches your current Nginx version.

On Ubuntu/Debian:

# Update repository lists
sudo apt update

# Reinstall the Nginx core and the problematic module
sudo apt install --reinstall nginx-core libnginx-mod-http-geoip

On CentOS/RHEL:

sudo yum reinstall nginx-mod-http-geoip

If the error persists, it might be because you are using the official Nginx repository (nginx.org) while the module was installed from the default OS repository (or vice versa). Ensure all Nginx components come from the same source.

Solution B: Compiling the Module Manually (Advanced)

If you are using a custom Nginx build or a module not found in standard repositories, you must compile the module against your current Nginx source code.

1. Download the matching Nginx source

Find your version with nginx -v and download the exact source code.

wget http://nginx.org/download/nginx-$(nginx -v 2>&1 | cut -d '/' -f 2).tar.gz
tar -xzvf nginx-*.tar.gz
cd nginx-*

2. Configure the build environment

You need to use the exact same configuration flags as your current Nginx binary. You can get these from nginx -V.

# Copy the 'configure arguments' from nginx -V and add the module flag
./configure --with-compat --add-dynamic-module=/path/to/module/source

3. Compile only the modules

Instead of running a full make install, you only need the module files.

make modules

4. Replace the old .so file

The new module will be located in the objs/ directory. Copy it to your Nginx modules directory.

sudo cp objs/ngx_http_geoip_module.so /etc/nginx/modules/
# Verify permissions
sudo chmod 644 /etc/nginx/modules/ngx_http_geoip_module.so

Verification

Once you have replaced the module or reinstalled the packages, always test the configuration before restarting the service.

sudo nginx -t

If you see syntax is ok and test is successful, you can safely restart Nginx:

sudo systemctl restart nginx

How to Prevent This in the Future

To avoid manual intervention during every system update, follow these best practices:

  • Use Official Repositories: Stick to either the Nginx.org repository or your OS's stable repository. Mixing them is the #1 cause of binary compatibility errors.
  • Apt Pinning: If you compile Nginx manually, use apt-mark hold nginx to prevent the package manager from updating the binary without you also updating your custom modules.
  • Automation: If you use custom modules, script the "Download -> Configure -> Make Modules" process to run as part of your CI/CD or server provisioning.

Related Error Notes