# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

# -----------------------
# Kong configuration file
# -----------------------
#
# The commented-out settings shown in this file represent the default values.
#
# This file is read when `kong start` or `kong prepare` are used. Kong
# generates the Nginx configuration with the settings specified in this file.
#
# All environment variables prefixed with `KONG_` and capitalized will override
# the settings specified in this file.
# Example:
#   `log_level` setting -> `KONG_LOG_LEVEL` env variable
#
# Boolean values can be specified as `on`/`off` or `true`/`false`.
# Lists must be specified as comma-separated strings.
#
# All comments in this file can be removed safely, including the
# commented-out properties.
# You can verify the integrity of your settings with `kong check <conf>`.

#------------------------------------------------------------------------------
# GENERAL
#------------------------------------------------------------------------------

#prefix = /usr/local/kong/       # Working directory. Equivalent to Nginx's
                                 # prefix path, containing temporary files
                                 # and logs.
                                 # Each Kong process must have a separate
                                 # working directory.

#log_level = notice              # Log level of the Nginx server. Logs are
                                 # found at `<prefix>/logs/error.log`.

# See http://nginx.org/en/docs/ngx_core_module.html#error_log for a list
# of accepted values.

#proxy_access_log = logs/access.log       # Path for proxy port request access
                                          # logs. Set this value to `off` to
                                          # disable logging proxy requests.
                                          # If this value is a relative path,
                                          # it will be placed under the
                                          # `prefix` location.

#proxy_error_log = logs/error.log         # Path for proxy port request error
                                          # logs. The granularity of these logs
                                          # is adjusted by the `log_level`
                                          # property.

#admin_access_log = logs/admin_access.log # Path for Admin API request access
                                          # logs. If Hybrid Mode is enabled
                                          # and the current node is set to be
                                          # the Control Plane, then the
                                          # connection requests from Data Planes
                                          # are also written to this file with
                                          # server name "kong_cluster_listener".
                                          #
                                          # Set this value to `off` to
                                          # disable logging Admin API requests.
                                          # If this value is a relative path,
                                          # it will be placed under the
                                          # `prefix` location.

#admin_error_log = logs/error.log         # Path for Admin API request error
                                          # logs. The granularity of these logs
                                          # is adjusted by the `log_level`
                                          # property.

#status_access_log = off                  # Path for Status API request access
                                          # logs. The default value of `off`
                                          # implies that loggin for this API
                                          # is disabled by default.
                                          # If this value is a relative path,
                                          # it will be placed under the
                                          # `prefix` location.

#status_error_log = logs/status_error.log # Path for Status API request error
                                          # logs. The granularity of these logs
                                          # is adjusted by the `log_level`
                                          # property.

plugins = bundled,skywalking               # Comma-separated list of plugins this node
                                 # should load. By default, only plugins
                                 # bundled in official distributions are
                                 # loaded via the `bundled` keyword.
                                 #
                                 # Loading a plugin does not enable it by
                                 # default, but only instructs Kong to load its
                                 # source code, and allows to configure the
                                 # plugin via the various related Admin API
                                 # endpoints.
                                 #
                                 # The specified name(s) will be substituted as
                                 # such in the Lua namespace:
                                 # `kong.plugins.{name}.*`.
                                 #
                                 # When the `off` keyword is specified as the
                                 # only value, no plugins will be loaded.
                                 #
                                 # `bundled` and plugin names can be mixed
                                 # together, as the following examples suggest:
                                 #
                                 # - `plugins = bundled,custom-auth,custom-log`
                                 #   will include the bundled plugins plus two
                                 #   custom ones
                                 # - `plugins = custom-auth,custom-log` will
                                 #   *only* include the `custom-auth` and
                                 #   `custom-log` plugins.
                                 # - `plugins = off` will not include any
                                 #   plugins
                                 #
                                 # **Note:** Kong will not start if some
                                 # plugins were previously configured (i.e.
                                 # have rows in the database) and are not
                                 # specified in this list.  Before disabling a
                                 # plugin, ensure all instances of it are
                                 # removed before restarting Kong.
                                 #
                                 # **Note:** Limiting the amount of available
                                 # plugins can improve P99 latency when
                                 # experiencing LRU churning in the database
                                 # cache (i.e. when the configured
                                 # `mem_cache_size`) is full.

#pluginserver_names =            # Comma-separated list of names for pluginserver
                                 # processes.  The actual names are used for
                                 # log messages and to relate the actual settings.

#pluginserver_XXX_socket = <prefix>/<XXX>.socket            # Path to the unix socket
                                                            # used by the <XXX> pluginserver.
#pluginserver_XXX_start_cmd = /usr/local/bin/<XXX>          # Full command (including
                                                            # any needed arguments) to
                                                            # start the <XXX> pluginserver
#pluginserver_XXX_query_cmd = /usr/local/bin/query_<XXX>    # Full command to "query" the
                                                            # <XXX> pluginserver.  Should
                                                            # produce a JSON with the
                                                            # dump info of all plugins it
                                                            # manages

#port_maps =                     # With this configuration parameter, you can
                                 # let the Kong to know about the port from
                                 # which the packets are forwarded to it. This
                                 # is fairly common when running Kong in a
                                 # containerized or virtualized environment.
                                 # For example, `port_maps=80:8000, 443:8443`
                                 # instructs Kong that the port 80 is mapped
                                 # to 8000 (and the port 443 to 8443), where
                                 # 8000 and 8443 are the ports that Kong is
                                 # listening to.
                                 #
                                 # This parameter helps Kong set a proper
                                 # forwarded upstream HTTP request header or to
                                 # get the proper forwarded port with the Kong PDK
                                 # (in case other means determining it has
                                 # failed). It changes routing by a destination
                                 # port to route by a port from which packets
                                 # are forwarded to Kong, and similarly it
                                 # changes the default plugin log serializer to
                                 # use the port according to this mapping
                                 # instead of reporting the port Kong is
                                 # listening to.

#anonymous_reports = on          # Send anonymous usage data such as error
                                 # stack traces to help improve Kong.

#------------------------------------------------------------------------------
# HYBRID MODE
#------------------------------------------------------------------------------

#role = traditional              # Use this setting to enable Hybrid Mode,
                                 # This allows running some Kong nodes in a
                                 # control plane role with a database and
                                 # have them deliver configuration updates
                                 # to other nodes running to DB-less running in
                                 # a Data Plane role.
                                 #
                                 # Valid values to this setting are:
                                 #
                                 # - `traditional`: do not use Hybrid Mode.
                                 # - `control_plane`: this node runs in a
                                 #   control plane role. It can use a database
                                 #   and will deliver configuration updates
                                 #   to data plane nodes.
                                 # - `data_plane`: this is a data plane node.
                                 #   It runs DB-less and receives configuration
                                 #   updates from a control plane node.

