Project: APISIX (Orchestration & Management / API Gateway)
File: CHANGELOG.md

title: Changelog <!-- --> change: use apisix.enable_http2 to enable HTTP/2 in APISIX (#11032) change: unify the keyring and keyencryptsalt fields (#10771) :sunrise: Support HTTP3/QUIC - :sunrise: add plugins/reload to control api :sunrise: add session.cookie configuration :sunrise: support endpointslices in kubernetes discovery :sunrise: add redis and redis-cluster in limit-req :sunrise: support expire prometheus metrics :sunrise: add redis and redis-cluster in limit-conn :sunrise: allow configuring allow-headers in grpc-web plugin :sunrise: Add forward-auth plugin exception configuration statusonerror :sunrise: add option to include request body and response body in log util :sunrise: support compressed responses in loggers :sunrise: add http-dubbo plugin :sunrise: support built-in variables in response_headers in mocking plugin :sunrise: support other data formats without warnings :sunrise: add ocsp-stapling plugin Fix: wrong namespace related endpoint in k8s Fix: when delete the secret cause 500 error Fix: jwe-decrypt secret length restriction Fix: unnecessary YAML Config reloads Fix: real_payload was overridden by malicious payload Fix: all origins could pass when alloworiginsby_metadata is set Fix: add compatibility headers Fix: missing trailers issue Fix: decryption failure Fix: server-side sessions locked by not calling explicit session:close() Fix: skip brotli compression for upstream compressed response Fix: use_jwks breaking authentication header Fix: authz_keycloak plugin giving 500 error :sunrise: Support the use of lua-resty-events module for better performance: - :sunrise: Upgrade OpenSSL 1.1.1 to OpenSSL 3: :sunrise: Add jwe-decrypt plugin: :sunrise: Support brotli when use filters.regex option (response-rewrite): :sunrise: Add multi-auth plugin: :sunrise: Add `required scopes` configuration property to `openid-connect` plugin: :sunrise: Support for the Timing-Allow-Origin header (cors): :sunrise: Add brotli plugin: :sunrise: Body-transformer plugin enhancement(#10472): :sunrise: Set minLength of redisclusternodes to 1 for limit-count plugin: :sunrise: Allow to use environment variables for limit-count plugin settings: Fix: When the upstream nodes are of array type, the port should be an optional field: Fix: Incorrect variable extraction in fault-injection plugin: Fix: All consumers should share the same counter (limit-count): Fix: Safely remove upstream when sending route to opa plugin: Fix: Missing etcd init_dir and unable to list resource: Fix: Forward-auth request body is too large: Fix: Memory leak caused by timer that never quit: Fix: Do not invoke add_header if value resolved as nil in proxy-rewrite plugin: Fix: Frequent traversal of all keys in etcd leads to high CPU usage: Fix: For prometheus upstreamstatus metrics, mostlyhealthy is healthy: Fix: Avoid getting a nil value in log phase in zipkin: Fix: Enable openid-connect plugin without redirect_uri got 500 error: Fix: Add redirectafterlogouturi for ODIC that do not have an endsession_endpoint: Fix: Response-rewrite filters.regex does not apply when content-encoding is gzip: Fix: The leak of prometheus metrics: Fix: Authz-keycloak add return detail err: Fix: upstream nodes was not updated correctly by service discover: Fix: apisix restart failed: :warning: Creating core resources does not allow passing in `createtime` and `updatetime`: :warning: Remove self-contained info fields `exptime` and `validitystart` and `validityend` from ssl schema: :warning: Replace `route` with `apisix.routename`, `service` with

in the attributes of opentelemetry plugin to follow the standards for span name and attributes: :sunrise: Added token to support access control for consul discovery: :sunrise: Support configuring `serviceid` in streamroute to reference service resources: :sunrise: Using `apisix-runtime` as the apisix runtime: - :sunrise: Add tests for authz-keycloak with apisix secrets: :sunrise: Add authorization params to openid-connect plugin: :sunrise: Support set variable in zipkin plugin: :sunrise: Support Nacos ak/sk authentication: Fix: Use warn log for get healthcheck target status failure: Fix: Keep healthcheck target state when upstream changes: - Fix: Add name field in plugin_config schema for consistency: Fix: Optimize tls in upstream_schema and wrong variable: Fix(consul): Failed to exit normally: Fix: The request header with `Content-Type: application/x-www-form-urlencoded;charset=utf-8` will cause vars condition `postargxxx` matching to failed: Fix: Make install failed on mac: Fix(log-rotate): Log compression timeout caused data loss: Fix(kafka-logger): Remove 0 from enum of required_acks: :warning: Remove gRPC support between APISIX and etcd and remove `etcd.use_grpc` configuration option: :warning: Remove conf server. The data plane no longer supports direct communication with the control plane, and the configuration should be adjusted from `configprovider: controlplane` to `config_provider: etcd`: :warning: Enforce strict schema validation on the properties of the core APISIX resources: :sunrise: Support configuring the buffer size of the access log: :sunrise: Support the use of local DNS resolvers in service discovery by configuring `resolv_conf`: :sunrise: Remove Rust dependency for installation: :sunrise: Support Dubbo protocol in xRPC :sunrise: Support https in traffic-split plugin: :sunrise: Support rewrite request body in external plugin: :sunrise: Support set nginx variables in opentelemetry plugin: :sunrise: Support unix sock host pattern in the chaitin-waf plugin: Fix GraphQL POST request route matching exception: Fix error on array of multiline string in `apisix.yaml`: Add error handlers for invalid `cache_zone` configuration in the `proxy-cache` plugin: :warning: remove snowflake algorithm in the request-id plugin: :warning: No longer compatible with OpenResty 1.19, it needs to be upgraded to 1.21+: :warning: Remove the configuration item `apisix.streamproxy.only`, the L4/L7 proxy needs to be enabled through the configuration item

:warning: The admin-api `/apisix/admin/plugins?all=true` marked as deprecated: :warning: allowlist and denylist can't be enabled at the same time in ua-restriction plugin: :sunrise: Support host level dynamic setting of tls protocol version: :sunrise: Support force delete resource: :sunrise: Support pulling env vars from yaml keys: :sunrise: Add schema validate API in admin-api: :sunrise: Add chaitin-waf plugin: :sunrise: Support vars for file-logger plugin: :sunrise: Support adding response headers for mock plugin: :sunrise: Support regexuri with unsafeuri for proxy-rewrite plugin: :sunrise: Support set client_email field for google-cloud-logging plugin: :sunrise: Support sending headers upstream returned by OPA server for opa plugin: :sunrise: Support configuring proxy server for openid-connect plugin: Fix(log-rotate): the max_kept configuration doesn't work when using custom name: Fix(limit_conn): do not use the http variable in stream mode: Fix(loki-logger): getting an error with log_labels: Fix(limit-count): X-RateLimit-Reset shouldn't be set to 0 after request be rejected: Fix(nacos): attempt to index upvalue 'applications' (a nil value): Fix(etcd): can't sync etcd data if key has special character: Fix(tencent-cloud-cls): dns parsing failure: Fix(reload): worker not exited when executing quit or reload command Fix(traffic-split): upstream_id validity verification :sunrise: Support route-level MTLS :sunrise: Support id schema for global_rules :sunrise: Support use a single long http connection to watch all resources for etcd :sunrise: Support max len 256 for ssl label :sunrise: Support multiple regex pattern matching for proxy_rewrite plugin :sunrise: Add loki-logger plugin :sunrise: Allow user configure DEFAULT_BUCKETS for prometheus plugin Fix(body-transformer): xml2lua: replace empty table with empty string Fix: opentelemetry and grpc-transcode plugins cannot work together Fix(skywalking-logger, error-log-logger): support $hostname in skywalking serviceinstancename Fix(admin): fix secrets do not support to update attributes by PATCH Fix(http-logger): default request path should be '/' Fix: syslog plugin doesn't work Fix: wrong log format for splunk-hec-logging Fix(etcd): reuse cli and enable keepalive Fix: upstream key config add mqttclientid support Fix: body-transformer plugin return raw body anytime Fix(wolf-rbac): other plugin in consumer not effective when consumer used wolf-rbac plugin Fix: always parse domain when host is domain name Fix: response-rewrite plugin can't add only one character Fix(consul): support to fetch only health endpoint The changes marked with :warning: are not backward compatible. :warning: Change the default router from `radixtreeuri` to `radixtreehost_uri`: :warning: CORS plugin will add `Vary: Origin` header when `allow_origin` is not `*`: :sunrise: Support store route's cert in secrets manager: :sunrise: Support bypassing Admin API Auth by configuration: :sunrise: Support header injection for `fault-injection` plugin: :sunrise: Support variable when rewrite header in `proxy-rewrite` plugin: :sunrise: `limit-count` plugin supports `username` and `ssl` for redis policy: Fix etcd data sync exception: Fix invalidate cache in `core.request.add_header` and fix some calls: Fix the high CPU and memory usage cause by healthcheck impl: Consider using `alloworiginsby_regex` only when it is not `nil`: Check upstream reference in `traffic-split` plugin when delete upstream: Fix failing to connect to etcd at startup: Fix health checker leak for domain nodes: Prevent non `127.0.0.0/24` to access admin api with empty admin_key: Ensure `holdbodychunk` should use separate buffer for each plugin in case of pollution: Ensure `batch-requests` plugin read trailer headers if existed: Ensure `proxy-rewrite` should set `ngx.var.uri`: This is an LTS maintenance release and you can see the CHANGELOG in `release/3.2` branch. Deprecated separate Vault configuration in

Users can use secret to achieve the same function: :sunrise: Support Vault token to configure secret through environment variables: :sunrise: Supports service discovery on stream subsystem: - - - :sunrise: Add RESTful to graphQL conversion plugin: :sunrise: Supports setting the log format on each log plugin: - :sunrise: Add request body/response body conversion plugin: :sunrise: Support sending error logs to Kafka: :sunrise: limit-count plugin supports X-RateLimit-Reset: :sunrise: limit-count plugin supports setting TLS to access Redis cluster: :sunrise: consumer-restriction plugin supports permission control via consumergroupid: Fix mTLS protection when the host and SNI mismatch: The proxy-rewrite plugin should escape URI parameter parts if they do not come from user config: Admin API PATCH operation should return 200 status code after success: Under certain conditions, the reload after etcd synchronization failure does not take effect: Fix the problem that the nodes found by the Consul service discovery are incomplete: Fix grpc-transcode plugin's conversion of Map data: External plugins should be able to set the content-type response header: When hotloading plugins, redundant timers may be left behind if the request-id plugin initializes the snowflake generator incorrectly: Close previous proto synchronizer for grpc-transcode when hotloading plugins: :sunrise: Support for etcd configuration synchronization via gRPC: - :sunrise: Support for configuring encrypted fields in plugins: - :sunrise: Support for placing partial fields in Vault or environment variable using secret resources: - - :sunrise: Allows upstream configuration in the stream subsystem as a domain name: :sunrise: Support Consul service discovery: :sunrise: Optimize resource usage for prometheus collection: :sunrise: Add inspect plugin for easy debugging: :sunrise: jwt-auth plugin supports parameters to hide authentication token from upstream : :sunrise: proxy-rewrite plugin supports adding new request headers without overwriting existing request headers with the same name: :sunrise: grpc-transcode plugin supports setting the grpc-status-details-bin response header into the response body: :sunrise: proxy-mirror plugin supports setting the prefix: Fix the problem that the plug-in configured under service object cannot take effect in time under some circumstances: Fix an occasional 502 problem when http and grpc share the same upstream connection due to connection pool reuse: file-logger should avoid buffer-induced log truncation when writing logs: max_kept parameter of log-rotate plugin should take effect on compressed files: Fix userinfo not being set when use_jwks is true in the openid-connect plugin: Fix an issue where x-forwarded-host cannot be changed in the proxy-rewrite plugin: Fix a bug where disabling the v3 admin API resulted in missing response bodies under certain circumstances: In zipkin plugin, pass trace ID even if there is a rejected sampling decision: Fix `_meta.filter` in plugin configuration not working with variables assigned after upstream response and custom variables in APISIX. - `enablecpuaffinity` is disabled by default to avoid this configuration affecting the behavior of APSISIX deployed in the container: :sunrise: Added Consumer Group entity to manage multiple consumers: :sunrise: Supports configuring the order in which DNS resolves domain name types: :sunrise: Support configuring multiple `keyencryptsalt` for rotation: :sunrise: Added ai plugin to dynamically optimize the execution path of APISIX according to the scene: - - - :sunrise: Support `sessionsecret` in openid-connect plugin to resolve the inconsistency of `sessionsecret` among multiple workers: :sunrise: Support sasl config in kafka-logger plugin: :sunrise: Support set resolve domain in proxy-mirror plugin: :sunrise: Support `brokers` property in kafka-logger plugin, which supports different broker to set the same host: :sunrise: Support get response body in ext-plugin-post-resp: :sunrise: Added cas-auth plugin to support CAS authentication: Conditional expressions of workflow plugin should support operators: Fix loading problem of batch processor plugin when prometheus plugin is disabled: When APISIX starts, delete the old conf server sock file if it exists: Disable core.grpc when gRPC-client-nginx-module module is not compiled: Here we use 2.99.0 as the version number in the source code instead of the code name `3.0.0-beta` for two reasons: avoid unexpected errors when some programs try to compare the version, as `3.0.0-beta` contains `3.0.0` and is longer than it. some package system might not allow package which has a suffix after the version number. We've adjusted the configuration in the static configuration file, so you need to update the configuration in `config.yaml` as well: The `configcenter` function is now implemented by `configprovider` under `deployment`: The `etcd` field is moved to `deployment`: The following Admin API configuration is moved to the `admin` field under `deployment`: admin_key enableadmincors allow_admin admin_listen https_admin adminapimtls adminapiversion You can refer to the latest `config-default.yaml` for details. With the new 3.0 release, we took the opportunity to clean out many configurations that were previously marked as deprecated. In the static configuration, we removed several fields as follows: Removed `enablehttp2` and `listenport` from `apisix.ssl`: Removed `apisix.port_admin`: Removed `etcd.healthcheckretry`: Removed `nginxconfig.http.luashared_dicts`: Removed `apisix.realipheader`: In the dynamic configuration, we made the following adjustments: Moved `disable` of the plugin configuration under `_meta`: Removed `service_protocol` from the Route: There are also specific plugin level changes: Removed `audience` field from authz-keycloak: Removed `upstream` field from mqtt-proxy: tcp-related configuration placed under the `tcp` field in error-log-logger: Removed `maxretrytimes` and `retry_interval` fields from syslog: The `scheme` field has been removed from proxy-rewrite: We have adjusted the response format of the Admin API in several PRs as follows: The new response format is shown below: Returns a single configuration: ```json { "modifiedIndex": 2685183, "value": { "id": "1", ... }, "key": "/apisix/routes/1", "createdIndex": 2684956 } ``` Returns multiple configurations: ```json { "list": [ { "modifiedIndex": 2685183, "value": { "id": "1", ... }, "key": "/apisix/routes/1", "createdIndex": 2684956 }, { "modifiedIndex": 2685163, "value": { "id": "2", ... }, "key": "/apisix/routes/2", "createdIndex": 2685163 } ], "total": 2 } ``` Port of Admin API changed to 9180: We only support OpenResty

and above: Adjusted the priority of the Plugin Config object so that the priority of a plugin configuration with the same name changes from Consumer > Plugin Config > Route > Service to Consumer > Route > Plugin Config > Service: Integrating grpc-client-nginx-module to APISIX: k8s service discovery support for configuring multiple clusters: Support for injecting header with specified prefix in opentelemetry plugin: Added openfunction plugin: Added elasticsearch-logger plugin: response-rewrite plugin supports adding response bodies: log-rorate supports specifying the maximum size to cut logs: Added workflow plug-in. - Added Tencent Cloud Log Service plugin: jwt-auth supports ES256 algorithm: ldap-auth internal implementation, switching from lualdap to lua-resty-ldap: http request metrics within the prometheus plugin supports setting additional labels via variables: The clickhouse-logger plugin supports specifying multiple clickhouse endpoints: gRPC proxy sets :authority request header to configured upstream Host: response-rewrite writing to an empty body may cause AIPSIX to fail to respond to the request: Fix the problem that when using Plugin Config and Consumer at the same time, there is a certain probability that the plugin configuration is not updated: Only reopen log files once when log cutting: Passive health checks should not be enabled by default: The zipkin plugin should pass trace IDs upstream even if it does not sample: Correction of opentelemetry span kind to server: in limit-count plugin, different routes with the same configuration should not share the same counter: Fix occasional exceptions thrown when removing clean_handler: Allow direct use of IPv6 literals when configuring upstream nodes: The wolf-rbac plugin adjusts the way it responds to errors: - the phases after proxy didn't run when 500 error happens before proxy: avoid error when multiple plugins associated with consumer and have rewrite phase: upgrade lua-resty-etcd to 1.8.3 which fixes various issues: This is an LTS maintenance release and you can see the CHANGELOG in `release/2.15` branch. This is an LTS maintenance release and you can see the CHANGELOG in `release/2.15` branch. This is an LTS maintenance release and you can see the CHANGELOG in `release/2.15` branch. We now map the grpc error code OUTOFRANGE to http code 400 in grpc-transcode plugin: Rename healthcheckretry configuration in etcd section of `config-default.yaml` to startup_retry: Remove `upstream.enable_websocket` which is deprecated since 2020: Support running plugins conditionally: Allow users to specify plugin execution priority: Support getting upstream certificate from ssl object: Allow customizing error response in the plugin: Add metrics to xRPC Redis proxy: Introduce deployment role to simplify the deployment of APISIX: - - Add

statistic in promethues plugin: Allow using unescaped raw URL in proxy-rewrite plugin: Add PKCE support to the openid-connect plugin: Support custom log format in sls-logger plugin: Export some params for kafka-client in kafka-logger plugin: Add support for capturing OIDC refresh tokens in openid-connect plugin: Add prometheus plugin in stream subsystem: clear remain state from the latest try before retrying in Kubernetes discovery: the query string was repeated twice when enabling both httptohttps and appendquerystring in the redirect plugin: don't send empty Authorization header by default in http-logger: ensure both `group` and `disable` configurations can be used in limit-count: adjust the execution priority of request-id so the tracing plugins can use the request id: correct the transcode of repeated Message in grpc-transcode: var missing in proxy-cache cache key should be ignored: reduce memory usage when abnormal weights are given in chash: cache should be bypassed when the method mismatch in proxy-cache: Upstream keepalive should consider TLS param: - The redirect plugin sets a correct port during redirecting HTTP to HTTPS: The "unix:" in the `realipfrom` configuration should not break the batch-requests plugin: To adapt the change of OpenTelemetry spec, the default port of OTLP/HTTP is changed to 4318: Introduce an experimental feature to allow subscribing Kafka message via APISIX. This feature is based on the pubsub framework running above websocket: - Introduce an experimental framework called xRPC to manage non-HTTP L7 traffic: - - - Now we support adding delay according to the command & key during proxying Redis traffic, which is built above xRPC: Introduce an experimental support to configure APISIX via xDS: - Add `normalizeurilike_servlet` option to normalize uri like servlet: Zookeeper service discovery via apisix-seed: The real-ip plugin supports recursive IP search like `realiprecursive`: The api-breaker plugin allows configuring response: The response-rewrite plugin supports body filters: The request-id plugin adds nanoid algorithm to generate ID: The file-logger plugin can cache & reopen file handler: Add casdoor plugin: The authz-keycloak plugin supports password grant: Upstream keepalive should consider TLS param: Do not expose internal error message to the client: - - DNS supports SRV record with port 0: client mTLS was ignored sometimes in TLS session reuse: The grpc-web plugin doesn't override Access-Control-Allow-Origin header in response: The syslog plugin's default timeout is corrected: The authz-keycloak plugin's `accessdeniedredirect_uri` was bypassed sometimes: Handle `USR2` signal properly: The redirect plugin set a correct port during redirecting HTTP to HTTPS: - Admin API rejects unknown stream plugin: This is an LTS maintenance release and you can see the CHANGELOG in `release/2.13` branch. This is an LTS maintenance release and you can see the CHANGELOG in `release/2.13` branch. This is an LTS maintenance release and you can see the CHANGELOG in `release/2.13` branch. change(syslog): correct the configuration change(server-info): use a new approach(keepalive) to report DP info change(admin): empty nodes should be encoded as array change(prometheus): replace wrong apisixnginxhttpcurrentconnections{state="total"} label change: don't expose public API by default & remove plugin interceptor :sunrise: feat: add delayedbodyfilter phase :sunrise: feat: support for reading environment variables from yaml configuration files :sunrise: feat: rerun rewrite phase for newly added plugins in consumer :sunrise: feat: add config to control write all status to x-upsream-apisix-status :sunrise: feat: add kubernetes discovery module :sunrise: feat(graphql): support http get and post json request :sunrise: feat: jwt-auth support custom parameters :sunrise: feat: set cors allow origins by plugin metadata :sunrise: feat: support postlogoutredirect_uri config in openid-connect plugin :sunrise: feat: mocking plugin :sunrise: feat(error-log-logger): add clickhouse for error-log-logger :sunrise: feat: clickhouse logger :sunrise: feat(grpc-transcode): support .pb file :sunrise: feat: development of Loggly logging plugin :sunrise: feat: add opentelemetry plugin :sunrise: feat: add public api plugin :sunrise: feat: add CSRF plugin fix(skywalking,opentelemetry): trace request rejected by auth fix(log-rotate): should rotate logs strictly hourly(or minutely) fix: deepcopy doesn't copy the metatable fix(request-validate): handle duplicate key in JSON fix(prometheus): conflict between global rule and route configure fix(proxy-rewrite): when conf.headers are missing,conf.method can make effect fix(traffic-split): failed to match rule when the first rule failed fix(configetcd): skip resyncdelay while etcd watch timeout fix(proto): avoid sharing state fix(limit-count): keep the counter if the plugin conf is the same fix(admin): correct the count field of plugin-metadata/global-rule fix: add missing labels after merging route and service This is an LTS maintenance release and you can see the CHANGELOG in `release/2.12`

change(serverless): rename "balancer" phase to "before_proxy" change: don't promise to support Tengine change: enable HTTP when stream proxy is set and enable_admin is true :sunrise: feat(L4): support TLS over TCP upstream :sunrise: feat: support registering custom variable :sunrise: feat(vault): vault lua module, integration with jwt-auth authentication plugin :sunrise: feat: enable L4 stream logging :sunrise: feat: add httpserverlocationconfigurationsnippet configuration :sunrise: feat: support resolve default value when environment not set :sunrise: feat(wasm): run in http header_filter :sunrise: feat: support hide the authentication header in basic-auth with a config :sunrise: feat: set proxyrequestbuffering dynamically :sunrise: feat(mqtt): balance by client id :sunrise: feat: add forward-auth plugin :sunrise: feat(grpc-web): support gRPC-Web Proxy :sunrise: feat(limit-count): add constant key type :sunrise: feat(limit-count): allow sharing counter :sunrise: feat(splunk): support splunk hec logging plugin :sunrise: feat: basic support OPA plugin :sunrise: feat: rocketmq logger :sunrise: feat(mqtt-proxy): support using route's upstream :sunrise: feat(ext-plugin): support to get request body :sunrise: feat(plugins): aws lambda serverless :sunrise: feat(http/kafka-logger): support to log response body :sunrise: feat: Apache OpenWhisk plugin :sunrise: feat(plugin): support google cloud logging service fix: the prometheus labels are inconsistent when error-log-logger is enabled fix(ipv6): allow disabling IPv6 resolve fix(mqtt): handle properties for MQTT 5 fix(sls-logger): unable to get millisecond part of the timestamp fix(mqtt-proxy): client id can be empty fix(ext-plugin): don't use stale key fix(log-rotate): race between reopen log & compression fix(batch-processor): we didn't free stale object actually fix: data pollution after passive health check is changed change(wolf-rbac): change default port number and add `authType` parameter to documentation :sunrise: feat: support advanced matching based on post form :sunrise: feat: initial wasm support :sunrise: feat(control): expose services :sunrise: feat(control): add dump upstream api :sunrise: feat: etcd cluster single node failure APISIX startup failure :sunrise: feat: support specify custom sni in etcd conf :sunrise: feat(plugin): azure serverless functions :sunrise: feat(kafka-logger): supports logging request body :sunrise: feat: provide skywalking logger plugin :sunrise: feat(plugins): Datadog for metrics collection :sunrise: feat(limit-* plugin): fallback to remote_addr when key is missing :sunrise: feat(limit-count): support multiple variables as key :sunrise: feat(limit-conn): support multiple variables as key :sunrise: feat(proxy-rewrite): rewrite method :sunrise: feat(limit-req): support multiple variables as key :sunrise: feat(proxy-cache): support memory-based strategy :sunrise: feat(ext-plugin): avoid sending conf request more times :sunrise: feat: Add ldap-auth plugin This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch. This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch. This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch. This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch. This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch. change(debug): move 'enable_debug' form config.yaml to debug.yaml change: use a new name to customize luashareddict in

change: drop the support of shell script installation :sunrise: feat(debug-mode): add dynamic debug mode :sunrise: feat: allow injecting logic to APISIX's method :sunrise: feat: allow configuring fallback SNI :sunrise: feat(stream_route): support CIDR in ip match :sunrise: feat: allow route to inherit hosts from service :sunrise: feat: support configurating the node listening address :sunrise: feat(hmac-auth): Add validate request body for hmac auth plugin :sunrise: feat(proxy-mirror): support mirror requests sample_ratio :sunrise: feat(referer-restriction): add blacklist and message :sunrise: feat(kafka-logger): add cluster name support :sunrise: feat(kafka-logger): add required_acks option :sunrise: feat(uri-blocker): add case insensitive switch fix(radixtreehosturi): correct matched host fix(radixtreehosturi): correct matched path fix(nacos): distinguish services that has same name but in different groups or namespaces fix(nacos): continue to process other services when request failed fix(ssl): match sni in case-insensitive way fix(upstream): should not override default keepalive value fix(DNS): prefer SRV in service discovery fix(consul): retry connecting after a delay fix: avoid copying unwanted data when the domain's IP changed fix(pluginconfig): recover plugin when pluginconfig changed change: rename plugin's balancer method to before_proxy :sunrise: feat: increase timers limitation :sunrise: feat: make A/B test APISIX easier by removing "additionalProperties = false" :sunrise: feat: support dash in args (#4519) :sunrise: feat(admin): reject invalid proto :sunrise: feat(ext-plugin): support ExtraInfo :sunrise: feat(gzip): support special * to match any type :sunrise: feat(real-ip): implement the first version :sunrise: feat(limit-*): add custom reject-message for traffic control :sunrise: feat: Request-ID plugin add snowflake algorithm :sunrise: feat: Added authz-casbin plugin and doc and tests for it :sunrise: feat: add error log skywalking reporter :sunrise: feat(ext-plugin): send the idempotent key when preparing conf fix: the issue that plugins in global rule may be cached to route fix(grpc-transcode): support converting nested message fix(authz-keycloak): set permissions as empty table when lazyloadpath is false fix(proxy-cache): keep cachemethod same with nginx's proxycache_methods fix(admin): inject updatetime when the request is PATCH with sub path fix(admin): check username for updating consumer fix(error-log-logger): avoid sending stale error log fix(grpc-transcode): handle enum type fix: when a request caused a 500 error, the status was converted to 405 change: enable stream proxy only by default :sunrise: feat: allow user-defined balancer with metadata in node :sunrise: feat: Add option retrytimeout that like nginx's proxynextupstreamtimeout :sunrise: feat: enable balancer phase for plugins :sunrise: feat: allow setting separate keepalive pool :sunrise: feat: enable etcd health-check :sunrise: feat: add gzip plugin :sunrise: feat(plugin): Add new plugin ua-restriction for bot spider restriction :sunrise: feat(stream): add ip-restriction :sunrise: feat(stream): add limit-conn :sunrise: feat: increase ext-plugin timeout to 60s :sunrise: feat(key-auth): supporting key-auth plugin to get key from query string :sunrise: feat(kafka-logger): support for specified the log formats via admin API. fix(stream): sni router is broken when session reuses fix: the limit-conn plugin cannot effectively intercept requests in special scenarios fix: ref check while deleting proto via Admin API fix(skywalking): handle conflict between global rule and route fix: `ctx.var.cookie_*` cookie not found log fix(request-id): we can use different ids with the same request change: check metadataschema with checkschema like the other schema change(echo): remove odd auth_value fix(admin): correct the resources' count field and change its type to integer :sunrise: feat(stream): support client certificate verification :sunrise: feat(stream): accept tls over tcp :sunrise: feat(stream): support domain in the upstream :sunrise: feat(cli): wrap nginx quit cmd :sunrise: feat: allow to set custom timeout for route :sunrise: feat: nacos discovery support group :sunrise: feat: nacos discovery support namespace :sunrise: feat(client-control): set clientmaxbody_size dynamically :sunrise: feat(ext-plugin): stop the runner with SIGTERM :sunrise: feat(limit-req) support nodelay :sunrise: feat(mqtt-proxy): support domain :sunrise: feat(redirect): support appending query string fix: solve memory leak when the client aborts fix(etcd): check res.body.error before accessing the data fix(ext-plugin): when token is stale, refresh token and try again fix(ext-plugin): pass environment variables fix: ensure the plugin is always reloaded change(prometheus): redesign the latency metrics & update grafana change(prometheus): don't expose metrics to internet change(limit-count): ensure redis cluster name is set correctly change: drop support of OpenResty 1.15 :sunrise: feat: support passing different host headers in multiple nodes :sunrise: feat: add 50x html for error page :sunrise: feat: support to use upstreamid in streamroute :sunrise: feat: support client certificate verification :sunrise: feat: add nacos support :sunrise: feat: patch

to use our DNS resolver :sunrise: feat(redirect): support uri encoding :sunrise: feat(key-auth): allow customizing header :sunrise: feat(response-rewrite): allow using variable in the header :sunrise: feat(ext-plugin): APISIX can support Java, Go and other languages to implement custom plugin fix(DNS): support IPv6 resolver fix(healthcheck): only one_loop is needed in the passive health check report fix(traffic-split): configure multiple "rules", the request will be confused between upstream fix: ensure upstream with domain is cached fix: be compatible with the router created before 2.5 fix(standalone): the conf should be available during start fix: ensure atomic operation in limit-count plugin The changes marked with :warning: are not backward compatible. Please upgrade your data accordingly before upgrading to this version. Means that empty vars will make the route fail to match any requests. :warning: change: remove unused consumer.id :warning: change: remove deprecated upstream.enable_websocket change(zipkin): rearrange the child span :sunrise: feat: support mTLS with etcd :warning: feat: upgrade lua-resty-expr/radixtree to support logical expression :sunrise: feat: load etcd configuration when apisix starts :sunrise: feat: let balancer support priority :sunrise: feat: add control api for discovery module :sunrise: feat(skywalking): allow destroy and configure report interval for reporter :sunrise: feat(traffic-split): the upstream pass_host needs to support IP mode :sunrise: feat: Add filter on HTTP methods for consumer-restriction plugin :sunrise: feat: add alloworiginsby_regex to cors plugin :sunrise: feat: support conditional response rewrite fix(error-log-logger): the logger should be run in each process fix: use the builtin server by default fix(traffic-split): binding upstream via upstream_id is invalid fix: correct the validation for ssltrustedcertificate fix: don't override cache relative headers fix: fail to run `make deps` on macOS change: global rules should not be executed on the internal api by default change: default to cache DNS record according to the TTL :sunrise: feat: support SRV record :sunrise: feat: add dns discovery :sunrise: feat: add consul kv discovery module :sunrise: feat: support to bind plugin config by `pluginconfigid` :sunrise: feat: support listen http2 with plaintext :sunrise: feat: support DNS AAAA record :sunrise: feat: the traffic-split plugin supports upstream_id :sunrise: feat(zipkin): support b3 req header fix(chash): ensure retry can try every node fix: script does not work when the route is bound to a service fix: use openssl111 in openresty dir in precedence fix(zipkin): don't cache the per-req sample ratio For more changes, please refer to fix: use luajit by default when run apisix feat: use luasocket instead of curl in etcd.lua :sunrise: feat: support to communicate with etcd by TLS without verification in command line :sunrise: feat: chaos test on route could still works when etcd is down :sunrise: feat: ewma use p2c to improve performance :sunrise: feat: support specifying https in upstream to talk with https backend :sunrise: feat: allow customizing luapackagepath & luapackagecpath :sunrise: feat: allow to pass SNI in HTTPS proxy :sunrise: feat: support gRPCS :sunrise: feat: allow getting upstream health check status via control API :sunrise: feat: support dubbo :sunrise: feat: load balance by least connections :sunrise: feat: kafka-logger implemented reuse kafka producer :sunrise: feat(authz-keycloak): dynamic scope and resource

:sunrise: feat: proxy-rewrite host support host with port :sunrise: feat(fault-injection): support conditional fault injection using nginx variables fix(standalone): require consumer's id to be the same as username fix: support upstream_id & consumer with grpc fix: set conf info when global rule is hit without matched rule fix: avoid caching outdated discovery upstream nodes fix: create the health checker in `access` phase fix: make setmoreretries() work when upstream_type is chash For more changes, please refer to disable node-status plugin by default k8sdeploymentinfo is no longer allowed in upstream don't treat route segment with ':' as parameter by default :sunrise: allow create consumers with multiple auth plugins :sunrise: increase the delay before resync etcd :sunrise: support enable/disable route :sunrise: route according to the graphql attributes :sunrise: share etcd auth token :sunrise: add control API :sunrise: feat(limt-count): use 'remote_addr' as default key :sunrise: feat(fault-injection): support Nginx variable in abort.body :sunrise: feat: implement new plugin `server-info` :sunrise: feat: add batch process metrics :sunrise: feat: Implement traffic splitting plugin :sunrise: feat: the proxy-rewrite plugin support pass nginx variable within header :sunrise: feat: Make headers to add to request in openid-connect plugin configurable :sunrise: feat: support var in upstream_uri on proxy-rewrite plugin basic-auth plugin should run in rewrite phases. fixed the non effective config update in http/udp-logger always necessary to save the data of the limit concurrency, and release the statistical status in the log phase avoid duplicate auto-generated id fix: ctx being contaminated due to a new feature of openresty 1.19. For openresty 1.19 users, it is recommended to upgrade the APISIX version as soon as possible. fix: correct the validation of route.vars For more changes, please refer to :sunrise: support ENV variable in configuration. :sunrise: support TLS connection with etcd. generate create/update_time automatically. add a deprecate log for enable_websocket in upstream. add a deprecate log for consumer id. Added `X-APISIX-Upstream-Status` header to distinguish 5xx errors from upstream or APISIX itself. support Nginx configuration snippet. :sunrise: Upgrade protocol to support Apache Skywalking 8.0. So this version only supports skywalking 8.0 protocol. This plugin is disabled by default, you need to modify config.yaml to enable, which is not backward compatible. :sunrise: add aliyun sls logging plugin. proxy-cache: the cache_zone field in the schema should be optional. fix: validate plugin configuration in the DP :bug: fix(etcd): handle etcd compaction. fix: move `conf/cert` to `t/certs` and disable ssl by default, which is not backward compatible. fix: check decrypt key to prevent lua thread aborted -In the 2.3 release, the consumer will only support user names and discard the id. The consumer needs to manually clean up the id field in etcd, otherwise the schema verification will report an error during use -In the 2.3 release, opening websocket on upstream will no longer be supported -In version 3.0, the data plane and control plane will be separated into two independent ports, that is, the current port 9080 will only process data plane requests, and no longer process admin API requests For more changes, please refer to This is release candidate. :sunrise: Migrate from etcd v2 to v3 protocol, which is not backward compatible. Apache APISIX only supports etcd 3.4 and above versions. add labels for upstream object. add managed fields in json schema for resources, such as createtime and updatetime. use interceptors to protect plugin's route support multiple ports for http and https listen. implement `core.sleep`. :sunrise: add AK/SK(HMAC) auth plugin. :sunrise: add referer-restriction plugin. `limit-count` support to use `redis` cluster. feat(proxy-cache): store the temporary file under cache directory. feat(http-logger): support for specified the log formats via admin API :bug: `high priority` When the data plane receives an instruction to delete a resource(router or upstream etc.), it does not properly clean up the cache, resulting in the existing resources cannot be found. This problem only occurs in the case of long and frequent deletion operations. fix routing priority does not take effect. set random seed for each worker process at `init_worker` phase, only `init` phase is not

remove unsupported algorithm in jwt plugin. return correct response code when `httptohttps` enabled in redirect plugin. For more changes, please refer to Fixed Admin API default access token vulnerability Admin API: support authentication with SSL certificates. Admin API: support both standard `PATCH` and sub path `PATCH`. HealthCheck: supports custom host port. Upstream: supports turning off the default retry mechanism. URI: supports delete the '/' at the end of the `URI`. :sunrise: Request Validator change: nginx workershutdowntimeout is changed from 3s to recommended value 240s. change: the `healthcheck` timeout time type changed from `integer` to `number`. change: the `request-validation` plugin input parameter supports `Schema` validation. change: add comments for Makefile `install` command. change: update comment for config.yaml `etcd.timeout` configuration. change: add more prometheus metrics. change: add more configuration options for `cors` plugin. fixed: failed to get `host` in health check configuration. fixed: should not save the runtime data of plugin into `etcd`. fixed: run `apisix start` several times will start multi nginx processes. fixed: read the request body from the temporary file if it was cached. fixed: batch processor name and error return type. fixed: failed to read redis.ttl in `limit-count` plugin. fixed: passive health check seems never provide a healthy report. fixed: avoid to modify the original plugin conf. fixed: the test case of `invalid-upstream` is unstable and sometimes fails to run. doc: added APISIX Lua Coding Style Guide. doc: fixed link syntax in README.md. doc: fixed image links in zh-cn benchmark. doc: fixed typos in `FAQ``admin-api``architecture-design``discovery``prometheus``proxy-rewrite``redirect``http-logger` documents. doc: added improvements for OSx unit tests and request validation plugin. doc: fixed typos in `architecture-design` document. doc: added the default import path of `Nginx` for unit testing in `Linux` and `macOS` systems in the `how-to-build` document. doc: add `request-validation` plugin chinese document. doc: fixed file path of `gRPC transcoding` in `README`. doc: fixed `uri-blocker` plugin path error in `README`. doc: fixed `grpc-transcode` plugin path error in `README`. doc: removed unnecessary configurations for `k8s` document. Fix: multiple SSL certificates are configured, but only one certificate working fine. Admin API: Support unique names for routes Optimization of log buffer size and flush time :sunrise: Apache Skywalking plugin :sunrise: Keycloak Identity Server Plugin :sunrise: Echo Plugin :sunrise: Consume Restriction Plugin Batch Request : Copy all headers to every request SSL private key encryption Improvement of docs for multiple plugins The 1.3 version is mainly for security update. reject invalid header and uri safe encode only allow 127.0.0.1 access admin API and dashboard by default. :sunrise: add batch request plugin. implemented plugin `sys logger`. The 1.2 version brings many new features, including core and plugins. :sunrise: support etcd cluster. using the local DNS resolver by default, which is friendly for k8s. support to run `headerfilter`, `bodyfilter` and `log` phases for global rules. changed the `lua/apisix` dir to `apisix`(not backward compatible). add dashboard as submodule. allow adding custom shared dict. :sunrise: add Apache Kafka plugin. :sunrise: add CORS plugin. :sunrise: add TCP logger plugin. :sunrise: add UDP logger plugin. :sunrise: add proxy mirror plugin. :sunrise: add proxy cache plugin. drop websocket enable control in proxy-rewrite plugin(not backward compatible). Adding support to public key based introspection for OAuth plugin. response-rewrite plugin support binary data to client by base64. plugin `grpc-transcode` supports grpc deadline. support password auth for limit-count-redis. Zipkin plugin add service name and report local server IP. add `changepwd` and `userinfo` for Wolf-Rbac plugin. :sunrise: support key-based authentication for Admin API(not backward

hide SSL private key in admin API. missing `clear` table before to reuse table (will cause memory leak). print warning error message if the yaml route file is invalid. the balancer IP may be nil, use an empty string instead. plugin node-status and heartbeat don't have schema. the plugin basic-auth needs required field. check the count of upstream valid node. This release is mainly to strengthen the stability of the code and add more documentation. always specify perl include path when running test cases. Feature: Add support for PROXY Protocol. enhancement: add verify command to verify apisix configuration(nginx.conf). feature: increase the default size of the core file. feature: make the number of file is as configurable as the connections. core: improve the core.log module. Modify bin/apisix to support the SO_REUSEPORT. doc: add link to download grafana meta data. doc: Update README.md. doc: doc: add wolf-rbac plugin. doc: update the download link of rpm. doc: add more english article. Adding contribution guidelines for the documentation. doc: getting-started.md check. Added additional information and refactoring sentences. Update admin-api-cn.md. Update architecture-design-cn.md. ci: remove patch which is no longer necessary and removed in the upst. fix path error when install with luarocks. travis: run a apisix instance which intalled by luarocks. feature: Add wolf rbac plugin. Adding UDP logger plugin. enhancement: using internal request instead of external request in node-status plugin. This release is mainly to strengthen the stability of the code and add more documentation. :sunrise: Support routing priority. You can match different upstream services based on conditions such as header, args, priority, etc. under the same URI. When no route is matched, an error message is returned. To distinguish it from other 404 requests. The address of the dashboard `/apisix/admin` supports CORS. The jsonschema validator returns a clearer error message. Upgrade the `ngx_var` module to version 0.5. Upgrade the `lua-resty-etcd` module to version 0.8. In development mode, the number of workers is automatically adjusted to 1. Remove the nginx.conf file from the code repository. It is automatically generated every time and cannot be modified manually. Added documentation on how to customize development plugins. fixed example's bugs in the serverless plugin documentation. Added documentation for using the Oauth plugin. Added dashboard compiled documentation. Added documentation on how to perform a/b testing. Added documentation on how to enable the MQTT plugin. Add test cases for key-auth plugin under normal circumstances. Added tests for gRPC transcode pb options. This release brings many new features, such as support for running APISIX with Tengine, an advanced debugging mode that is more developer friendly, and a new URI redirection plugin. :sunrise: Supported to run APISIX with tengine. :sunrise: Enabled HTTP2 and supported to set ssl_protocols. :sunrise: Advanced Debug Mode, Target module function's input arguments or returned value would be printed once this option is enabled. Support to install APISIX without dashboard. Removed router R3 : Redirect URI plugin. : Supported remove `header` feature. : Supported global limit count with `Redis Server`. lua-resty-radixtree Support for `host + uri` as an index. lua-resty-jsonschema This extension is a JSON data validator that replaces the existing `lua-rapidjson` extension. key-auth plugin cannot run accurately in the case of multiple consumers. Exported schema for plugin serverless. Discard args of uri when using proxy-write plugin Zipkin plugin not set tracing data to request header. Skipped check cjson for luajit environment in apisix CLI. Skipped to init etcd if use local file as config

Support more built-in parameters when set chash balancer. Replace the `lua-rapidjson` module with `lua-resty-jsonschema` global, `lua-resty-jsonschema` is faster and easier to compile. Released on 2019/09/30 This release brings many new features, such as stream proxy, support MQTT protocol proxy, and support for ARM platform, and proxy rewrite plugin. :sunrise: : using yaml to update configurations of APISIX, more friendly to kubernetes. :sunrise: . :sunrise: support consumer bind plugins. support domain name in upstream, not only IP. ignored upstream node when it's weight is 0. :sunrise: : support to load balance MQTT by `client_id`, both support MQTT 3.1 and 5.0. : rewrite uri, schema, host for upstream. :sunrise: APISIX can run normally under Ubuntu 18.04 of ARM64 architecture, so you can use APISIX as IoT gateway with MQTT plugin. lua-resty-ipmatcher support IPv6 IP white/black list, route. lua-resty-radixtree allow to specify multiple host, remote_addr and uri. allow to define user-function to filter request. use `lua-resty-ipmatcher` instead of `lua-resty-iputils`, `lua-resty-ipmatcher` matches fast and support IPv6. healthcheck: the checker name is wrong if APISIX works under multiple processes. removed `lua-tinyyaml` from source code base, and install through Luarocks. Released on 2019/09/06 This release brings many new features, such as IP black and white list, gPRC protocol transcoding, IPv6, IdP (identity provider) services, serverless, Change the default route to radix tree (not downward compatible), and more. :sunrise: : supports protocol transcoding so that clients can access your gRPC API by using HTTP/JSON. :sunrise: : The radix tree is used as the default router implementation. It supports the uri, host, cookie, request header, request parameters, Nginx built-in variables, etc. as the routing conditions, and supports common operators such as equal, greater than, less than, etc., more powerful and flexible.IMPORTANT: This change is not downward compatible. All users who use historical versions need to manually modify their routing to work properly. Dynamic upstream supports more parameters, you can specify the upstream uri and host, and whether to enable websocket. Support for get values from cookies directly from `ctx.var`. Routing support IPv6. :sunrise: : With serverless support, users can dynamically run any Lua function on a gateway node. Users can also use this feature as a lightweight plugin. :sunrise: support IdP: Support external authentication services, such as Auth0, okta, etc., users can use this to connect to Oauth2.0 and other authentication methods. : Support for more restricted keys, such as `X-Forwarded-For` and `X-Real-IP`, and allows users to use Nginx variables, request headers, and request parameters as keys. Support IP black and white list for security. Add the `version` directive to get the version number of APISIX. The `PATCH` API is supported and can be modified individually for a configuration without submitting the entire configuration. :sunrise: Add the online version of the dashboardusers can without install. Released on 2019/08/05 This release brings many new features such as health check and circuit breaker, debug mode, opentracing and JWT auth. And add built-in dashboard. :sunrise: : Enable health check on the upstream node, and will automatically filter unhealthy nodes during load balancing to ensure system stability. Anti-ReDoS(Regular expression Denial of Service). supported debug mode. allowed to use different router. supported to match route by host + uri. allowed plugins to handler balance phase. added desc for upstream and service in schema. :sunrise: : support Zipkin and Apache SkyWalking. . support multiple ips of `allow`. supported real_ip configure in nginx.conf and added functions to get ip and remote ip. :sunrise: add built-in dashboard. support OSX in Travis CI. installed all of the dependencies to `deps` folder.