Before going further, it is necessary to briefly explain how Kong is built, especially how it integrates with Nginx and what Lua has to do with it.
lua-nginx-module enables Lua scripting capabilities in Nginx. Instead of compiling Nginx with this module, Kong is distributed along with OpenResty, which already includes lua-nginx-module. OpenResty is not a fork of Nginx, but a bundle of modules extending its capabilities.
Hence, Kong is a Lua application designed to load and execute Lua modules (which we more commonly refer to as plugins) and provides an entire development environment for them, including an SDK, database abstractions, migrations, and more.
Plugins consist of Lua modules interacting with the request/response objects or streams via the Plugin Development Kit (PDK) to implement arbitrary logic. The PDK is a set of Lua functions that a plugin can use to facilitate interactions between plugins and the core (or other components) of Kong.
This guide will explore in detail the structure of plugins, what they can extend, and how to distribute and install them. For a complete reference of the PDK, see the Plugin Development Kit reference.