#cluster_mtls = shared           # Sets the verification between nodes of the
                                 # cluster.
                                 #
                                 # Valid values to this setting are:
                                 #
                                 # - `shared`: use a shared certificate/key
                                 #   pair specified with the `cluster_cert`
                                 #   and `cluster_cert_key` settings.
                                 #   Note that CP and DP nodes have to present
                                 #   the same certificate to establish mTLS
                                 #   connections.
                                 # - `pki`: use `cluster_ca_cert`,
                                 #   `cluster_server_name` and `cluster_cert`
                                 #   for verification.
                                 #   These are different certificates for each
                                 #   DP node, but issued by a cluster-wide
                                 #   common CA certificate: `cluster_ca_cert`.

#cluster_cert =                  # Filename of the cluster certificate to use
                                 # when establishing secure communication
                                 # between control and data plane nodes.
                                 # You can use the `kong hybrid` command to
                                 # generate the certificate/key pair.
                                 # Under `shared` mode, it must be the same
                                 # for all nodes.  Under `pki` mode it
                                 # should be a different certificate for each
                                 # DP node.

#cluster_cert_key =              # Filename of the cluster certificate key to
                                 # use when establishing secure communication
                                 # between control and data plane nodes.
                                 # You can use the `kong hybrid` command to
                                 # generate the certificate/key pair.
                                 # Under `shared` mode, it must be the same
                                 # for all nodes.  Under `pki` mode it
                                 # should be a different certificate for each
                                 # DP node.

#cluster_ca_cert =               # The trusted CA certificate file in PEM
                                 # format used to verify the `cluster_cert`.
                                 # Required if `cluster_mtls` is set to `pki`,
                                 # ignored otherwise.

#------------------------------------------------------------------------------
# HYBRID MODE DATA PLANE
#------------------------------------------------------------------------------

#cluster_server_name =           # The server name used in the SNI of the TLS
                                 # connection from a DP node to a CP node.
                                 # Must match the Common Name (CN) or Subject
                                 # Alternative Name (SAN) found in the CP
                                 # certificate.
                                 # If `cluster_mtls` is set to
                                 # `shared`, this setting is ignored and
                                 # `kong_clustering` is used.

#cluster_control_plane =         # To be used by data plane nodes only:
                                 # address of the control plane node from
                                 # which configuration updates will be fetched,
                                 # in `host:port` format.

#------------------------------------------------------------------------------
# HYBRID MODE CONTROL PLANE
#------------------------------------------------------------------------------

#cluster_listen = 0.0.0.0:8005
                         # Comma-separated list of addresses and ports on
                         # which the cluster control plane server should listen
                         # for data plane connections.
                         # The cluster communication port of the control plane
                         # must be accessible by all the data planes
                         # within the same cluster. This port is mTLS protected
                         # to ensure end-to-end security and integrity.
                         #
                         # This setting has no effect if `role` is not set to
                         # `control_plane`.
                         #
                         # Connection made to this endpoint are logged
                         # to the same location as Admin API access logs.
                         # See `admin_access_log` config description for more
                         # information.

#cluster_data_plane_purge_delay = 1209600
                         # How many seconds must pass from the time a DP node
                         # becomes offline to the time its entry gets removed
                         # from the database, as returned by the
                         # /clustering/data-planes Admin API endpoint.
                         #
                         # This is to prevent the cluster data plane table from
                         # growing indefinitely. The default is set to
                         # 14 days. That is, if CP haven't heard from a DP for
                         # 14 days, its entry will be removed.

#------------------------------------------------------------------------------
# NGINX
#------------------------------------------------------------------------------

#proxy_listen = 0.0.0.0:8000 reuseport backlog=16384, 0.0.0.0:8443 http2 ssl reuseport backlog=16384
                         # Comma-separated list of addresses and ports on
                         # which the proxy server should listen for
                         # HTTP/HTTPS traffic.
                         # The proxy server is the public entry point of Kong,
                         # which proxies traffic from your consumers to your
                         # backend services. This value accepts IPv4, IPv6, and
                         # hostnames.
                         #
                         # Some suffixes can be specified for each pair:
                         #
                         # - `ssl` will require that all connections made
                         #   through a particular address/port be made with TLS
                         #   enabled.
                         # - `http2` will allow for clients to open HTTP/2
                         #   connections to Kong's proxy server.
                         # - `proxy_protocol` will enable usage of the
                         #   PROXY protocol for a given address/port.
                         # - `deferred` instructs to use a deferred accept on
                         #   Linux (the TCP_DEFER_ACCEPT socket option).
                         # - `bind` instructs to make a separate bind() call
                         #   for a given address:port pair.
                         # - `reuseport` instructs to create an individual
                         #   listening socket for each worker process
                         #   allowing the Kernel to better distribute incoming
                         #   connections between worker processes
                         # - `backlog=N` sets the maximum length for the queue
                         #   of pending TCP connections. This number should
                         #   not be too small in order to prevent clients
                         #   seeing "Connection refused" error connecting to
                         #   a busy Kong instance.
                         #   **Note:** on Linux, this value is limited by the
                         #   setting of `net.core.somaxconn` Kernel parameter.
                         #   In order for the larger `backlog` set here to take
                         #   effect it is necessary to raise
                         #   `net.core.somaxconn` at the same time to match or
                         #   exceed the `backlog` number set.
                         #
                         # This value can be set to `off`, thus disabling
                         # the HTTP/HTTPS proxy port for this node.
                         # If stream_listen is also set to `off`, this enables
                         # 'control-plane' mode for this node
                         # (in which all traffic proxying capabilities are
                         # disabled). This node can then be used only to
                         # configure a cluster of Kong
                         # nodes connected to the same datastore.
                         #
                         # Example:
                         # `proxy_listen = 0.0.0.0:443 ssl, 0.0.0.0:444 http2 ssl`
                         #
                         # See http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
                         # for a description of the accepted formats for this
                         # and other `*_listen` values.
                         #
                         # See https://www.nginx.com/resources/admin-guide/proxy-protocol/
                         # for more details about the `proxy_protocol`
                         # parameter.
                         #
                         # Not all `*_listen` values accept all formats
                         # specified in nginx's documentation.

