(un)Installing your plugin

    These steps should be applied to each node in your Kong cluster, to ensure the custom plugin(s) are available on each one of them.

    You can either use a regular packing strategy (e.g. ), or use the LuaRocks package manager to do it for you. We recommend LuaRocks as it is installed along with Kong when using one of the official distribution packages.

    When using LuaRocks, you must create a rockspec file, which specifies the package contents. For an example, see the . For more info about the format, see the LuaRocks documentation on rockspecs.

    Pack your rock using the following command (from the plugin repo):

    1. Install it locally (based on the .rockspec in the current directory):

    2. Pack the installed rock:

      1. luarocks pack <plugin-name> <version>

      Assuming your plugin rockspec is called kong-plugin-my-plugin-0.1.0-1.rockspec, the above would become;

      1. luarocks pack kong-plugin-my-plugin 0.1.0-1

    The LuaRocks pack command has now created a .rock file (this is simply a zip file containing everything needed to install the rock).

    If you do not or cannot use LuaRocks, then use tar to pack the .lua files of which your plugin consists into a .tar.gz archive. You can also include the .rockspec file if you do have LuaRocks on the target systems.

    The contents of this archive should be close to the following:

    1. tree <plugin-name>
    2. ├── INSTALL.txt
    3. ├── README.md
    4. ├── kong
    5. └── plugins
    6. └── <plugin-name>
    7. ├── handler.lua
    8. └── schema.lua
    9. └── <plugin-name>-<version>.rockspec

    Install the plugin

    For a Kong node to be able to use the custom plugin, the custom plugin’s Lua sources must be installed on your host’s file system. There are multiple ways of doing so: via LuaRocks, or manually. Choose one of the following paths.

    Reminder: regardless of which method you are using to install your plugin’s sources, you must still do so for each node in your Kong cluster.

    The .rock file is a self contained package that can be installed locally or from a remote server.

    If the luarocks utility is installed in your system (this is likely the case if you used one of the official installation packages), you can install the ‘rock’ in your LuaRocks tree (a directory in which LuaRocks installs Lua modules).

    It can be installed by doing:

    The filename can be a local name, or any of the supported methods, e.g. http://myrepository.lan/rocks/my-plugin-0.1.0-1.all.rock

    If the luarocks utility is installed in your system (this is likely the case if you used one of the official installation packages), you can install the Lua sources in your LuaRocks tree (a directory in which LuaRocks installs Lua modules).

    You can do so by changing the current directory to the extracted archive, where the rockspec file is:

    1. cd <plugin-name>

    This will install the Lua sources in kong/plugins/<plugin-name> in your system’s LuaRocks tree, where all the Kong sources are already present.

    A more conservative way of installing your plugin’s sources is to avoid “polluting” the LuaRocks tree, and instead, point Kong to the directory containing them.

    This is done by tweaking the lua_package_path property of your Kong configuration. Under the hood, this property is an alias to the LUA_PATH variable of the Lua VM, if you are familiar with it.

    Those properties contain a semicolon-separated list of directories in which to search for Lua sources. It should be set like so in your Kong configuration file:

    1. lua_package_path = /<path-to-plugin-location>/?.lua;;

    Where:

    • /<path-to-plugin-location> is the path to the directory containing the extracted archive. It should be the location of the kong directory from the archive.
    • ? is a placeholder that will be replaced by kong.plugins.<plugin-name> when Kong will try to load your plugin. Do not change it.
    • ;; a placeholder for the “the default Lua path”. Do not change it.

    For example, if the plugin something is located on the file system and the handler file is in the following directory:

    1. /usr/local/custom/kong/plugins/<something>/handler.lua

    The location of the kong directory is /usr/local/custom, so the proper path setup would be:

    1. lua_package_path = /usr/local/custom/?.lua;;

    Multiple plugins

    If you want to install two or more custom plugins this way, you can set the variable to something like:

      • ; is the separator between directories.
      • ;; still means “the default Lua path”.

      You can also set this property via its environment variable equivalent: KONG_LUA_PACKAGE_PATH.

      1. Add the custom plugin’s name to the plugins list in your Kong configuration (on each Kong node):

        1. plugins = bundled,<plugin-name>

        Or, if you don’t want to include the bundled plugins:

        If you are using two or more custom plugins, insert commas in between, like so:

        Or:

        1. plugins = plugin1,plugin2

        You can also set this property via its environment variable equivalent: KONG_PLUGINS.

      2. Update the plugins directive for each node in your Kong cluster.

      3. Restart Kong to apply the plugin:

        1. kong restart

        Or, if you want to apply a plugin without stopping Kong, you can use this:

        1. kong prepare
        2. kong reload

      Verify loading the plugin

      You should now be able to start Kong without any issue. Consult your custom plugin’s instructions on how to enable/configure your plugin on a Service, Route, or Consumer entity.

        1. log_level = debug

        or:

      1. Then, you should see the following log for each plugin being loaded:

        1. [debug] Loading plugin <plugin-name>

      There are three steps to completely remove a plugin.

      1. Remove the plugin from your Kong Service or Route configuration. Make sure that it is no longer applied globally nor for any Service, Route, or consumer. This has to be done only once for the entire Kong cluster, no restart/reload required. This step in itself will make that the plugin is no longer in use. But it remains available and it is still possible to re-apply the plugin.

      2. To remove the plugin thoroughly, delete the plugin-related files from each of the Kong nodes. Make sure to have completed step 2, including restarting/reloading Kong, before deleting the files. If you used LuaRocks to install the plugin, you can do luarocks remove <plugin-name> to remove it.

      Distribute your plugin

      The preferred way to do so is to use LuaRocks, a package manager for Lua modules. It calls such modules “rocks”. Your module does not have to live inside the Kong repository, but it can be if that’s how you’d like to maintain your Kong setup.

      By defining your modules (and their eventual dependencies) in a file, you can install those modules on your platform via LuaRocks. You can also upload your module on LuaRocks and make it available to everyone!

      Here is an example rockspec using the builtin build type to define modules in Lua notation and their corresponding file.

      For more information about the format, see the LuaRocks .

      Kong can fail to start because of a misconfigured custom plugin for several reasons:

      plugin is in use but not enabled

      You configured a custom plugin from another node, and that the plugin configuration is in the database, but the current node you are trying to start does not have it in its plugins directive. To resolve, add the plugin’s name to the node’s plugins directive.

      plugin is enabled but not installed

      The plugin’s name is present in the plugins directive, but Kong can’t load the handler.lua source file from the file system. To resolve, make sure that the directive is properly set to load this plugin’s Lua sources.

      no configuration schema found for plugin

      The plugin is installed and enabled in the plugins directive, but Kong is unable to load the schema.lua source file from the file system. To resolve, make sure that the schema.lua file is present alongside the plugin’s handler.lua file.


      Previous Writing tests