Bali, Indonesia
Insights

Supercharging cPanel with OpenResty: Compiling Custom Nginx Modules Without Breaking EasyApache 4 Updates

October 12, 2026
Running a high-traffic web hosting environment on cPanel often exposes the rigid boundaries of EasyApache 4 (EA4). While EA4 provides a reliable Nginx reverse proxy out of the box, it notoriously lacks advanced capabilities like the Lua JIT engine, native Redis connectors, and complex stream manipulation modules provided by OpenResty. For enterprise workloads requiring dynamic request routing, Web Application Firewall (WAF) filtering at the edge, or real-time rate limiting, relying solely on standard EA4 packages is a major bottleneck.
EasyApache 4 manages Nginx as an RPM-based service (ea-nginx), designed for predictable updates, compatibility, and seamless integration with Apache backend handlers. Because cPanel maintains strict control over the RPM repository, core packages are stripped of non-standard third-party dynamic modules like 'ngx_http_lua_module' to maintain stability, security baselines, and straightforward dependency trees. When administrators attempt to install standard Lua-based applications or custom OpenResty stacks directly over the system Nginx, they inevitably hit a brick wall. Package managers override binaries during routine EA4 updates, wiping out custom compilations and abruptly taking down production routing layers.
To safely introduce OpenResty capabilities into a cPanel environment without breaking EA4 lifecycle management, we avoid modifying the core ea-nginx RPM. Instead, we compile a standalone OpenResty instance optimized for edge routing, leaving EA4 untouched to handle local virtual host configurations and PHP-FPM socket generation.
Before compiling OpenResty, ensure your AlmaLinux or CloudLinux environment has the necessary development tools and dependency libraries installed.
yum groupinstall 'Development Tools' -y
yum install pcre-devel openssl-devel zlib-devel readline-devel perl-devel make -y
We download the latest stable OpenResty release and compile it with custom dynamic modules. By installing it into an isolated prefix directory like '/opt/openresty', we completely eliminate conflict vectors with cPanel's RPM database.
cd /usr/local/src
wget https://openresty.org/download/openresty-1.21.4.2.tar.gz
tar -zxvf openresty-1.21.4.2.tar.gz
cd openresty-1.21.4.2

./configure \
  --prefix='/opt/openresty' \
  --with-http_ssl_module \
  --with-http_v2_module \
  --with-http_realip_module \
  --with-http_stub_status_module \
  --with-threads \
  --with-luajit

make -j$(nproc)
make install
Once compiled, OpenResty runs independently on ports 80 and 443, while EA4's Nginx/Apache backend is shifted to internal loopback ports (e.g., 8080 and 8443). This setup transforms OpenResty into a high-performance WAF and caching layer.
worker_processes auto;
events {
    worker_connections 10240;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    lua_shared_dict ratelimit_cache 10m;

    server {
        listen 80;
        server_name example.com;

        location / {
            access_by_lua_block {
                local limit = ngx.shared.ratelimit_cache
                local ip = ngx.var.remote_addr
                local current, err = limit:get(ip)
                if current then
                    if current > 100 then
                        ngx.exit(503)
                    end
                    limit:incr(ip, 1)
                else
                    limit:set(ip, 1, 60)
                end
            }

            proxy_pass http://127.0.0.1:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}
To ensure your custom OpenResty installation survives system reboots and cPanel updates, manage it via 'systemd' rather than init scripts, and exclude the binary paths from automated package cleanups. Create a dedicated systemd service file at '/etc/systemd/system/openresty.service':
[Unit]
Description=OpenResty High-Performance Web Platform
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/opt/openresty/nginx/logs/nginx.pid
ExecStart=/opt/openresty/bin/openresty -g 'daemon on;'
ExecReload=/opt/openresty/bin/openresty -s reload
ExecStop=/opt/openresty/bin/openresty -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target
Enable and start the service:
systemctl daemon-reload
systemctl enable openresty
systemctl start openresty
By decoupling OpenResty from EasyApache 4's native packaging system, you gain enterprise-grade Lua scripting, advanced rate-limiting, and deep traffic inspection capabilities without risking broken configurations during routine cPanel updates. This hybrid architecture delivers the best of both worlds: the automated account management of cPanel alongside raw edge-routing performance.