#stream_listen = off
                         # Comma-separated list of addresses and ports on
                         # which the stream mode should listen.
                         #
                         # This value accepts IPv4, IPv6, and hostnames.
                         # Some suffixes can be specified for each pair:
                         # - `ssl` will require that all connections made
                         #   through a particular address/port be made with TLS
                         #   enabled.
                         # - `proxy_protocol` will enable usage of the
                         #   PROXY protocol for a given address/port.
                         # - `bind` instructs to make a separate bind() call
                         #   for a given address:port pair.
                         # - `reuseport` instructs to create an individual
                         #   listening socket for each worker process
                         #   allowing the Kernel to better distribute incoming
                         #   connections between worker processes
                         # - `backlog=N` sets the maximum length for the queue
                         #   of pending TCP connections. This number should
                         #   not be too small in order to prevent clients
                         #   seeing "Connection refused" error connecting to
                         #   a busy Kong instance.
                         #   **Note:** on Linux, this value is limited by the
                         #   setting of `net.core.somaxconn` Kernel parameter.
                         #   In order for the larger `backlog` set here to take
                         #   effect it is necessary to raise
                         #   `net.core.somaxconn` at the same time to match or
                         #   exceed the `backlog` number set.
                         #
                         # **Note:** The `ssl` suffix is not supported,
                         # and each address/port will accept TCP with or
                         # without TLS enabled.
                         #
                         # Examples:
                         #
                         # ```
                         # stream_listen = 127.0.0.1:7000 reuseport backlog=16384
                         # stream_listen = 0.0.0.0:989 reuseport backlog=65536, 0.0.0.0:20
                         # stream_listen = [::1]:1234 backlog=16384
                         # ```
                         #
                         # By default this value is set to `off`, thus
                         # disabling the stream proxy port for this node.

# See http://nginx.org/en/docs/stream/ngx_stream_core_module.html#listen
# for a description of the formats that Kong might accept in stream_listen.

#admin_listen = 127.0.0.1:8001 reuseport backlog=16384, 127.0.0.1:8444 http2 ssl reuseport backlog=16384
                         # Comma-separated list of addresses and ports on
                         # which the Admin interface should listen.
                         # The Admin interface is the API allowing you to
                         # configure and manage Kong.
                         # Access to this interface should be *restricted*
                         # to Kong administrators *only*. This value accepts
                         # IPv4, IPv6, and hostnames.
                         #
                         # Some suffixes can be specified for each pair:
                         #
                         # - `ssl` will require that all connections made
                         #   through a particular address/port be made with TLS
                         #   enabled.
                         # - `http2` will allow for clients to open HTTP/2
                         #   connections to Kong's proxy server.
                         # - `proxy_protocol` will enable usage of the
                         #   PROXY protocol for a given address/port.
                         # - `deferred` instructs to use a deferred accept on
                         #   Linux (the TCP_DEFER_ACCEPT socket option).
                         # - `bind` instructs to make a separate bind() call
                         #   for a given address:port pair.
                         # - `reuseport` instructs to create an individual
                         #   listening socket for each worker process
                         #   allowing the Kernel to better distribute incoming
                         #   connections between worker processes
                         # - `backlog=N` sets the maximum length for the queue
                         #   of pending TCP connections. This number should
                         #   not be too small in order to prevent clients
                         #   seeing "Connection refused" error connecting to
                         #   a busy Kong instance.
                         #   **Note:** on Linux, this value is limited by the
                         #   setting of `net.core.somaxconn` Kernel parameter.
                         #   In order for the larger `backlog` set here to take
                         #   effect it is necessary to raise
                         #   `net.core.somaxconn` at the same time to match or
                         #   exceed the `backlog` number set.
                         #
                         # This value can be set to `off`, thus disabling
                         # the Admin interface for this node, enabling a
                         # 'data-plane' mode (without configuration
                         # capabilities) pulling its configuration changes
                         # from the database.
                         #
                         # Example: `admin_listen = 127.0.0.1:8444 http2 ssl`

#status_listen = off     # Comma-separated list of addresses and ports on
                         # which the Status API should listen.
                         # The Status API is a read-only endpoint
                         # allowing monitoring tools to retrieve metrics,
                         # healthiness, and other non-sensitive information
                         # of the current Kong node.
                         #
                         # The following suffix can be specified for each pair:
                         #
                         # - `ssl` will require that all connections made
                         #   through a particular address/port be made with TLS
                         #   enabled.
                         #
                         # This value can be set to `off`, disabling
                         # the Status API for this node.
                         #
                         # Example: `status_listen = 0.0.0.0:8100`


#nginx_user = kong kong          # Defines user and group credentials used by
                                 # worker processes. If group is omitted, a
                                 # group whose name equals that of user is
                                 # used.
                                 #
                                 # Example: `nginx_user = nginx www`
                                 #
                                 # **Note**: If the `kong` user and the `kong`
                                 # group are not available, the default user
                                 # and group credentials will be
                                 # `nobody nobody`.

#nginx_worker_processes = auto   # Determines the number of worker processes
                                 # spawned by Nginx.
                                 #
                                 # See http://nginx.org/en/docs/ngx_core_module.html#worker_processes
                                 # for detailed usage of the equivalent Nginx
                                 # directive and a description of accepted
                                 # values.

#nginx_daemon = on               # Determines whether Nginx will run as a daemon
                                 # or as a foreground process. Mainly useful
                                 # for development or when running Kong inside
                                 # a Docker environment.
                                 #
                                 # See http://nginx.org/en/docs/ngx_core_module.html#daemon.

#mem_cache_size = 128m           # Size of each of the two in-memory caches
                                 # for database entities. The accepted units are
                                 # `k` and `m`, with a minimum recommended value of
                                 # a few MBs.
                                 #
                                 # **Note**: As this option controls the size of two
                                 # different cache entries, the total memory Kong
                                 # uses to cache entities might be double this value.

#ssl_cipher_suite = intermediate # Defines the TLS ciphers served by Nginx.
                                 # Accepted values are `modern`,
                                 # `intermediate`, `old`, or `custom`.
                                 #
                                 # See https://wiki.mozilla.org/Security/Server_Side_TLS
                                 # for detailed descriptions of each cipher
                                 # suite.

#ssl_ciphers =                   # Defines a custom list of TLS ciphers to be
                                 # served by Nginx. This list must conform to
                                 # the pattern defined by `openssl ciphers`.
                                 # This value is ignored if `ssl_cipher_suite`
                                 # is not `custom`.

#ssl_protocols = TLSv1.1 TLSv1.2 TLSv1.3
                                 # Enables the specified protocols for
                                 # client-side connections. The set of
                                 # supported protocol versions also depends
                                 # on the version of OpenSSL Kong was built
                                 # with. This value is ignored if
                                 # `ssl_cipher_suite` is not `custom`.
                                 #
                                 # See http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_protocols

#ssl_prefer_server_ciphers = on  # Specifies that server ciphers should be
                                 # preferred over client ciphers when using
                                 # the SSLv3 and TLS protocols. This value is
                                 # ignored if `ssl_cipher_suite` is not `custom`.
                                 #
                                 # See http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_prefer_server_ciphers

#ssl_dhparam =                   # Defines DH parameters for DHE ciphers from the
                                 # predefined groups: `ffdhe2048`, `ffdhe3072`,
                                 # `ffdhe4096`, `ffdhe6144`, `ffdhe8192`, or
                                 # from the absolute path to a parameters file.
                                 #
                                 # This value is ignored if `ssl_cipher_suite`
                                 # is `modern` or `intermediate`. The reason is
                                 # that `modern` has no ciphers that needs this,
                                 # and `intermediate` uses `ffdhe2048`.
                                 #
                                 # See http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_dhparam

