• Home
  • Integrations
  • SDKs
  • Guides
  • API docs
    No results for ""


    Using the Lua SDK with HAProxy

    Read time: 1 minute
    Last edited: Apr 29, 2023
    This guide has not been updated to include custom contexts

    This documentation is not updated to display upcoming changes from LaunchDarkly's contexts feature. This documentation will be updated during the contexts Early Access Program (EAP).

    To learn more about custom contexts, read Contexts and segments.


    This guide explains how to use our Lua server-side SDK with HAProxy. You can use HAProxy with LaunchDarkly to implement dynamic rate limiting, access controls, rollout, and many other features at the edge of your application architecture.

    You can extend HAProxy with Lua 5.3, enabling complex control of HAProxy functionality. HAProxy has substantial commercial adoption.

    Find a basic Dockerized app in the GitHub repository at hello-haproxy.


    To complete this guide, you must have the following prerequisites:

    • Basic working knowledge of the LaunchDarkly Lua server-side SDK
    • Basic working knowledge of the LaunchDarkly C/C++ server-side SDK

    The C server-side SDK is required because the Lua server-side SDK is implemented as a wrapper around the C server-side SDK.

    Preparing the C/C++ server-side SDK

    Make the binary of the C/C++ server-side SDK accessible to the dynamic linker. The most convenient way to do this is to install the binary system-wide at /usr/lib/libldserverapi.so.

    Ensuring correct initialization

    The most important part of effective SDK usage is managing the lifetime of clients correctly. When HAProxy utilizes process based concurrency, multiple clients initiate. If you accidentally initiate a client per request, the application is substantially slower because the SDK has to download a fresh ruleset from LaunchDarkly.

    For ideal operations, initialize each HAProxy worker process exactly once. You can do this with the lua-load directive under global. This directive executes a script when a process is freshly spawned. Client initialization should reside in this script. In the example below, this file is called shared.lua.

    Here is an example of initialization logic:

    local ld = require("launchdarkly_server_sdk")
    local os = require("os")
    local config = {
    key = os.getenv("sdk-key-123abc")
    local client = ld.clientInit(config, 1000)

    Later we can use the result of this initialization process in other services:

    core.register_service("launchdarkly", "http", function(applet)
    local user = ld.makeUser({
    key = "abc"
    if client:boolVariation(user, os.getenv("flag-key-123abc"), false) then
    applet:send("<p>feature launched</p>")
    applet:send("<p>feature not launched</p>")
    Want to know more? Start a trial.

    Your 14-day trial begins as soon as you sign up. Learn to use LaunchDarkly with the app's built-in tutorial. You'll discover how easy it is to manage the whole feature lifecycle from concept to launch to control.

    Want to try it out? Start a trial.