#ssl_session_tickets = on        # Enables or disables session resumption through
                                 # TLS session tickets. This has no impact when
                                 # used with TLSv1.3.
                                 #
                                 # Kong enables this by default for performance
                                 # reasons, but it has security implications:
                                 # https://github.com/mozilla/server-side-tls/issues/135
                                 #
                                 # See http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_tickets

#ssl_session_timeout = 1d        # Specifies a time during which a client may
                                 # reuse the session parameters. See the rationale:
                                 # https://github.com/mozilla/server-side-tls/issues/198
                                 #
                                 # See http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_timeout

#ssl_cert =                      # The absolute path to the SSL certificate for
                                 # `proxy_listen` values with SSL enabled.

#ssl_cert_key =                  # The absolute path to the SSL key for
                                 # `proxy_listen` values with SSL enabled.

#client_ssl = off                # Determines if Nginx should send client-side
                                 # SSL certificates when proxying requests.

#client_ssl_cert =               # If `client_ssl` is enabled, the absolute
                                 # path to the client SSL certificate for the
                                 # `proxy_ssl_certificate` directive. Note that
                                 # this value is statically defined on the
                                 # node, and currently cannot be configured on
                                 # a per-API basis.

#client_ssl_cert_key =           # If `client_ssl` is enabled, the absolute
                                 # path to the client SSL key for the
                                 # `proxy_ssl_certificate_key` address. Note
                                 # this value is statically defined on the
                                 # node, and currently cannot be configured on
                                 # a per-API basis.

#admin_ssl_cert =                # The absolute path to the SSL certificate for
                                 # `admin_listen` values with SSL enabled.

#admin_ssl_cert_key =            # The absolute path to the SSL key for
                                 # `admin_listen` values with SSL enabled.

#status_ssl_cert =               # The absolute path to the SSL certificate for
                                 # `status_listen` values with SSL enabled.

#status_ssl_cert_key =           # The absolute path to the SSL key for
                                 # `status_listen` values with SSL enabled.

#headers = server_tokens, latency_tokens
                                 # Comma-separated list of headers Kong should
                                 # inject in client responses.
                                 #
                                 # Accepted values are:
                                 # - `Server`: Injects `Server: kong/x.y.z`
                                 #   on Kong-produced response (e.g. Admin
                                 #   API, rejected requests from auth plugin).
                                 # - `Via`: Injects `Via: kong/x.y.z` for
                                 #   successfully proxied requests.
                                 # - `X-Kong-Proxy-Latency`: Time taken
                                 #   (in milliseconds) by Kong to process
                                 #   a request and run all plugins before
                                 #   proxying the request upstream.
                                 # - `X-Kong-Response-Latency`: time taken
                                 #   (in millisecond) by Kong to produce
                                 #   a response in case of e.g. plugin
                                 #   short-circuiting the request, or in
                                 #   in case of an error.
                                 # - `X-Kong-Upstream-Latency`: Time taken
                                 #   (in milliseconds) by the upstream
                                 #   service to send response headers.
                                 # - `X-Kong-Admin-Latency`: Time taken
                                 #   (in milliseconds) by Kong to process
                                 #   an Admin API request.
                                 # - `X-Kong-Upstream-Status`: The HTTP status
                                 #   code returned by the upstream service.
                                 #   This is particularly useful for clients to
                                 #   distinguish upstream statuses if the
                                 #   response is rewritten by a plugin.
                                 # - `server_tokens`: Same as specifying both
                                 #   `Server` and `Via`.
                                 # - `latency_tokens`: Same as specifying
                                 #   `X-Kong-Proxy-Latency`,
                                 #   `X-Kong-Response-Latency`,
                                 #   `X-Kong-Admin-Latency` and
                                 #   `X-Kong-Upstream-Latency`
                                 #
                                 # In addition to those, this value can be set
                                 # to `off`, which prevents Kong from injecting
                                 # any of the above headers. Note that this
                                 # does not prevent plugins from injecting
                                 # headers of their own.
                                 #
                                 # Example: `headers = via, latency_tokens`

#trusted_ips =                   # Defines trusted IP addresses blocks that are
                                 # known to send correct `X-Forwarded-*`
                                 # headers.
                                 # Requests from trusted IPs make Kong forward
                                 # their `X-Forwarded-*` headers upstream.
                                 # Non-trusted requests make Kong insert its
                                 # own `X-Forwarded-*` headers.
                                 #
                                 # This property also sets the
                                 # `set_real_ip_from` directive(s) in the Nginx
                                 # configuration. It accepts the same type of
                                 # values (CIDR blocks) but as a
                                 # comma-separated list.
                                 #
                                 # To trust *all* /!\ IPs, set this value to
                                 # `0.0.0.0/0,::/0`.
                                 #
                                 # If the special value `unix:` is specified,
                                 # all UNIX-domain sockets will be trusted.
                                 #
                                 # See http://nginx.org/en/docs/http/ngx_http_realip_module.html#set_real_ip_from
                                 # for examples of accepted values.

#real_ip_header = X-Real-IP      # Defines the request header field whose value
                                 # will be used to replace the client address.
                                 # This value sets the `ngx_http_realip_module`
                                 # directive of the same name in the Nginx
                                 # configuration.
                                 #
                                 # If this value receives `proxy_protocol`:
                                 #
                                 # - at least one of the `proxy_listen` entries
                                 #   must have the `proxy_protocol` flag
                                 #   enabled.
                                 # - the `proxy_protocol` parameter will be
                                 #   appended to the `listen` directive of the
                                 #   Nginx template.
                                 #
                                 # See http://nginx.org/en/docs/http/ngx_http_realip_module.html#real_ip_header
                                 # for a description of this directive.

#real_ip_recursive = off         # This value sets the `ngx_http_realip_module`
                                 # directive of the same name in the Nginx
                                 # configuration.
                                 #
                                 # See http://nginx.org/en/docs/http/ngx_http_realip_module.html#real_ip_recursive
                                 # for a description of this directive.

#error_default_type = text/plain  # Default MIME type to use when the request
                                  # `Accept` header is missing and Nginx
                                  # is returning an error for the request.
                                  # Accepted values are `text/plain`,
                                  # `text/html`, `application/json`, and
                                  # `application/xml`.

#upstream_keepalive_pool_size = 60  # Sets the default size of the upstream
                                    # keepalive connection pools.
                                    # Upstream keepalive connection pools
                                    # are segmented by the `dst ip/dst
                                    # port/SNI` attributes of a connection.
                                    # A value of `0` will disable upstream
                                    # keepalive connections by default, forcing
                                    # each upstream request to open a new
                                    # connection.

#upstream_keepalive_max_requests = 100  # Sets the default maximum number of
                                        # requests than can be proxied upstream
                                        # through one keepalive connection.
                                        # After the maximum number of requests
                                        # is reached, the connection will be
                                        # closed.
                                        # A value of `0` will disable this
                                        # behavior, and a keepalive connection
                                        # can be used to proxy an indefinite
                                        # number of requests.

#upstream_keepalive_idle_timeout = 60   # Sets the default timeout (in seconds)
                                        # for which an upstream keepalive
                                        # connection should be kept open. When
                                        # the timeout is reached while the
                                        # connection has not been reused, it
                                        # will be closed.
                                        # A value of `0` will disable this
                                        # behavior, and an idle keepalive
                                        # connection may be kept open
                                        # indefinitely.

#------------------------------------------------------------------------------
# NGINX injected directives
#------------------------------------------------------------------------------

# Nginx directives can be dynamically injected in the runtime nginx.conf file
# without requiring a custom Nginx configuration template.
#
# All configuration properties respecting the naming scheme
# `nginx_<namespace>_<directive>` will result in `<directive>` being injected in
# the Nginx configuration block corresponding to the property's `<namespace>`.
# Example:
#   `nginx_proxy_large_client_header_buffers = 8 24k`
#
#   Will inject the following directive in Kong's proxy `server {}` block:
#
#   `large_client_header_buffers 8 24k;`
#
# The following namespaces are supported:
#
# - `nginx_main_<directive>`: Injects `<directive>` in Kong's configuration
#   `main` context.
# - `nginx_events_<directive>`: Injects `<directive>` in Kong's `events {}`
#    block.
# - `nginx_http_<directive>`: Injects `<directive>` in Kong's `http {}` block.
# - `nginx_proxy_<directive>`: Injects `<directive>` in Kong's proxy
#   `server {}` block.
# - `nginx_upstream_<directive>`: Injects `<directive>` in Kong's proxy
#   `upstream {}` block.
# - `nginx_admin_<directive>`: Injects `<directive>` in Kong's Admin API
#   `server {}` block.
# - `nginx_status_<directive>`: Injects `<directive>` in Kong's Status API
#   `server {}` block  (only effective if `status_listen` is enabled).
# - `nginx_stream_<directive>`: Injects `<directive>` in Kong's stream module
#   `stream {}` block (only effective if `stream_listen` is enabled).
# - `nginx_sproxy_<directive>`: Injects `<directive>` in Kong's stream module
#   `server {}` block (only effective if `stream_listen` is enabled).
# - `nginx_supstream_<directive>`: Injects `<directive>` in Kong's stream
#   module `upstream {}` block.
#
# As with other configuration properties, Nginx directives can be injected via
# environment variables when capitalized and prefixed with `KONG_`.
# Example:
#   `KONG_NGINX_HTTP_SSL_PROTOCOLS` -> `nginx_http_ssl_protocols`
#
#   Will inject the following directive in Kong's `http {}` block:
#
#   `ssl_protocols <value>;`
#
#   If different sets of protocols are desired between the proxy and Admin API
#   server, you may specify `nginx_proxy_ssl_protocols` and/or
#   `nginx_admin_ssl_protocols`, both of which taking precedence over the
#   `http {}` block.

#nginx_main_worker_rlimit_nofile = auto
                                 # Changes the limit on the maximum number of open files
                                 # for worker processes.
                                 #
                                 # The special and default value of `auto` sets this
                                 # value to `ulimit -n` with the upper bound limited to
                                 # 16384 as a measure to protect against excess memory use.
                                 #
                                 # See http://nginx.org/en/docs/ngx_core_module.html#worker_rlimit_nofile

#nginx_events_worker_connections = auto
                                 # Sets the maximum number of simultaneous
                                 # connections that can be opened by a worker process.
                                 #
                                 # The special and default value of `auto` sets this
                                 # value to `ulimit -n` with the upper bound limited to
                                 # 16384 as a measure to protect against excess memory use.
                                 #
                                 # See http://nginx.org/en/docs/ngx_core_module.html#worker_connections

#nginx_http_client_header_buffer_size = 1k  # Sets buffer size for reading the
                                            # client request headers.
                                            # See http://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_buffer_size

#nginx_http_large_client_header_buffers = 4 8k  # Sets the maximum number and
                                                # size of buffers used for
                                                # reading large clients
                                                # requests headers.
                                                # See http://nginx.org/en/docs/http/ngx_http_core_module.html#large_client_header_buffers

#nginx_http_client_max_body_size = 0  # Defines the maximum request body size
                                      # allowed by requests proxied by Kong,
                                      # specified in the Content-Length request
                                      # header. If a request exceeds this
                                      # limit, Kong will respond with a 413
                                      # (Request Entity Too Large). Setting
                                      # this value to 0 disables checking the
                                      # request body size.
                                      # See http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size

#nginx_admin_client_max_body_size = 10m  # Defines the maximum request body size for
                                         # Admin API.

#nginx_http_client_body_buffer_size = 8k  # Defines the buffer size for reading
                                          # the request body. If the client
                                          # request body is larger than this
                                          # value, the body will be buffered to
                                          # disk. Note that when the body is
                                          # buffered to disk, Kong plugins that
                                          # access or manipulate the request
                                          # body may not work, so it is
                                          # advisable to set this value as high
                                          # as possible (e.g., set it as high
                                          # as `client_max_body_size` to force
                                          # request bodies to be kept in
                                          # memory). Do note that
                                          # high-concurrency environments will
                                          # require significant memory
                                          # allocations to process many
                                          # concurrent large request bodies.
                                          # See http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size

#nginx_admin_client_body_buffer_size = 10m  # Defines the buffer size for reading
                                            # the request body on Admin API.

#------------------------------------------------------------------------------
# DATASTORE
#------------------------------------------------------------------------------

# Kong can run with a database to store coordinated data between Kong nodes in
# a cluster, or without a database, where each node stores its information
# independently in memory.
#
# When using a database, Kong will store data for all its entities (such as
# Routes, Services, Consumers, and Plugins) in either Cassandra or PostgreSQL,
# and all Kong nodes belonging to the same cluster must connect themselves
# to the same database.
#
# Kong supports the following database versions:
# - **PostgreSQL**: 9.5 and above.
# - **Cassandra**: 2.2 and above.
#
# When not using a database, Kong is said to be in "DB-less mode": it will keep
# its entities in memory, and each node needs to have this data entered via a
# declarative configuration file, which can be specified through the
# `declarative_config` property, or via the Admin API using the `/config`
# endpoint.
#
# When using Postgres as the backend storage, you can optionally enable Kong
# to serve read queries from a separate database instance.
# When the number of proxies is large, this can greatly reduce the load
# on the main Postgres instance and achieve better scalability. It may also
# reduce the latency jitter if the Kong proxy node's latency to the main
# Postgres instance is high.
#
# The read-only Postgres instance only serves read queries and write
# queries still goes to the main connection. The read-only Postgres instance
# can be eventually consistent while replicating changes from the main
# instance.
#
# At least the `pg_ro_host` config is needed to enable this feature.
# By default, all other database config for the read-only connection are
# inherited from the corresponding main connection config described above but
# may be optionally overwritten explicitly using the `pg_ro_*` config below.

#database = postgres             # Determines which of PostgreSQL or Cassandra
                                 # this node will use as its datastore.
                                 # Accepted values are `postgres`,
                                 # `cassandra`, and `off`.

#pg_host = 127.0.0.1             # Host of the Postgres server.
#pg_port = 5432                  # Port of the Postgres server.
#pg_timeout = 5000               # Defines the timeout (in ms), for connecting,
                                 # reading and writing.

#pg_user = kong                  # Postgres user.
#pg_password =                   # Postgres user's password.
#pg_database = kong              # The database name to connect to.

#pg_schema =                     # The database schema to use. If unspecified,
                                 # Kong will respect the `search_path` value of
                                 # your PostgreSQL instance.

#pg_ssl = off                    # Toggles client-server TLS connections
                                 # between Kong and PostgreSQL.
                                 # Because PostgreSQL uses the same port for TLS
                                 # and non-TLS, this is only a hint. If the
                                 # server does not support TLS, the established
                                 # connection will be a plain one.

#pg_ssl_verify = off             # Toggles server certificate verification if
                                 # `pg_ssl` is enabled.
                                 # See the `lua_ssl_trusted_certificate`
                                 # setting to specify a certificate authority.

#pg_max_concurrent_queries = 0   # Sets the maximum number of concurrent queries
                                 # that can be executing at any given time. This
                                 # limit is enforced per worker process; the
                                 # total number of concurrent queries for this
                                 # node will be will be:
                                 # `pg_max_concurrent_queries * nginx_worker_processes`.
                                 #
                                 # The default value of 0 removes this
                                 # concurrency limitation.

#pg_semaphore_timeout = 60000    # Defines the timeout (in ms) after which
                                 # PostgreSQL query semaphore resource
                                 # acquisition attempts will fail. Such
                                 # failures will generally result in the
                                 # associated proxy or Admin API request
                                 # failing with an HTTP 500 status code.
                                 # Detailed discussion of this behavior is
                                 # available in the online documentation.

#pg_ro_host =                    # Same as `pg_host`, but for the
                                 # read-only connection.
                                 # **Note:** Refer to the documentation
                                 # section above for detailed usage.

#pg_ro_port = <pg_port>          # Same as `pg_port`, but for the
                                 # read-only connection.

#pg_ro_timeout = <pg_timeout>    # Same as `pg_timeout`, but for the
                                 # read-only connection.

#pg_ro_user = <pg_user>          # Same as `pg_user`, but for the
                                 # read-only connection.

#pg_ro_password = <pg_password>  # Same as `pg_password`, but for the
                                 # read-only connection.

#pg_ro_database = <pg_database>  # Same as `pg_database`, but for the
                                 # read-only connection.

#pg_ro_schema = <pg_schema>      # Same as `pg_schema`, but for the
                                 # read-only connection.

#pg_ro_ssl = <pg_ssl>            # Same as `pg_ssl`, but for the
                                 # read-only connection.

#pg_ro_ssl_verify = <pg_ssl_verify>
                                 # Same as `pg_ssl_verify`, but for the
                                 # read-only connection.

#pg_ro_max_concurrent_queries = <pg_max_concurrent_queries>
                                 # Same as `pg_max_concurrent_queries`, but for
                                 # the read-only connection.
                                 # Note: read-only concurrency is not shared
                                 # with the main (read-write) connection.

#pg_ro_semaphore_timeout = <pg_semaphore_timeout>
                                 # Same as `pg_semaphore_timeout`, but for the
                                 # read-only connection.

#cassandra_contact_points = 127.0.0.1  # A comma-separated list of contact
                                       # points to your cluster.
                                       # You may specify IP addresses or
                                       # hostnames. Note that the port
                                       # component of SRV records will be
                                       # ignored in favor of `cassandra_port`.
                                       # When connecting to a multi-DC cluster,
                                       # ensure that contact points from the
                                       # local datacenter are specified first
                                       # in this list.

#cassandra_port = 9042           # The port on which your nodes are listening
                                 # on. All your nodes and contact points must
                                 # listen on the same port. Will be created if
                                 # it doesn't exist.

#cassandra_keyspace = kong       # The keyspace to use in your cluster.

#cassandra_write_consistency = ONE  # Consistency setting to use when
                                    # writing to the Cassandra cluster.

#cassandra_read_consistency = ONE   # Consistency setting to use when
                                    # reading from the Cassandra cluster.

#cassandra_timeout = 5000        # Defines the timeout (in ms) for reading
                                 # and writing.

#cassandra_ssl = off             # Toggles client-to-node TLS connections
                                 # between Kong and Cassandra.

#cassandra_ssl_verify = off      # Toggles server certificate verification if
                                 # `cassandra_ssl` is enabled.
                                 # See the `lua_ssl_trusted_certificate`
                                 # setting to specify a certificate authority.

#cassandra_username = kong       # Username when using the
                                 # `PasswordAuthenticator` scheme.

#cassandra_password =            # Password when using the
                                 # `PasswordAuthenticator` scheme.

#cassandra_lb_policy = RequestRoundRobin  # Load balancing policy to use when
                                          # distributing queries across your
                                          # Cassandra cluster.
                                          # Accepted values are:
                                          # `RoundRobin`, `RequestRoundRobin`,
                                          # `DCAwareRoundRobin`, and
                                          # `RequestDCAwareRoundRobin`.
                                          # Policies prefixed with "Request"
                                          # make efficient use of established
                                          # connections throughout the same
                                          # request.
                                          # Prefer "DCAware" policies if and
                                          # only if you are using a
                                          # multi-datacenter cluster.

#cassandra_local_datacenter =    # When using the `DCAwareRoundRobin`
                                 # or `RequestDCAwareRoundRobin` load
                                 # balancing policy, you must specify the name
                                 # of the local (closest) datacenter for this
                                 # Kong node.

#cassandra_refresh_frequency = 60          # Frequency (in seconds) at which
                                           # the cluster topology will be
                                           # checked for new or decommissioned
                                           # nodes.
                                           # A value of `0` will disable this
                                           # check, and the cluster topology
                                           # will never be refreshed.

#cassandra_repl_strategy = SimpleStrategy  # When migrating for the first time,
                                           # Kong will use this setting to
                                           # create your keyspace.
                                           # Accepted values are
                                           # `SimpleStrategy` and
                                           # `NetworkTopologyStrategy`.

#cassandra_repl_factor = 1       # When migrating for the first time, Kong
                                 # will create the keyspace with this
                                 # replication factor when using the
                                 # `SimpleStrategy`.

#cassandra_data_centers = dc1:2,dc2:3  # When migrating for the first time,
                                       # will use this setting when using the
                                       # `NetworkTopologyStrategy`.
                                       # The format is a comma-separated list
                                       # made of `<dc_name>:<repl_factor>`.

#cassandra_schema_consensus_timeout = 10000  # Defines the timeout (in ms) for
                                             # the waiting period to reach a
                                             # schema consensus between your
                                             # Cassandra nodes.
                                             # This value is only used during
                                             # migrations.

#declarative_config =           # The path to the declarative configuration
                                # file which holds the specification of all
                                # entities (Routes, Services, Consumers, etc.)
                                # to be used when the `database` is set to
                                # `off`.
                                #
                                # Entities are stored in Kong's in-memory cache,
                                # so you must ensure that enough memory is
                                # allocated to it via the `mem_cache_size`
                                # property. You must also ensure that items
                                # in the cache never expire, which means that
                                # `db_cache_ttl` should preserve its default
                                # value of 0.

#------------------------------------------------------------------------------
# DATASTORE CACHE
#------------------------------------------------------------------------------

# In order to avoid unnecessary communication with the datastore, Kong caches
# entities (such as APIs, Consumers, Credentials...) for a configurable period
# of time. It also handles invalidations if such an entity is updated.
#
# This section allows for configuring the behavior of Kong regarding the
# caching of such configuration entities.

#db_update_frequency = 5         # Frequency (in seconds) at which to check for
                                 # updated entities with the datastore.
                                 #
                                 # When a node creates, updates, or deletes an
                                 # entity via the Admin API, other nodes need
                                 # to wait for the next poll (configured by
                                 # this value) to eventually purge the old
                                 # cached entity and start using the new one.

#db_update_propagation = 0       # Time (in seconds) taken for an entity in the
                                 # datastore to be propagated to replica nodes
                                 # of another datacenter.
                                 #
                                 # When in a distributed environment such as
                                 # a multi-datacenter Cassandra cluster, this
                                 # value should be the maximum number of
                                 # seconds taken by Cassandra to propagate a
                                 # row to other datacenters.
                                 #
                                 # When set, this property will increase the
                                 # time taken by Kong to propagate the change
                                 # of an entity.
                                 #
                                 # Single-datacenter setups or PostgreSQL
                                 # servers should suffer no such delays, and
                                 # this value can be safely set to 0.

#db_cache_ttl = 0                # Time-to-live (in seconds) of an entity from
                                 # the datastore when cached by this node.
                                 #
                                 # Database misses (no entity) are also cached
                                 # according to this setting if you do not
                                 # configure `db_cache_neg_ttl`.
                                 #
                                 # If set to 0 (default), such cached entities
                                 # or misses never expire.

#db_cache_neg_ttl =              # Time-to-live (in seconds) of a datastore
                                 # miss (no entity).
                                 #
                                 # If not specified (default), `db_cache_ttl`
                                 # value will be used instead.
                                 #
                                 # If set to 0, misses will never expire.

#db_resurrect_ttl = 30           # Time (in seconds) for which stale entities
                                 # from the datastore should be resurrected for
                                 # when they cannot be refreshed (e.g., the
                                 # datastore is unreachable). When this TTL
                                 # expires, a new attempt to refresh the stale
                                 # entities will be made.

#db_cache_warmup_entities = services
                                 # Entities to be pre-loaded from the datastore
                                 # into the in-memory cache at Kong start-up.
                                 # This speeds up the first access of endpoints
                                 # that use the given entities.
                                 #
                                 # When the `services` entity is configured
                                 # for warmup, the DNS entries for values in
                                 # its `host` attribute are pre-resolved
                                 # asynchronously as well.
                                 #
                                 # Cache size set in `mem_cache_size` should
                                 # be set to a value large enough to hold all
                                 # instances of the specified entities.
                                 # If the size is insufficient, Kong will log
                                 # a warning.

#------------------------------------------------------------------------------
# DNS RESOLVER
#------------------------------------------------------------------------------

# By default, the DNS resolver will use the standard configuration files
# `/etc/hosts` and `/etc/resolv.conf`. The settings in the latter file will be
# overridden by the environment variables `LOCALDOMAIN` and `RES_OPTIONS` if
# they have been set.
#
# Kong will resolve hostnames as either `SRV` or `A` records (in that order, and
# `CNAME` records will be dereferenced in the process).
# In case a name was resolved as an `SRV` record it will also override any given
# port number by the `port` field contents received from the DNS server.
#
# The DNS options `SEARCH` and `NDOTS` (from the `/etc/resolv.conf` file) will
# be used to expand short names to fully qualified ones. So it will first try
# the entire `SEARCH` list for the `SRV` type, if that fails it will try the
# `SEARCH` list for `A`, etc.
#
# For the duration of the `ttl`, the internal DNS resolver will loadbalance each
# request it gets over the entries in the DNS record. For `SRV` records the
# `weight` fields will be honored, but it will only use the lowest `priority`
# field entries in the record.

#dns_resolver =                  # Comma separated list of nameservers, each
                                 # entry in `ip[:port]` format to be used by
                                 # Kong. If not specified the nameservers in
                                 # the local `resolv.conf` file will be used.
                                 # Port defaults to 53 if omitted. Accepts
                                 # both IPv4 and IPv6 addresses.

#dns_hostsfile = /etc/hosts      # The hosts file to use. This file is read
                                 # once and its content is static in memory.
                                 # To read the file again after modifying it,
                                 # Kong must be reloaded.

#dns_order = LAST,SRV,A,CNAME    # The order in which to resolve different
                                 # record types. The `LAST` type means the
                                 # type of the last successful lookup (for the
                                 # specified name). The format is a (case
                                 # insensitive) comma separated list.

#dns_valid_ttl =                 # By default, DNS records are cached using
                                 # the TTL value of a response. If this
                                 # property receives a value (in seconds), it
                                 # will override the TTL for all records.

#dns_stale_ttl = 4               # Defines, in seconds, how long a record will
                                 # remain in cache past its TTL. This value
                                 # will be used while the new DNS record is
                                 # fetched in the background.
                                 # Stale data will be used from expiry of a
                                 # record until either the refresh query
                                 # completes, or the `dns_stale_ttl` number of
                                 # seconds have passed.

#dns_not_found_ttl = 30          # TTL in seconds for empty DNS responses and
                                 # "(3) name error" responses.

#dns_error_ttl = 1               # TTL in seconds for error responses.

#dns_no_sync = off               # If enabled, then upon a cache-miss every
                                 # request will trigger its own dns query.
                                 # When disabled multiple requests for the
                                 # same name/type will be synchronised to a
                                 # single query.

#------------------------------------------------------------------------------
# TUNING & BEHAVIOR
#------------------------------------------------------------------------------

#worker_consistency = strict
                                 # Defines whether this node should rebuild its
                                 # state synchronously or asynchronously (the
                                 # balancers and the router are rebuilt on
                                 # updates that affects them, e.g., updates to
                                 # Routes, Services or Upstreams, via the Admin
                                 # API or loading a declarative configuration
                                 # file).
                                 #
                                 # Accepted values are:
                                 #
                                 # - `strict`: the router will be rebuilt
                                 #   synchronously, causing incoming requests to
                                 #   be delayed until the rebuild is finished.
                                 # - `eventual`: the router will be rebuilt
                                 #   asynchronously via a recurring background
                                 #   job running every second inside of each
                                 #   worker.
                                 #
                                 # Note that `strict` ensures that all workers
                                 # of a given node will always proxy requests
                                 # with an identical router, but that increased
                                 # long tail latency can be observed if
                                 # frequent Routes and Services updates are
                                 # expected.
                                 # Using `eventual` will help preventing long
                                 # tail latency issues in such cases, but may
                                 # cause workers to route requests differently
                                 # for a short period of time after Routes and
                                 # Services updates.

#worker_state_update_frequency = 5
                                 # Defines how often the worker state changes are
                                 # checked with a background job. When a change
                                 # is detected, a new router or balancer will be
                                 # built, as needed. Raising this value will
                                 # decrease the load on database servers and
                                 # result in less jitter in proxy latency, but
                                 # it might take more time to propagate changes
                                 # to each individual worker.

#------------------------------------------------------------------------------
# MISCELLANEOUS
#------------------------------------------------------------------------------

# Additional settings inherited from lua-nginx-module allowing for more
# flexibility and advanced usage.
#
# See the lua-nginx-module documentation for more information:
# https://github.com/openresty/lua-nginx-module


#lua_ssl_trusted_certificate =   # Comma-separated list of paths to certificate
                                 # authority files for Lua cosockets in PEM format.
                                 #
                                 # The special value `system` attempts to search for the
                                 # "usual default" provided by each distro, according
                                 # to an arbitrary heuristic. In the current implementation,
                                 # The following pathnames will be tested in order,
                                 # and the first one found will be used:
                                 #
                                 # - /etc/ssl/certs/ca-certificates.crt (Debian/Ubuntu/Gentoo)
                                 # - /etc/pki/tls/certs/ca-bundle.crt (Fedora/RHEL 6)
                                 # - /etc/ssl/ca-bundle.pem (OpenSUSE)
                                 # - /etc/pki/tls/cacert.pem (OpenELEC)
                                 # - /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem (CentOS/RHEL 7)
                                 # - /etc/ssl/cert.pem (OpenBSD, Alpine)
                                 #
                                 # If no file is found on any of these paths, an error will
                                 # be raised.
                                 #
                                 # `system` can be used by itself or in conjunction with other
                                 # CA filepaths.
                                 #
                                 # When `pg_ssl_verify` or `cassandra_ssl_verify`
                                 # are enabled, these certificate authority files will be
                                 # used for verifying Kong's database connections.
                                 #
                                 # See https://github.com/openresty/lua-nginx-module#lua_ssl_trusted_certificate

#lua_ssl_verify_depth = 1        # Sets the verification depth in the server
                                 # certificates chain used by Lua cosockets,
                                 # set by `lua_ssl_trusted_certificate`.
                                 # This includes the certificates configured
                                 # for Kong's database connections.
                                 # If the maximum depth is reached before
                                 # reaching the end of the chain, verification
                                 # will fail. This helps mitigate certificate
                                 # based DoS attacks.
                                 #
                                 # See https://github.com/openresty/lua-nginx-module#lua_ssl_verify_depth

lua_package_path = /home/kong/.luarocks/share/lua/5.1/?.lua;;
#lua_package_path = ./?.lua;./?/init.lua;  # Sets the Lua module search path
                                           # (LUA_PATH). Useful when developing
                                           # or using custom plugins not stored
                                           # in the default search path.
                                           #
                                           # See https://github.com/openresty/lua-nginx-module#lua_package_path

#lua_package_cpath =             # Sets the Lua C module search path
                                 # (LUA_CPATH).
                                 #
                                 # See https://github.com/openresty/lua-nginx-module#lua_package_cpath

#lua_socket_pool_size = 30       # Specifies the size limit for every cosocket
                                 # connection pool associated with every remote
                                 # server.
                                 #
                                 # See https://github.com/openresty/lua-nginx-module#lua_socket_pool_size

#untrusted_lua = sandbox
                                 # Accepted values are:
                                 #
                                 # - `off`: disallow any loading of Lua functions
                                 #          from admin supplied sources (such as via the Admin API).
                                 #
                                 #          Note using the `off` option will render plugins such as
                                 #          Serverless Functions unusable.
                                 # - `sandbox`: allow loading of Lua functions from admin
                                 #              supplied sources, but use a sandbox when
                                 #              executing them. The sandboxed
                                 #              function will have restricted access
                                 #              to the global environment and only
                                 #              have access to standard Lua functions
                                 #              that will generally not cause harm to
                                 #              the Kong node.
                                 #
                                 #              In this mode, the `require` function inside
                                 #              the sandbox only allows loading external Lua
                                 #              modules that are explicitly listed in
                                 #              `untrusted_lua_sandbox_requires` below.
                                 #
                                 #              LuaJIT bytecode loading is disabled.
                                 #
                                 #              Warning: LuaJIT is not designed as a secure
                                 #              runtime for running malicious code, therefore,
                                 #              you should properly protect your Admin API endpoint
                                 #              even with sandboxing enabled. The sandbox only
                                 #              provides protection against trivial attackers or
                                 #              unintentional modification of the Kong global
                                 #              environment.
                                 # - `on`: allow loading of Lua functions from admin
                                 #         supplied sources and do not use a sandbox when
                                 #         executing them. Functions will have unrestricted
                                 #         access to global environment and able to load any
                                 #         Lua modules. This is similar to the behavior in Kong
                                 #         prior to 2.3.0.
                                 #
                                 #         LuaJIT bytecode loading is disabled.

#untrusted_lua_sandbox_requires =
                                 # Comma-separated list of modules allowed to be loaded
                                 # with `require` inside the sandboxed environment. Ignored
                                 # if `untrusted_lua` is not `sandbox`.
                                 #
                                 # Note: certain modules, when allowed, may cause sandbox
                                 # escaping trivial.

#untrusted_lua_sandbox_environment =
                                 # Comma-separated list of global Lua variables
                                 # that should be made available inside the sandboxed
                                 # environment. Ignored if `untrusted_lua` is not `sandbox`.
                                 #
                                 # Note: certain variables, when made available,
                                 # may cause sandbox escaping trivial.
