diff --git a/CloudronPackages/APISIX/CloudronManifest.json b/CloudronPackages/APISIX/CloudronManifest.json
new file mode 100644
index 0000000..c0a91fa
--- /dev/null
+++ b/CloudronPackages/APISIX/CloudronManifest.json
@@ -0,0 +1,33 @@
+{
+ "id": "apisix",
+ "title": "Apache APISIX",
+ "description": "Apache APISIX is a dynamic, real-time, high-performance API gateway.",
+ "tagline": "High-performance API Gateway",
+ "icon": "https://cdn.cloudron.io/icons/apisix.svg",
+ "main": {
+ "type": "docker",
+ "image": "cloudron/base:4.2.0",
+ "ports": {
+ "9080/tcp": "APISIX HTTP/HTTPS Port"
+ },
+ "healthCheck": {
+ "url": "/"
+ }
+ },
+ "manifestVersion": 2,
+ "addons": {
+ "etcd": {}
+ },
+ "environment": {
+ "APISIX_ETCD_HOST": {
+ "type": "string",
+ "description": "etcd host for APISIX",
+ "required": true
+ },
+ "APISIX_ETCD_PORT": {
+ "type": "string",
+ "description": "etcd port for APISIX",
+ "required": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/CloudronPackages/APISIX/Dockerfile b/CloudronPackages/APISIX/Dockerfile
new file mode 100644
index 0000000..0776c2a
--- /dev/null
+++ b/CloudronPackages/APISIX/Dockerfile
@@ -0,0 +1,58 @@
+FROM cloudron/base:4.2.0 AS build
+
+ENV DEBIAN_FRONTEND=noninteractive
+ENV ENV_INST_LUADIR=/usr/local/apisix
+
+COPY apisix-source /apisix
+
+WORKDIR /apisix
+
+RUN set -x
+ && apt-get -y update --fix-missing
+ && apt-get install -y
+ make
+ git
+ sudo
+ libyaml-dev
+ libldap2-dev
+ && make deps
+ && mkdir -p ${ENV_INST_LUADIR}
+ && cp -r deps ${ENV_INST_LUADIR}
+ && make install
+
+FROM cloudron/base:4.2.0
+
+# Install the runtime libyaml package
+RUN apt-get -y update --fix-missing
+ && apt-get install -y libyaml-0-2
+ && apt-get remove --purge --auto-remove -y
+ && mkdir -p /usr/local/apisix/ui
+
+COPY --from=build /usr/local/apisix /usr/local/apisix
+COPY --from=build /usr/local/openresty /usr/local/openresty
+COPY --from=build /usr/bin/apisix /usr/bin/apisix
+# Assuming UI files are in apisix-source/ui, adjust if needed
+COPY apisix-source/ui/ /usr/local/apisix/ui/
+
+# Install brotli (from upstream install-brotli.sh)
+RUN apt-get update && apt-get install -y
+ libbrotli-dev
+ --no-install-recommends &&
+ rm -rf /var/lib/apt/lists/*
+
+ENV PATH=$PATH:/usr/local/openresty/luajit/bin:/usr/local/openresty/nginx/sbin:/usr/local/openresty/bin
+
+WORKDIR /usr/local/apisix
+
+RUN ln -sf /dev/stdout /usr/local/apisix/logs/access.log
+ && ln -sf /dev/stderr /usr/local/apisix/logs/error.log
+
+EXPOSE 9080 9443
+
+# Copy our custom start.sh
+COPY start.sh /usr/local/bin/start.sh
+RUN chmod +x /usr/local/bin/start.sh
+
+ENTRYPOINT ["/usr/local/bin/start.sh"]
+
+STOPSIGNAL SIGQUIT
diff --git a/CloudronPackages/APISIX/apisix-source/.devcontainer/Dockerfile b/CloudronPackages/APISIX/apisix-source/.devcontainer/Dockerfile
new file mode 100644
index 0000000..4402db7
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.devcontainer/Dockerfile
@@ -0,0 +1,38 @@
+#
+# 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.
+#
+
+FROM ubuntu:24.04
+
+RUN apt update && export DEBIAN_FRONTEND=noninteractive \
+ && apt install -y sudo git make gcc tini
+
+COPY Makefile .requirements apisix-master-0.rockspec ./
+COPY utils/install-dependencies.sh utils/linux-install-luarocks.sh utils/
+
+RUN make install-runtime
+
+RUN cpanm --notest Test::Nginx IPC::Run > build.log 2>&1 || (cat build.log && exit 1)
+
+ARG ETCD_VER=v3.5.17
+ARG BUILDARCH
+RUN curl -L https://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-${BUILDARCH}.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-${BUILDARCH}.tar.gz \
+ && mkdir -p /tmp/etcd-download-test \
+ && tar xzvf /tmp/etcd-${ETCD_VER}-linux-${BUILDARCH}.tar.gz -C /tmp/etcd-download-test --strip-components=1 \
+ && mv /tmp/etcd-download-test/etcdctl /usr/bin \
+ && rm -rf /tmp/*
+
+ENTRYPOINT [ "tini", "--" ]
diff --git a/CloudronPackages/APISIX/apisix-source/.devcontainer/devcontainer.json b/CloudronPackages/APISIX/apisix-source/.devcontainer/devcontainer.json
new file mode 100644
index 0000000..7151076
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.devcontainer/devcontainer.json
@@ -0,0 +1,14 @@
+{
+ "name": "APISIX",
+ "dockerComposeFile": ["docker-compose.yml"],
+ "service": "apisix",
+ "workspaceFolder": "/workspace",
+ "privileged": true,
+ "postCreateCommand": "bash -c 'cd /workspace && rm -rf test-nginx && git config --global --add safe.directory /workspace && git submodule update --init --recursive && git clone https://github.com/openresty/test-nginx.git --depth 1 --single-branch -b master && make deps'",
+ "customizations": {
+ "vscode": {
+ "extensions": ["ms-vscode.makefile-tools", "ms-azuretools.vscode-docker", "sumneko.lua"]
+ }
+ },
+ "forwardPorts": [9080, 9180, 2379]
+}
diff --git a/CloudronPackages/APISIX/apisix-source/.devcontainer/docker-compose.yml b/CloudronPackages/APISIX/apisix-source/.devcontainer/docker-compose.yml
new file mode 100644
index 0000000..f238f23
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.devcontainer/docker-compose.yml
@@ -0,0 +1,37 @@
+#
+# 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.
+#
+
+services:
+ apisix:
+ build:
+ context: ..
+ dockerfile: .devcontainer/Dockerfile
+ command: sleep infinity
+ volumes:
+ - ..:/workspace:cached
+ network_mode: service:etcd
+ etcd:
+ image: bitnami/etcd:3.5
+ volumes:
+ - etcd_data:/bitnami/etcd
+ environment:
+ ALLOW_NONE_AUTHENTICATION: "yes"
+ ETCD_ADVERTISE_CLIENT_URLS: "http://127.0.0.1:2379"
+ ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
+
+volumes:
+ etcd_data:
diff --git a/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/bug_report.yml b/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 0000000..de8c29d
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,68 @@
+name: "Bug Report"
+description: Report a bug to help improve the project.
+title: "bug: "
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thank you for taking the time to report this bug!
+
+ _The more information you share, the faster we can identify and fix the bug._
+
+ Prior to opening the issue, please make sure that you:
+
+ - Use English to communicate.
+ - Search the [open issues](https://github.com/apache/apisix/issues) and [discussion forum](https://github.com/apache/apisix/discussions) to avoid duplicating the issue.
+
+ - type: textarea
+ id: current-behavior
+ attributes:
+ label: Current Behavior
+ description: Describe the issue you are facing.
+ placeholder: |
+ What is the issue with the current behavior?
+ validations:
+ required: true
+ - type: textarea
+ id: expected-behavior
+ attributes:
+ label: Expected Behavior
+ description: Describe what you expected to happen.
+ placeholder: |
+ What did you expect to happen instead?
+ validations:
+ required: false
+ - type: textarea
+ id: error
+ attributes:
+ label: Error Logs
+ description: Paste the error logs if any. You can change the [log level](https://github.com/apache/apisix/blob/617c325628f33961be67f61f0fa8002afc370e42/docs/en/latest/FAQ.md#how-to-change-the-log-level) to get a verbose error log.
+ validations:
+ required: false
+ - type: textarea
+ id: steps
+ attributes:
+ label: Steps to Reproduce
+ description: Share the steps you took so that we can reproduce the issue. Reports without proper steps details will likely be closed.
+ placeholder: |
+ 1. Run APISIX via the Docker image.
+ 2. Create a Route with the Admin API.
+ 3. Try configuring ...
+ 4. ...
+ validations:
+ required: true
+ - type: textarea
+ id: environment
+ attributes:
+ label: Environment
+ description: Share your environment details. Reports without proper environment details will likely be closed.
+ value: |
+ - APISIX version (run `apisix version`):
+ - Operating system (run `uname -a`):
+ - OpenResty / Nginx version (run `openresty -V` or `nginx -V`):
+ - etcd version, if relevant (run `curl http://127.0.0.1:9090/v1/server_info`):
+ - APISIX Dashboard version, if relevant:
+ - Plugin runner version, for issues related to plugin runners:
+ - LuaRocks version, for installation issues (run `luarocks --version`):
+ validations:
+ required: true
diff --git a/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/config.yml b/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..f07f3eb
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+ - name: APISIX Discussion Forum
+ url: https://github.com/apache/apisix/discussions
+ about: Please ask and answer questions here.
diff --git a/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/feature_request.yml b/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/feature_request.yml
new file mode 100644
index 0000000..a2b5714
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -0,0 +1,23 @@
+name: "Feature Request"
+description: Suggest an enhancement to APISIX.
+title: "feat: As a user, I want to ..., so that ..."
+body:
+ - type: markdown
+ attributes:
+ value: |
+ _The more information you share, the faster we can help you._
+
+ Prior to opening the issue, please make sure that you:
+
+ - Use English to communicate.
+ - Search the [open issues](https://github.com/apache/apisix/issues) and [discussion forum](https://github.com/apache/apisix/discussions) to avoid duplicating the issue.
+
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: Describe the feature you would like to see.
+ placeholder: |
+ As a user, I want to ..., so that...
+ validations:
+ required: true
diff --git a/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/improve_docs.yml b/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/improve_docs.yml
new file mode 100644
index 0000000..ef737b0
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/improve_docs.yml
@@ -0,0 +1,33 @@
+name: "Documentation Issue"
+description: Issues related to documentation.
+title: "docs: "
+labels: [doc]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ _The more information you share, the faster we can help you._
+
+ Prior to opening the issue, please make sure that you:
+
+ - Use English to communicate.
+ - Search the [open issues](https://github.com/apache/apisix/issues) and [discussion forum](https://github.com/apache/apisix/discussions) to avoid duplicating the issue.
+
+ - type: textarea
+ id: current-state
+ attributes:
+ label: Current State
+ description: Describe the current state of the documentation.
+ placeholder: |
+ The documentation for the API in this page (url) is missing ...
+ validations:
+ required: true
+ - type: textarea
+ id: desired-state
+ attributes:
+ label: Desired State
+ description: Describe the desired state the documentation should be in.
+ placeholder: |
+ There should be line mentioning how the API behaves when ...
+ validations:
+ required: true
diff --git a/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/request_help.yml b/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/request_help.yml
new file mode 100644
index 0000000..dc0d6b9
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/ISSUE_TEMPLATE/request_help.yml
@@ -0,0 +1,36 @@
+name: "Request Help"
+description: Stuck? Ask for help!
+title: "help request: "
+body:
+ - type: markdown
+ attributes:
+ value: |
+ _The more information you share, the faster we can help you._
+
+ Prior to opening the issue, please make sure that you:
+
+ - Use English to communicate.
+ - Search the [open issues](https://github.com/apache/apisix/issues) and [discussion forum](https://github.com/apache/apisix/discussions) to avoid duplicating the issue.
+
+ - type: textarea
+ id: description
+ attributes:
+ label: Description
+ description: Describe the issue you are facing and what you need help with.
+ validations:
+ required: true
+ - type: textarea
+ id: environment
+ attributes:
+ label: Environment
+ description: Share your environment details. Reports without proper environment details will likely be closed.
+ value: |
+ - APISIX version (run `apisix version`):
+ - Operating system (run `uname -a`):
+ - OpenResty / Nginx version (run `openresty -V` or `nginx -V`):
+ - etcd version, if relevant (run `curl http://127.0.0.1:9090/v1/server_info`):
+ - APISIX Dashboard version, if relevant:
+ - Plugin runner version, for issues related to plugin runners:
+ - LuaRocks version, for installation issues (run `luarocks --version`):
+ validations:
+ required: true
diff --git a/CloudronPackages/APISIX/apisix-source/.github/PULL_REQUEST_TEMPLATE.md b/CloudronPackages/APISIX/apisix-source/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..5860ce4
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,33 @@
+### Description
+
+
+
+
+#### Which issue(s) this PR fixes:
+
+Fixes #
+
+### Checklist
+
+- [ ] I have explained the need for this PR and the problem it solves
+- [ ] I have explained the changes or the new features added to this PR
+- [ ] I have added tests corresponding to this change
+- [ ] I have updated the documentation to reflect this change
+- [ ] I have verified that this change is backward compatible (If not, please discuss on the [APISIX mailing list](https://github.com/apache/apisix/tree/master#community) first)
+
+
diff --git a/CloudronPackages/APISIX/apisix-source/.github/dependabot.yml b/CloudronPackages/APISIX/apisix-source/.github/dependabot.yml
new file mode 100644
index 0000000..5737055
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/dependabot.yml
@@ -0,0 +1,10 @@
+# Set update schedule for GitHub Actions
+
+version: 2
+updates:
+
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ # Check for updates to GitHub Actions every weekday
+ interval: "daily"
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/build.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/build.yml
new file mode 100644
index 0000000..185d919
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/build.yml
@@ -0,0 +1,177 @@
+name: CI
+
+on:
+ push:
+ branches: [master, 'release/**']
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+ pull_request:
+ branches: [master, 'release/**']
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.run_number || github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ - ubuntu-latest
+ os_name:
+ - linux_openresty
+ events_module:
+ - lua-resty-worker-events
+ - lua-resty-events
+ test_dir:
+ - t/plugin/[a-k]*
+ - t/plugin/[l-z]*
+ - t/admin t/cli t/config-center-yaml t/control t/core t/debug t/discovery t/error_page t/http3/admin t/misc
+ - t/node t/pubsub t/router t/script t/secret t/stream-node t/utils t/wasm t/xds-library t/xrpc
+
+ runs-on: ${{ matrix.platform }}
+ timeout-minutes: 90
+ env:
+ SERVER_NAME: ${{ matrix.os_name }}
+ OPENRESTY_VERSION: default
+
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version: "1.17"
+
+ - name: Cache deps
+ uses: actions/cache@v4
+ env:
+ cache-name: cache-deps
+ with:
+ path: deps
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ matrix.os_name }}-${{ hashFiles('apisix-master-0.rockspec') }}
+
+ - name: Extract test type
+ shell: bash
+ id: test_env
+ run: |
+ test_dir="${{ matrix.test_dir }}"
+ if [[ $test_dir =~ 't/plugin' ]]; then
+ echo "type=plugin" >>$GITHUB_OUTPUT
+ fi
+ if [[ $test_dir =~ 't/admin ' ]]; then
+ echo "type=first" >>$GITHUB_OUTPUT
+ fi
+ if [[ $test_dir =~ ' t/xrpc' ]]; then
+ echo "type=last" >>$GITHUB_OUTPUT
+ fi
+
+ - name: Free disk space
+ run: |
+ bash ./ci/free_disk_space.sh
+
+ - name: Linux Before install
+ run: sudo ./ci/${{ matrix.os_name }}_runner.sh before_install
+
+ - name: Linux Install
+ run: |
+ sudo --preserve-env=OPENRESTY_VERSION \
+ ./ci/${{ matrix.os_name }}_runner.sh do_install
+
+ - name: Linux launch common services
+ run: |
+ make ci-env-up project_compose_ci=ci/pod/docker-compose.common.yml
+ sudo ./ci/init-common-test-service.sh
+
+ - name: Cache images
+ id: cache-images
+ uses: actions/cache@v4
+ env:
+ cache-name: cache-apisix-docker-images
+ with:
+ path: docker-images-backup
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ steps.test_env.outputs.type }}-${{ hashFiles(format('./ci/pod/docker-compose.{0}.yml', steps.test_env.outputs.type )) }}
+
+ - if: ${{ steps.cache-images.outputs.cache-hit == 'true' }}
+ name: Load saved docker images
+ run: |
+ if [[ -f docker-images-backup/apisix-images.tar ]]; then
+ [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh before
+ docker load --input docker-images-backup/apisix-images.tar
+ echo "loaded docker images"
+
+ # preserve storage space
+ rm docker-images-backup/apisix-images.tar
+
+ make ci-env-up project_compose_ci=ci/pod/docker-compose.${{ steps.test_env.outputs.type }}.yml
+ if [[ ${{ steps.test_env.outputs.type }} != first ]]; then
+ sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh after
+ fi
+ fi
+ - if: ${{ steps.cache-images.outputs.cache-hit != 'true' }}
+ name: Linux launch services
+ run: |
+ [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh before
+ [[ ${{ steps.test_env.outputs.type }} == plugin ]] && ./ci/pod/openfunction/build-function-image.sh
+ make ci-env-up project_compose_ci=ci/pod/docker-compose.${{ steps.test_env.outputs.type }}.yml
+ [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh after
+ echo "Linux launch services, done."
+ - name: Start Dubbo Backend
+ if: matrix.os_name == 'linux_openresty' && (steps.test_env.outputs.type == 'plugin' || steps.test_env.outputs.type == 'last')
+ run: |
+ cur_dir=$(pwd)
+ sudo apt update
+ sudo apt install -y maven openjdk-8-jdk
+ sudo update-java-alternatives --set java-1.8.0-openjdk-amd64
+ export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
+ export PATH=$JAVA_HOME/bin:$PATH
+ cd t/lib/dubbo-backend
+ mvn package
+ cd dubbo-backend-provider/target
+ java \
+ -Djava.net.preferIPv4Stack=true \
+ -jar dubbo-demo-provider.one-jar.jar > /tmp/java.log &
+ cd $cur_dir/t/lib/dubbo-serialization-backend
+ mvn package
+ cd dubbo-serialization-backend-provider/target
+ java \
+ -Djava.net.preferIPv4Stack=true \
+ -jar dubbo-demo-provider.one-jar.jar > /tmp/java2.log &
+
+ - name: Build xDS library
+ if: steps.test_env.outputs.type == 'last'
+ run: |
+ cd t/xds-library
+ go build -o libxds.so -buildmode=c-shared main.go export.go
+
+ - name: Build wasm code
+ if: matrix.os_name == 'linux_openresty' && steps.test_env.outputs.type == 'last'
+ run: |
+ export TINYGO_VER=0.20.0
+ wget https://github.com/tinygo-org/tinygo/releases/download/v${TINYGO_VER}/tinygo_${TINYGO_VER}_amd64.deb 2>/dev/null
+ sudo dpkg -i tinygo_${TINYGO_VER}_amd64.deb
+ cd t/wasm && find . -type f -name "*.go" | xargs -Ip tinygo build -o p.wasm -scheduler=none -target=wasi p
+
+ - name: Linux Script
+ env:
+ TEST_FILE_SUB_DIR: ${{ matrix.test_dir }}
+ TEST_EVENTS_MODULE: ${{ matrix.events_module }}
+ run: sudo -E ./ci/${{ matrix.os_name }}_runner.sh script
+
+ - if: ${{ steps.cache-images.outputs.cache-hit != 'true' }}
+ name: Save docker images
+ run: |
+ echo "start backing up, $(date)"
+ bash ./ci/backup-docker-images.sh ${{ steps.test_env.outputs.type }}
+ echo "backup done, $(date)"
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/check-changelog.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/check-changelog.yml
new file mode 100644
index 0000000..0efef10
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/check-changelog.yml
@@ -0,0 +1,27 @@
+name: Check Changelog
+
+on:
+ push:
+ paths:
+ - 'CHANGELOG.md'
+ - 'ci/check_changelog_prs.ts'
+ pull_request:
+ paths:
+ - 'CHANGELOG.md'
+ - 'ci/check_changelog_prs.ts'
+
+jobs:
+ check-changelog:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+
+ - name: Run check_changelog_prs script
+ working-directory: ci
+ run: |
+ curl -fsSL https://bun.sh/install | bash
+ export PATH="$HOME/.bun/bin:$PATH"
+ bun run check_changelog_prs.ts
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/cli.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/cli.yml
new file mode 100644
index 0000000..1840f9a
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/cli.yml
@@ -0,0 +1,68 @@
+name: CLI Test
+
+on:
+ push:
+ branches: [master, 'release/**']
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+ pull_request:
+ branches: [master, 'release/**']
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.run_number || github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ - ubuntu-latest
+ job_name:
+ - linux_apisix_current_luarocks
+ - linux_apisix_current_luarocks_in_customed_nginx
+
+ runs-on: ${{ matrix.platform }}
+ timeout-minutes: 30
+ env:
+ SERVER_NAME: ${{ matrix.job_name }}
+ OPENRESTY_VERSION: default
+
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Cache deps
+ uses: actions/cache@v4
+ env:
+ cache-name: cache-deps
+ with:
+ path: deps
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ matrix.job_name }}-${{ hashFiles('apisix-master-0.rockspec') }}
+
+ - name: Linux launch common services
+ run: |
+ project_compose_ci=ci/pod/docker-compose.common.yml make ci-env-up
+
+ - name: Linux Before install
+ run: sudo ./ci/${{ matrix.job_name }}_runner.sh before_install
+
+ - name: Linux Install
+ run: |
+ sudo --preserve-env=OPENRESTY_VERSION \
+ ./ci/${{ matrix.job_name }}_runner.sh do_install
+
+ - name: Linux Script
+ run: |
+ sudo chmod +x /home/runner
+ sudo ./ci/${{ matrix.job_name }}_runner.sh script
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/close-unresponded.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/close-unresponded.yml
new file mode 100644
index 0000000..9508af7
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/close-unresponded.yml
@@ -0,0 +1,39 @@
+name: Check Issues
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 10 * * *'
+
+permissions:
+ contents: read
+
+jobs:
+ prune_stale:
+ permissions:
+ issues: write # for actions/stale to close stale issues
+ name: Prune Unresponded
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+
+ steps:
+ - name: Prune Stale
+ uses: actions/stale@v8
+ with:
+ days-before-issue-stale: 60
+ days-before-issue-close: 3
+ stale-issue-message: >
+ Due to lack of the reporter's response this issue has been labeled with "no response".
+ It will be close in 3 days if no further activity occurs. If this issue is still
+ relevant, please simply write any comment. Even if closed, you can still revive the
+ issue at any time or discuss it on the dev@apisix.apache.org list.
+ Thank you for your contributions.
+ close-issue-message: >
+ This issue has been closed due to lack of activity. If you think that
+ is incorrect, or the issue requires additional review, you can revive the issue at
+ any time.
+ # Issues with these labels will never be considered stale.
+ only-labels: 'wait for update'
+ stale-issue-label: 'no response'
+ exempt-issue-labels: "don't close"
+ ascending: true
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/code-lint.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/code-lint.yml
new file mode 100644
index 0000000..0fdbf28
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/code-lint.yml
@@ -0,0 +1,48 @@
+name: Code Lint
+
+on:
+ pull_request:
+ branches: [master, 'release/**']
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+
+permissions:
+ contents: read
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install
+ run: |
+ . ./ci/common.sh
+ export_or_prefix
+ export OPENRESTY_VERSION=default
+
+ sudo -E ./ci/linux-install-openresty.sh
+ ./utils/linux-install-luarocks.sh
+ sudo -E luarocks install luacheck
+
+ - name: Script
+ run: |
+ . ./ci/common.sh
+ export_or_prefix
+ make lint
+
+ sc-lint:
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Shellcheck code
+ run: |
+ scversion="latest"
+ wget -qO- "https://github.com/koalaman/shellcheck/releases/download/${scversion?}/shellcheck-${scversion?}.linux.x86_64.tar.xz" | tar -xJv
+ cp -av "shellcheck-${scversion}/shellcheck" /usr/local/bin/
+ shellcheck --version
+ git ls-files -- "*.sh" | xargs -t shellcheck
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/doc-lint.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/doc-lint.yml
new file mode 100644
index 0000000..962671d
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/doc-lint.yml
@@ -0,0 +1,58 @@
+name: Doc Lint
+
+on:
+ push:
+ paths:
+ - "docs/**"
+ - "**/*.md"
+ - ".github/workflows/doc-lint.yml"
+ pull_request:
+ branches: [master, "release/**"]
+ paths:
+ - "docs/**"
+ - "**/*.md"
+ - ".github/workflows/doc-lint.yml"
+
+permissions:
+ contents: read
+
+jobs:
+ markdownlint:
+ name: 🍇 Markdown
+ runs-on: ubuntu-latest
+ timeout-minutes: 1
+ steps:
+ - uses: actions/checkout@v4
+ - name: 🚀 Use Node.js
+ uses: actions/setup-node@v4.4.0
+ with:
+ node-version: "12.x"
+ - run: npm install -g markdownlint-cli@0.25.0
+ - run: markdownlint '**/*.md'
+ - name: check category
+ run: |
+ ./utils/check-category.py
+ - name: check Chinese doc
+ run: |
+ sudo pip3 install zhon
+ ./utils/fix-zh-doc-segment.py > \
+ /tmp/check.log 2>&1 || (cat /tmp/check.log && exit 1)
+ if grep "find broken newline in file: " /tmp/check.log; then
+ cat /tmp/check.log
+ echo "Newline can't appear in the middle of Chinese sentences."
+ echo "You need to run ./utils/fix-zh-doc-segment.py to fix them."
+ exit 1
+ fi
+
+ Chinse-Copywriting-lint:
+ name: Chinese Copywriting
+ runs-on: ubuntu-latest
+ timeout-minutes: 1
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - name: Check Chinese copywriting
+ uses: ./.github/actions/autocorrect
+ with:
+ args: autocorrect --lint --no-diff-bg-color ./docs/zh/latest/
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/gm-cron.yaml.disabled b/CloudronPackages/APISIX/apisix-source/.github/workflows/gm-cron.yaml.disabled
new file mode 100644
index 0000000..46447e4
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/gm-cron.yaml.disabled
@@ -0,0 +1,182 @@
+name: CI GM (cron)
+
+on:
+ schedule:
+ # UTC 7:30 every Friday
+ - cron: "30 7 * * 5"
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ - ubuntu-latest
+ os_name:
+ - linux_openresty_tongsuo
+ test_dir:
+ - t/plugin/[a-k]*
+ - t/plugin/[l-z]*
+ - t/admin t/cli t/config-center-yaml t/control t/core t/debug t/discovery t/error_page t/misc
+ - t/node t/pubsub t/router t/script t/stream-node t/utils t/wasm t/xds-library t/xrpc
+
+ runs-on: ${{ matrix.platform }}
+ timeout-minutes: 90
+ env:
+ SERVER_NAME: ${{ matrix.os_name }}
+ OPENRESTY_VERSION: default
+
+ # TODO: refactor the workflows to reduce duplicate parts. Maybe we can write them in shell
+ # scripts or a separate action?
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Setup Go
+ uses: actions/setup-go@v5
+ with:
+ go-version: "1.17"
+
+ - name: Cache deps
+ uses: actions/cache@v4
+ env:
+ cache-name: cache-deps
+ with:
+ path: deps
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ matrix.os_name }}-${{ hashFiles('apisix-master-0.rockspec') }}
+
+ - name: Cache Tongsuo compilation
+ id: cache-tongsuo
+ uses: actions/cache@v4
+ env:
+ cache-name: cache-tongsuo
+ with:
+ path: ./tongsuo
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ matrix.os_name }}-tongsuo-ver
+
+ - name: Test SSL Env
+ id: test_ssl_env
+ shell: bash
+ if: steps.cache-tongsuo.outputs.cache-hit != 'true'
+ run: |
+ echo "compile_tongsuo=true" >>$GITHUB_OUTPUT
+
+ - name: Extract test type
+ shell: bash
+ id: test_env
+ run: |
+ test_dir="${{ matrix.test_dir }}"
+ if [[ $test_dir =~ 't/plugin' ]]; then
+ echo "type=plugin" >>$GITHUB_OUTPUT
+ fi
+ if [[ $test_dir =~ 't/admin ' ]]; then
+ echo "type=first" >>$GITHUB_OUTPUT
+ fi
+ if [[ $test_dir =~ ' t/xrpc' ]]; then
+ echo "type=last" >>$GITHUB_OUTPUT
+ fi
+
+ - name: Free disk space
+ run: |
+ bash ./ci/free_disk_space.sh
+
+ - name: Linux launch common services
+ run: |
+ make ci-env-up project_compose_ci=ci/pod/docker-compose.common.yml
+ sudo ./ci/init-common-test-service.sh
+
+ - name: Cache images
+ id: cache-images
+ uses: actions/cache@v4
+ env:
+ cache-name: cache-apisix-docker-images
+ with:
+ path: docker-images-backup
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ steps.test_env.outputs.type }}-${{ hashFiles(format('./ci/pod/docker-compose.{0}.yml', steps.test_env.outputs.type )) }}
+
+ - if: ${{ steps.cache-images.outputs.cache-hit == 'true' }}
+ name: Load saved docker images
+ run: |
+ if [[ -f docker-images-backup/apisix-images.tar ]]; then
+ [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh before
+ docker load --input docker-images-backup/apisix-images.tar
+ rm docker-images-backup/apisix-images.tar
+ make ci-env-up project_compose_ci=ci/pod/docker-compose.${{ steps.test_env.outputs.type }}.yml
+ echo "loaded docker images"
+ if [[ ${{ steps.test_env.outputs.type }} != first ]]; then
+ sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh after
+ fi
+ fi
+ - if: ${{ steps.cache-images.outputs.cache-hit != 'true' }}
+ name: Linux launch services
+ run: |
+ [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh before
+ [[ ${{ steps.test_env.outputs.type }} == plugin ]] && ./ci/pod/openfunction/build-function-image.sh
+ make ci-env-up project_compose_ci=ci/pod/docker-compose.${{ steps.test_env.outputs.type }}.yml
+ [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh after
+ echo "Linux launch services, done."
+
+ - name: Start Dubbo Backend
+ if: steps.test_env.outputs.type == 'plugin'
+ run: |
+ cur_dir=$(pwd)
+ sudo apt update
+ sudo apt install -y maven openjdk-8-jdk
+ sudo update-java-alternatives --set java-1.8.0-openjdk-amd64
+ export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
+ export PATH=$JAVA_HOME/bin:$PATH
+ cd t/lib/dubbo-backend
+ mvn package
+ cd dubbo-backend-provider/target
+ java \
+ -Djava.net.preferIPv4Stack=true \
+ -jar dubbo-demo-provider.one-jar.jar > /tmp/java.log &
+ cd $cur_dir/t/lib/dubbo-serialization-backend
+ mvn package
+ cd dubbo-serialization-backend-provider/target
+ java \
+ -Djava.net.preferIPv4Stack=true \
+ -jar dubbo-demo-provider.one-jar.jar > /tmp/java2.log &
+
+ - name: Build xDS library
+ if: steps.test_env.outputs.type == 'last'
+ run: |
+ cd t/xds-library
+ go build -o libxds.so -buildmode=c-shared main.go export.go
+
+ - name: Build wasm code
+ if: steps.test_env.outputs.type == 'last'
+ run: |
+ export TINYGO_VER=0.20.0
+ wget https://github.com/tinygo-org/tinygo/releases/download/v${TINYGO_VER}/tinygo_${TINYGO_VER}_amd64.deb 2>/dev/null
+ sudo dpkg -i tinygo_${TINYGO_VER}_amd64.deb
+ cd t/wasm && find . -type f -name "*.go" | xargs -Ip tinygo build -o p.wasm -scheduler=none -target=wasi p
+
+ - name: Linux Before install
+ env:
+ COMPILE_TONGSUO: ${{ steps.test_ssl_env.outputs.compile_tongsuo }}
+ run: |
+ sudo --preserve-env=COMPILE_TONGSUO \
+ ./ci/${{ matrix.os_name }}_runner.sh before_install
+
+ - name: Linux Install
+ run: |
+ sudo --preserve-env=OPENRESTY_VERSION \
+ ./ci/${{ matrix.os_name }}_runner.sh do_install
+
+ - name: Linux Script
+ env:
+ TEST_FILE_SUB_DIR: ${{ matrix.test_dir }}
+ run: sudo -E ./ci/${{ matrix.os_name }}_runner.sh script
+
+ - if: ${{ steps.cache-images.outputs.cache-hit != 'true' }}
+ name: Save docker images
+ run: |
+ echo "start backing up, $(date)"
+ bash ./ci/backup-docker-images.sh ${{ steps.test_env.outputs.type }}
+ echo "backup done, $(date)"
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/gm.yml.disabled b/CloudronPackages/APISIX/apisix-source/.github/workflows/gm.yml.disabled
new file mode 100644
index 0000000..44260e0
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/gm.yml.disabled
@@ -0,0 +1,93 @@
+name: CI GM
+
+on:
+ push:
+ branches: [master]
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+ pull_request:
+ branches: [master]
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.run_number || github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ - ubuntu-latest
+ os_name:
+ - linux_openresty_tongsuo
+ test_dir:
+ - t/gm
+
+ runs-on: ${{ matrix.platform }}
+ timeout-minutes: 90
+ env:
+ SERVER_NAME: ${{ matrix.os_name }}
+ OPENRESTY_VERSION: default
+
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Cache deps
+ uses: actions/cache@v4
+ env:
+ cache-name: cache-deps
+ with:
+ path: deps
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ matrix.os_name }}-${{ hashFiles('apisix-master-0.rockspec') }}
+
+ - name: Cache Tongsuo compilation
+ id: cache-tongsuo
+ uses: actions/cache@v4
+ env:
+ cache-name: cache-tongsuo
+ with:
+ path: ./tongsuo
+ # TODO: use a fixed release once they have created one.
+ # See https://github.com/Tongsuo-Project/Tongsuo/issues/318
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ matrix.os_name }}-tongsuo-ver
+
+ - name: Test SSL Env
+ id: test_ssl_env
+ shell: bash
+ if: steps.cache-tongsuo.outputs.cache-hit != 'true'
+ run: |
+ echo "compile_tongsuo=true" >>$GITHUB_OUTPUT
+
+ - name: Linux launch common services
+ run: |
+ make ci-env-up project_compose_ci=ci/pod/docker-compose.common.yml
+ sudo ./ci/init-common-test-service.sh
+
+ - name: Linux Before install
+ env:
+ COMPILE_TONGSUO: ${{ steps.test_ssl_env.outputs.compile_tongsuo }}
+ run: |
+ sudo --preserve-env=COMPILE_TONGSUO \
+ ./ci/${{ matrix.os_name }}_runner.sh before_install
+
+ - name: Linux Do install
+ run: |
+ sudo --preserve-env=OPENRESTY_VERSION \
+ ./ci/${{ matrix.os_name }}_runner.sh do_install
+
+ - name: Linux Script
+ env:
+ TEST_FILE_SUB_DIR: ${{ matrix.test_dir }}
+ run: |
+ sudo -E ./ci/${{ matrix.os_name }}_runner.sh script
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/kubernetes-ci.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/kubernetes-ci.yml
new file mode 100644
index 0000000..16f3343
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/kubernetes-ci.yml
@@ -0,0 +1,79 @@
+name: CI Kubernetes
+
+on:
+ push:
+ branches: [ master, 'release/**' ]
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+ pull_request:
+ branches: [ master, 'release/**' ]
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.run_number || github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ kubernetes-discovery:
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ - ubuntu-latest
+ os_name:
+ - linux_openresty
+
+ runs-on: ${{ matrix.platform }}
+ timeout-minutes: 15
+ env:
+ SERVER_NAME: ${{ matrix.os_name }}
+ OPENRESTY_VERSION: default
+
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Setup kubernetes cluster
+ run: |
+ KUBERNETES_VERSION="v1.22.7"
+
+ kind create cluster --name apisix-test --config ./t/kubernetes/configs/kind.yaml --image kindest/node:${KUBERNETES_VERSION}
+
+ kubectl wait --for=condition=Ready nodes --all --timeout=180s
+
+ kubectl apply -f ./t/kubernetes/configs/account.yaml
+
+ kubectl apply -f ./t/kubernetes/configs/endpoint.yaml
+
+ KUBERNETES_CLIENT_TOKEN_CONTENT=$(kubectl get secrets | grep apisix-test | awk '{system("kubectl get secret -o jsonpath={.data.token} "$1" | base64 --decode")}')
+
+ KUBERNETES_CLIENT_TOKEN_DIR="/tmp/var/run/secrets/kubernetes.io/serviceaccount"
+
+ KUBERNETES_CLIENT_TOKEN_FILE=${KUBERNETES_CLIENT_TOKEN_DIR}/token
+
+ mkdir -p ${KUBERNETES_CLIENT_TOKEN_DIR}
+ echo -n "$KUBERNETES_CLIENT_TOKEN_CONTENT" > ${KUBERNETES_CLIENT_TOKEN_FILE}
+
+ echo 'KUBERNETES_SERVICE_HOST=127.0.0.1'
+ echo 'KUBERNETES_SERVICE_PORT=6443'
+ echo 'KUBERNETES_CLIENT_TOKEN='"${KUBERNETES_CLIENT_TOKEN_CONTENT}"
+ echo 'KUBERNETES_CLIENT_TOKEN_FILE='${KUBERNETES_CLIENT_TOKEN_FILE}
+
+ kubectl proxy -p 6445 &
+
+ - name: Linux Install
+ run: |
+ sudo ./ci/${{ matrix.os_name }}_runner.sh before_install
+ sudo --preserve-env=OPENRESTY_VERSION ./ci/${{ matrix.os_name }}_runner.sh do_install
+
+ - name: Run test cases
+ run: |
+ ./ci/kubernetes-ci.sh run_case
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/license-checker.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/license-checker.yml
new file mode 100644
index 0000000..bae5d6c
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/license-checker.yml
@@ -0,0 +1,37 @@
+#
+# 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.
+#
+name: License checker
+
+on:
+ push:
+ branches: [master, 'release/**']
+ pull_request:
+ branches: [master, 'release/**']
+
+jobs:
+ check-license:
+ runs-on: ubuntu-latest
+ timeout-minutes: 3
+
+ steps:
+ - uses: actions/checkout@v4
+ - name: Check License Header
+ uses: apache/skywalking-eyes@v0.6.0
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/link-check.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/link-check.yml
new file mode 100644
index 0000000..75758a9
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/link-check.yml
@@ -0,0 +1,49 @@
+name: 'Link Checker'
+
+# **What it does**: Renders the content of every page and check all internal links.
+# **Why we have it**: To make sure all links connect correctly.
+# **Who does it impact**: Docs content.
+
+on:
+ workflow_dispatch:
+ push:
+ # branches: [master, 'release/**']
+ paths:
+ - '**/*.md'
+ - '**/link-check.yml'
+ pull_request:
+ branches: [master, "release/**"]
+ paths:
+ - '**/*.md'
+ - '**/link-check.yml'
+
+permissions:
+ contents: read
+ # Needed for the 'trilom/file-changes-action' action
+ pull-requests: read
+
+# This allows a subsequently queued workflow run to interrupt previous runs
+concurrency:
+ group: '${{ github.workflow }} @ ${{ github.event.pull_request.head.label || github.head_ref || github.ref }}'
+ cancel-in-progress: true
+
+jobs:
+ check-links:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Get script
+ run: |
+ wget https://raw.githubusercontent.com/xuruidong/markdown-link-checker/main/link_checker.py
+
+ - name: Setup python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.9'
+
+ - name: Link check (critical, all files)
+ run: |
+ # python link_checker.py ./ --enable-external --ignore "http://apisix.iresty.com" "https://www.upyun.com" "https://github.com/apache/apisix/actions/workflows/build.yml/badge.svg" "https://httpbin.org/" "https://en.wikipedia.org/wiki/Cache"
+ python link_checker.py ./
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/lint.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/lint.yml
new file mode 100644
index 0000000..a3244ca
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/lint.yml
@@ -0,0 +1,46 @@
+name: ❄️ Lint
+
+on: [push, pull_request]
+
+permissions:
+ contents: read
+
+jobs:
+ misc:
+ name: misc checker
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out code.
+ uses: actions/checkout@v4
+ - name: spell check
+ run: |
+ pip install codespell==2.1.0
+ # codespell considers some repo name in go.sum are misspelled
+ git grep --cached -l '' | grep -v go.sum | grep -v pnpm-lock.yaml |xargs codespell --ignore-words=.ignore_words --skip="*.ts,*.mts"
+ - name: Merge conflict
+ run: |
+ bash ./utils/check-merge-conflict.sh
+ - name: Plugin Code
+ run: |
+ bash ./utils/check-plugins-code.sh
+
+ ci-eclint:
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+
+ - name: Setup Nodejs env
+ uses: actions/setup-node@v4.4.0
+ with:
+ node-version: '12'
+
+ - name: Install eclint
+ run: |
+ sudo npm install -g eclint
+
+ - name: Run eclint
+ run: |
+ eclint check
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/push-dev-image-on-commit.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/push-dev-image-on-commit.yml
new file mode 100644
index 0000000..793347b
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/push-dev-image-on-commit.yml
@@ -0,0 +1,109 @@
+name: Build and Push `apisix:dev` to DockerHub on Commit
+
+on:
+ pull_request:
+ paths-ignore:
+ - "docs/**"
+ - "**/*.md"
+ push:
+ paths-ignore:
+ - "docs/**"
+ - "**/*.md"
+ workflow_dispatch:
+
+jobs:
+ build-test-push:
+ strategy:
+ matrix:
+ include:
+ - runner: ubuntu-24.04
+ arch: amd64
+ - runner: ubuntu-24.04-arm
+ arch: arm64
+
+ runs-on: ${{ matrix.runner }}
+
+ env:
+ APISIX_DOCKER_TAG: master-debian-dev
+ ENV_OS_ARCH: ${{ matrix.arch }}
+ DOCKER_BUILDKIT: 1
+
+ steps:
+ - name: Check out the repo
+ uses: actions/checkout@v4
+
+ - name: Build APISIX Dashboard
+ run: |
+ # install node.js and pnpm
+ sudo n lts
+ corepack enable pnpm
+
+ # prepare apisix-dashboard source code
+ source .requirements
+ git clone --revision=${APISIX_DASHBOARD_COMMIT} --depth 1 https://github.com/apache/apisix-dashboard.git
+ pushd apisix-dashboard
+
+ # compile
+ pnpm install --frozen-lockfile
+ pnpm run build
+ popd
+
+ # copy the dist files to the ui directory
+ mkdir ui
+ cp -r apisix-dashboard/dist/* ui/
+ rm -r apisix-dashboard
+
+ - name: Build and run
+ run: |
+ make build-on-debian-dev
+ docker compose -f ./docker/compose/docker-compose-master.yaml up -d
+ sleep 30
+ docker logs compose-apisix-1
+
+ - name: Test APISIX
+ run: |
+ curl http://127.0.0.1:9180/apisix/admin/routes/1 \
+ -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
+ {
+ "uri": "/get",
+ "upstream": {
+ "type": "roundrobin",
+ "nodes": { "httpbin.org:80": 1 }
+ }
+ }'
+
+ result_code=$(curl -I -m 10 -o /dev/null -s -w %{http_code} http://127.0.0.1:9080/get)
+ if [[ $result_code -ne 200 ]]; then
+ printf "result_code: %s\n" "$result_code"
+ exit 125
+ fi
+
+ - name: Login to Docker Hub
+ if: github.ref == 'refs/heads/master'
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USER }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Push apisix image to Docker Hub
+ if: github.ref == 'refs/heads/master'
+ run: |
+ make push-on-debian-dev
+
+ merge-tags:
+ needs: build-test-push
+ if: github.ref == 'refs/heads/master'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Login to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USER }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Check out the repo
+ uses: actions/checkout@v4
+
+ - name: Merge architecture-specific tags
+ run: |
+ make merge-dev-tags
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/redhat-ci.yaml b/CloudronPackages/APISIX/apisix-source/.github/workflows/redhat-ci.yaml
new file mode 100644
index 0000000..190919c
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/redhat-ci.yaml
@@ -0,0 +1,179 @@
+name: CI Redhat UBI - Daily
+
+on:
+ schedule:
+ - cron: "0 0 * * *"
+ pull_request:
+ branches: [master]
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.run_number || github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ test_apisix:
+ name: run ci on redhat ubi
+ runs-on: ubuntu-latest
+ timeout-minutes: 90
+ strategy:
+ fail-fast: false
+ matrix:
+ events_module:
+ - lua-resty-worker-events
+ - lua-resty-events
+ test_dir:
+ - t/plugin/[a-k]*
+ - t/plugin/[l-z]*
+ - t/admin t/cli t/config-center-yaml t/control t/core t/debug t/discovery t/error_page t/misc
+ - t/node t/pubsub t/router t/script t/secret t/stream-node t/utils t/xds-library
+
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Cache deps
+ uses: actions/cache@v4
+ env:
+ cache-name: cache-deps
+ with:
+ path: deps
+ key: ${{ runner.os }}-${{ env.cache-name }}-ubi8.6-${{ hashFiles('apisix-master-0.rockspec') }}
+
+ - name: Extract branch name
+ if: ${{ startsWith(github.ref, 'refs/heads/release/') }}
+ id: branch_env
+ shell: bash
+ run: |
+ echo "version=${GITHUB_REF##*/}" >>$GITHUB_OUTPUT
+
+ - name: Extract test type
+ shell: bash
+ id: test_env
+ run: |
+ test_dir="${{ matrix.test_dir }}"
+ if [[ $test_dir =~ 't/plugin' ]]; then
+ echo "type=plugin" >>$GITHUB_OUTPUT
+ fi
+ if [[ $test_dir =~ 't/admin ' ]]; then
+ echo "type=first" >>$GITHUB_OUTPUT
+ fi
+ if [[ $test_dir =~ ' t/xds-library' ]]; then
+ echo "type=last" >>$GITHUB_OUTPUT
+ fi
+
+ - name: Free disk space
+ run: |
+ bash ./ci/free_disk_space.sh
+
+ - name: Linux launch common services
+ run: |
+ make ci-env-up project_compose_ci=ci/pod/docker-compose.common.yml
+ sudo ./ci/init-common-test-service.sh
+
+ - name: Build rpm package
+ if: ${{ startsWith(github.ref, 'refs/heads/release/') }}
+ run: |
+ export VERSION=${{ steps.branch_env.outputs.version }}
+ sudo gem install --no-document fpm
+ git clone --depth 1 https://github.com/api7/apisix-build-tools.git
+
+ # move codes under build tool
+ mkdir ./apisix-build-tools/apisix
+ for dir in `ls|grep -v "^apisix-build-tools$"`;do cp -r $dir ./apisix-build-tools/apisix/;done
+
+ cd apisix-build-tools
+ make package type=rpm app=apisix version=${VERSION} checkout=release/${VERSION} image_base=ubi image_tag=8.6 local_code_path=./apisix
+ cd ..
+ rm -rf $(ls -1 -I apisix-build-tools -I t -I utils -I ci --ignore=Makefile -I "*.rockspec")
+
+ - name: Start Dubbo Backend
+ run: |
+ cur_dir=$(pwd)
+ sudo apt update
+ sudo apt install -y maven
+ cd t/lib/dubbo-backend
+ mvn package
+ cd dubbo-backend-provider/target
+ java \
+ -Djava.net.preferIPv4Stack=true \
+ -jar dubbo-demo-provider.one-jar.jar > /tmp/java.log &
+ cd $cur_dir/t/lib/dubbo-serialization-backend
+ mvn package
+ cd dubbo-serialization-backend-provider/target
+ java \
+ -Djava.net.preferIPv4Stack=true \
+ -jar dubbo-demo-provider.one-jar.jar > /tmp/java2.log &
+
+ - name: Build xDS library
+ if: steps.test_env.outputs.type == 'last'
+ run: |
+ cd t/xds-library
+ go build -o libxds.so -buildmode=c-shared main.go export.go
+
+ - name: Run redhat docker and mapping apisix into container
+ env:
+ TEST_FILE_SUB_DIR: ${{ matrix.test_dir }}
+ TEST_EVENTS_MODULE: ${{ matrix.events_module }}
+ run: |
+ docker run -itd -v ${{ github.workspace }}:/apisix --env TEST_FILE_SUB_DIR="$TEST_FILE_SUB_DIR" --env TEST_EVENTS_MODULE="$TEST_EVENTS_MODULE" --name ubiInstance --net="host" --dns 8.8.8.8 --dns-search apache.org registry.access.redhat.com/ubi8/ubi:8.6 /bin/bash
+
+ - name: Cache images
+ id: cache-images
+ uses: actions/cache@v4
+ env:
+ cache-name: cache-apisix-docker-images
+ with:
+ path: docker-images-backup
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ steps.test_env.outputs.type }}-${{ hashFiles(format('./ci/pod/docker-compose.{0}.yml', steps.test_env.outputs.type )) }}
+
+ - if: ${{ steps.cache-images.outputs.cache-hit == 'true' }}
+ name: Load saved docker images
+ run: |
+ if [[ -f docker-images-backup/apisix-images.tar ]]; then
+ [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh before
+ docker load --input docker-images-backup/apisix-images.tar
+ rm docker-images-backup/apisix-images.tar
+ make ci-env-up project_compose_ci=ci/pod/docker-compose.${{ steps.test_env.outputs.type }}.yml
+ echo "loaded docker images"
+ if [[ ${{ steps.test_env.outputs.type }} != first ]]; then
+ sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh after
+ fi
+ fi
+ - if: ${{ steps.cache-images.outputs.cache-hit != 'true' }}
+ name: Linux launch services
+ run: |
+ [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh before
+ [[ ${{ steps.test_env.outputs.type }} == plugin ]] && ./ci/pod/openfunction/build-function-image.sh
+ make ci-env-up project_compose_ci=ci/pod/docker-compose.${{ steps.test_env.outputs.type }}.yml
+ [[ ${{ steps.test_env.outputs.type }} != first ]] && sudo ./ci/init-${{ steps.test_env.outputs.type }}-test-service.sh after
+ echo "Linux launch services, done."
+
+ - name: Install dependencies
+ run: |
+ docker exec ubiInstance bash -c "cd apisix && chmod +x ./ci/redhat-ci.sh && ./ci/redhat-ci.sh install_dependencies"
+
+ - name: Install rpm package
+ if: ${{ startsWith(github.ref, 'refs/heads/release/') }}
+ run: |
+ docker exec ubiInstance bash -c "cd apisix && rpm -iv --prefix=/apisix ./apisix-build-tools/output/apisix-${{ steps.branch_env.outputs.version }}-0.ubi8.6.x86_64.rpm"
+ # Dependencies are attached with rpm, so revert `make deps`
+ docker exec ubiInstance bash -c "cd apisix && rm -rf deps"
+ docker exec ubiInstance bash -c "cd apisix && mv usr/bin . && mv usr/local/apisix/* ."
+
+ - name: Run test cases
+ run: |
+ docker exec ubiInstance bash -c "cd apisix && chmod +x ./ci/redhat-ci.sh && ./ci/redhat-ci.sh run_case"
+
+ - if: ${{ steps.cache-images.outputs.cache-hit != 'true' }}
+ name: Save docker images
+ run: |
+ echo "start backing up, $(date)"
+ bash ./ci/backup-docker-images.sh ${{ steps.test_env.outputs.type }}
+ echo "backup done, $(date)"
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/semantic.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/semantic.yml
new file mode 100644
index 0000000..85df2c0
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/semantic.yml
@@ -0,0 +1,35 @@
+name: "PR Lint"
+
+on:
+ pull_request_target:
+ types:
+ - opened
+ - edited
+ - synchronize
+
+jobs:
+ main:
+ name: Validate PR title
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - uses: ./.github/actions/action-semantic-pull-request
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ types: |
+ feat
+ fix
+ docs
+ style
+ refactor
+ perf
+ test
+ build
+ ci
+ chore
+ revert
+ change
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/source-install.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/source-install.yml
new file mode 100644
index 0000000..c21435f
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/source-install.yml
@@ -0,0 +1,124 @@
+name: Source Code Install
+
+on:
+ push:
+ branches: [master, 'release/**']
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+ pull_request:
+ branches: [master, 'release/**']
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.run_number || github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ install-on-multi-platform:
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ - ubuntu-latest
+ os_platform:
+ - ubuntu
+ - redhat
+ services:
+ etcd:
+ image: bitnami/etcd:3.5.4
+ ports:
+ - 2379:2379
+ - 2380:2380
+ env:
+ ALLOW_NONE_AUTHENTICATION: yes
+ ETCD_ADVERTISE_CLIENT_URLS: http://0.0.0.0:2379
+ httpbin:
+ image: kennethreitz/httpbin
+ ports:
+ - 8088:80
+
+ runs-on: ${{ matrix.platform }}
+ timeout-minutes: 30
+
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Cache deps
+ uses: actions/cache@v4
+ env:
+ cache-name: cache-deps
+ with:
+ path: deps
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ matrix.os_platform }}-${{ hashFiles('apisix-master-0.rockspec') }}
+
+ - name: Install and start apisix on ${{ matrix.os_platform }}
+ env:
+ INSTALL_PLATFORM: ${{ matrix.os_platform }}
+ run: |
+ if [[ $INSTALL_PLATFORM == "ubuntu" ]]; then
+ sudo apt-get update
+ sudo apt-get install -y git sudo make
+ make deps
+ sudo make install
+ apisix start
+ elif [[ $INSTALL_PLATFORM == "redhat" ]]; then
+ docker run -itd -v ${{ github.workspace }}:/apisix --name ubi8 --net="host" --dns 8.8.8.8 --dns-search apache.org registry.access.redhat.com/ubi8/ubi:8.6 /bin/bash
+ docker exec ubi8 bash -c "yum install -y git sudo make"
+ docker exec ubi8 bash -c "cd apisix && make deps"
+ docker exec ubi8 bash -c "cd apisix && make install"
+ docker exec ubi8 bash -c "cd apisix && apisix start"
+ elif [[ $INSTALL_PLATFORM == "centos7" ]]; then
+ docker run -itd -v ${{ github.workspace }}:/apisix --name centos7Instance --net="host" --dns 8.8.8.8 --dns-search apache.org docker.io/centos:7 /bin/bash
+ docker exec centos7Instance bash -c "yum install -y git sudo make"
+ docker exec centos7Instance bash -c "cd apisix && make deps"
+ docker exec centos7Instance bash -c "cd apisix && make install"
+ docker exec centos7Instance bash -c "cd apisix && apisix start"
+ fi
+ sleep 6
+
+ - name: Test apisix
+ run: |
+ wget https://github.com/mikefarah/yq/releases/download/3.4.1/yq_linux_amd64 -O /usr/bin/yq && sudo chmod +x /usr/bin/yq
+ get_admin_key() {
+ local admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml)
+ echo "$admin_key"
+ }
+ export admin_key=$(get_admin_key); echo $admin_key
+ cat conf/config.yaml
+ curl -v http://127.0.0.1:9180/apisix/admin/routes/1 \
+ -H "X-API-KEY: $admin_key" -X PUT -d '
+ {
+ "uri": "/get",
+ "upstream": {
+ "type": "roundrobin",
+ "nodes": {
+ "127.0.0.1:8088": 1
+ }
+ }
+ }'
+ result_code=`curl -I -m 10 -o /dev/null -s -w %{http_code} http://127.0.0.1:9080/get`
+ if [[ $result_code -ne 200 ]]; then
+ printf "result_code: %s\n" "$result_code"
+ echo "===============access.log==============="
+ cat logs/access.log
+ echo "===============error.log==============="
+ cat logs/error.log
+ exit 125
+ fi
+
+ - name: Check error log
+ run: |
+ if grep -q '\[error\]' logs/error.log; then
+ echo "=====found error log====="
+ cat /usr/local/apisix/logs/error.log
+ exit 125
+ fi
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/stale.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/stale.yml
new file mode 100644
index 0000000..3bd686e
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/stale.yml
@@ -0,0 +1,52 @@
+name: Stable Test
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 10 * * *'
+
+permissions:
+ contents: read
+
+jobs:
+ prune_stale:
+ permissions:
+ issues: write # for actions/stale to close stale issues
+ pull-requests: write # for actions/stale to close stale PRs
+ name: Prune Stale
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+
+ steps:
+ - name: Prune Stale
+ uses: actions/stale@v8
+ with:
+ days-before-issue-stale: 350
+ days-before-issue-close: 14
+ stale-issue-message: >
+ This issue has been marked as stale due to 350 days of inactivity.
+ It will be closed in 2 weeks if no further activity occurs. If this issue is still
+ relevant, please simply write any comment. Even if closed, you can still revive the
+ issue at any time or discuss it on the dev@apisix.apache.org list.
+ Thank you for your contributions.
+ close-issue-message: >
+ This issue has been closed due to lack of activity. If you think that
+ is incorrect, or the issue requires additional review, you can revive the issue at
+ any time.
+ days-before-pr-stale: 60
+ days-before-pr-close: 28
+ stale-pr-message: >
+ This pull request has been marked as stale due to 60 days of inactivity.
+ It will be closed in 4 weeks if no further activity occurs. If you think
+ that's incorrect or this pull request should instead be reviewed, please simply
+ write any comment. Even if closed, you can still revive the PR at any time or
+ discuss it on the dev@apisix.apache.org list.
+ Thank you for your contributions.
+ close-pr-message: >
+ This pull request/issue has been closed due to lack of activity. If you think that
+ is incorrect, or the pull request requires review, you can revive the PR at any time.
+ # Issues with these labels will never be considered stale.
+ exempt-issue-labels: 'bug,enhancement,good first issue'
+ stale-issue-label: 'stale'
+ stale-pr-label: 'stale'
+ ascending: true
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/tars-ci.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/tars-ci.yml
new file mode 100644
index 0000000..8e2dba4
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/tars-ci.yml
@@ -0,0 +1,55 @@
+name: CI Tars
+
+on:
+ push:
+ branches: [ master, 'release/**' ]
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+ pull_request:
+ branches: [ master, 'release/**' ]
+ paths-ignore:
+ - 'docs/**'
+ - '**/*.md'
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/master' && github.run_number || github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ tars:
+ strategy:
+ fail-fast: false
+ matrix:
+ platform:
+ - ubuntu-latest
+ os_name:
+ - linux_openresty
+
+ runs-on: ${{ matrix.platform }}
+ timeout-minutes: 15
+ env:
+ SERVER_NAME: ${{ matrix.os_name }}
+ OPENRESTY_VERSION: default
+
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+
+ - name: Setup Tars MySql
+ run: |
+ docker run -d -p 3306:3306 -v $PWD/t/tars/conf/tars.sql:/docker-entrypoint-initdb.d/tars.sql -e MYSQL_ROOT_PASSWORD=tars2022 mysql:5.7
+
+ - name: Linux Install
+ run: |
+ sudo ./ci/${{ matrix.os_name }}_runner.sh before_install
+ sudo --preserve-env=OPENRESTY_VERSION ./ci/${{ matrix.os_name }}_runner.sh do_install
+
+ - name: Run test cases
+ run: |
+ ./ci/tars-ci.sh run_case
diff --git a/CloudronPackages/APISIX/apisix-source/.github/workflows/update-labels.yml b/CloudronPackages/APISIX/apisix-source/.github/workflows/update-labels.yml
new file mode 100644
index 0000000..bc974d9
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.github/workflows/update-labels.yml
@@ -0,0 +1,62 @@
+name: Update labels when user responds in issue and pr
+permissions:
+ issues: write
+ pull-requests: write
+
+on:
+ issue_comment:
+ types: [created]
+ pull_request_review_comment:
+ types: [created]
+
+jobs:
+ issue_commented:
+ if: github.event.issue && !github.event.issue.pull_request && github.event.comment.user.login == github.event.issue.user.login && contains(github.event.issue.labels.*.name, 'wait for update') && !contains(github.event.issue.labels.*.name, 'user responded')
+ runs-on: ubuntu-latest
+ steps:
+ - name: update labels when user responds
+ uses: actions/github-script@v7
+ with:
+ script: |
+ github.rest.issues.addLabels({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ labels: ["user responded"]
+ })
+ github.rest.issues.removeLabel({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ name: "wait for update"
+ })
+
+ pr_commented:
+ if: github.event.issue && github.event.issue.pull_request && github.event.comment.user.login == github.event.issue.user.login && (contains(github.event.issue.labels.*.name, 'wait for update') || contains(github.event.issue.labels.*.name, 'discuss') || contains(github.event.issue.labels.*.name, 'need test cases')) && !contains(github.event.issue.labels.*.name, 'user responded')
+ runs-on: ubuntu-latest
+ steps:
+ - name: update label when user responds
+ uses: actions/github-script@v7
+ with:
+ script: |
+ github.rest.issues.addLabels({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ labels: ["user responded"]
+ })
+
+ pr_review_commented:
+ if: github.event.pull_request && github.event.comment.user.login == github.event.pull_request.user.login && (contains(github.event.pull_request.labels.*.name, 'wait for update') || contains(github.event.pull_request.labels.*.name, 'discuss') || contains(github.event.issue.labels.*.name, 'need test cases')) && !contains(github.event.pull_request.labels.*.name, 'user responded')
+ runs-on: ubuntu-latest
+ steps:
+ - name: update label when user responds
+ uses: actions/github-script@v7
+ with:
+ script: |
+ github.rest.issues.addLabels({
+ issue_number: context.issue.number,
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ labels: ["user responded"]
+ })
diff --git a/CloudronPackages/APISIX/apisix-source/.gitmodules b/CloudronPackages/APISIX/apisix-source/.gitmodules
new file mode 100644
index 0000000..9819855
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.gitmodules
@@ -0,0 +1,9 @@
+[submodule "t/toolkit"]
+ path = t/toolkit
+ url = https://github.com/api7/test-toolkit.git
+[submodule ".github/actions/action-semantic-pull-request"]
+ path = .github/actions/action-semantic-pull-request
+ url = https://github.com/amannn/action-semantic-pull-request.git
+[submodule ".github/actions/autocorrect"]
+ path = .github/actions/autocorrect
+ url = https://github.com/huacnlee/autocorrect.git
diff --git a/CloudronPackages/APISIX/apisix-source/.ignore_words b/CloudronPackages/APISIX/apisix-source/.ignore_words
new file mode 100644
index 0000000..86683d3
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.ignore_words
@@ -0,0 +1,11 @@
+iam
+te
+ba
+ue
+shttp
+nd
+hel
+nulll
+smove
+aks
+nin
diff --git a/CloudronPackages/APISIX/apisix-source/.licenserc.yaml b/CloudronPackages/APISIX/apisix-source/.licenserc.yaml
new file mode 100644
index 0000000..86edebf
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.licenserc.yaml
@@ -0,0 +1,60 @@
+#
+# 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.
+#
+header:
+ license:
+ spdx-id: Apache-2.0
+ copyright-owner: Apache Software Foundation
+
+ license-location-threshold: 360
+
+ paths-ignore:
+ - '.gitignore'
+ - '.gitattributes'
+ - '.gitmodules'
+ - 'LICENSE'
+ - 'NOTICE'
+ - '**/*.json'
+ - '**/*.key'
+ - '**/*.crt'
+ - '**/*.pem'
+ - '**/*.pb.go'
+ - '**/pnpm-lock.yaml'
+ - '.github/'
+ - 'conf/mime.types'
+ - '**/*.svg'
+ # Exclude CI env_file
+ - 'ci/pod/**/*.env'
+ # eyes has some limitation to handle git pattern
+ - '**/*.log'
+ # Exclude test toolkit files
+ - 't/toolkit'
+ - 'go.mod'
+ - 'go.sum'
+ # Exclude non-Apache licensed files
+ - 'apisix/balancer/ewma.lua'
+ # Exclude plugin-specific configuration files
+ - 't/plugin/authz-casbin'
+ - 't/coredns'
+ - 't/fuzzing/requirements.txt'
+ - 'autodocs/'
+ - 'docs/**/*.md'
+ - '.ignore_words'
+ - '.luacheckrc'
+ # Exclude file contains certificate revocation information
+ - 't/certs/ocsp/index.txt'
+
+ comment: on-failure
diff --git a/CloudronPackages/APISIX/apisix-source/.markdownlint.yml b/CloudronPackages/APISIX/apisix-source/.markdownlint.yml
new file mode 100644
index 0000000..36d2485
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/.markdownlint.yml
@@ -0,0 +1,34 @@
+#
+# 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.
+#
+
+MD001: false
+MD004: false
+MD005: false
+MD006: false
+MD007: false
+MD010: false
+MD013: false
+MD014: false
+MD024: false
+MD026: false
+MD029: false
+MD033: false
+MD034: false
+MD036: false
+MD040: false
+MD041: false
+MD046: false
diff --git a/CloudronPackages/APISIX/apisix-source/CHANGELOG.md b/CloudronPackages/APISIX/apisix-source/CHANGELOG.md
new file mode 100644
index 0000000..41c430a
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/CHANGELOG.md
@@ -0,0 +1,1936 @@
+---
+title: Changelog
+---
+
+
+
+## Table of Contents
+
+- [3.13.0](#3130)
+- [3.12.0](#3120)
+- [3.11.0](#3110)
+- [3.10.0](#3100)
+- [3.9.0](#390)
+- [3.8.0](#380)
+- [3.7.0](#370)
+- [3.6.0](#360)
+- [3.5.0](#350)
+- [3.4.0](#340)
+- [3.3.0](#330)
+- [3.2.1](#321)
+- [3.2.0](#320)
+- [3.1.0](#310)
+- [3.0.0](#300)
+- [3.0.0-beta](#300-beta)
+- [2.15.3](#2153)
+- [2.15.2](#2152)
+- [2.15.1](#2151)
+- [2.15.0](#2150)
+- [2.14.1](#2141)
+- [2.14.0](#2140)
+- [2.13.3](#2133)
+- [2.13.2](#2132)
+- [2.13.1](#2131)
+- [2.13.0](#2130)
+- [2.12.1](#2121)
+- [2.12.0](#2120)
+- [2.11.0](#2110)
+- [2.10.5](#2105)
+- [2.10.4](#2104)
+- [2.10.3](#2103)
+- [2.10.2](#2102)
+- [2.10.1](#2101)
+- [2.10.0](#2100)
+- [2.9.0](#290)
+- [2.8.0](#280)
+- [2.7.0](#270)
+- [2.6.0](#260)
+- [2.5.0](#250)
+- [2.4.0](#240)
+- [2.3.0](#230)
+- [2.2.0](#220)
+- [2.1.0](#210)
+- [2.0.0](#200)
+- [1.5.0](#150)
+- [1.4.1](#141)
+- [1.4.0](#140)
+- [1.3.0](#130)
+- [1.2.0](#120)
+- [1.1.0](#110)
+- [1.0.0](#100)
+- [0.9.0](#090)
+- [0.8.0](#080)
+- [0.7.0](#070)
+- [0.6.0](#060)
+
+## 3.13.0
+
+**The changes marked with :warning: are not backward compatible.**
+
+### Change
+
+- :warning: mark server-info plugin as deprecated [#12244](https://github.com/apache/apisix/pull/12244)
+- :warning: fill in the metadata of resource schema [#12224](https://github.com/apache/apisix/pull/12224).
+This PR sets additionalProperties to false for consumer credentials.
+
+### Bugfixes
+
+- fix: running stale healthchecker when new node count <= 1 [#12118](https://github.com/apache/apisix/pull/12118)
+- fix: release healthchecker on 0 nodes [#12126](https://github.com/apache/apisix/pull/12126)
+- fix: only parse and validate apisix.yaml in cli when startup [#12216](https://github.com/apache/apisix/pull/12216)
+- fix(standalone): API-driven mode does not properly handle consumer schema [#12256](https://github.com/apache/apisix/pull/12256)
+- fix: added restriction for TLSv1.3 cross-SNI session resumption [#12366](https://github.com/apache/apisix/pull/12366)
+- fix: flaky t/admin/filter.t due to url encoding for query params [#12370](https://github.com/apache/apisix/pull/12370)
+- fix(workflow/push-dev-image-on-commit): remove already defined uses [#12365](https://github.com/apache/apisix/pull/12365)
+- fix(workflow): use runners with different architectures instead of QEMU [#12322](https://github.com/apache/apisix/pull/12322)
+- fix: kubernetes service discovery single mode data dump [#12284](https://github.com/apache/apisix/pull/12284)
+- fix: handle consul nil port cases by defaulting to port 80 [#12304](https://github.com/apache/apisix/pull/12304)
+- fix: check if config contains duplicate resources in API-driven standalone mode [#12317](https://github.com/apache/apisix/pull/12317)
+- fix: original key being modified causing cache inconsistency [#12299](https://github.com/apache/apisix/pull/12299)
+- fix: access to the apisix dashboard in dev returns 404 [#12376](https://github.com/apache/apisix/pull/12376)
+
+### Core
+
+- feat(consumer): consumer username allows - in it [#12296](https://github.com/apache/apisix/pull/12296)
+- chore: change log level to debug to avoid unnecessary logs [#12361](https://github.com/apache/apisix/pull/12361)
+- chore: change log level from warn to info for stale batch processor removal [#12297](https://github.com/apache/apisix/pull/12297)
+- feat(standalone): allow more characters in credential_id for API-driven mode [#12295](https://github.com/apache/apisix/pull/12295)
+- feat: add standalone admin api [#12179](https://github.com/apache/apisix/pull/12179)
+- feat: support health checker for stream subsystem [#12180](https://github.com/apache/apisix/pull/12180)
+- feat(standalone): support revision in API-driven standalone mode like etcd [#12214](https://github.com/apache/apisix/pull/12214)
+- feat: add healthcheck for sync configuration [#12200](https://github.com/apache/apisix/pull/12200)
+- perf: compare service discovery nodes by address [#12258](https://github.com/apache/apisix/pull/12258)
+- feat: fill in the metadata of resource schema [#12224](https://github.com/apache/apisix/pull/12224)
+- feat: add embedded apisix dashboard ui [#12276](https://github.com/apache/apisix/pull/12276)
+- feat: add apisix dashboard to dev image [#12369](https://github.com/apache/apisix/pull/12369)
+- feat: add max pending entries option to batch-processor [#12338](https://github.com/apache/apisix/pull/12338)
+- feat(standalone): support JSON format [#12333](https://github.com/apache/apisix/pull/12333)
+- feat: enhance admin api filter [#12291](https://github.com/apache/apisix/pull/12291)
+- feat: add warning for data plane writing to etcd [#12241](https://github.com/apache/apisix/pull/12241)
+- chore: upgrade openresty version to v1.27.1.2 [#12307](https://github.com/apache/apisix/pull/12307)
+- chore: upgrade luarocks version to 3.12.0 [#12305](https://github.com/apache/apisix/pull/12305)
+
+### Plugins
+
+- refactor(ai-proxy): move read_response into ai_driver.request function [#12101](https://github.com/apache/apisix/pull/12101)
+- refactor: mcp server framework implementation [#12168](https://github.com/apache/apisix/pull/12168)
+- feat: add mcp-bridge plugin [#12151](https://github.com/apache/apisix/pull/12151)
+- feat: add lago plugin [#12196](https://github.com/apache/apisix/pull/12196)
+- feat: add headers attribute for loki-logger [#12243](https://github.com/apache/apisix/pull/12243)
+- feat: expose apisix version in prometheus node info metric [#12367](https://github.com/apache/apisix/pull/12367)
+
+## Doc improvements
+
+- docs: update stream proxy doc for proxy_mode and some formatting [#12108](https://github.com/apache/apisix/pull/12108)
+- docs: improve loki-logger plugin docs [#11921](https://github.com/apache/apisix/pull/11921)
+- docs: improve ua-restriction plugin docs [#11956](https://github.com/apache/apisix/pull/11956)
+- docs: improve elasticsearch-logger plugin docs [#11922](https://github.com/apache/apisix/pull/11922)
+- fix file logger example wrong data structure [#12125](https://github.com/apache/apisix/pull/12125)
+- docs: improve limit-req plugin docs [#11873](https://github.com/apache/apisix/pull/11873)
+- docs: improve body-transformer plugin docs [#11856](https://github.com/apache/apisix/pull/11856)
+- docs: update ai-rate-limiting and ai-rag docs [#12107](https://github.com/apache/apisix/pull/12107)
+- docs: improve basic-auth docs and update docs for anonymous consumer [#11859](https://github.com/apache/apisix/pull/11859)
+- docs: improve key-auth docs and update docs for anonymous consumer [#11860](https://github.com/apache/apisix/pull/11860)
+- docs: improve hmac-auth plugin docs and update docs for anonymous consumer [#11867](https://github.com/apache/apisix/pull/11867)
+- docs: improve jwt-auth plugin docs and update docs for anonymous consumer [#11865](https://github.com/apache/apisix/pull/11865)
+- docs: improve request-validation plugin docs [#11853](https://github.com/apache/apisix/pull/11853)
+- docs: update variable in building apisix from source [#11640](https://github.com/apache/apisix/pull/11640)
+- docs: update readme with APISIX AI Gateway product link and MCP feature [#12166](https://github.com/apache/apisix/pull/12166)
+- docs: improve plugin-develop docs [#12242](https://github.com/apache/apisix/pull/12242)
+- docs: fix typo in real-ip.md [#12236](https://github.com/apache/apisix/pull/12236)
+- docs: the configuration type of the WASM plugin can be an object. [#12251](https://github.com/apache/apisix/pull/12251)
+
+## Developer productivity
+
+- feat: support devcontainer for containerized development of APISIX [#11765](https://github.com/apache/apisix/pull/11765)
+
+## 3.12.0
+
+**The changes marked with :warning: are not backward compatible.**
+
+### Change
+
+- :warning: replace plugin attribute with plugin metadata in `opentelemetry` plugin [#11940](https://github.com/apache/apisix/pull/11940)
+- :warning: refactor: ai-content-moderation to ai-aws-content-moderation [#12010](https://github.com/apache/apisix/pull/12010)
+- add expiration time for all Prometheus metrics [#11838](https://github.com/apache/apisix/pull/11838)
+- allow workflow config without case [#11787](https://github.com/apache/apisix/pull/11787)
+- unify google-cloud-oauth.lua file [#11596](https://github.com/apache/apisix/pull/11596)
+- :warning: ai-proxy remove passthrough [#12014](https://github.com/apache/apisix/pull/12014)
+- :warning: remove model options' `stream` default value [#12013](https://github.com/apache/apisix/pull/12013)
+- :warning: grpc-web response contains two trailer chunks [#11988](https://github.com/apache/apisix/pull/11988).
+This PR returns `405 Method not allowed` instead of `400 Bad Request` when request HTTP method errors.
+- :warning: disallow empty key configuration attributes [#11852](https://github.com/apache/apisix/pull/11852)
+- :warning: set default value of ssl_trusted_certificate to system [#11993](https://github.com/apache/apisix/pull/11993)
+
+### Bugfixes
+
+- Fix: timeout risk in usages of lua-resty-aws [#12070](https://github.com/apache/apisix/pull/12070)
+- Fix: ai-rate-limiting not allowed to limit to a single instance [#12061](https://github.com/apache/apisix/pull/12061)
+- Fix: update watch_ctx.revision to avoid multiple resyncs [#12021](https://github.com/apache/apisix/pull/12021)
+- Fix: ai-proxy remove passthrough [#12014](https://github.com/apache/apisix/pull/12014)
+- Fix: ai-proxy dead loop when retrying [#12012](https://github.com/apache/apisix/pull/12012)
+- Fix: error while trying to log table in ai-content-moderation plugin [#11994](https://github.com/apache/apisix/pull/11994)
+- Fix: resync etcd when a lower revision is found [#12015](https://github.com/apache/apisix/pull/12015)
+- Fix: remove model options' `stream` default value [#12013](https://github.com/apache/apisix/pull/12013)
+- Fix: grpc-web response contains two trailer chunks [#11988](https://github.com/apache/apisix/pull/11988)
+- Fix: event_id is nil in chaitin-waf [#11651](https://github.com/apache/apisix/pull/11651)
+- Fix: race condition problem while update upstream.nodes [#11916](https://github.com/apache/apisix/pull/11916)
+- Fix: `upstream_obj.upstream` should not be a string [#11932](https://github.com/apache/apisix/pull/11932)
+- Fix: query params in override.endpoint not being sent to LLMs [#11863](https://github.com/apache/apisix/pull/11863)
+- Fix: add support for ignoring "load" global variable [#11862](https://github.com/apache/apisix/pull/11862)
+- Fix: corrupt data in routes() response due to healthchecker data [#11844](https://github.com/apache/apisix/pull/11844)
+- Fix: deepcopy should copy same table exactly only once [#11861](https://github.com/apache/apisix/pull/11861)
+- Fix: disallow empty key configuration attributes [#11852](https://github.com/apache/apisix/pull/11852)
+- Fix: etcd watch restart when receive invalid revision [#11833](https://github.com/apache/apisix/pull/11833)
+- Fix: missing parsed_url nil check [#11637](https://github.com/apache/apisix/pull/11637)
+- Fix: use `plugin.get` to fetch plugin configured in multi-auth plugin [#11794](https://github.com/apache/apisix/pull/11794)
+- Fix: allow special characters in uri params [#11788](https://github.com/apache/apisix/pull/11788)
+- Fix: add nil check to conf in body-transformer [#11768](https://github.com/apache/apisix/pull/11768)
+- Fix: use max_req_body_bytes field in custom_format [#11771](https://github.com/apache/apisix/pull/11771)
+- Fix: health checker can't be released due to health parent being released early [#11760](https://github.com/apache/apisix/pull/11760)
+- Fix: use right modifiedIndex for consumer when use credential [#11649](https://github.com/apache/apisix/pull/11649)
+
+### Core
+
+- set default value of ssl_trusted_certificate to system [#11993](https://github.com/apache/apisix/pull/11993)
+- upgrade openresty version to v1.27.11 [#11936](https://github.com/apache/apisix/pull/11936)
+- Support the use of system-provided CA certs in `ssl_trusted_certificate` [#11809](https://github.com/apache/apisix/pull/11809)
+- support _meta.pre_function to execute custom logic before execution of each phase [#11793](https://github.com/apache/apisix/pull/11793)
+- support anonymous consumer [#11917](https://github.com/apache/apisix/pull/11917)
+- accelerate the creation of the consumer cache [#11840](https://github.com/apache/apisix/pull/11840)
+- replace 'string.find' with 'core.string.find' [#11886](https://github.com/apache/apisix/pull/11886)
+- workflow plugin registration [#11832](https://github.com/apache/apisix/pull/11832)
+
+### Plugins
+
+- refactor ai-proxy and ai-proxy-multi [#12030](https://github.com/apache/apisix/pull/12030)
+- support embeddings API [#12062](https://github.com/apache/apisix/pull/12062)
+- implement rate limiting based fallback strategy [#12047](https://github.com/apache/apisix/pull/12047)
+- ai-rate-limiting plugin [#12037](https://github.com/apache/apisix/pull/12037)
+- add `valid_issuers` field in `openid-connect` plugin [#12002](https://github.com/apache/apisix/pull/12002)
+- add ai-prompt-guard plugin [#12008](https://github.com/apache/apisix/pull/12008)
+- add jwt audience validator [#11987](https://github.com/apache/apisix/pull/11987)
+- store JWT in the request context [#11675](https://github.com/apache/apisix/pull/11675)
+- support proxying openai compatible LLMs [#12004](https://github.com/apache/apisix/pull/12004)
+- add `ai-proxy-multi` plugin [#11986](https://github.com/apache/apisix/pull/11986) [#12030](https://github.com/apache/apisix/pull/12030)
+- make rate limiting response header names configurable [#11831](https://github.com/apache/apisix/pull/11831)
+- support mulipart content-type in `body-transformer` [#11767](https://github.com/apache/apisix/pull/11767)
+- plugins in multi-auth returns error instead of logging it [#11775](https://github.com/apache/apisix/pull/11775)
+- support configuring `key_claim_name` [#11772](https://github.com/apache/apisix/pull/11772)
+- add Total request per second panel in grafana dashboard [#11692](https://github.com/apache/apisix/pull/11692)
+- add ai-rag plugin [#11568](https://github.com/apache/apisix/pull/11568)
+- add ai-content-moderation plugin [#11541](https://github.com/apache/apisix/pull/11541)
+- use setmetatable to set hidden variables without effecting serialisation [#11770](https://github.com/apache/apisix/pull/11770)
+
+## 3.11.0
+
+**The changes marked with :warning: are not backward compatible.**
+
+### Change
+
+- :warning: remove JWT signing endpoint and no longer require a private key to be uploaded in the jwt-auth plugin. [#11597](https://github.com/apache/apisix/pull/11597)
+- :warning: rewrite hmac-auth plugin for usability [#11581](https://github.com/apache/apisix/pull/11581)
+
+### Plugins
+
+- allow configuring keepalive_timeout in splunk-logger [#11611](https://github.com/apache/apisix/pull/11611)
+- add plugin attach-consmer-label [#11604](https://github.com/apache/apisix/pull/11604)
+- ai-proxy plugin [#11499](https://github.com/apache/apisix/pull/11499)
+- ai-prompt-decorator plugin [#11515](https://github.com/apache/apisix/pull/11515)
+- ai-prompt-template plugin [#11517](https://github.com/apache/apisix/pull/11517)
+
+### Bugfixes
+
+- Fix: adjust the position of enums in pb_option_def [#11448](https://github.com/apache/apisix/pull/11448)
+- Fix: encryption/decryption for non-auth plugins in consumer [#11600](https://github.com/apache/apisix/pull/11600)
+- Fix: confusion when substituting ENV in config file [#11545](https://github.com/apache/apisix/pull/11545)
+
+### Core
+
+- support gcp secret manager [#11436](https://github.com/apache/apisix/pull/11436)
+- support aws secret manager [#11417](https://github.com/apache/apisix/pull/11417)
+- add credential resource and include `X-Consumer-Username`, `X-Credential-Identifier`, and `X-Consumer-Custom-ID` headers in requests to upstream services [#11601](https://github.com/apache/apisix/pull/11601)
+
+## 3.10.0
+
+**The changes marked with :warning: are not backward compatible.**
+
+### Change
+
+- :warning: remove `core.grpc` module [#11427](https://github.com/apache/apisix/pull/11427)
+- add max req/resp body size attributes [#11133](https://github.com/apache/apisix/pull/11133)
+- :warning: autogenerate admin api key if not passed [#11080](https://github.com/apache/apisix/pull/11080)
+- :warning: enable sensitive fields encryption by default [#11076](https://github.com/apache/apisix/pull/11076)
+- support more sensitive fields for encryption [#11095](https://github.com/apache/apisix/pull/11095)
+- :warning: avoid overwriting `Access-Control-Expose-Headers` response header [#11136](https://github.com/apache/apisix/pull/11136)
+This change removes the default `*` value for `expose_headers` and only sets the header when explicitly configured.
+- :warning: add a default limit of 100 for `get_headers()` [#11140](https://github.com/apache/apisix/pull/11140)
+- :warning: core.request.header return strings instead of table [#11127](https://github.com/apache/apisix/pull/11127)
+This function now always returns strings, previously it returned tables when duplicate headers existed.
+
+### Plugins
+
+- allow set headers in introspection request [#11090](https://github.com/apache/apisix/pull/11090)
+
+### Bugfixes
+
+- Fix: add libyaml-dev dependency for apt [#11291](https://github.com/apache/apisix/pull/11291)
+- Fix: etcd sync data checker should work [#11457](https://github.com/apache/apisix/pull/11457)
+- Fix: plugin metadata add id value for etcd checker [#11452](https://github.com/apache/apisix/pull/11452)
+- Fix: allow trailing period in SNI and CN for SSL [#11414](https://github.com/apache/apisix/pull/11414)
+- Fix: filter out illegal INT(string) formats [#11367](https://github.com/apache/apisix/pull/11367)
+- Fix: make the message clearer when API key is missing [#11370](https://github.com/apache/apisix/pull/11370)
+- Fix: report consumer username tag in datadog [#11354](https://github.com/apache/apisix/pull/11354)
+- Fix: after updating the header, get the old value from the ctx.var [#11329](https://github.com/apache/apisix/pull/11329)
+- Fix: ssl key rotation caused request failure [#11305](https://github.com/apache/apisix/pull/11305)
+- Fix: validation fails causing etcd events not to be handled correctly [#11268](https://github.com/apache/apisix/pull/11268)
+- Fix: stream route matcher is nil after first match [#11269](https://github.com/apache/apisix/pull/11269)
+- Fix: rectify the way to fetch secret resource by id [#11164](https://github.com/apache/apisix/pull/11164)
+- Fix: multi-auth raise 500 error when use default conf [#11145](https://github.com/apache/apisix/pull/11145)
+- Fix: avoid overwriting `Access-Control-Expose-Headers` response header [#11136](https://github.com/apache/apisix/pull/11136)
+- Fix: close session in case of error to avoid blocked session [#11089](https://github.com/apache/apisix/pull/11089)
+- Fix: restore `pb.state` appropriately [#11135](https://github.com/apache/apisix/pull/11135)
+- Fix: add a default limit of 100 for `get_headers()` [#11140](https://github.com/apache/apisix/pull/11140)
+- Fix: disable features when prometheus plugin is turned off [#11117](https://github.com/apache/apisix/pull/11117)
+- Fix: add post request headers only if auth request method is POST [#11021](https://github.com/apache/apisix/pull/11021)
+- Fix: core.request.header return strings instead of table [#11127](https://github.com/apache/apisix/pull/11127)
+- Fix: brotli partial response [#11087](https://github.com/apache/apisix/pull/11087)
+- Fix: the port value greater than 65535 should not be allowed [#11043](https://github.com/apache/apisix/pull/11043)
+
+### Core
+
+- upgrade openresty version to 1.25.3.2 [#11419](https://github.com/apache/apisix/pull/11419)
+- move config-default.yaml to hardcoded lua file [#11343](https://github.com/apache/apisix/pull/11343)
+- warn log when sending requests to external services insecurely [#11403](https://github.com/apache/apisix/pull/11403)
+- update casbin to 1.41.9 [#11400](https://github.com/apache/apisix/pull/11400)
+- update lua-resty-t1k to 1.1.5 [#11391](https://github.com/apache/apisix/pull/11391)
+- support store ssl.keys ssl.certs in secrets mamager [#11339](https://github.com/apache/apisix/pull/11339)
+- move tinyyaml to lyaml [#11312](https://github.com/apache/apisix/pull/11312)
+- support hcv namespace [#11277](https://github.com/apache/apisix/pull/11277)
+- add discovery k8s dump data interface [#11111](https://github.com/apache/apisix/pull/11111)
+- make fetch_secrets use cache for performance [#11201](https://github.com/apache/apisix/pull/11201)
+- replace 'string.len' with '#' [#11078](https://github.com/apache/apisix/pull/11078)
+
+## 3.9.0
+
+**The changes marked with :warning: are not backward compatible.**
+
+### Change
+
+- :warning: use apisix.enable_http2 to enable HTTP/2 in APISIX [#11032](https://github.com/apache/apisix/pull/11032)
+- :warning: unify the keyring and key_encrypt_salt fields [#10771](https://github.com/apache/apisix/pull/10771)
+
+### Core
+
+- :sunrise: Support HTTP3/QUIC
+ - [#10989](https://github.com/apache/apisix/pull/10989)
+ - [#11010](https://github.com/apache/apisix/pull/11010)
+ - [#11027](https://github.com/apache/apisix/pull/11027)
+- :sunrise: add plugins/reload to control api [#10905](https://github.com/apache/apisix/pull/10905)
+- :sunrise: consul deduplicate and sort [#10941](https://github.com/apache/apisix/pull/10941)
+- :sunrise: support uri_arg_ when use radixtree_uri_with_parameter [#10645](https://github.com/apache/apisix/pull/10645)
+
+### Plugins
+
+- :sunrise: add session.cookie configuration [#10919](https://github.com/apache/apisix/pull/10919)
+- :sunrise: support endpointslices in kubernetes discovery [#10916](https://github.com/apache/apisix/pull/10916)
+- :sunrise: add redis and redis-cluster in limit-req [#10874](https://github.com/apache/apisix/pull/10874)
+- :sunrise: support expire prometheus metrics [#10869](https://github.com/apache/apisix/pull/10869)
+- :sunrise: add redis and redis-cluster in limit-conn [#10866](https://github.com/apache/apisix/pull/10866)
+- :sunrise: allow configuring allow-headers in grpc-web plugin [#10904](https://github.com/apache/apisix/pull/10904)
+- :sunrise: Add forward-auth plugin exception configuration status_on_error [#10898](https://github.com/apache/apisix/pull/10898)
+- :sunrise: add option to include request body and response body in log util [#10888](https://github.com/apache/apisix/pull/10888)
+- :sunrise: support compressed responses in loggers [#10884](https://github.com/apache/apisix/pull/10884)
+- :sunrise: add http-dubbo plugin [#10703](https://github.com/apache/apisix/pull/10703)
+- :sunrise: support built-in variables in response_headers in mocking plugin [#10872](https://github.com/apache/apisix/pull/10872)
+- :sunrise: support other data formats without warnings [#10862](https://github.com/apache/apisix/pull/10862)
+- :sunrise: add ocsp-stapling plugin [#10817](https://github.com/apache/apisix/pull/10817)
+
+### Bug Fixes
+
+- Fix: keep different strategy response header consistency [#11048](https://github.com/apache/apisix/pull/11048)
+- Fix: add apisix/plugin/limit-req to makefile [#10955](https://github.com/apache/apisix/pull/10959)
+- Fix: wrong namespace related endpoint in k8s [#10917](https://github.com/apache/apisix/pull/10917)
+- Fix: when delete the secret cause 500 error [#10902](https://github.com/apache/apisix/pull/10902)
+- Fix: jwe-decrypt secret length restriction [#10928](https://github.com/apache/apisix/pull/10928)
+- Fix: unnecessary YAML Config reloads [#9065](https://github.com/apache/apisix/pull/9065)
+- Fix: real_payload was overridden by malicious payload [#10982](https://github.com/apache/apisix/pull/10982)
+- Fix: all origins could pass when allow_origins_by_metadata is set [#10948](https://github.com/apache/apisix/pull/10948)
+- Fix: add compatibility headers [#10828](https://github.com/apache/apisix/pull/10828)
+- Fix: missing trailers issue [#10851](https://github.com/apache/apisix/pull/10851)
+- Fix: decryption failure [#10843](https://github.com/apache/apisix/pull/10843)
+- Fix: linux-install-luarocks are not compatible with the openresty environment [#10813](https://github.com/apache/apisix/pull/10813)
+- Fix: server-side sessions locked by not calling explicit session:close() [#10788](https://github.com/apache/apisix/pull/10788)
+- Fix: skip brotli compression for upstream compressed response [#10740](https://github.com/apache/apisix/pull/10740)
+- Fix: use_jwks breaking authentication header [#10670](https://github.com/apache/apisix/pull/10670)
+- Fix: authz_keycloak plugin giving 500 error [#10763](https://github.com/apache/apisix/pull/10763)
+
+## 3.8.0
+
+### Core
+
+- :sunrise: Support the use of lua-resty-events module for better performance:
+ - [#10550](https://github.com/apache/apisix/pull/10550)
+ - [#10558](https://github.com/apache/apisix/pull/10558)
+- :sunrise: Upgrade OpenSSL 1.1.1 to OpenSSL 3: [#10724](https://github.com/apache/apisix/pull/10724)
+
+### Plugins
+
+- :sunrise: Add jwe-decrypt plugin: [#10252](https://github.com/apache/apisix/pull/10252)
+- :sunrise: Support brotli when use filters.regex option (response-rewrite): [#10733](https://github.com/apache/apisix/pull/10733)
+- :sunrise: Add multi-auth plugin: [#10482](https://github.com/apache/apisix/pull/10482)
+- :sunrise: Add `required scopes` configuration property to `openid-connect` plugin: [#10493](https://github.com/apache/apisix/pull/10493)
+- :sunrise: Support for the Timing-Allow-Origin header (cors): [#9365](https://github.com/apache/apisix/pull/9365)
+- :sunrise: Add brotli plugin: [#10515](https://github.com/apache/apisix/pull/10515)
+- :sunrise: Body-transformer plugin enhancement(#10472): [#10496](https://github.com/apache/apisix/pull/10496)
+- :sunrise: Set minLength of redis_cluster_nodes to 1 for limit-count plugin: [#10612](https://github.com/apache/apisix/pull/10612)
+- :sunrise: Allow to use environment variables for limit-count plugin settings: [#10607](https://github.com/apache/apisix/pull/10607)
+
+### Bugfixes
+
+- Fix: When the upstream nodes are of array type, the port should be an optional field: [#10477](https://github.com/apache/apisix/pull/10477)
+- Fix: Incorrect variable extraction in fault-injection plugin: [#10485](https://github.com/apache/apisix/pull/10485)
+- Fix: All consumers should share the same counter (limit-count): [#10541](https://github.com/apache/apisix/pull/10541)
+- Fix: Safely remove upstream when sending route to opa plugin: [#10552](https://github.com/apache/apisix/pull/10552)
+- Fix: Missing etcd init_dir and unable to list resource: [#10569](https://github.com/apache/apisix/pull/10569)
+- Fix: Forward-auth request body is too large: [#10589](https://github.com/apache/apisix/pull/10589)
+- Fix: Memory leak caused by timer that never quit: [#10614](https://github.com/apache/apisix/pull/10614)
+- Fix: Do not invoke add_header if value resolved as nil in proxy-rewrite plugin: [#10619](https://github.com/apache/apisix/pull/10619)
+- Fix: Frequent traversal of all keys in etcd leads to high CPU usage: [#10671](https://github.com/apache/apisix/pull/10671)
+- Fix: For prometheus upstream_status metrics, mostly_healthy is healthy: [#10639](https://github.com/apache/apisix/pull/10639)
+- Fix: Avoid getting a nil value in log phase in zipkin: [#10666](https://github.com/apache/apisix/pull/10666)
+- Fix: Enable openid-connect plugin without redirect_uri got 500 error: [#7690](https://github.com/apache/apisix/pull/7690)
+- Fix: Add redirect_after_logout_uri for ODIC that do not have an end_session_endpoint: [#10653](https://github.com/apache/apisix/pull/10653)
+- Fix: Response-rewrite filters.regex does not apply when content-encoding is gzip: [#10637](https://github.com/apache/apisix/pull/10637)
+- Fix: The leak of prometheus metrics: [#10655](https://github.com/apache/apisix/pull/10655)
+- Fix: Authz-keycloak add return detail err: [#10691](https://github.com/apache/apisix/pull/10691)
+- Fix: upstream nodes was not updated correctly by service discover: [#10722](https://github.com/apache/apisix/pull/10722)
+- Fix: apisix restart failed: [#10696](https://github.com/apache/apisix/pull/10696)
+
+## 3.7.0
+
+**The changes marked with :warning: are not backward compatible.**
+
+### Change
+
+- :warning: Creating core resources does not allow passing in `create_time` and `update_time`: [#10232](https://github.com/apache/apisix/pull/10232)
+- :warning: Remove self-contained info fields `exptime` and `validity_start` and `validity_end` from ssl schema: [10323](https://github.com/apache/apisix/pull/10323)
+- :warning: Replace `route` with `apisix.route_name`, `service` with `apisix.service_name` in the attributes of opentelemetry plugin to follow the standards for span name and attributes: [#10393](https://github.com/apache/apisix/pull/10393)
+
+### Core
+
+- :sunrise: Added token to support access control for consul discovery: [#10278](https://github.com/apache/apisix/pull/10278)
+- :sunrise: Support configuring `service_id` in stream_route to reference service resources: [#10298](https://github.com/apache/apisix/pull/10298)
+- :sunrise: Using `apisix-runtime` as the apisix runtime:
+ - [#10415](https://github.com/apache/apisix/pull/10415)
+ - [#10427](https://github.com/apache/apisix/pull/10427)
+
+### Plugins
+
+- :sunrise: Add tests for authz-keycloak with apisix secrets: [#10353](https://github.com/apache/apisix/pull/10353)
+- :sunrise: Add authorization params to openid-connect plugin: [#10058](https://github.com/apache/apisix/pull/10058)
+- :sunrise: Support set variable in zipkin plugin: [#10361](https://github.com/apache/apisix/pull/10361)
+- :sunrise: Support Nacos ak/sk authentication: [#10445](https://github.com/apache/apisix/pull/10445)
+
+### Bugfixes
+
+- Fix: Use warn log for get healthcheck target status failure:
+ - [#10156](https://github.com/apache/apisix/pull/10156)
+- Fix: Keep healthcheck target state when upstream changes:
+ - [#10312](https://github.com/apache/apisix/pull/10312)
+ - [#10307](https://github.com/apache/apisix/pull/10307)
+- Fix: Add name field in plugin_config schema for consistency: [#10315](https://github.com/apache/apisix/pull/10315)
+- Fix: Optimize tls in upstream_schema and wrong variable: [#10269](https://github.com/apache/apisix/pull/10269)
+- Fix(consul): Failed to exit normally: [#10342](https://github.com/apache/apisix/pull/10342)
+- Fix: The request header with `Content-Type: application/x-www-form-urlencoded;charset=utf-8` will cause vars condition `post_arg_xxx` matching to failed: [#10372](https://github.com/apache/apisix/pull/10372)
+- Fix: Make install failed on mac: [#10403](https://github.com/apache/apisix/pull/10403)
+- Fix(log-rotate): Log compression timeout caused data loss: [#8620](https://github.com/apache/apisix/pull/8620)
+- Fix(kafka-logger): Remove 0 from enum of required_acks: [#10469](https://github.com/apache/apisix/pull/10469)
+
+## 3.6.0
+
+**The changes marked with :warning: are not backward compatible.**
+
+### Change
+
+- :warning: Remove gRPC support between APISIX and etcd and remove `etcd.use_grpc` configuration option: [#10015](https://github.com/apache/apisix/pull/10015)
+- :warning: Remove conf server. The data plane no longer supports direct communication with the control plane, and the configuration should be adjusted from `config_provider: control_plane` to `config_provider: etcd`: [#10012](https://github.com/apache/apisix/pull/10012)
+- :warning: Enforce strict schema validation on the properties of the core APISIX resources: [#10233](https://github.com/apache/apisix/pull/10233)
+
+### Core
+
+- :sunrise: Support configuring the buffer size of the access log: [#10225](https://github.com/apache/apisix/pull/10225)
+- :sunrise: Support the use of local DNS resolvers in service discovery by configuring `resolv_conf`: [#9770](https://github.com/apache/apisix/pull/9770)
+- :sunrise: Remove Rust dependency for installation: [#10121](https://github.com/apache/apisix/pull/10121)
+- :sunrise: Support Dubbo protocol in xRPC [#9660](https://github.com/apache/apisix/pull/9660)
+
+### Plugins
+
+- :sunrise: Support https in traffic-split plugin: [#9115](https://github.com/apache/apisix/pull/9115)
+- :sunrise: Support rewrite request body in external plugin:[#9990](https://github.com/apache/apisix/pull/9990)
+- :sunrise: Support set nginx variables in opentelemetry plugin: [#8871](https://github.com/apache/apisix/pull/8871)
+- :sunrise: Support unix sock host pattern in the chaitin-waf plugin: [#10161](https://github.com/apache/apisix/pull/10161)
+
+### Bugfixes
+
+- Fix GraphQL POST request route matching exception: [#10198](https://github.com/apache/apisix/pull/10198)
+- Fix error on array of multiline string in `apisix.yaml`: [#10193](https://github.com/apache/apisix/pull/10193)
+- Add error handlers for invalid `cache_zone` configuration in the `proxy-cache` plugin: [#10138](https://github.com/apache/apisix/pull/10138)
+
+## 3.5.0
+
+**The changes marked with :warning: are not backward compatible.**
+
+### Change
+
+- :warning: remove snowflake algorithm in the request-id plugin: [#9715](https://github.com/apache/apisix/pull/9715)
+- :warning: No longer compatible with OpenResty 1.19, it needs to be upgraded to 1.21+: [#9913](https://github.com/apache/apisix/pull/9913)
+- :warning: Remove the configuration item `apisix.stream_proxy.only`, the L4/L7 proxy needs to be enabled through the configuration item `apisix.proxy_mode`: [#9607](https://github.com/apache/apisix/pull/9607)
+- :warning: The admin-api `/apisix/admin/plugins?all=true` marked as deprecated: [#9580](https://github.com/apache/apisix/pull/9580)
+- :warning: allowlist and denylist can't be enabled at the same time in ua-restriction plugin: [#9841](https://github.com/apache/apisix/pull/9841)
+
+### Core
+
+- :sunrise: Support host level dynamic setting of tls protocol version: [#9903](https://github.com/apache/apisix/pull/9903)
+- :sunrise: Support force delete resource: [#9810](https://github.com/apache/apisix/pull/9810)
+- :sunrise: Support pulling env vars from yaml keys: [#9855](https://github.com/apache/apisix/pull/9855)
+- :sunrise: Add schema validate API in admin-api: [#10065](https://github.com/apache/apisix/pull/10065)
+
+### Plugins
+
+- :sunrise: Add chaitin-waf plugin: [#9838](https://github.com/apache/apisix/pull/9838)
+- :sunrise: Support vars for file-logger plugin: [#9712](https://github.com/apache/apisix/pull/9712)
+- :sunrise: Support adding response headers for mock plugin: [#9720](https://github.com/apache/apisix/pull/9720)
+- :sunrise: Support regex_uri with unsafe_uri for proxy-rewrite plugin: [#9813](https://github.com/apache/apisix/pull/9813)
+- :sunrise: Support set client_email field for google-cloud-logging plugin: [#9813](https://github.com/apache/apisix/pull/9813)
+- :sunrise: Support sending headers upstream returned by OPA server for opa plugin: [#9710](https://github.com/apache/apisix/pull/9710)
+- :sunrise: Support configuring proxy server for openid-connect plugin: [#9948](https://github.com/apache/apisix/pull/9948)
+
+### Bugfixes
+
+- Fix(log-rotate): the max_kept configuration doesn't work when using custom name: [#9749](https://github.com/apache/apisix/pull/9749)
+- Fix(limit_conn): do not use the http variable in stream mode: [#9816](https://github.com/apache/apisix/pull/9816)
+- Fix(loki-logger): getting an error with log_labels: [#9850](https://github.com/apache/apisix/pull/9850)
+- Fix(limit-count): X-RateLimit-Reset shouldn't be set to 0 after request be rejected: [#9978](https://github.com/apache/apisix/pull/9978)
+- Fix(nacos): attempt to index upvalue 'applications' (a nil value): [#9960](https://github.com/apache/apisix/pull/9960)
+- Fix(etcd): can't sync etcd data if key has special character: [#9967](https://github.com/apache/apisix/pull/9967)
+- Fix(tencent-cloud-cls): dns parsing failure: [#9843](https://github.com/apache/apisix/pull/9843)
+- Fix(reload): worker not exited when executing quit or reload command [#9909](https://github.com/apache/apisix/pull/9909)
+- Fix(traffic-split): upstream_id validity verification [#10008](https://github.com/apache/apisix/pull/10008)
+
+## 3.4.0
+
+### Core
+
+- :sunrise: Support route-level MTLS [#9322](https://github.com/apache/apisix/pull/9322)
+- :sunrise: Support id schema for global_rules [#9517](https://github.com/apache/apisix/pull/9517)
+- :sunrise: Support use a single long http connection to watch all resources for etcd [#9456](https://github.com/apache/apisix/pull/9456)
+- :sunrise: Support max len 256 for ssl label [#9301](https://github.com/apache/apisix/pull/9301)
+
+### Plugins
+
+- :sunrise: Support multiple regex pattern matching for proxy_rewrite plugin [#9194](https://github.com/apache/apisix/pull/9194)
+- :sunrise: Add loki-logger plugin [#9399](https://github.com/apache/apisix/pull/9399)
+- :sunrise: Allow user configure DEFAULT_BUCKETS for prometheus plugin [#9673](https://github.com/apache/apisix/pull/9673)
+
+### Bugfixes
+
+- Fix(body-transformer): xml2lua: replace empty table with empty string [#9669](https://github.com/apache/apisix/pull/9669)
+- Fix: opentelemetry and grpc-transcode plugins cannot work together [#9606](https://github.com/apache/apisix/pull/9606)
+- Fix(skywalking-logger, error-log-logger): support $hostname in skywalking service_instance_name [#9401](https://github.com/apache/apisix/pull/9401)
+- Fix(admin): fix secrets do not support to update attributes by PATCH [#9510](https://github.com/apache/apisix/pull/9510)
+- Fix(http-logger): default request path should be '/' [#9472](https://github.com/apache/apisix/pull/9472)
+- Fix: syslog plugin doesn't work [#9425](https://github.com/apache/apisix/pull/9425)
+- Fix: wrong log format for splunk-hec-logging [#9478](https://github.com/apache/apisix/pull/9478)
+- Fix(etcd): reuse cli and enable keepalive [#9420](https://github.com/apache/apisix/pull/9420)
+- Fix: upstream key config add mqtt_client_id support [#9450](https://github.com/apache/apisix/pull/9450)
+- Fix: body-transformer plugin return raw body anytime [#9446](https://github.com/apache/apisix/pull/9446)
+- Fix(wolf-rbac): other plugin in consumer not effective when consumer used wolf-rbac plugin [#9298](https://github.com/apache/apisix/pull/9298)
+- Fix: always parse domain when host is domain name [#9332](https://github.com/apache/apisix/pull/9332)
+- Fix: response-rewrite plugin can't add only one character [#9372](https://github.com/apache/apisix/pull/9372)
+- Fix(consul): support to fetch only health endpoint [#9204](https://github.com/apache/apisix/pull/9204)
+
+## 3.3.0
+
+**The changes marked with :warning: are not backward compatible.**
+
+### Change
+
+- :warning: Change the default router from `radixtree_uri` to `radixtree_host_uri`: [#9047](https://github.com/apache/apisix/pull/9047)
+- :warning: CORS plugin will add `Vary: Origin` header when `allow_origin` is not `*`: [#9010](https://github.com/apache/apisix/pull/9010)
+
+### Core
+
+- :sunrise: Support store route's cert in secrets manager: [#9247](https://github.com/apache/apisix/pull/9247)
+- :sunrise: Support bypassing Admin API Auth by configuration: [#9147](https://github.com/apache/apisix/pull/9147)
+
+### Plugins
+
+- :sunrise: Support header injection for `fault-injection` plugin: [#9039](https://github.com/apache/apisix/pull/9039)
+- :sunrise: Support variable when rewrite header in `proxy-rewrite` plugin: [#9112](https://github.com/apache/apisix/pull/9112)
+- :sunrise: `limit-count` plugin supports `username` and `ssl` for redis policy: [#9185](https://github.com/apache/apisix/pull/9185)
+
+### Bugfixes
+
+- Fix etcd data sync exception: [#8493](https://github.com/apache/apisix/pull/8493)
+- Fix invalidate cache in `core.request.add_header` and fix some calls: [#8824](https://github.com/apache/apisix/pull/8824)
+- Fix the high CPU and memory usage cause by healthcheck impl: [#9015](https://github.com/apache/apisix/pull/9015)
+- Consider using `allow_origins_by_regex` only when it is not `nil`: [#9028](https://github.com/apache/apisix/pull/9028)
+- Check upstream reference in `traffic-split` plugin when delete upstream: [#9044](https://github.com/apache/apisix/pull/9044)
+- Fix failing to connect to etcd at startup: [#9077](https://github.com/apache/apisix/pull/9077)
+- Fix health checker leak for domain nodes: [#9090](https://github.com/apache/apisix/pull/9090)
+- Prevent non `127.0.0.0/24` to access admin api with empty admin_key: [#9146](https://github.com/apache/apisix/pull/9146)
+- Ensure `hold_body_chunk` should use separate buffer for each plugin in case of pollution: [#9266](https://github.com/apache/apisix/pull/9266)
+- Ensure `batch-requests` plugin read trailer headers if existed: [#9289](https://github.com/apache/apisix/pull/9289)
+- Ensure `proxy-rewrite` should set `ngx.var.uri`: [#9309](https://github.com/apache/apisix/pull/9309)
+
+## 3.2.1
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/3.2` branch.**
+
+[https://github.com/apache/apisix/blob/release/3.2/CHANGELOG.md#321](https://github.com/apache/apisix/blob/release/3.2/CHANGELOG.md#321)
+
+## 3.2.0
+
+### Change
+
+- Deprecated separate Vault configuration in jwt-auth. Users can use secret to achieve the same function: [#8660](https://github.com/apache/apisix/pull/8660)
+
+### Core
+
+- :sunrise: Support Vault token to configure secret through environment variables: [#8866](https://github.com/apache/apisix/pull/8866)
+- :sunrise: Supports service discovery on stream subsystem:
+ - [#8583](https://github.com/apache/apisix/pull/8583)
+ - [#8593](https://github.com/apache/apisix/pull/8593)
+ - [#8584](https://github.com/apache/apisix/pull/8584)
+ - [#8640](https://github.com/apache/apisix/pull/8640)
+ - [#8633](https://github.com/apache/apisix/pull/8633)
+ - [#8696](https://github.com/apache/apisix/pull/8696)
+ - [#8826](https://github.com/apache/apisix/pull/8826)
+
+### Plugins
+
+- :sunrise: Add RESTful to graphQL conversion plugin: [#8959](https://github.com/apache/apisix/pull/8959)
+- :sunrise: Supports setting the log format on each log plugin:
+ - [#8806](https://github.com/apache/apisix/pull/8806)
+ - [#8643](https://github.com/apache/apisix/pull/8643)
+- :sunrise: Add request body/response body conversion plugin: [#8766](https://github.com/apache/apisix/pull/8766)
+- :sunrise: Support sending error logs to Kafka: [#8693](https://github.com/apache/apisix/pull/8693)
+- :sunrise: limit-count plugin supports X-RateLimit-Reset: [#8578](https://github.com/apache/apisix/pull/8578)
+- :sunrise: limit-count plugin supports setting TLS to access Redis cluster: [#8558](https://github.com/apache/apisix/pull/8558)
+- :sunrise: consumer-restriction plugin supports permission control via consumer_group_id: [#8567](https://github.com/apache/apisix/pull/8567)
+
+### Bugfixes
+
+- Fix mTLS protection when the host and SNI mismatch: [#8967](https://github.com/apache/apisix/pull/8967)
+- The proxy-rewrite plugin should escape URI parameter parts if they do not come from user config: [#8888](https://github.com/apache/apisix/pull/8888)
+- Admin API PATCH operation should return 200 status code after success: [#8855](https://github.com/apache/apisix/pull/8855)
+- Under certain conditions, the reload after etcd synchronization failure does not take effect: [#8736](https://github.com/apache/apisix/pull/8736)
+- Fix the problem that the nodes found by the Consul service discovery are incomplete: [#8651](https://github.com/apache/apisix/pull/8651)
+- Fix grpc-transcode plugin's conversion of Map data: [#8731](https://github.com/apache/apisix/pull/8731)
+- External plugins should be able to set the content-type response header: [#8588](https://github.com/apache/apisix/pull/8588)
+- When hotloading plugins, redundant timers may be left behind if the request-id plugin initializes the snowflake generator incorrectly: [#8556](https://github.com/apache/apisix/pull/8556)
+- Close previous proto synchronizer for grpc-transcode when hotloading plugins: [#8557](https://github.com/apache/apisix/pull/8557)
+
+## 3.1.0
+
+### Core
+
+- :sunrise: Support for etcd configuration synchronization via gRPC:
+ - [#8485](https://github.com/apache/apisix/pull/8485)
+ - [#8450](https://github.com/apache/apisix/pull/8450)
+ - [#8411](https://github.com/apache/apisix/pull/8411)
+- :sunrise: Support for configuring encrypted fields in plugins:
+ - [#8487](https://github.com/apache/apisix/pull/8487)
+ - [#8403](https://github.com/apache/apisix/pull/8403)
+- :sunrise: Support for placing partial fields in Vault or environment variable using secret resources:
+ - [#8448](https://github.com/apache/apisix/pull/8448)
+ - [#8421](https://github.com/apache/apisix/pull/8421)
+ - [#8412](https://github.com/apache/apisix/pull/8412)
+ - [#8394](https://github.com/apache/apisix/pull/8394)
+ - [#8390](https://github.com/apache/apisix/pull/8390)
+- :sunrise: Allows upstream configuration in the stream subsystem as a domain name: [#8500](https://github.com/apache/apisix/pull/8500)
+- :sunrise: Support Consul service discovery: [#8380](https://github.com/apache/apisix/pull/8380)
+
+### Plugin
+
+- :sunrise: Optimize resource usage for prometheus collection: [#8434](https://github.com/apache/apisix/pull/8434)
+- :sunrise: Add inspect plugin for easy debugging: [#8400](https://github.com/apache/apisix/pull/8400)
+- :sunrise: jwt-auth plugin supports parameters to hide authentication token from upstream : [#8206](https://github.com/apache/apisix/pull/8206)
+- :sunrise: proxy-rewrite plugin supports adding new request headers without overwriting existing request headers with the same name: [#8336](https://github.com/apache/apisix/pull/8336)
+- :sunrise: grpc-transcode plugin supports setting the grpc-status-details-bin response header into the response body: [#7639](https://github.com/apache/apisix/pull/7639)
+- :sunrise: proxy-mirror plugin supports setting the prefix: [#8261](https://github.com/apache/apisix/pull/8261)
+
+### Bugfix
+
+- Fix the problem that the plug-in configured under service object cannot take effect in time under some circumstances: [#8482](https://github.com/apache/apisix/pull/8482)
+- Fix an occasional 502 problem when http and grpc share the same upstream connection due to connection pool reuse: [#8364](https://github.com/apache/apisix/pull/8364)
+- file-logger should avoid buffer-induced log truncation when writing logs: [#7884](https://github.com/apache/apisix/pull/7884)
+- max_kept parameter of log-rotate plugin should take effect on compressed files: [#8366](https://github.com/apache/apisix/pull/8366)
+- Fix userinfo not being set when use_jwks is true in the openid-connect plugin: [#8347](https://github.com/apache/apisix/pull/8347)
+- Fix an issue where x-forwarded-host cannot be changed in the proxy-rewrite plugin: [#8200](https://github.com/apache/apisix/pull/8200)
+- Fix a bug where disabling the v3 admin API resulted in missing response bodies under certain circumstances: [#8349](https://github.com/apache/apisix/pull/8349)
+- In zipkin plugin, pass trace ID even if there is a rejected sampling decision: [#8099](https://github.com/apache/apisix/pull/8099)
+- Fix `_meta.filter` in plugin configuration not working with variables assigned after upstream response and custom variables in APISIX.
+ - [#8162](https://github.com/apache/apisix/pull/8162)
+ - [#8256](https://github.com/apache/apisix/pull/8256)
+
+## 3.0.0
+
+### Change
+
+- `enable_cpu_affinity` is disabled by default to avoid this configuration affecting the behavior of APSISIX deployed in the container: [#8074](https://github.com/apache/apisix/pull/8074)
+
+### Core
+
+- :sunrise: Added Consumer Group entity to manage multiple consumers: [#7980](https://github.com/apache/apisix/pull/7980)
+- :sunrise: Supports configuring the order in which DNS resolves domain name types: [#7935](https://github.com/apache/apisix/pull/7935)
+- :sunrise: Support configuring multiple `key_encrypt_salt` for rotation: [#7925](https://github.com/apache/apisix/pull/7925)
+
+### Plugin
+
+- :sunrise: Added ai plugin to dynamically optimize the execution path of APISIX according to the scene:
+ - [#8102](https://github.com/apache/apisix/pull/8102)
+ - [#8113](https://github.com/apache/apisix/pull/8113)
+ - [#8120](https://github.com/apache/apisix/pull/8120)
+ - [#8128](https://github.com/apache/apisix/pull/8128)
+ - [#8130](https://github.com/apache/apisix/pull/8130)
+ - [#8149](https://github.com/apache/apisix/pull/8149)
+ - [#8157](https://github.com/apache/apisix/pull/8157)
+- :sunrise: Support `session_secret` in openid-connect plugin to resolve the inconsistency of `session_secret` among multiple workers: [#8068](https://github.com/apache/apisix/pull/8068)
+- :sunrise: Support sasl config in kafka-logger plugin: [#8050](https://github.com/apache/apisix/pull/8050)
+- :sunrise: Support set resolve domain in proxy-mirror plugin: [#7861](https://github.com/apache/apisix/pull/7861)
+- :sunrise: Support `brokers` property in kafka-logger plugin, which supports different broker to set the same host: [#7999](https://github.com/apache/apisix/pull/7999)
+- :sunrise: Support get response body in ext-plugin-post-resp: [#7947](https://github.com/apache/apisix/pull/7947)
+- :sunrise: Added cas-auth plugin to support CAS authentication: [#7932](https://github.com/apache/apisix/pull/7932)
+
+### Bugfix
+
+- Conditional expressions of workflow plugin should support operators: [#8121](https://github.com/apache/apisix/pull/8121)
+- Fix loading problem of batch processor plugin when prometheus plugin is disabled: [#8079](https://github.com/apache/apisix/pull/8079)
+- When APISIX starts, delete the old conf server sock file if it exists: [#8022](https://github.com/apache/apisix/pull/8022)
+- Disable core.grpc when gRPC-client-nginx-module module is not compiled: [#8007](https://github.com/apache/apisix/pull/8007)
+
+## 3.0.0-beta
+
+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:
+
+1. 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.
+2. some package system might not allow package which has a suffix
+after the version number.
+
+### Change
+
+#### Moves the config_center, etcd and Admin API configuration to the deployment
+
+We've adjusted the configuration in the static configuration file, so you need to update the configuration in `config.yaml` as well:
+
+- The `config_center` function is now implemented by `config_provider` under `deployment`: [#7901](https://github.com/apache/apisix/pull/7901)
+- The `etcd` field is moved to `deployment`: [#7860](https://github.com/apache/apisix/pull/7860)
+- The following Admin API configuration is moved to the `admin` field under `deployment`: [#7823](https://github.com/apache/apisix/pull/7823)
+ - admin_key
+ - enable_admin_cors
+ - allow_admin
+ - admin_listen
+ - https_admin
+ - admin_api_mtls
+ - admin_api_version
+
+You can refer to the latest `config-default.yaml` for details.
+
+#### Removing multiple deprecated configurations
+
+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 `enable_http2` and `listen_port` from `apisix.ssl`: [#7717](https://github.com/apache/apisix/pull/7717)
+- Removed `apisix.port_admin`: [#7716](https://github.com/apache/apisix/pull/7716)
+- Removed `etcd.health_check_retry`: [#7676](https://github.com/apache/apisix/pull/7676)
+- Removed `nginx_config.http.lua_shared_dicts`: [#7677](https://github.com/apache/apisix/pull/7677)
+- Removed `apisix.real_ip_header`: [#7696](https://github.com/apache/apisix/pull/7696)
+
+In the dynamic configuration, we made the following adjustments:
+
+- Moved `disable` of the plugin configuration under `_meta`: [#7707](https://github.com/apache/apisix/pull/7707)
+- Removed `service_protocol` from the Route: [#7701](https://github.com/apache/apisix/pull/7701)
+
+There are also specific plugin level changes:
+
+- Removed `audience` field from authz-keycloak: [#7683](https://github.com/apache/apisix/pull/7683)
+- Removed `upstream` field from mqtt-proxy: [#7694](https://github.com/apache/apisix/pull/7694)
+- tcp-related configuration placed under the `tcp` field in error-log-logger: [#7700](https://github.com/apache/apisix/pull/7700)
+- Removed `max_retry_times` and `retry_interval` fields from syslog: [#7699](https://github.com/apache/apisix/pull/7699)
+- The `scheme` field has been removed from proxy-rewrite: [#7695](https://github.com/apache/apisix/pull/7695)
+
+#### New Admin API response format
+
+We have adjusted the response format of the Admin API in several PRs as follows:
+
+- [#7630](https://github.com/apache/apisix/pull/7630)
+- [#7622](https://github.com/apache/apisix/pull/7622)
+
+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
+}
+```
+
+#### Other
+
+- Port of Admin API changed to 9180: [#7806](https://github.com/apache/apisix/pull/7806)
+- We only support OpenResty 1.19.3.2 and above: [#7625](https://github.com/apache/apisix/pull/7625)
+- 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: [#7614](https://github.com/apache/apisix/pull/7614)
+
+### Core
+
+- Integrating grpc-client-nginx-module to APISIX: [#7917](https://github.com/apache/apisix/pull/7917)
+- k8s service discovery support for configuring multiple clusters: [#7895](https://github.com/apache/apisix/pull/7895)
+
+### Plugin
+
+- Support for injecting header with specified prefix in opentelemetry plugin: [#7822](https://github.com/apache/apisix/pull/7822)
+- Added openfunction plugin: [#7634](https://github.com/apache/apisix/pull/7634)
+- Added elasticsearch-logger plugin: [#7643](https://github.com/apache/apisix/pull/7643)
+- response-rewrite plugin supports adding response bodies: [#7794](https://github.com/apache/apisix/pull/7794)
+- log-rorate supports specifying the maximum size to cut logs: [#7749](https://github.com/apache/apisix/pull/7749)
+- Added workflow plug-in.
+ - [#7760](https://github.com/apache/apisix/pull/7760)
+ - [#7771](https://github.com/apache/apisix/pull/7771)
+- Added Tencent Cloud Log Service plugin: [#7593](https://github.com/apache/apisix/pull/7593)
+- jwt-auth supports ES256 algorithm: [#7627](https://github.com/apache/apisix/pull/7627)
+- ldap-auth internal implementation, switching from lualdap to lua-resty-ldap: [#7590](https://github.com/apache/apisix/pull/7590)
+- http request metrics within the prometheus plugin supports setting additional labels via variables: [#7549](https://github.com/apache/apisix/pull/7549)
+- The clickhouse-logger plugin supports specifying multiple clickhouse endpoints: [#7517](https://github.com/apache/apisix/pull/7517)
+
+### Bugfix
+
+- gRPC proxy sets :authority request header to configured upstream Host: [#7939](https://github.com/apache/apisix/pull/7939)
+- response-rewrite writing to an empty body may cause AIPSIX to fail to respond to the request: [#7836](https://github.com/apache/apisix/pull/7836)
+- 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: [#7965](https://github.com/apache/apisix/pull/7965)
+- Only reopen log files once when log cutting: [#7869](https://github.com/apache/apisix/pull/7869)
+- Passive health checks should not be enabled by default: [#7850](https://github.com/apache/apisix/pull/7850)
+- The zipkin plugin should pass trace IDs upstream even if it does not sample: [#7833](https://github.com/apache/apisix/pull/7833)
+- Correction of opentelemetry span kind to server: [#7830](https://github.com/apache/apisix/pull/7830)
+- in limit-count plugin, different routes with the same configuration should not share the same counter: [#7750](https://github.com/apache/apisix/pull/7750)
+- Fix occasional exceptions thrown when removing clean_handler: [#7648](https://github.com/apache/apisix/pull/7648)
+- Allow direct use of IPv6 literals when configuring upstream nodes: [#7594](https://github.com/apache/apisix/pull/7594)
+- The wolf-rbac plugin adjusts the way it responds to errors:
+ - [#7561](https://github.com/apache/apisix/pull/7561)
+ - [#7497](https://github.com/apache/apisix/pull/7497)
+- the phases after proxy didn't run when 500 error happens before proxy: [#7703](https://github.com/apache/apisix/pull/7703)
+- avoid error when multiple plugins associated with consumer and have rewrite phase: [#7531](https://github.com/apache/apisix/pull/7531)
+- upgrade lua-resty-etcd to 1.8.3 which fixes various issues: [#7565](https://github.com/apache/apisix/pull/7565)
+
+## 2.15.3
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.15` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2153](https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2153)
+
+## 2.15.2
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.15` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2152](https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2152)
+
+## 2.15.1
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.15` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2151](https://github.com/apache/apisix/blob/release/2.15/CHANGELOG.md#2151)
+
+## 2.15.0
+
+### Change
+
+- We now map the grpc error code OUT_OF_RANGE to http code 400 in grpc-transcode plugin: [#7419](https://github.com/apache/apisix/pull/7419)
+- Rename health_check_retry configuration in etcd section of `config-default.yaml` to startup_retry: [#7304](https://github.com/apache/apisix/pull/7304)
+- Remove `upstream.enable_websocket` which is deprecated since 2020: [#7222](https://github.com/apache/apisix/pull/7222)
+
+### Core
+
+- Support running plugins conditionally: [#7453](https://github.com/apache/apisix/pull/7453)
+- Allow users to specify plugin execution priority: [#7273](https://github.com/apache/apisix/pull/7273)
+- Support getting upstream certificate from ssl object: [#7221](https://github.com/apache/apisix/pull/7221)
+- Allow customizing error response in the plugin: [#7128](https://github.com/apache/apisix/pull/7128)
+- Add metrics to xRPC Redis proxy: [#7183](https://github.com/apache/apisix/pull/7183)
+- Introduce deployment role to simplify the deployment of APISIX:
+ - [#7405](https://github.com/apache/apisix/pull/7405)
+ - [#7417](https://github.com/apache/apisix/pull/7417)
+ - [#7392](https://github.com/apache/apisix/pull/7392)
+ - [#7365](https://github.com/apache/apisix/pull/7365)
+ - [#7249](https://github.com/apache/apisix/pull/7249)
+
+### Plugin
+
+- Add ngx.shared.dict statistic in promethues plugin: [#7412](https://github.com/apache/apisix/pull/7412)
+- Allow using unescaped raw URL in proxy-rewrite plugin: [#7401](https://github.com/apache/apisix/pull/7401)
+- Add PKCE support to the openid-connect plugin: [#7370](https://github.com/apache/apisix/pull/7370)
+- Support custom log format in sls-logger plugin: [#7328](https://github.com/apache/apisix/pull/7328)
+- Export some params for kafka-client in kafka-logger plugin: [#7266](https://github.com/apache/apisix/pull/7266)
+- Add support for capturing OIDC refresh tokens in openid-connect plugin: [#7220](https://github.com/apache/apisix/pull/7220)
+- Add prometheus plugin in stream subsystem: [#7174](https://github.com/apache/apisix/pull/7174)
+
+### Bugfix
+
+- clear remain state from the latest try before retrying in Kubernetes discovery: [#7506](https://github.com/apache/apisix/pull/7506)
+- the query string was repeated twice when enabling both http_to_https and append_query_string in the redirect plugin: [#7433](https://github.com/apache/apisix/pull/7433)
+- don't send empty Authorization header by default in http-logger: [#7444](https://github.com/apache/apisix/pull/7444)
+- ensure both `group` and `disable` configurations can be used in limit-count: [#7384](https://github.com/apache/apisix/pull/7384)
+- adjust the execution priority of request-id so the tracing plugins can use the request id: [#7281](https://github.com/apache/apisix/pull/7281)
+- correct the transcode of repeated Message in grpc-transcode: [#7231](https://github.com/apache/apisix/pull/7231)
+- var missing in proxy-cache cache key should be ignored: [#7168](https://github.com/apache/apisix/pull/7168)
+- reduce memory usage when abnormal weights are given in chash: [#7103](https://github.com/apache/apisix/pull/7103)
+- cache should be bypassed when the method mismatch in proxy-cache: [#7111](https://github.com/apache/apisix/pull/7111)
+- Upstream keepalive should consider TLS param:
+ - [#7054](https://github.com/apache/apisix/pull/7054)
+ - [#7466](https://github.com/apache/apisix/pull/7466)
+- The redirect plugin sets a correct port during redirecting HTTP to HTTPS:
+ - [#7065](https://github.com/apache/apisix/pull/7065)
+
+## 2.14.1
+
+### Bugfix
+
+- The "unix:" in the `real_ip_from` configuration should not break the batch-requests plugin: [#7106](https://github.com/apache/apisix/pull/7106)
+
+## 2.14.0
+
+### Change
+
+- To adapt the change of OpenTelemetry spec, the default port of OTLP/HTTP is changed to 4318: [#7007](https://github.com/apache/apisix/pull/7007)
+
+### Core
+
+- Introduce an experimental feature to allow subscribing Kafka message via APISIX. This feature is based on the pubsub framework running above websocket:
+ - [#7028](https://github.com/apache/apisix/pull/7028)
+ - [#7032](https://github.com/apache/apisix/pull/7032)
+- Introduce an experimental framework called xRPC to manage non-HTTP L7 traffic:
+ - [#6885](https://github.com/apache/apisix/pull/6885)
+ - [#6901](https://github.com/apache/apisix/pull/6901)
+ - [#6919](https://github.com/apache/apisix/pull/6919)
+ - [#6960](https://github.com/apache/apisix/pull/6960)
+ - [#6965](https://github.com/apache/apisix/pull/6965)
+ - [#7040](https://github.com/apache/apisix/pull/7040)
+- Now we support adding delay according to the command & key during proxying Redis traffic, which is built above xRPC:
+ - [#6999](https://github.com/apache/apisix/pull/6999)
+- Introduce an experimental support to configure APISIX via xDS:
+ - [#6614](https://github.com/apache/apisix/pull/6614)
+ - [#6759](https://github.com/apache/apisix/pull/6759)
+- Add `normalize_uri_like_servlet` option to normalize uri like servlet: [#6984](https://github.com/apache/apisix/pull/6984)
+- Zookeeper service discovery via apisix-seed: [#6751](https://github.com/apache/apisix/pull/6751)
+
+### Plugin
+
+- The real-ip plugin supports recursive IP search like `real_ip_recursive`: [#6988](https://github.com/apache/apisix/pull/6988)
+- The api-breaker plugin allows configuring response: [#6949](https://github.com/apache/apisix/pull/6949)
+- The response-rewrite plugin supports body filters: [#6750](https://github.com/apache/apisix/pull/6750)
+- The request-id plugin adds nanoid algorithm to generate ID: [#6779](https://github.com/apache/apisix/pull/6779)
+- The file-logger plugin can cache & reopen file handler: [#6721](https://github.com/apache/apisix/pull/6721)
+- Add casdoor plugin: [#6382](https://github.com/apache/apisix/pull/6382)
+- The authz-keycloak plugin supports password grant: [#6586](https://github.com/apache/apisix/pull/6586)
+
+### Bugfix
+
+- Upstream keepalive should consider TLS param: [#7054](https://github.com/apache/apisix/pull/7054)
+- Do not expose internal error message to the client:
+ - [#6982](https://github.com/apache/apisix/pull/6982)
+ - [#6859](https://github.com/apache/apisix/pull/6859)
+ - [#6854](https://github.com/apache/apisix/pull/6854)
+ - [#6853](https://github.com/apache/apisix/pull/6853)
+ - [#6846](https://github.com/apache/apisix/pull/6846)
+- DNS supports SRV record with port 0: [#6739](https://github.com/apache/apisix/pull/6739)
+- client mTLS was ignored sometimes in TLS session reuse: [#6906](https://github.com/apache/apisix/pull/6906)
+- The grpc-web plugin doesn't override Access-Control-Allow-Origin header in response: [#6842](https://github.com/apache/apisix/pull/6842)
+- The syslog plugin's default timeout is corrected: [#6807](https://github.com/apache/apisix/pull/6807)
+- The authz-keycloak plugin's `access_denied_redirect_uri` was bypassed sometimes: [#6794](https://github.com/apache/apisix/pull/6794)
+- Handle `USR2` signal properly: [#6758](https://github.com/apache/apisix/pull/6758)
+- The redirect plugin set a correct port during redirecting HTTP to HTTPS:
+ - [#7065](https://github.com/apache/apisix/pull/7065)
+ - [#6686](https://github.com/apache/apisix/pull/6686)
+- Admin API rejects unknown stream plugin: [#6813](https://github.com/apache/apisix/pull/6813)
+
+## 2.13.3
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.13` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2133](https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2133)
+
+## 2.13.2
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.13` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2132](https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2132)
+
+## 2.13.1
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.13` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2131](https://github.com/apache/apisix/blob/release/2.13/CHANGELOG.md#2131)
+
+## 2.13.0
+
+### Change
+
+- change(syslog): correct the configuration [#6551](https://github.com/apache/apisix/pull/6551)
+- change(server-info): use a new approach(keepalive) to report DP info [#6202](https://github.com/apache/apisix/pull/6202)
+- change(admin): empty nodes should be encoded as array [#6384](https://github.com/apache/apisix/pull/6384)
+- change(prometheus): replace wrong apisix_nginx_http_current_connections{state="total"} label [#6327](https://github.com/apache/apisix/pull/6327)
+- change: don't expose public API by default & remove plugin interceptor [#6196](https://github.com/apache/apisix/pull/6196)
+
+### Core
+
+- :sunrise: feat: add delayed_body_filter phase [#6605](https://github.com/apache/apisix/pull/6605)
+- :sunrise: feat: support for reading environment variables from yaml configuration files [#6505](https://github.com/apache/apisix/pull/6505)
+- :sunrise: feat: rerun rewrite phase for newly added plugins in consumer [#6502](https://github.com/apache/apisix/pull/6502)
+- :sunrise: feat: add config to control write all status to x-upsream-apisix-status [#6392](https://github.com/apache/apisix/pull/6392)
+- :sunrise: feat: add kubernetes discovery module [#4880](https://github.com/apache/apisix/pull/4880)
+- :sunrise: feat(graphql): support http get and post json request [#6343](https://github.com/apache/apisix/pull/6343)
+
+### Plugin
+
+- :sunrise: feat: jwt-auth support custom parameters [#6561](https://github.com/apache/apisix/pull/6561)
+- :sunrise: feat: set cors allow origins by plugin metadata [#6546](https://github.com/apache/apisix/pull/6546)
+- :sunrise: feat: support post_logout_redirect_uri config in openid-connect plugin [#6455](https://github.com/apache/apisix/pull/6455)
+- :sunrise: feat: mocking plugin [#5940](https://github.com/apache/apisix/pull/5940)
+- :sunrise: feat(error-log-logger): add clickhouse for error-log-logger [#6256](https://github.com/apache/apisix/pull/6256)
+- :sunrise: feat: clickhouse logger [#6215](https://github.com/apache/apisix/pull/6215)
+- :sunrise: feat(grpc-transcode): support .pb file [#6264](https://github.com/apache/apisix/pull/6264)
+- :sunrise: feat: development of Loggly logging plugin [#6113](https://github.com/apache/apisix/pull/6113)
+- :sunrise: feat: add opentelemetry plugin [#6119](https://github.com/apache/apisix/pull/6119)
+- :sunrise: feat: add public api plugin [#6145](https://github.com/apache/apisix/pull/6145)
+- :sunrise: feat: add CSRF plugin [#5727](https://github.com/apache/apisix/pull/5727)
+
+### Bugfix
+
+- fix(skywalking,opentelemetry): trace request rejected by auth [#6617](https://github.com/apache/apisix/pull/6617)
+- fix(log-rotate): should rotate logs strictly hourly(or minutely) [#6521](https://github.com/apache/apisix/pull/6521)
+- fix: deepcopy doesn't copy the metatable [#6623](https://github.com/apache/apisix/pull/6623)
+- fix(request-validate): handle duplicate key in JSON [#6625](https://github.com/apache/apisix/pull/6625)
+- fix(prometheus): conflict between global rule and route configure [#6579](https://github.com/apache/apisix/pull/6579)
+- fix(proxy-rewrite): when conf.headers are missing,conf.method can make effect [#6300](https://github.com/apache/apisix/pull/6300)
+- fix(traffic-split): failed to match rule when the first rule failed [#6292](https://github.com/apache/apisix/pull/6292)
+- fix(config_etcd): skip resync_delay while etcd watch timeout [#6259](https://github.com/apache/apisix/pull/6259)
+- fix(proto): avoid sharing state [#6199](https://github.com/apache/apisix/pull/6199)
+- fix(limit-count): keep the counter if the plugin conf is the same [#6151](https://github.com/apache/apisix/pull/6151)
+- fix(admin): correct the count field of plugin-metadata/global-rule [#6155](https://github.com/apache/apisix/pull/6155)
+- fix: add missing labels after merging route and service [#6177](https://github.com/apache/apisix/pull/6177)
+
+## 2.12.1
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.12` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.12/CHANGELOG.md#2121](https://github.com/apache/apisix/blob/release/2.12/CHANGELOG.md#2121)
+
+## 2.12.0
+
+### Change
+
+- change(serverless): rename "balancer" phase to "before_proxy" [#5992](https://github.com/apache/apisix/pull/5992)
+- change: don't promise to support Tengine [#5961](https://github.com/apache/apisix/pull/5961)
+- change: enable HTTP when stream proxy is set and enable_admin is true [#5867](https://github.com/apache/apisix/pull/5867)
+
+### Core
+
+- :sunrise: feat(L4): support TLS over TCP upstream [#6030](https://github.com/apache/apisix/pull/6030)
+- :sunrise: feat: support registering custom variable [#5941](https://github.com/apache/apisix/pull/5941)
+- :sunrise: feat(vault): vault lua module, integration with jwt-auth authentication plugin [#5745](https://github.com/apache/apisix/pull/5745)
+- :sunrise: feat: enable L4 stream logging [#5768](https://github.com/apache/apisix/pull/5768)
+- :sunrise: feat: add http_server_location_configuration_snippet configuration [#5740](https://github.com/apache/apisix/pull/5740)
+- :sunrise: feat: support resolve default value when environment not set [#5675](https://github.com/apache/apisix/pull/5675)
+- :sunrise: feat(wasm): run in http header_filter [#5544](https://github.com/apache/apisix/pull/5544)
+
+### Plugin
+
+- :sunrise: feat: support hide the authentication header in basic-auth with a config [#6039](https://github.com/apache/apisix/pull/6039)
+- :sunrise: feat: set proxy_request_buffering dynamically [#6075](https://github.com/apache/apisix/pull/6075)
+- :sunrise: feat(mqtt): balance by client id [#6079](https://github.com/apache/apisix/pull/6079)
+- :sunrise: feat: add forward-auth plugin [#6037](https://github.com/apache/apisix/pull/6037)
+- :sunrise: feat(grpc-web): support gRPC-Web Proxy [#5964](https://github.com/apache/apisix/pull/5964)
+- :sunrise: feat(limit-count): add constant key type [#5984](https://github.com/apache/apisix/pull/5984)
+- :sunrise: feat(limit-count): allow sharing counter [#5881](https://github.com/apache/apisix/pull/5881)
+- :sunrise: feat(splunk): support splunk hec logging plugin [#5819](https://github.com/apache/apisix/pull/5819)
+- :sunrise: feat: basic support OPA plugin [#5734](https://github.com/apache/apisix/pull/5734)
+- :sunrise: feat: rocketmq logger [#5653](https://github.com/apache/apisix/pull/5653)
+- :sunrise: feat(mqtt-proxy): support using route's upstream [#5666](https://github.com/apache/apisix/pull/5666)
+- :sunrise: feat(ext-plugin): support to get request body [#5600](https://github.com/apache/apisix/pull/5600)
+- :sunrise: feat(plugins): aws lambda serverless [#5594](https://github.com/apache/apisix/pull/5594)
+- :sunrise: feat(http/kafka-logger): support to log response body [#5550](https://github.com/apache/apisix/pull/5550)
+- :sunrise: feat: Apache OpenWhisk plugin [#5518](https://github.com/apache/apisix/pull/5518)
+- :sunrise: feat(plugin): support google cloud logging service [#5538](https://github.com/apache/apisix/pull/5538)
+
+### Bugfix
+
+- fix: the prometheus labels are inconsistent when error-log-logger is enabled [#6055](https://github.com/apache/apisix/pull/6055)
+- fix(ipv6): allow disabling IPv6 resolve [#6023](https://github.com/apache/apisix/pull/6023)
+- fix(mqtt): handle properties for MQTT 5 [#5916](https://github.com/apache/apisix/pull/5916)
+- fix(sls-logger): unable to get millisecond part of the timestamp [#5820](https://github.com/apache/apisix/pull/5820)
+- fix(mqtt-proxy): client id can be empty [#5816](https://github.com/apache/apisix/pull/5816)
+- fix(ext-plugin): don't use stale key [#5782](https://github.com/apache/apisix/pull/5782)
+- fix(log-rotate): race between reopen log & compression [#5715](https://github.com/apache/apisix/pull/5715)
+- fix(batch-processor): we didn't free stale object actually [#5700](https://github.com/apache/apisix/pull/5700)
+- fix: data pollution after passive health check is changed [#5589](https://github.com/apache/apisix/pull/5589)
+
+## 2.11.0
+
+### Change
+
+- change(wolf-rbac): change default port number and add `authType` parameter to documentation [#5477](https://github.com/apache/apisix/pull/5477)
+
+### Core
+
+- :sunrise: feat: support advanced matching based on post form [#5409](https://github.com/apache/apisix/pull/5409)
+- :sunrise: feat: initial wasm support [#5288](https://github.com/apache/apisix/pull/5288)
+- :sunrise: feat(control): expose services[#5271](https://github.com/apache/apisix/pull/5271)
+- :sunrise: feat(control): add dump upstream api [#5259](https://github.com/apache/apisix/pull/5259)
+- :sunrise: feat: etcd cluster single node failure APISIX startup failure [#5158](https://github.com/apache/apisix/pull/5158)
+- :sunrise: feat: support specify custom sni in etcd conf [#5206](https://github.com/apache/apisix/pull/5206)
+
+### Plugin
+
+- :sunrise: feat(plugin): azure serverless functions [#5479](https://github.com/apache/apisix/pull/5479)
+- :sunrise: feat(kafka-logger): supports logging request body [#5501](https://github.com/apache/apisix/pull/5501)
+- :sunrise: feat: provide skywalking logger plugin [#5478](https://github.com/apache/apisix/pull/5478)
+- :sunrise: feat(plugins): Datadog for metrics collection [#5372](https://github.com/apache/apisix/pull/5372)
+- :sunrise: feat(limit-* plugin): fallback to remote_addr when key is missing [#5422](https://github.com/apache/apisix/pull/5422)
+- :sunrise: feat(limit-count): support multiple variables as key [#5378](https://github.com/apache/apisix/pull/5378)
+- :sunrise: feat(limit-conn): support multiple variables as key [#5354](https://github.com/apache/apisix/pull/5354)
+- :sunrise: feat(proxy-rewrite): rewrite method [#5292](https://github.com/apache/apisix/pull/5292)
+- :sunrise: feat(limit-req): support multiple variables as key [#5302](https://github.com/apache/apisix/pull/5302)
+- :sunrise: feat(proxy-cache): support memory-based strategy [#5028](https://github.com/apache/apisix/pull/5028)
+- :sunrise: feat(ext-plugin): avoid sending conf request more times [#5183](https://github.com/apache/apisix/pull/5183)
+- :sunrise: feat: Add ldap-auth plugin [#3894](https://github.com/apache/apisix/pull/3894)
+
+## 2.10.5
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2105](https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2105)
+
+## 2.10.4
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2104](https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2104)
+
+## 2.10.3
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2103](https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2103)
+
+## 2.10.2
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2102](https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2102)
+
+## 2.10.1
+
+**This is an LTS maintenance release and you can see the CHANGELOG in `release/2.10` branch.**
+
+[https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2101](https://github.com/apache/apisix/blob/release/2.10/CHANGELOG.md#2101)
+
+## 2.10.0
+
+### Change
+
+- change(debug): move 'enable_debug' form config.yaml to debug.yaml [#5046](https://github.com/apache/apisix/pull/5046)
+- change: use a new name to customize lua_shared_dict in nginx.conf [#5030](https://github.com/apache/apisix/pull/5030)
+- change: drop the support of shell script installation [#4985](https://github.com/apache/apisix/pull/4985)
+
+### Core
+
+- :sunrise: feat(debug-mode): add dynamic debug mode [#5012](https://github.com/apache/apisix/pull/5012)
+- :sunrise: feat: allow injecting logic to APISIX's method [#5068](https://github.com/apache/apisix/pull/5068)
+- :sunrise: feat: allow configuring fallback SNI [#5000](https://github.com/apache/apisix/pull/5000)
+- :sunrise: feat(stream_route): support CIDR in ip match [#4980](https://github.com/apache/apisix/pull/4980)
+- :sunrise: feat: allow route to inherit hosts from service [#4977](https://github.com/apache/apisix/pull/4977)
+- :sunrise: feat: support configurating the node listening address[#4856](https://github.com/apache/apisix/pull/4856)
+
+### Plugin
+
+- :sunrise: feat(hmac-auth): Add validate request body for hmac auth plugin [#5038](https://github.com/apache/apisix/pull/5038)
+- :sunrise: feat(proxy-mirror): support mirror requests sample_ratio [#4965](https://github.com/apache/apisix/pull/4965)
+- :sunrise: feat(referer-restriction): add blacklist and message [#4916](https://github.com/apache/apisix/pull/4916)
+- :sunrise: feat(kafka-logger): add cluster name support [#4876](https://github.com/apache/apisix/pull/4876)
+- :sunrise: feat(kafka-logger): add required_acks option [#4878](https://github.com/apache/apisix/pull/4878)
+- :sunrise: feat(uri-blocker): add case insensitive switch [#4868](https://github.com/apache/apisix/pull/4868)
+
+### Bugfix
+
+- fix(radixtree_host_uri): correct matched host [#5124](https://github.com/apache/apisix/pull/5124)
+- fix(radixtree_host_uri): correct matched path [#5104](https://github.com/apache/apisix/pull/5104)
+- fix(nacos): distinguish services that has same name but in different groups or namespaces [#5083](https://github.com/apache/apisix/pull/5083)
+- fix(nacos): continue to process other services when request failed [#5112](https://github.com/apache/apisix/pull/5112)
+- fix(ssl): match sni in case-insensitive way [#5074](https://github.com/apache/apisix/pull/5074)
+- fix(upstream): should not override default keepalive value [#5054](https://github.com/apache/apisix/pull/5054)
+- fix(DNS): prefer SRV in service discovery [#4992](https://github.com/apache/apisix/pull/4992)
+- fix(consul): retry connecting after a delay [#4979](https://github.com/apache/apisix/pull/4979)
+- fix: avoid copying unwanted data when the domain's IP changed [#4952](https://github.com/apache/apisix/pull/4952)
+- fix(plugin_config): recover plugin when plugin_config changed [#4888](https://github.com/apache/apisix/pull/4888)
+
+## 2.9.0
+
+### Change
+
+- change: rename plugin's balancer method to before_proxy [#4697](https://github.com/apache/apisix/pull/4697)
+
+### Core
+
+- :sunrise: feat: increase timers limitation [#4843](https://github.com/apache/apisix/pull/4843)
+- :sunrise: feat: make A/B test APISIX easier by removing "additionalProperties = false" [#4797](https://github.com/apache/apisix/pull/4797)
+- :sunrise: feat: support dash in args (#4519) [#4676](https://github.com/apache/apisix/pull/4676)
+- :sunrise: feat(admin): reject invalid proto [#4750](https://github.com/apache/apisix/pull/4750)
+
+### Plugin
+
+- :sunrise: feat(ext-plugin): support ExtraInfo [#4835](https://github.com/apache/apisix/pull/4835)
+- :sunrise: feat(gzip): support special * to match any type [#4817](https://github.com/apache/apisix/pull/4817)
+- :sunrise: feat(real-ip): implement the first version [#4813](https://github.com/apache/apisix/pull/4813)
+- :sunrise: feat(limit-*): add custom reject-message for traffic control [#4808](https://github.com/apache/apisix/pull/4808)
+- :sunrise: feat: Request-ID plugin add snowflake algorithm [#4559](https://github.com/apache/apisix/pull/4559)
+- :sunrise: feat: Added authz-casbin plugin and doc and tests for it [#4710](https://github.com/apache/apisix/pull/4710)
+- :sunrise: feat: add error log skywalking reporter [#4633](https://github.com/apache/apisix/pull/4633)
+- :sunrise: feat(ext-plugin): send the idempotent key when preparing conf [#4736](https://github.com/apache/apisix/pull/4736)
+
+### Bugfix
+
+- fix: the issue that plugins in global rule may be cached to route [#4867](https://github.com/apache/apisix/pull/4867)
+- fix(grpc-transcode): support converting nested message [#4859](https://github.com/apache/apisix/pull/4859)
+- fix(authz-keycloak): set permissions as empty table when lazy_load_path is false [#4845](https://github.com/apache/apisix/pull/4845)
+- fix(proxy-cache): keep cache_method same with nginx's proxy_cache_methods [#4814](https://github.com/apache/apisix/pull/4814)
+- fix(admin): inject updatetime when the request is PATCH with sub path [#4765](https://github.com/apache/apisix/pull/4765)
+- fix(admin): check username for updating consumer [#4756](https://github.com/apache/apisix/pull/4756)
+- fix(error-log-logger): avoid sending stale error log [#4690](https://github.com/apache/apisix/pull/4690)
+- fix(grpc-transcode): handle enum type [#4706](https://github.com/apache/apisix/pull/4706)
+- fix: when a request caused a 500 error, the status was converted to 405 [#4696](https://github.com/apache/apisix/pull/4696)
+
+## 2.8.0
+
+### Change
+
+- change: enable stream proxy only by default [#4580](https://github.com/apache/apisix/pull/4580)
+
+### Core
+
+- :sunrise: feat: allow user-defined balancer with metadata in node [#4605](https://github.com/apache/apisix/pull/4605)
+- :sunrise: feat: Add option retry_timeout that like nginx's proxy_next_upstream_timeout [#4574](https://github.com/apache/apisix/pull/4574)
+- :sunrise: feat: enable balancer phase for plugins [#4549](https://github.com/apache/apisix/pull/4549)
+- :sunrise: feat: allow setting separate keepalive pool [#4506](https://github.com/apache/apisix/pull/4506)
+- :sunrise: feat: enable etcd health-check [#4191](https://github.com/apache/apisix/pull/4191)
+
+### Plugin
+
+- :sunrise: feat: add gzip plugin [#4640](https://github.com/apache/apisix/pull/4640)
+- :sunrise: feat(plugin): Add new plugin ua-restriction for bot spider restriction [#4587](https://github.com/apache/apisix/pull/4587)
+- :sunrise: feat(stream): add ip-restriction [#4602](https://github.com/apache/apisix/pull/4602)
+- :sunrise: feat(stream): add limit-conn [#4515](https://github.com/apache/apisix/pull/4515)
+- :sunrise: feat: increase ext-plugin timeout to 60s [#4557](https://github.com/apache/apisix/pull/4557)
+- :sunrise: feat(key-auth): supporting key-auth plugin to get key from query string [#4490](https://github.com/apache/apisix/pull/4490)
+- :sunrise: feat(kafka-logger): support for specified the log formats via admin API. [#4483](https://github.com/apache/apisix/pull/4483)
+
+### Bugfix
+
+- fix(stream): sni router is broken when session reuses [#4607](https://github.com/apache/apisix/pull/4607)
+- fix: the limit-conn plugin cannot effectively intercept requests in special scenarios [#4585](https://github.com/apache/apisix/pull/4585)
+- fix: ref check while deleting proto via Admin API [#4575](https://github.com/apache/apisix/pull/4575)
+- fix(skywalking): handle conflict between global rule and route [#4589](https://github.com/apache/apisix/pull/4589)
+- fix: `ctx.var.cookie_*` cookie not found log [#4564](https://github.com/apache/apisix/pull/4564)
+- fix(request-id): we can use different ids with the same request [#4479](https://github.com/apache/apisix/pull/4479)
+
+## 2.7.0
+
+### Change
+
+- change: check metadata_schema with check_schema like the other schema [#4381](https://github.com/apache/apisix/pull/4381)
+- change(echo): remove odd auth_value [#4055](https://github.com/apache/apisix/pull/4055)
+- fix(admin): correct the resources' count field and change its type to integer [#4385](https://github.com/apache/apisix/pull/4385)
+
+### Core
+
+- :sunrise: feat(stream): support client certificate verification [#4445](https://github.com/apache/apisix/pull/4445)
+- :sunrise: feat(stream): accept tls over tcp [#4409](https://github.com/apache/apisix/pull/4409)
+- :sunrise: feat(stream): support domain in the upstream [#4386](https://github.com/apache/apisix/pull/4386)
+- :sunrise: feat(cli): wrap nginx quit cmd [#4360](https://github.com/apache/apisix/pull/4360)
+- :sunrise: feat: allow to set custom timeout for route [#4340](https://github.com/apache/apisix/pull/4340)
+- :sunrise: feat: nacos discovery support group [#4325](https://github.com/apache/apisix/pull/4325)
+- :sunrise: feat: nacos discovery support namespace [#4313](https://github.com/apache/apisix/pull/4313)
+
+### Plugin
+
+- :sunrise: feat(client-control): set client_max_body_size dynamically [#4423](https://github.com/apache/apisix/pull/4423)
+- :sunrise: feat(ext-plugin): stop the runner with SIGTERM [#4367](https://github.com/apache/apisix/pull/4367)
+- :sunrise: feat(limit-req) support nodelay [#4395](https://github.com/apache/apisix/pull/4395)
+- :sunrise: feat(mqtt-proxy): support domain [#4391](https://github.com/apache/apisix/pull/4391)
+- :sunrise: feat(redirect): support appending query string [#4298](https://github.com/apache/apisix/pull/4298)
+
+### Bugfix
+
+- fix: solve memory leak when the client aborts [#4405](https://github.com/apache/apisix/pull/4405)
+- fix(etcd): check res.body.error before accessing the data [#4371](https://github.com/apache/apisix/pull/4371)
+- fix(ext-plugin): when token is stale, refresh token and try again [#4345](https://github.com/apache/apisix/pull/4345)
+- fix(ext-plugin): pass environment variables [#4349](https://github.com/apache/apisix/pull/4349)
+- fix: ensure the plugin is always reloaded [#4319](https://github.com/apache/apisix/pull/4319)
+
+## 2.6.0
+
+### Change
+
+- change(prometheus): redesign the latency metrics & update grafana [#3993](https://github.com/apache/apisix/pull/3993)
+- change(prometheus): don't expose metrics to internet [#3994](https://github.com/apache/apisix/pull/3994)
+- change(limit-count): ensure redis cluster name is set correctly [#3910](https://github.com/apache/apisix/pull/3910)
+- change: drop support of OpenResty 1.15 [#3960](https://github.com/apache/apisix/pull/3960)
+
+### Core
+
+- :sunrise: feat: support passing different host headers in multiple nodes [#4208](https://github.com/apache/apisix/pull/4208)
+- :sunrise: feat: add 50x html for error page [#4164](https://github.com/apache/apisix/pull/4164)
+- :sunrise: feat: support to use upstream_id in stream_route [#4121](https://github.com/apache/apisix/pull/4121)
+- :sunrise: feat: support client certificate verification [#4034](https://github.com/apache/apisix/pull/4034)
+- :sunrise: feat: add nacos support [#3820](https://github.com/apache/apisix/pull/3820)
+- :sunrise: feat: patch tcp.sock.connect to use our DNS resolver [#4114](https://github.com/apache/apisix/pull/4114)
+
+### Plugin
+
+- :sunrise: feat(redirect): support uri encoding [#4244](https://github.com/apache/apisix/pull/4244)
+- :sunrise: feat(key-auth): allow customizing header [#4013](https://github.com/apache/apisix/pull/4013)
+- :sunrise: feat(response-rewrite): allow using variable in the header [#4194](https://github.com/apache/apisix/pull/4194)
+- :sunrise: feat(ext-plugin): APISIX can support Java, Go and other languages to implement custom plugin [#4183](https://github.com/apache/apisix/pull/4183)
+
+### Bugfix
+
+- fix(DNS): support IPv6 resolver [#4242](https://github.com/apache/apisix/pull/4242)
+- fix(healthcheck): only one_loop is needed in the passive health check report [#4116](https://github.com/apache/apisix/pull/4116)
+- fix(traffic-split): configure multiple "rules", the request will be confused between upstream [#4092](https://github.com/apache/apisix/pull/4092)
+- fix: ensure upstream with domain is cached [#4061](https://github.com/apache/apisix/pull/4061)
+- fix: be compatible with the router created before 2.5 [#4056](https://github.com/apache/apisix/pull/4056)
+- fix(standalone): the conf should be available during start [#4027](https://github.com/apache/apisix/pull/4027)
+- fix: ensure atomic operation in limit-count plugin [#3991](https://github.com/apache/apisix/pull/3991)
+
+## 2.5.0
+
+**The changes marked with :warning: are not backward compatible.**
+**Please upgrade your data accordingly before upgrading to this version.**
+**[#3809](https://github.com/apache/apisix/pull/3809) Means that empty vars will make the route fail to match any requests.**
+
+### Change
+
+- :warning: change: remove unused consumer.id [#3868](https://github.com/apache/apisix/pull/3868)
+- :warning: change: remove deprecated upstream.enable_websocket [#3854](https://github.com/apache/apisix/pull/3854)
+- change(zipkin): rearrange the child span [#3877](https://github.com/apache/apisix/pull/3877)
+
+### Core
+
+- :sunrise: feat: support mTLS with etcd [#3905](https://github.com/apache/apisix/pull/3905)
+- :warning: feat: upgrade lua-resty-expr/radixtree to support logical expression [#3809](https://github.com/apache/apisix/pull/3809)
+- :sunrise: feat: load etcd configuration when apisix starts [#3799](https://github.com/apache/apisix/pull/3799)
+- :sunrise: feat: let balancer support priority [#3755](https://github.com/apache/apisix/pull/3755)
+- :sunrise: feat: add control api for discovery module [#3742](https://github.com/apache/apisix/pull/3742)
+
+### Plugin
+
+- :sunrise: feat(skywalking): allow destroy and configure report interval for reporter [#3925](https://github.com/apache/apisix/pull/3925)
+- :sunrise: feat(traffic-split): the upstream pass_host needs to support IP mode [#3870](https://github.com/apache/apisix/pull/3870)
+- :sunrise: feat: Add filter on HTTP methods for consumer-restriction plugin [#3691](https://github.com/apache/apisix/pull/3691)
+- :sunrise: feat: add allow_origins_by_regex to cors plugin [#3839](https://github.com/apache/apisix/pull/3839)
+- :sunrise: feat: support conditional response rewrite [#3577](https://github.com/apache/apisix/pull/3577)
+
+### Bugfix
+
+- fix(error-log-logger): the logger should be run in each process [#3912](https://github.com/apache/apisix/pull/3912)
+- fix: use the builtin server by default [#3907](https://github.com/apache/apisix/pull/3907)
+- fix(traffic-split): binding upstream via upstream_id is invalid [#3842](https://github.com/apache/apisix/pull/3842)
+- fix: correct the validation for ssl_trusted_certificate [#3832](https://github.com/apache/apisix/pull/3832)
+- fix: don't override cache relative headers [#3789](https://github.com/apache/apisix/pull/3789)
+- fix: fail to run `make deps` on macOS [#3718](https://github.com/apache/apisix/pull/3718)
+
+## 2.4.0
+
+### Change
+
+- change: global rules should not be executed on the internal api by default [#3396](https://github.com/apache/apisix/pull/3396)
+- change: default to cache DNS record according to the TTL [#3530](https://github.com/apache/apisix/pull/3530)
+
+### Core
+
+- :sunrise: feat: support SRV record [#3686](https://github.com/apache/apisix/pull/3686)
+- :sunrise: feat: add dns discovery [#3629](https://github.com/apache/apisix/pull/3629)
+- :sunrise: feat: add consul kv discovery module [#3615](https://github.com/apache/apisix/pull/3615)
+- :sunrise: feat: support to bind plugin config by `plugin_config_id` [#3567](https://github.com/apache/apisix/pull/3567)
+- :sunrise: feat: support listen http2 with plaintext [#3547](https://github.com/apache/apisix/pull/3547)
+- :sunrise: feat: support DNS AAAA record [#3484](https://github.com/apache/apisix/pull/3484)
+
+### Plugin
+
+- :sunrise: feat: the traffic-split plugin supports upstream_id [#3512](https://github.com/apache/apisix/pull/3512)
+- :sunrise: feat(zipkin): support b3 req header [#3551](https://github.com/apache/apisix/pull/3551)
+
+### Bugfix
+
+- fix(chash): ensure retry can try every node [#3651](https://github.com/apache/apisix/pull/3651)
+- fix: script does not work when the route is bound to a service [#3678](https://github.com/apache/apisix/pull/3678)
+- fix: use openssl111 in openresty dir in precedence [#3603](https://github.com/apache/apisix/pull/3603)
+- fix(zipkin): don't cache the per-req sample ratio [#3522](https://github.com/apache/apisix/pull/3522)
+
+For more changes, please refer to [Milestone](https://github.com/apache/apisix/milestone/13)
+
+## 2.3.0
+
+### Change
+
+- fix: use luajit by default when run apisix [#3335](https://github.com/apache/apisix/pull/3335)
+- feat: use luasocket instead of curl in etcd.lua [#2965](https://github.com/apache/apisix/pull/2965)
+
+### Core
+
+- :sunrise: feat: support to communicate with etcd by TLS without verification in command line [#3415](https://github.com/apache/apisix/pull/3415)
+- :sunrise: feat: chaos test on route could still works when etcd is down [#3404](https://github.com/apache/apisix/pull/3404)
+- :sunrise: feat: ewma use p2c to improve performance [#3300](https://github.com/apache/apisix/pull/3300)
+- :sunrise: feat: support specifying https in upstream to talk with https backend [#3430](https://github.com/apache/apisix/pull/3430)
+- :sunrise: feat: allow customizing lua_package_path & lua_package_cpath [#3417](https://github.com/apache/apisix/pull/3417)
+- :sunrise: feat: allow to pass SNI in HTTPS proxy [#3420](https://github.com/apache/apisix/pull/3420)
+- :sunrise: feat: support gRPCS [#3411](https://github.com/apache/apisix/pull/3411)
+- :sunrise: feat: allow getting upstream health check status via control API [#3345](https://github.com/apache/apisix/pull/3345)
+- :sunrise: feat: support dubbo [#3224](https://github.com/apache/apisix/pull/3224)
+- :sunrise: feat: load balance by least connections [#3304](https://github.com/apache/apisix/pull/3304)
+
+### Plugin
+
+- :sunrise: feat: kafka-logger implemented reuse kafka producer [#3429](https://github.com/apache/apisix/pull/3429)
+- :sunrise: feat(authz-keycloak): dynamic scope and resource mapping. [#3308](https://github.com/apache/apisix/pull/3308)
+- :sunrise: feat: proxy-rewrite host support host with port [#3428](https://github.com/apache/apisix/pull/3428)
+- :sunrise: feat(fault-injection): support conditional fault injection using nginx variables [#3363](https://github.com/apache/apisix/pull/3363)
+
+### Bugfix
+
+- fix(standalone): require consumer's id to be the same as username [#3394](https://github.com/apache/apisix/pull/3394)
+- fix: support upstream_id & consumer with grpc [#3387](https://github.com/apache/apisix/pull/3387)
+- fix: set conf info when global rule is hit without matched rule [#3332](https://github.com/apache/apisix/pull/3332)
+- fix: avoid caching outdated discovery upstream nodes [#3295](https://github.com/apache/apisix/pull/3295)
+- fix: create the health checker in `access` phase [#3240](https://github.com/apache/apisix/pull/3240)
+- fix: make set_more_retries() work when upstream_type is chash [#2676](https://github.com/apache/apisix/pull/2676)
+
+For more changes, please refer to [Milestone](https://github.com/apache/apisix/milestone/12)
+
+## 2.2.0
+
+### Change
+
+- disable node-status plugin by default [#2968](https://github.com/apache/apisix/pull/2968)
+- k8s_deployment_info is no longer allowed in upstream [#3098](https://github.com/apache/apisix/pull/3098)
+- don't treat route segment with ':' as parameter by default [#3154](https://github.com/apache/apisix/pull/3154)
+
+### Core
+
+- :sunrise: allow create consumers with multiple auth plugins [#2898](https://github.com/apache/apisix/pull/2898)
+- :sunrise: increase the delay before resync etcd [#2977](https://github.com/apache/apisix/pull/2977)
+- :sunrise: support enable/disable route [#2943](https://github.com/apache/apisix/pull/2943)
+- :sunrise: route according to the graphql attributes [#2964](https://github.com/apache/apisix/pull/2964)
+- :sunrise: share etcd auth token [#2932](https://github.com/apache/apisix/pull/2932)
+- :sunrise: add control API [#3048](https://github.com/apache/apisix/pull/3048)
+
+### Plugin
+
+- :sunrise: feat(limt-count): use 'remote_addr' as default key [#2927](https://github.com/apache/apisix/pull/2927)
+- :sunrise: feat(fault-injection): support Nginx variable in abort.body [#2986](https://github.com/apache/apisix/pull/2986)
+- :sunrise: feat: implement new plugin `server-info` [#2926](https://github.com/apache/apisix/pull/2926)
+- :sunrise: feat: add batch process metrics [#3070](https://github.com/apache/apisix/pull/3070)
+- :sunrise: feat: Implement traffic splitting plugin [#2935](https://github.com/apache/apisix/pull/2935)
+- :sunrise: feat: the proxy-rewrite plugin support pass nginx variable within header [#3144](https://github.com/apache/apisix/pull/3144)
+- :sunrise: feat: Make headers to add to request in openid-connect plugin configurable [#2903](https://github.com/apache/apisix/pull/2903)
+- :sunrise: feat: support var in upstream_uri on proxy-rewrite plugin [#3139](https://github.com/apache/apisix/pull/3139)
+
+### Bugfix
+
+- basic-auth plugin should run in rewrite phases. [#2905](https://github.com/apache/apisix/pull/2905)
+- fixed the non effective config update in http/udp-logger [#2901](https://github.com/apache/apisix/pull/2901)
+- always necessary to save the data of the limit concurrency, and release the statistical status in the log phase [#2465](https://github.com/apache/apisix/pull/2465)
+- avoid duplicate auto-generated id [#3003](https://github.com/apache/apisix/pull/3003)
+- 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.** [#3105](https://github.com/apache/apisix/pull/3105)
+- fix: correct the validation of route.vars [#3124](https://github.com/apache/apisix/pull/3124)
+
+For more changes, please refer to [Milestone](https://github.com/apache/apisix/milestone/10)
+
+## 2.1.0
+
+### Core
+
+- :sunrise: **support ENV variable in configuration.** [#2743](https://github.com/apache/apisix/pull/2743)
+- :sunrise: **support TLS connection with etcd.** [#2548](https://github.com/apache/apisix/pull/2548)
+- generate create/update_time automatically. [#2740](https://github.com/apache/apisix/pull/2740)
+- add a deprecate log for enable_websocket in upstream.[#2691](https://github.com/apache/apisix/pull/2691)
+- add a deprecate log for consumer id.[#2829](https://github.com/apache/apisix/pull/2829)
+- Added `X-APISIX-Upstream-Status` header to distinguish 5xx errors from upstream or APISIX itself. [#2817](https://github.com/apache/apisix/pull/2817)
+- support Nginx configuration snippet. [#2803](https://github.com/apache/apisix/pull/2803)
+
+### Plugin
+
+- :sunrise: **Upgrade protocol to support Apache Skywalking 8.0**[#2389](https://github.com/apache/apisix/pull/2389). 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.[#2169](https://github.com/apache/apisix/issues/2169)
+- proxy-cache: the cache_zone field in the schema should be optional.[#2776](https://github.com/apache/apisix/pull/2776)
+- fix: validate plugin configuration in the DP [#2856](https://github.com/apache/apisix/pull/2856)
+
+### Bugfix
+
+- :bug: fix(etcd): handle etcd compaction.[#2687](https://github.com/apache/apisix/pull/2687)
+- fix: move `conf/cert` to `t/certs` and disable ssl by default, which is not backward compatible. [#2112](https://github.com/apache/apisix/pull/2112)
+- fix: check decrypt key to prevent lua thread aborted [#2815](https://github.com/apache/apisix/pull/2815)
+
+### Not downward compatible features in future versions
+
+-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 [Milestone](https://github.com/apache/apisix/milestone/8)
+
+## 2.0.0
+
+This is release candidate.
+
+### Core
+
+- :sunrise: **Migrate from etcd v2 to v3 protocol, which is not backward compatible. Apache APISIX only supports etcd 3.4 and above versions.** [#2036](https://github.com/apache/apisix/pull/2036)
+- add labels for upstream object.[#2279](https://github.com/apache/apisix/pull/2279)
+- add managed fields in json schema for resources, such as create_time and update_time.[#2444](https://github.com/apache/apisix/pull/2444)
+- use interceptors to protect plugin's route[#2416](https://github.com/apache/apisix/pull/2416)
+- support multiple ports for http and https listen.[#2409](https://github.com/apache/apisix/pull/2409)
+- implement `core.sleep`.[#2397](https://github.com/apache/apisix/pull/2397)
+
+### Plugin
+
+- :sunrise: **add AK/SK(HMAC) auth plugin.**[#2192](https://github.com/apache/apisix/pull/2192)
+- :sunrise: add referer-restriction plugin.[#2352](https://github.com/apache/apisix/pull/2352)
+- `limit-count` support to use `redis` cluster.[#2406](https://github.com/apache/apisix/pull/2406)
+- feat(proxy-cache): store the temporary file under cache directory. [#2317](https://github.com/apache/apisix/pull/2317)
+- feat(http-logger): support for specified the log formats via admin API [#2309](https://github.com/apache/apisix/pull/2309)
+
+### Bugfix
+
+- :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.[#2168](https://github.com/apache/apisix/pull/2168)
+- fix routing priority does not take effect.[#2447](https://github.com/apache/apisix/pull/2447)
+- set random seed for each worker process at `init_worker` phase, only `init` phase is not enough.[#2357](https://github.com/apache/apisix/pull/2357)
+- remove unsupported algorithm in jwt plugin.[#2356](https://github.com/apache/apisix/pull/2356)
+- return correct response code when `http_to_https` enabled in redirect plugin.[#2311](https://github.com/apache/apisix/pull/2311)
+
+For more changes, please refer to [Milestone](https://github.com/apache/apisix/milestone/7)
+
+### CVE
+
+- Fixed Admin API default access token vulnerability
+
+## 1.5.0
+
+### Core
+
+- Admin API: support authentication with SSL certificates. [1747](https://github.com/apache/apisix/pull/1747)
+- Admin API: support both standard `PATCH` and sub path `PATCH`. [1930](https://github.com/apache/apisix/pull/1930)
+- HealthCheck: supports custom host port. [1914](https://github.com/apache/apisix/pull/1914)
+- Upstream: supports turning off the default retry mechanism. [1919](https://github.com/apache/apisix/pull/1919)
+- URI: supports delete the '/' at the end of the `URI`. [1766](https://github.com/apache/apisix/pull/1766)
+
+### New Plugin
+
+- :sunrise: **Request Validator** [1709](https://github.com/apache/apisix/pull/1709)
+
+### Improvements
+
+- change: nginx worker_shutdown_timeout is changed from 3s to recommended value 240s. [1883](https://github.com/apache/apisix/pull/1883)
+- change: the `healthcheck` timeout time type changed from `integer` to `number`. [1892](https://github.com/apache/apisix/pull/1892)
+- change: the `request-validation` plugin input parameter supports `Schema` validation. [1920](https://github.com/apache/apisix/pull/1920)
+- change: add comments for Makefile `install` command. [1912](https://github.com/apache/apisix/pull/1912)
+- change: update comment for config.yaml `etcd.timeout` configuration. [1929](https://github.com/apache/apisix/pull/1929)
+- change: add more prometheus metrics. [1888](https://github.com/apache/apisix/pull/1888)
+- change: add more configuration options for `cors` plugin. [1963](https://github.com/apache/apisix/pull/1963)
+
+### Bugfix
+
+- fixed: failed to get `host` in health check configuration. [1871](https://github.com/apache/apisix/pull/1871)
+- fixed: should not save the runtime data of plugin into `etcd`. [1910](https://github.com/apache/apisix/pull/1910)
+- fixed: run `apisix start` several times will start multi nginx processes. [1913](https://github.com/apache/apisix/pull/1913)
+- fixed: read the request body from the temporary file if it was cached. [1863](https://github.com/apache/apisix/pull/1863)
+- fixed: batch processor name and error return type. [1927](https://github.com/apache/apisix/pull/1927)
+- fixed: failed to read redis.ttl in `limit-count` plugin. [1928](https://github.com/apache/apisix/pull/1928)
+- fixed: passive health check seems never provide a healthy report. [1918](https://github.com/apache/apisix/pull/1918)
+- fixed: avoid to modify the original plugin conf. [1958](https://github.com/apache/apisix/pull/1958)
+- fixed: the test case of `invalid-upstream` is unstable and sometimes fails to run. [1925](https://github.com/apache/apisix/pull/1925)
+
+### Doc
+
+- doc: added APISIX Lua Coding Style Guide. [1874](https://github.com/apache/apisix/pull/1874)
+- doc: fixed link syntax in README.md. [1894](https://github.com/apache/apisix/pull/1894)
+- doc: fixed image links in zh-cn benchmark. [1896](https://github.com/apache/apisix/pull/1896)
+- doc: fixed typos in `FAQ`、`admin-api`、`architecture-design`、`discovery`、`prometheus`、`proxy-rewrite`、`redirect`、`http-logger` documents. [1916](https://github.com/apache/apisix/pull/1916)
+- doc: added improvements for OSx unit tests and request validation plugin. [1926](https://github.com/apache/apisix/pull/1926)
+- doc: fixed typos in `architecture-design` document. [1938](https://github.com/apache/apisix/pull/1938)
+- doc: added the default import path of `Nginx` for unit testing in `Linux` and `macOS` systems in the `how-to-build` document. [1936](https://github.com/apache/apisix/pull/1936)
+- doc: add `request-validation` plugin chinese document. [1932](https://github.com/apache/apisix/pull/1932)
+- doc: fixed file path of `gRPC transcoding` in `README`. [1945](https://github.com/apache/apisix/pull/1945)
+- doc: fixed `uri-blocker` plugin path error in `README`. [1950](https://github.com/apache/apisix/pull/1950)
+- doc: fixed `grpc-transcode` plugin path error in `README`. [1946](https://github.com/apache/apisix/pull/1946)
+- doc: removed unnecessary configurations for `k8s` document. [1891](https://github.com/apache/apisix/pull/1891)
+
+## 1.4.1
+
+### Bugfix
+
+- Fix: multiple SSL certificates are configured, but only one certificate working fine. [1818](https://github.com/apache/incubator-apisix/pull/1818)
+
+## 1.4.0
+
+### Core
+
+- Admin API: Support unique names for routes [1655](https://github.com/apache/incubator-apisix/pull/1655)
+- Optimization of log buffer size and flush time [1570](https://github.com/apache/incubator-apisix/pull/1570)
+
+### New plugins
+
+- :sunrise: **Apache Skywalking plugin** [1241](https://github.com/apache/incubator-apisix/pull/1241)
+- :sunrise: **Keycloak Identity Server Plugin** [1701](https://github.com/apache/incubator-apisix/pull/1701)
+- :sunrise: **Echo Plugin** [1632](https://github.com/apache/incubator-apisix/pull/1632)
+- :sunrise: **Consume Restriction Plugin** [1437](https://github.com/apache/incubator-apisix/pull/1437)
+
+### Improvements
+
+- Batch Request : Copy all headers to every request [1697](https://github.com/apache/incubator-apisix/pull/1697)
+- SSL private key encryption [1678](https://github.com/apache/incubator-apisix/pull/1678)
+- Improvement of docs for multiple plugins
+
+## 1.3.0
+
+The 1.3 version is mainly for security update.
+
+### Security
+
+- reject invalid header[#1462](https://github.com/apache/incubator-apisix/pull/1462) and uri safe encode[#1461](https://github.com/apache/incubator-apisix/pull/1461)
+- only allow 127.0.0.1 access admin API and dashboard by default. [#1458](https://github.com/apache/incubator-apisix/pull/1458)
+
+### Plugin
+
+- :sunrise: **add batch request plugin**. [#1388](https://github.com/apache/incubator-apisix/pull/1388)
+- implemented plugin `sys logger`. [#1414](https://github.com/apache/incubator-apisix/pull/1414)
+
+## 1.2.0
+
+The 1.2 version brings many new features, including core and plugins.
+
+### Core
+
+- :sunrise: **support etcd cluster**. [#1283](https://github.com/apache/incubator-apisix/pull/1283)
+- using the local DNS resolver by default, which is friendly for k8s. [#1387](https://github.com/apache/incubator-apisix/pull/1387)
+- support to run `header_filter`, `body_filter` and `log` phases for global rules. [#1364](https://github.com/apache/incubator-apisix/pull/1364)
+- changed the `lua/apisix` dir to `apisix`(**not backward compatible**). [#1351](https://github.com/apache/incubator-apisix/pull/1351)
+- add dashboard as submodule. [#1360](https://github.com/apache/incubator-apisix/pull/1360)
+- allow adding custom shared dict. [#1367](https://github.com/apache/incubator-apisix/pull/1367)
+
+### Plugin
+
+- :sunrise: **add Apache Kafka plugin**. [#1312](https://github.com/apache/incubator-apisix/pull/1312)
+- :sunrise: **add CORS plugin**. [#1327](https://github.com/apache/incubator-apisix/pull/1327)
+- :sunrise: **add TCP logger plugin**. [#1221](https://github.com/apache/incubator-apisix/pull/1221)
+- :sunrise: **add UDP logger plugin**. [1070](https://github.com/apache/incubator-apisix/pull/1070)
+- :sunrise: **add proxy mirror plugin**. [#1288](https://github.com/apache/incubator-apisix/pull/1288)
+- :sunrise: **add proxy cache plugin**. [#1153](https://github.com/apache/incubator-apisix/pull/1153)
+- drop websocket enable control in proxy-rewrite plugin(**not backward compatible**). [1332](https://github.com/apache/incubator-apisix/pull/1332)
+- Adding support to public key based introspection for OAuth plugin. [#1266](https://github.com/apache/incubator-apisix/pull/1266)
+- response-rewrite plugin support binary data to client by base64. [#1381](https://github.com/apache/incubator-apisix/pull/1381)
+- plugin `grpc-transcode` supports grpc deadline. [#1149](https://github.com/apache/incubator-apisix/pull/1149)
+- support password auth for limit-count-redis. [#1150](https://github.com/apache/incubator-apisix/pull/1150)
+- Zipkin plugin add service name and report local server IP. [#1386](https://github.com/apache/incubator-apisix/pull/1386)
+- add `change_pwd` and `user_info` for Wolf-Rbac plugin. [#1204](https://github.com/apache/incubator-apisix/pull/1204)
+
+### Admin API
+
+- :sunrise: support key-based authentication for Admin API(**not backward compatible**). [#1169](https://github.com/apache/incubator-apisix/pull/1169)
+- hide SSL private key in admin API. [#1240](https://github.com/apache/incubator-apisix/pull/1240)
+
+### Bugfix
+
+- missing `clear` table before to reuse table (**will cause memory leak**). [#1134](https://github.com/apache/incubator-apisix/pull/1134)
+- print warning error message if the yaml route file is invalid. [#1141](https://github.com/apache/incubator-apisix/pull/1141)
+- the balancer IP may be nil, use an empty string instead. [#1166](https://github.com/apache/incubator-apisix/pull/1166)
+- plugin node-status and heartbeat don't have schema. [#1249](https://github.com/apache/incubator-apisix/pull/1249)
+- the plugin basic-auth needs required field. [#1251](https://github.com/apache/incubator-apisix/pull/1251)
+- check the count of upstream valid node. [#1292](https://github.com/apache/incubator-apisix/pull/1292)
+
+## 1.1.0
+
+This release is mainly to strengthen the stability of the code and add more documentation.
+
+### Core
+
+- always specify perl include path when running test cases. [#1097](https://github.com/apache/incubator-apisix/pull/1097)
+- Feature: Add support for PROXY Protocol. [#1113](https://github.com/apache/incubator-apisix/pull/1113)
+- enhancement: add verify command to verify apisix configuration(nginx.conf). [#1112](https://github.com/apache/incubator-apisix/pull/1112)
+- feature: increase the default size of the core file. [#1105](https://github.com/apache/incubator-apisix/pull/1105)
+- feature: make the number of file is as configurable as the connections. [#1098](https://github.com/apache/incubator-apisix/pull/1098)
+- core: improve the core.log module. [#1093](https://github.com/apache/incubator-apisix/pull/1093)
+- Modify bin/apisix to support the SO_REUSEPORT. [#1085](https://github.com/apache/incubator-apisix/pull/1085)
+
+### Doc
+
+- doc: add link to download grafana meta data. [#1119](https://github.com/apache/incubator-apisix/pull/1119)
+- doc: Update README.md. [#1118](https://github.com/apache/incubator-apisix/pull/1118)
+- doc: doc: add wolf-rbac plugin. [#1116](https://github.com/apache/incubator-apisix/pull/1116)
+- doc: update the download link of rpm. [#1108](https://github.com/apache/incubator-apisix/pull/1108)
+- doc: add more english article. [#1092](https://github.com/apache/incubator-apisix/pull/1092)
+- Adding contribution guidelines for the documentation. [#1086](https://github.com/apache/incubator-apisix/pull/1086)
+- doc: getting-started.md check. [#1084](https://github.com/apache/incubator-apisix/pull/1084)
+- Added additional information and refactoring sentences. [#1078](https://github.com/apache/incubator-apisix/pull/1078)
+- Update admin-api-cn.md. [#1067](https://github.com/apache/incubator-apisix/pull/1067)
+- Update architecture-design-cn.md. [#1065](https://github.com/apache/incubator-apisix/pull/1065)
+
+### CI
+
+- ci: remove patch which is no longer necessary and removed in the upst. [#1090](https://github.com/apache/incubator-apisix/pull/1090)
+- fix path error when install with luarocks. [#1068](https://github.com/apache/incubator-apisix/pull/1068)
+- travis: run a apisix instance which intalled by luarocks. [#1063](https://github.com/apache/incubator-apisix/pull/1063)
+
+### Plugins
+
+- feature: Add wolf rbac plugin. [#1095](https://github.com/apache/incubator-apisix/pull/1095)
+- Adding UDP logger plugin. [#1070](https://github.com/apache/incubator-apisix/pull/1070)
+- enhancement: using internal request instead of external request in node-status plugin. [#1109](https://github.com/apache/incubator-apisix/pull/1109)
+
+## 1.0.0
+
+This release is mainly to strengthen the stability of the code and add more documentation.
+
+### Core
+
+- :sunrise: Support routing priority. You can match different upstream services based on conditions such as header, args, priority, etc. under the same URI. [#998](https://github.com/apache/incubator-apisix/pull/998)
+- When no route is matched, an error message is returned. To distinguish it from other 404 requests. [#1013](https://github.com/apache/incubator-apisix/pull/1013)
+- The address of the dashboard `/apisix/admin` supports CORS. [#982](https://github.com/apache/incubator-apisix/pull/982)
+- The jsonschema validator returns a clearer error message. [#1011](https://github.com/apache/incubator-apisix/pull/1011)
+- Upgrade the `ngx_var` module to version 0.5. [#1005](https://github.com/apache/incubator-apisix/pull/1005)
+- Upgrade the `lua-resty-etcd` module to version 0.8. [#980](https://github.com/apache/incubator-apisix/pull/980)
+- In development mode, the number of workers is automatically adjusted to 1. [#926](https://github.com/apache/incubator-apisix/pull/926)
+- Remove the nginx.conf file from the code repository. It is automatically generated every time and cannot be modified manually. [#974](https://github.com/apache/incubator-apisix/pull/974)
+
+### Doc
+
+- Added documentation on how to customize development plugins. [#909](https://github.com/apache/incubator-apisix/pull/909)
+- fixed example's bugs in the serverless plugin documentation. [#1006](https://github.com/apache/incubator-apisix/pull/1006)
+- Added documentation for using the Oauth plugin. [#987](https://github.com/apache/incubator-apisix/pull/987)
+- Added dashboard compiled documentation. [#985](https://github.com/apache/incubator-apisix/pull/985)
+- Added documentation on how to perform a/b testing. [#957](https://github.com/apache/incubator-apisix/pull/957)
+- Added documentation on how to enable the MQTT plugin. [#916](https://github.com/apache/incubator-apisix/pull/916)
+
+### Test case
+
+- Add test cases for key-auth plugin under normal circumstances. [#964](https://github.com/apache/incubator-apisix/pull/964/)
+- Added tests for gRPC transcode pb options. [#920](https://github.com/apache/incubator-apisix/pull/920)
+
+## 0.9.0
+
+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.
+
+### Core
+
+- :sunrise: Supported to run APISIX with tengine. [#683](https://github.com/apache/incubator-apisix/pull/683)
+- :sunrise: Enabled HTTP2 and supported to set ssl_protocols. [#663](https://github.com/apache/incubator-apisix/pull/663)
+- :sunrise: Advanced Debug Mode, Target module function's input arguments or returned value would be printed once this option is enabled. [#614](https://github.com/apache/incubator-apisix/pull/641)
+- Support to install APISIX without dashboard. [#686](https://github.com/apache/incubator-apisix/pull/686)
+- Removed router R3 [#725](https://github.com/apache/incubator-apisix/pull/725)
+
+### Plugins
+
+- [Redirect URI](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/redirect.md): Redirect URI plugin. [#732](https://github.com/apache/incubator-apisix/pull/732)
+- [Proxy Rewrite](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/proxy-rewrite.md): Supported remove `header` feature. [#658](https://github.com/apache/incubator-apisix/pull/658)
+- [Limit Count](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/limit-count.md): Supported global limit count with `Redis Server`.[#624](https://github.com/apache/incubator-apisix/pull/624)
+
+### lua-resty-*
+
+- 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.
+
+### Bugfix
+
+- key-auth plugin cannot run accurately in the case of multiple consumers. [#826](https://github.com/apache/incubator-apisix/pull/826)
+- Exported schema for plugin serverless. [#787](https://github.com/apache/incubator-apisix/pull/787)
+- Discard args of uri when using proxy-write plugin [#642](https://github.com/apache/incubator-apisix/pull/642)
+- Zipkin plugin not set tracing data to request header. [#715](https://github.com/apache/incubator-apisix/pull/715)
+- Skipped check cjson for luajit environment in apisix CLI. [#652](https://github.com/apache/incubator-apisix/pull/652)
+- Skipped to init etcd if use local file as config center. [#737](https://github.com/apache/incubator-apisix/pull/737)
+- Support more built-in parameters when set chash balancer. [#775](https://github.com/apache/incubator-apisix/pull/775)
+
+### Dependencies
+
+- Replace the `lua-rapidjson` module with `lua-resty-jsonschema` global, `lua-resty-jsonschema` is faster and easier to compile.
+
+## 0.8.0
+
+> 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.
+
+### Core
+
+- :sunrise: **[support standalone mode](https://github.com/apache/apisix/blob/master/docs/en/latest/deployment-modes.md#standalone)**: using yaml to update configurations of APISIX, more friendly to kubernetes. [#464](https://github.com/apache/incubator-apisix/pull/464)
+- :sunrise: **[support stream proxy](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/stream-proxy.md)**. [#513](https://github.com/apache/incubator-apisix/pull/513)
+- :sunrise: support consumer bind plugins. [#544](https://github.com/apache/incubator-apisix/pull/544)
+- support domain name in upstream, not only IP. [#522](https://github.com/apache/incubator-apisix/pull/522)
+- ignored upstream node when it's weight is 0. [#536](https://github.com/apache/incubator-apisix/pull/536)
+
+### Plugins
+
+- :sunrise: **[MQTT Proxy](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/mqtt-proxy.md)**: support to load balance MQTT by `client_id`, both support MQTT 3.1 and 5.0. [#513](https://github.com/apache/incubator-apisix/pull/513)
+- [proxy-rewrite](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/proxy-rewrite.md): rewrite uri,
+ schema, host for upstream. [#594](https://github.com/apache/incubator-apisix/pull/594)
+
+### ARM
+
+- :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-*
+
+- 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.
+
+### Bugfix
+
+- healthcheck: the checker name is wrong if APISIX works under multiple processes. [#568](https://github.com/apache/incubator-apisix/issues/568)
+
+### Dependencies
+
+- removed `lua-tinyyaml` from source code base, and install through Luarocks.
+
+## 0.7.0
+
+> 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.
+
+### Core
+
+- :sunrise: **[gRPC transcoding](https://github.com/apache/apisix/blob/master/docs/en/latest/plugins/grpc-transcode.md)**: supports protocol transcoding so that clients can access your gRPC API by using HTTP/JSON. [#395](https://github.com/apache/incubator-apisix/issues/395)
+- :sunrise: **[radix tree router](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/router-radixtree.md)**: 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.** [#414](https://github.com/apache/incubator-apisix/issues/414)
+- Dynamic upstream supports more parameters, you can specify the upstream uri and host, and whether to enable websocket. [#451](https://github.com/apache/incubator-apisix/pull/451)
+- Support for get values from cookies directly from `ctx.var`. [#449](https://github.com/apache/incubator-apisix/pull/449)
+- Routing support IPv6. [#331](https://github.com/apache/incubator-apisix/issues/331)
+
+### Plugins
+
+- :sunrise: **[serverless](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/serverless.md)**: With serverless support, users can dynamically run any Lua function on a gateway node. Users can also use this feature as a lightweight plugin.[#86](https://github.com/apache/incubator-apisix/pull/86)
+- :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. [#447](https://github.com/apache/incubator-apisix/pull/447)
+- [rate limit](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/limit-conn.md): 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. [#228](https://github.com/apache/incubator-apisix/issues/228)
+- [IP black and white list](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/ip-restriction.md) Support IP black and white list for security. [#398](https://github.com/apache/incubator-apisix/pull/398)
+
+### CLI
+
+- Add the `version` directive to get the version number of APISIX. [#420](https://github.com/apache/incubator-apisix/issues/420)
+
+### Admin
+
+- The `PATCH` API is supported and can be modified individually for a configuration without submitting the entire configuration. [#365](https://github.com/apache/incubator-apisix/pull/365)
+
+### Dashboard
+
+- :sunrise: **Add the online version of the dashboard**,users can [experience APISIX](http://apisix.iresty.com/) without install. [#374](https://github.com/apache/incubator-apisix/issues/374)
+
+[Back to TOC](#table-of-contents)
+
+## 0.6.0
+
+> 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**.
+
+### Core
+
+- :sunrise: **[Health Check and Circuit Breaker](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/tutorials/health-check.md)**: Enable health check on the upstream node, and will automatically filter unhealthy nodes during load balancing to ensure system stability. [#249](https://github.com/apache/incubator-apisix/pull/249)
+- Anti-ReDoS(Regular expression Denial of Service). [#252](https://github.com/apache/incubator-apisix/pull/250)
+- supported debug mode. [#319](https://github.com/apache/incubator-apisix/pull/319)
+- allowed to use different router. [#364](https://github.com/apache/incubator-apisix/pull/364)
+- supported to match route by host + uri. [#325](https://github.com/apache/incubator-apisix/pull/325)
+- allowed plugins to handler balance phase. [#299](https://github.com/apache/incubator-apisix/pull/299)
+- added desc for upstream and service in schema. [#289](https://github.com/apache/incubator-apisix/pull/289)
+
+### Plugins
+
+- :sunrise: **[OpenTracing](https://github.com/apache/incubator-apisix/blob/master/docs/en/latest/plugins/zipkin.md)**: support Zipkin and Apache SkyWalking. [#304](https://github.com/apache/incubator-apisix/pull/304)
+- [JWT auth](https://github.com/apache/apisix/blob/master/docs/en/latest/plugins/jwt-auth.md). [#303](https://github.com/apache/incubator-apisix/pull/303)
+
+### CLI
+
+- support multiple ips of `allow`. [#340](https://github.com/apache/incubator-apisix/pull/340)
+- supported real_ip configure in nginx.conf and added functions to get ip and remote ip. [#236](https://github.com/apache/incubator-apisix/pull/236)
+
+### Dashboard
+
+- :sunrise: **add built-in dashboard**. [#327](https://github.com/apache/incubator-apisix/pull/327)
+
+### Test
+
+- support OSX in Travis CI. [#217](https://github.com/apache/incubator-apisix/pull/217)
+- installed all of the dependencies to `deps` folder. [#248](https://github.com/apache/incubator-apisix/pull/248)
+
+[Back to TOC](#table-of-contents)
diff --git a/CloudronPackages/APISIX/apisix-source/CODE_OF_CONDUCT.md b/CloudronPackages/APISIX/apisix-source/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..fe93188
--- /dev/null
+++ b/CloudronPackages/APISIX/apisix-source/CODE_OF_CONDUCT.md
@@ -0,0 +1,121 @@
+
+
+*The following is copied for your convenience from
Index | +Upstream | +Check type | +Host | +Status | +Success counts | +TCP Failures | +HTTP Failures | +TIMEOUT Failures | +
---|---|---|---|---|---|---|---|---|
{* i *} | +{* stat.name *} | +{* stat.type *} | +{* node.ip .. ":" .. node.port *} | +{* node.status *} | +{* node.counter.success *} | +{* node.counter.tcp_failure *} | +{* node.counter.http_failure *} | +{* node.counter.timeout_failure *} | +
Powered by APISIX.
+ +* Connection #0 to host admin.apisix.dev left intact +``` + +3. Although the client certificate is missing, but the URI is in the whitelist, +you get successful response. + +```bash +curl https://admin.apisix.dev:9443/anything/foobar -i \ +--resolve 'admin.apisix.dev:9443:127.0.0.1' --cacert t/certs/mtls_ca.crt +HTTP/2 200 +content-type: application/json +content-length: 416 +date: Fri, 21 Apr 2023 07:58:28 GMT +access-control-allow-origin: * +access-control-allow-credentials: true +server: APISIX/3.2.0 +... +``` + +## Conclusion + +If you don't want to use curl or test on windows, you can read this gist for more details. [APISIX mTLS for client to APISIX](https://gist.github.com/bzp2010/6ce0bf7c15c191029ed54724547195b4). + +For more information about the mTLS feature of Apache APISIX, you can read [Mutual TLS Authentication](../mtls.md). diff --git a/CloudronPackages/APISIX/apisix-source/docs/en/latest/tutorials/expose-api.md b/CloudronPackages/APISIX/apisix-source/docs/en/latest/tutorials/expose-api.md new file mode 100644 index 0000000..cab143a --- /dev/null +++ b/CloudronPackages/APISIX/apisix-source/docs/en/latest/tutorials/expose-api.md @@ -0,0 +1,123 @@ +--- +title: Expose API +keywords: + - API Gateway + - Apache APISIX + - Expose Service +description: This article describes how to publish services through the API Gateway Apache APISIX. +--- + + + +This article will guide you through APISIX's upstream, routing, and service concepts and introduce how to publish your services through APISIX. + +## Concept introduction + +### Upstream + +[Upstream](../terminology/upstream.md) is a virtual host abstraction that performs load balancing on a given set of service nodes according to the configured rules. + +The role of the Upstream is to load balance the service nodes according to the configuration rules, and Upstream information can be directly configured to the Route or Service. + +When multiple routes or services refer to the same upstream, you can create an upstream object and use the upstream ID in the Route or Service to reference the upstream to reduce maintenance pressure. + +### Route + +[Routes](../terminology/route.md) match the client's request based on defined rules, load and execute the corresponding plugins, and forwards the request to the specified Upstream. + +### Service + +A [Service](../terminology/service.md) is an abstraction of an API (which can also be understood as a set of Route abstractions). It usually corresponds to an upstream service abstraction. + +## Prerequisites + +Please make sure you have [installed Apache APISIX](../installation-guide.md) before doing the following. + +## Expose your service + +1. Create an Upstream. + +Create an Upstream service containing `httpbin.org` that you can use for testing. This is a return service that will return the parameters we passed in the request. + +``` +curl "http://127.0.0.1:9180/apisix/admin/upstreams/1" \ +-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d ' +{ + "type": "roundrobin", + "nodes": { + "httpbin.org:80": 1 + } +}' +``` + +In this command, we specify the Admin API Key of Apache APISIX as `edd1c9f034335f136f87ad84b625c8f1`, use `roundrobin` as the load balancing mechanism, and set `httpbin.org:80` as the upstream service. To bind this upstream to a route, `upstream_id` needs to be set to `1` here. Here you can specify multiple upstreams under `nodes` to achieve load balancing. + +For more information, please refer to [Upstream](../terminology/upstream.md). + +2. Create a Route. + +```shell +curl "http://127.0.0.1:9180/apisix/admin/routes/1" \ +-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d ' +{ + "methods": ["GET"], + "host": "example.com", + "uri": "/anything/*", + "upstream_id": "1" +}' +``` + +:::note + +Adding an `upstream` object to your route can achieve the above effect. + +```shell +curl "http://127.0.0.1:9180/apisix/admin/routes/1" \ +-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d ' +{ + "methods": ["GET"], + "host": "example.com", + "uri": "/anything/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "httpbin.org:80": 1 + } + } +}' +``` + +::: + +3. Test + +After creating the Route, you can test the Service with the following command: + +``` +curl -i -X GET "http://127.0.0.1:9080/anything/get?foo1=bar1&foo2=bar2" -H "Host: example.com" +``` + +APISIX will forward the request to `http://httpbin.org:80/anything/get?foo1=bar1&foo2=bar2`. + +## More Tutorials + +You can refer to [Protect API](./protect-api.md) to protect your API. + +You can also use APISIX's [Plugin](../terminology/plugin.md) to achieve more functions. diff --git a/CloudronPackages/APISIX/apisix-source/docs/en/latest/tutorials/health-check.md b/CloudronPackages/APISIX/apisix-source/docs/en/latest/tutorials/health-check.md new file mode 100644 index 0000000..cf344a9 --- /dev/null +++ b/CloudronPackages/APISIX/apisix-source/docs/en/latest/tutorials/health-check.md @@ -0,0 +1,240 @@ +--- +title: Health Check +keywords: + - APISIX + - API Gateway + - Health Check +description: This article describes how to use the health check feature of API Gateway Apache APISIX to check the health status of upstream nodes. +--- + + + +## Description + +This article mainly introduces the health check function of Apache APISIX. The health check function can proxy requests to healthy nodes when the upstream node fails or migrates, avoiding the problem of service unavailability to the greatest extent. The health check function of APISIX is implemented using [lua-resty-healthcheck](https://github.com/api7/lua-resty-healthcheck), which is divided into active check and passive check. + +## Active check + +Active health check mainly means that APISIX actively detects the survivability of upstream nodes through preset probe types. APISIX supports three probe types: `HTTP`, `HTTPS`, and `TCP`. + +When N consecutive probes sent to healthy node `A` fail, the node will be marked as unhealthy, and the unhealthy node will be ignored by APISIX's load balancer and cannot receive requests; if For an unhealthy node, if M consecutive probes are successful, the node will be re-marked as healthy and can be proxied. + +## Passive check + +Passive health check refers to judging whether the corresponding upstream node is healthy by judging the response status of the request forwarded from APISIX to the upstream node. Compared with the active health check, the passive health check method does not need to initiate additional probes, but it cannot sense the node status in advance, and there may be a certain amount of failed requests. + +If `N` consecutive requests to a healthy node A fail, the node will be marked as unhealthy. + +:::note + +Since unhealthy nodes cannot receive requests, nodes cannot be re-marked as healthy using the passive health check strategy alone, so combining the active health check strategy is usually necessary. + +::: + +:::tip + +- We only start the health check when the upstream is hit by a request. There won't be any health check if an upstream is configured but isn't in used. +- If there is no healthy node can be chosen, we will continue to access the upstream. + +::: + +### Configuration instructions + +| Name | Configuration type | Value type | Valid values | Default | Description | +| ----------------------------------------------- | ------------------------------- | ---------- | -------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| upstream.checks.active.type | Active check | string | `http` `https` `tcp` | http | The type of active check. | +| upstream.checks.active.timeout | Active check | integer | | 1 | The timeout period of the active check (unit: second). | +| upstream.checks.active.concurrency | Active check | integer | | 10 | The number of targets to be checked at the same time during the active check. | +| upstream.checks.active.http_path | Active check | string | | / | The HTTP request path that is actively checked. | +| upstream.checks.active.host | Active check | string | | ${upstream.node.host} | The hostname of the HTTP request actively checked. | +| upstream.checks.active.port | Active check | integer | `1` to `65535` | ${upstream.node.port} | The host port of the HTTP request that is actively checked. | +| upstream.checks.active.https_verify_certificate | Active check | boolean | | true | Active check whether to check the SSL certificate of the remote host when HTTPS type checking is used. | +| upstream.checks.active.req_headers | Active check | array | | [] | Active check When using HTTP or HTTPS type checking, set additional request header information. | +| upstream.checks.active.healthy.interval | Active check (healthy node) | integer | `>= 1` | 1 | Active check (healthy node) check interval (unit: second) | +| upstream.checks.active.healthy.http_statuses | Active check (healthy node) | array | `200` to `599` | [200, 302] | Active check (healthy node) HTTP or HTTPS type check, the HTTP status code of the healthy node. | +| upstream.checks.active.healthy.successes | Active check (healthy node) | integer | `1` to `254` | 2 | Active check (healthy node) determine the number of times a node is healthy. | +| upstream.checks.active.unhealthy.interval | Active check (unhealthy node) | integer | `>= 1` | 1 | Active check (unhealthy node) check interval (unit: second) | +| upstream.checks.active.unhealthy.http_statuses | Active check (unhealthy node) | array | `200` to `599` | [429, 404, 500, 501, 502, 503, 504, 505] | Active check (unhealthy node) HTTP or HTTPS type check, the HTTP status code of the non-healthy node. | +| upstream.checks.active.unhealthy.http_failures | Active check (unhealthy node) | integer | `1` to `254` | 5 | Active check (unhealthy node) HTTP or HTTPS type check, determine the number of times that the node is not healthy. | +| upstream.checks.active.unhealthy.tcp_failures | Active check (unhealthy node) | integer | `1` to `254` | 2 | Active check (unhealthy node) TCP type check, determine the number of times that the node is not healthy. | +| upstream.checks.active.unhealthy.timeouts | Active check (unhealthy node) | integer | `1` to `254` | 3 | Active check (unhealthy node) to determine the number of timeouts for unhealthy nodes. | +| upstream.checks.passive.type | Passive check | string | `http` `https` `tcp` | http | The type of passive check. | +| upstream.checks.passive.healthy.http_statuses | Passive check (healthy node) | array | `200` to `599` | [200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302, 303, 304, 305, 306, 307, 308] | Passive check (healthy node) HTTP or HTTPS type check, the HTTP status code of the healthy node. | +| upstream.checks.passive.healthy.successes | Passive check (healthy node) | integer | `0` to `254` | 5 | Passive checks (healthy node) determine the number of times a node is healthy. | +| upstream.checks.passive.unhealthy.http_statuses | Passive check (unhealthy node) | array | `200` to `599` | [429, 500, 503] | Passive check (unhealthy node) HTTP or HTTPS type check, the HTTP status code of the non-healthy node. | +| upstream.checks.passive.unhealthy.tcp_failures | Passive check (unhealthy node) | integer | `0` to `254` | 2 | Passive check (unhealthy node) When TCP type is checked, determine the number of times that the node is not healthy. | +| upstream.checks.passive.unhealthy.timeouts | Passive check (unhealthy node) | integer | `0` to `254` | 7 | Passive checks (unhealthy node) determine the number of timeouts for unhealthy nodes. | +| upstream.checks.passive.unhealthy.http_failures | Passive check (unhealthy node) | integer | `0` to `254` | 5 | Passive check (unhealthy node) The number of times that the node is not healthy during HTTP or HTTPS type checking. | + +### Configuration example + +You can enable health checks in routes via the Admin API: + +:::note +You can fetch the `admin_key` from `config.yaml` and save to an environment variable with the following command: + +```bash +admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g') +``` + +::: + +```shell +curl http://127.0.0.1:9180/apisix/admin/routes/1 -H "X-API-KEY: $admin_key" -X PUT -d ' +{ + "uri": "/index.html", + "plugins": { + "limit-count": { + "count": 2, + "time_window": 60, + "rejected_code": 503, + "key": "remote_addr" + } + }, + "upstream": { + "nodes": { + "127.0.0.1:1980": 1, + "127.0.0.1:1970": 1 + }, + "type": "roundrobin", + "retries": 2, + "checks": { + "active": { + "timeout": 5, + "http_path": "/status", + "host": "foo.com", + "healthy": { + "interval": 2, + "successes": 1 + }, + "unhealthy": { + "interval": 1, + "http_failures": 2 + }, + "req_headers": ["User-Agent: curl/7.29.0"] + }, + "passive": { + "healthy": { + "http_statuses": [200, 201], + "successes": 3 + }, + "unhealthy": { + "http_statuses": [500], + "http_failures": 3, + "tcp_failures": 3 + } + } + } + } +}' +``` + +If APISIX detects an unhealthy node, the following logs will be output in the error log: + +```shell +enabled healthcheck passive while logging request +failed to receive status line from 'nil (127.0.0.1:1980)': closed +unhealthy TCP increment (1/2) for '(127.0.0.1:1980)' +failed to receive status line from 'nil (127.0.0.1:1980)': closed +unhealthy TCP increment (2/2) for '(127.0.0.1:1980' +``` + +:::tip + +To observe the above log information, you need to adjust the error log level to `info`. + +::: + +The health check status can be fetched via `GET /v1/healthcheck` in [Control API](../control-api.md). + +```shell + +curl http://127.0.0.1:9090/v1/healthcheck/upstreams/healthycheck -s | jq . + +``` + +## Health Check Status + +APISIX provides comprehensive health check information, with particular emphasis on the `status` and `counter` parameters for effective health monitoring. In the APISIX context, nodes exhibit four states: `healthy`, `unhealthy`, `mostly_unhealthy`, and `mostly_healthy`. The `mostly_healthy` status indicates that the current node is considered healthy, but during health checks, the node's health status is not consistently successful. The `mostly_unhealthy` status indicates that the current node is considered unhealthy, but during health checks, the node's health detection is not consistently unsuccessful. The transition of a node's state depends on the success or failure of the current health check, along with the recording of four key metrics in the `counter`: `tcp_failure`, `http_failure`, `success`, and `timeout_failure`. + +To retrieve health check information, you can use the following curl command: + +```shell + curl -i http://127.0.0.1:9090/v1/healthcheck +``` + +Response Example: + +```json +[ + { + "nodes": {}, + "name": "/apisix/routes/1", + "type": "http" + }, + { + "nodes": [ + { + "port": 1970, + "hostname": "127.0.0.1", + "status": "healthy", + "ip": "127.0.0.1", + "counter": { + "tcp_failure": 0, + "http_failure": 0, + "success": 0, + "timeout_failure": 0 + } + }, + { + "port": 1980, + "hostname": "127.0.0.1", + "status": "healthy", + "ip": "127.0.0.1", + "counter": { + "tcp_failure": 0, + "http_failure": 0, + "success": 0, + "timeout_failure": 0 + } + } + ], + "name": "/apisix/routes/example-hc-route", + "type": "http" + } +] +``` + +### State Transition Diagram + + + +Note that all nodes start with the `healthy` status without any initial probes, and the counter only resets and updates with a state change. Hence, when nodes are `healthy` and all subsequent checks are successful, the `success` counter is not updated and remains zero. + +### Counter Information + +In the event of a health check failure, the `success` count in the counter will be reset to zero. Upon a successful health check, the `tcp_failure`, `http_failure`, and `timeout_failure` data will be reset to zero. + +| Name | Description | Purpose | +|----------------|----------------------------------------|--------------------------------------------------------------------------------------------------------------------------| +| success | Number of successful health checks | When `success` exceeds the configured `healthy.successes` value, the node transitions to a `healthy` state. | +| tcp_failure | Number of TCP health check failures | When `tcp_failure` exceeds the configured `unhealthy.tcp_failures` value, the node transitions to an `unhealthy` state. | +| http_failure | Number of HTTP health check failures | When `http_failure` exceeds the configured `unhealthy.http_failures` value, the node transitions to an `unhealthy` state. | +| timeout_failure | Number of health check timeouts | When `timeout_failure` exceeds the configured `unhealthy.timeouts` value, the node transitions to an `unhealthy` state. | diff --git a/CloudronPackages/APISIX/apisix-source/docs/en/latest/tutorials/keycloak-oidc.md b/CloudronPackages/APISIX/apisix-source/docs/en/latest/tutorials/keycloak-oidc.md new file mode 100644 index 0000000..64e2ecf --- /dev/null +++ b/CloudronPackages/APISIX/apisix-source/docs/en/latest/tutorials/keycloak-oidc.md @@ -0,0 +1,467 @@ +--- +title: Set Up SSO with Keycloak (OIDC) +keywords: + - APISIX + - API Gateway + - OIDC + - Keycloak +description: This article describes how to integrate APISIX with Keycloak using the authorization code grant, client credentials grant, and password grant, using the openid-connect Plugin. +--- + + + +[OpenID Connect (OIDC)](https://openid.net/connect/) is a simple identity layer on top of the [OAuth 2.0 protocol](https://www.rfc-editor.org/rfc/rfc6749). It allows clients to verify the identity of end users based on the authentication performed by the identity provider, as well as to obtain basic profile information about end users in an interoperable and REST-like manner. With APISIX and [Keycloak](https://www.keycloak.org/), you can implement OIDC-based authentication processes to protect your APIs and enable single sign-on (SSO). + +[Keycloak](https://www.keycloak.org/) is an open-source identity and access management solution for modern applications and services. Keycloak supports single sign-on (SSO), which enables services to interface with Keycloak through protocols such as OIDC and OAuth 2.0. In addition, Keycloak also supports delegating authentication to third party identity providers such as Facebook and Google. + +This tutorial will show you how to integrate APISIX with Keycloak using [authorization code grant](#implement-authorization-code-grant), [client credentials grant](#implement-client-credentials-grant), and [password grant](#implement-password-grant), using the [`openid-connect`](/hub/openid-connect) Plugin. + +## Configure Keycloak + +Start a Keycloak instance named `apisix-quickstart-keycloak` with the administrator name `quickstart-admin` and password `quickstart-admin-pass` in [development mode](https://www.keycloak.org/server/configuration#_starting_keycloak_in_development_mode) in Docker. The exposed port is mapped to `8080` on the host machine: + +```shell +docker run -d --name "apisix-quickstart-keycloak" \ + -e 'KEYCLOAK_ADMIN=quickstart-admin' \ + -e 'KEYCLOAK_ADMIN_PASSWORD=quickstart-admin-pass' \ + -p 8080:8080 \ + quay.io/keycloak/keycloak:18.0.2 start-dev +``` + +Keycloak provides an easy-to-use web UI to help the administrator manage all resources, such as clients, roles, and users. + +Navigate to `http://localhost:8080` in browser to access the Keycloak web page, then click __Administration Console__: + + + +Enter the administrator’s username `quickstart-admin` and password `quickstart-admin-pass` and sign in: + + + +You need to maintain the login status to configure Keycloak during the following steps. + +### Create a Realm + +_Realms_ in Keycloak are workspaces to manage resources such as users, credentials, and roles. The resources in different realms are isolated from each other. You need to create a realm named `quickstart-realm` for APISIX. + +In the left menu, hover over **Master**, and select __Add realm__ in the dropdown: + + + +Enter the realm name `quickstart-realm` and click __Create__ to create it: + + + +### Create a Client + +_Clients_ in Keycloak are entities that request Keycloak to authenticate a user. More often, clients are applications that want to use Keycloak to secure themselves and provide a single sign-on solution. APISIX is equivalent to a client that is responsible for initiating authentication requests to Keycloak, so you need to create its corresponding client named `apisix-quickstart-client`. + +Click __Clients__ > __Create__ to open the __Add Client__ page: + + + +Enter __Client ID__ as `apisix-quickstart-client`, then select __Client Protocol__ as `openid-connect` and __Save__: + + + +The client `apisix-quickstart-client` is created. After redirecting to the detailed page, select `confidential` as the __Access Type__: + + + +When the user login is successful during the SSO, Keycloak will carry the state and code to redirect the client to the addresses in __Valid Redirect URIs__. To simplify the operation, enter wildcard `*` to consider any URI valid: + + + +If you are implementing the [authorization code grant with PKCE](#implement-authorization-code-grant), configure the PKCE challenge method in the client's advanced settings: + +
+
+
+APISIX 被纳入 云原生软件基金会 API 网关全景图
+
Powered by APISIX.
+ +* Connection #0 to host admin.apisix.dev left intact +``` + +3. 虽然没提供客户端证书,但是 URI 在白名单内,请求会被成功处理和响应。 + +```bash +curl https://admin.apisix.dev:9443/anything/foobar -i \ +--resolve 'admin.apisix.dev:9443:127.0.0.1' --cacert t/certs/mtls_ca.crt +HTTP/2 200 +content-type: application/json +content-length: 416 +date: Fri, 21 Apr 2023 07:58:28 GMT +access-control-allow-origin: * +access-control-allow-credentials: true +server: APISIX/3.2.0 +... +``` + +## 总结 + +想了解更多有关 Apache APISIX 的 mTLS 功能介绍,可以阅读:[TLS 双向认证](../mtls.md)。 diff --git a/CloudronPackages/APISIX/apisix-source/docs/zh/latest/tutorials/expose-api.md b/CloudronPackages/APISIX/apisix-source/docs/zh/latest/tutorials/expose-api.md new file mode 100644 index 0000000..9561717 --- /dev/null +++ b/CloudronPackages/APISIX/apisix-source/docs/zh/latest/tutorials/expose-api.md @@ -0,0 +1,126 @@ +--- +title: 发布 API +keywords: + - API 网关 + - Apache APISIX + - 发布路由 + - 创建服务 +description: 本文介绍了如何通过 Apache APISIX 发布服务和路由。 +--- + + + +## 描述 + +本文将引导你了解 APISIX 的上游、路由以及服务的概念,并介绍如何通过 APISIX 发布你的 API。 + +## 概念介绍 + +### 上游 + +[Upstream](../terminology/upstream.md) 也称为上游,上游是对虚拟主机的抽象,即应用层服务或节点的抽象。 + +上游的作用是按照配置规则对服务节点进行负载均衡,它的地址信息可以直接配置到路由或服务上。当多个路由或服务引用同一个上游时,可以通过创建上游对象,在路由或服务中使用上游 ID 的方式引用上游,减轻维护压力。 + +### 路由 + +[Route](../terminology/route.md) 也称为路由,是 APISIX 中最基础和最核心的资源对象。 + +APISIX 可以通过路由定义规则来匹配客户端请求,根据匹配结果加载并执行相应的[插件](../terminology/plugin.md),最后把请求转发给到指定的上游服务。路由中主要包含三部分内容:匹配规则、插件配置和上游信息。 + +### 服务 + +[Service](../terminology/service.md) 也称为服务,是某类 API 的抽象(也可以理解为一组 Route 的抽象)。它通常与上游服务抽象是一一对应的,Route 与 Service 之间,通常是 N:1 的关系。 + +## 前提条件 + +在进行如下操作前,请确保你已经通过 Docker [启动 APISIX](../installation-guide.md)。 + +## 公开你的服务 + +1. 创建上游。 + +创建一个包含 `httpbin.org` 的上游服务,你可以使用它进行测试。这是一个返回服务,它将返回我们在请求中传递的参数。 + +```shell +curl "http://127.0.0.1:9180/apisix/admin/upstreams/1" \ +-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d ' +{ + "type": "roundrobin", + "nodes": { + "httpbin.org:80": 1 + } +}' +``` + +在该命令中,我们指定了 Apache APISIX 的 Admin API Key 为 `edd1c9f034335f136f87ad84b625c8f1`,并且使用 `roundrobin` 作为负载均衡机制,并设置了 `httpbin.org:80` 为上游服务。为了将该上游绑定到路由,此处需要把 `upstream_id` 设置为 `1`。此处你可以在 `nodes` 下指定多个上游,以达到负载均衡的效果。 + +如需了解更多信息,请参考[上游](../terminology/upstream.md)。 + +2. 创建路由。 + +```shell +curl "http://127.0.0.1:9180/apisix/admin/routes/1" \ +-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d ' +{ + "methods": ["GET"], + "host": "example.com", + "uri": "/anything/*", + "upstream_id": "1" +}' +``` + +:::note 注意 + +创建上游非必须步骤,你可以通过在路由中,添加 `upstream` 对象,达到上述的效果。例如: + +```shell +curl "http://127.0.0.1:9180/apisix/admin/routes/1" \ +-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d ' +{ + "methods": ["GET"], + "host": "example.com", + "uri": "/anything/*", + "upstream": { + "type": "roundrobin", + "nodes": { + "httpbin.org:80": 1 + } + } +}' +``` + +::: + +3. 测试路由。 + +在创建完成路由后,你可以通过以下命令测试路由是否正常: + +``` +curl -i -X GET "http://127.0.0.1:9080/anything/get?foo1=bar1&foo2=bar2" -H "Host: example.com" +``` + +该请求将被 APISIX 转发到 `http://httpbin.org:80/anything/get?foo1=bar1&foo2=bar2`。 + +## 更多教程 + +你可以查看[保护 API](./protect-api.md) 来保护你的 API。 + +接下来,你可以通过 APISIX 的一些[插件](../plugins/batch-requests.md),实现更多功能。 diff --git a/CloudronPackages/APISIX/apisix-source/docs/zh/latest/tutorials/health-check.md b/CloudronPackages/APISIX/apisix-source/docs/zh/latest/tutorials/health-check.md new file mode 100644 index 0000000..870c4b4 --- /dev/null +++ b/CloudronPackages/APISIX/apisix-source/docs/zh/latest/tutorials/health-check.md @@ -0,0 +1,240 @@ +--- +title: 健康检查 +keywords: + - APISIX + - API 网关 + - 健康检查 +description: 本文介绍了如何使用 API 网关 Apache APISIX 的健康检查功能来检查上游节点的健康状态。 +--- + + +## 描述 + +本文主要介绍了 Apache APISIX 的健康检查功能。健康检查功能可以在上游节点发生故障或者迁移时,将请求代理到健康的节点上,最大程度避免服务不可用的问题。APISIX 的健康检查功能使用 [lua-resty-healthcheck](https://github.com/api7/lua-resty-healthcheck) 实现,并分为主动检查和被动检查。 + +## 主动健康检查 + +主动健康检查主要是指 APISIX 通过预设的探针类型,主动探测上游节点的存活性。目前 APISIX 支持 `HTTP`、`HTTPS`、`TCP` 三种探针类型。 + +当发向健康节点 A 的 N 个连续探针都失败时(取决于如何配置),则该节点将被标记为不健康,不健康的节点将会被 APISIX 的负载均衡器忽略,无法收到请求;若某个不健康的节点,连续 M 个探针都成功,则该节点将被重新标记为健康,进而可以被代理。 + +## 被动健康检查 + +被动健康检查是指,通过判断从 APISIX 转发到上游节点的请求响应状态,来判断对应的上游节点是否健康。相对于主动健康检查,被动健康检查的方式无需发起额外的探针,但是也无法提前感知节点状态,可能会有一定量的失败请求。 + +若发向健康节点 A 的 N 个连续请求都被判定为失败(取决于如何配置),则该节点将被标记为不健康。 + +:::note 注意 + +由于不健康的节点无法收到请求,仅使用被动健康检查策略无法重新将节点标记为健康,因此通常需要结合主动健康检查策略。 + +::: + +:::tip 提示 + +- 只有在 `upstream` 被请求时才会开始健康检查,如果 `upstream` 被配置但没有被请求,不会触发启动健康检查。 +- 如果没有健康的节点,那么请求会继续发送给上游。 + +::: + +## 属性 + +| 名称 | 配置类型 | 类型 | 有效值 | 默认值 | 描述 | +| ----------------------------------------------- | ------------------ | ------- | -------------------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| upstream.checks.active.type | 主动检查 | string | `http` `https` `tcp` | http | 主动检查的类型。 | +| upstream.checks.active.timeout | 主动检查 | integer | | 1 | 主动检查的超时时间(单位为秒)。 | +| upstream.checks.active.concurrency | 主动检查 | integer | | 10 | 主动检查时同时检查的目标数。 | +| upstream.checks.active.http_path | 主动检查 | string | | / | 主动检查的 HTTP 请求路径。 | +| upstream.checks.active.host | 主动检查 | string | | ${upstream.node.host} | 主动检查的 HTTP 请求主机名。 | +| upstream.checks.active.port | 主动检查 | integer | `1` 至 `65535` | ${upstream.node.port} | 主动检查的 HTTP 请求主机端口。 | +| upstream.checks.active.https_verify_certificate | 主动检查 | boolean | | true | 主动检查使用 HTTPS 类型检查时,是否检查远程主机的 SSL 证书。 | +| upstream.checks.active.req_headers | 主动检查 | array | | [] | 主动检查使用 HTTP 或 HTTPS 类型检查时,设置额外的请求头信息。 | +| upstream.checks.active.healthy.interval | 主动检查(健康节点)| integer | `>= 1` | 1 | 主动检查(健康节点)检查的间隔时间(单位为秒)| +| upstream.checks.active.healthy.http_statuses | 主动检查(健康节点)| array | `200` 至 `599` | [200, 302] | 主动检查(健康节点)HTTP 或 HTTPS 类型检查时,健康节点的 HTTP 状态码。 | +| upstream.checks.active.healthy.successes | 主动检查(健康节点)| integer | `1` 至 `254` | 2 | 主动检查(健康节点)确定节点健康的次数。 | +| upstream.checks.active.unhealthy.interval | 主动检查(非健康节点)| integer | `>= 1` | 1 | 主动检查(非健康节点)检查的间隔时间(单位为秒)| +| upstream.checks.active.unhealthy.http_statuses | 主动检查(非健康节点)| array | `200` 至 `599` | [429, 404, 500, 501, 502, 503, 504, 505] | 主动检查(非健康节点)HTTP 或 HTTPS 类型检查时,非健康节点的 HTTP 状态码。 | +| upstream.checks.active.unhealthy.http_failures | 主动检查(非健康节点)| integer | `1` 至 `254` | 5 | 主动检查(非健康节点)HTTP 或 HTTPS 类型检查时,确定节点非健康的次数。 | +| upstream.checks.active.unhealthy.tcp_failures | 主动检查(非健康节点)| integer | `1` 至 `254` | 2 | 主动检查(非健康节点)TCP 类型检查时,确定节点非健康的次数。 | +| upstream.checks.active.unhealthy.timeouts | 主动检查(非健康节点)| integer | `1` 至 `254` | 3 | 主动检查(非健康节点)确定节点非健康的超时次数。 | +| upstream.checks.passive.type | 被动检查 | string | `http` `https` `tcp` | http | 被动检查的类型。 | +| upstream.checks.passive.healthy.http_statuses | 被动检查(健康节点)| array | `200` 至 `599` | [200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302, 303, 304, 305, 306, 307, 308] | 被动检查(健康节点)HTTP 或 HTTPS 类型检查时,健康节点的 HTTP 状态码。 | +| upstream.checks.passive.healthy.successes | 被动检查(健康节点)| integer | `0` 至 `254` | 5 | 被动检查(健康节点)确定节点健康的次数。 | +| upstream.checks.passive.unhealthy.http_statuses | 被动检查(非健康节点)| array | `200` 至 `599` | [429, 500, 503] | 被动检查(非健康节点)HTTP 或 HTTPS 类型检查时,非健康节点的 HTTP 状态码。 | +| upstream.checks.passive.unhealthy.tcp_failures | 被动检查(非健康节点)| integer | `0` 至 `254` | 2 | 被动检查(非健康节点)TCP 类型检查时,确定节点非健康的次数。 | +| upstream.checks.passive.unhealthy.timeouts | 被动检查(非健康节点)| integer | `0` 至 `254` | 7 | 被动检查(非健康节点)确定节点非健康的超时次数。 | +| upstream.checks.passive.unhealthy.http_failures | 被动检查(非健康节点)| integer | `0` 至 `254` | 5 | 被动检查(非健康节点)HTTP 或 HTTPS 类型检查时,确定节点非健康的次数。 | + +## 配置示例 + +你可以通过 Admin API 在路由中启用健康检查功能: + +:::note + +您可以这样从 `config.yaml` 中获取 `admin_key` 并存入环境变量: + +```bash +admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g') +``` + +::: + +```shell +curl http://127.0.0.1:9180/apisix/admin/routes/1 -H "X-API-KEY: $admin_key" -X PUT -d ' +{ + "uri": "/index.html", + "plugins": { + "limit-count": { + "count": 2, + "time_window": 60, + "rejected_code": 503, + "key": "remote_addr" + } + }, + "upstream": { + "nodes": { + "127.0.0.1:1980": 1, + "127.0.0.1:1970": 1 + }, + "type": "roundrobin", + "retries": 2, + "checks": { + "active": { + "timeout": 5, + "http_path": "/status", + "host": "foo.com", + "healthy": { + "interval": 2, + "successes": 1 + }, + "unhealthy": { + "interval": 1, + "http_failures": 2 + }, + "req_headers": ["User-Agent: curl/7.29.0"] + }, + "passive": { + "healthy": { + "http_statuses": [200, 201], + "successes": 3 + }, + "unhealthy": { + "http_statuses": [500], + "http_failures": 3, + "tcp_failures": 3 + } + } + } + } +}' +``` + +启用成功后,如果 APISIX 探测到不健康的节点,将会在错误日志中输出如下日志: + +```shell +enabled healthcheck passive while logging request +failed to receive status line from 'nil (127.0.0.1:1980)': closed +unhealthy TCP increment (1/2) for '(127.0.0.1:1980)' +failed to receive status line from 'nil (127.0.0.1:1980)': closed +unhealthy TCP increment (2/2) for '(127.0.0.1:1980' +``` + +:::tip 提示 + +需要将错误日志的级别调整为 `info` 才可以观测到上述日志信息 + +::: + +你可以通过[控制接口](../control-api.md) 中的 `GET /v1/healthcheck` 接口获取健康检查信息。如下所示: + +```shell + +curl http://127.0.0.1:9090/v1/healthcheck/upstreams/healthycheck -s | jq . + +``` + +## 健康检查信息 + +APISIX 提供了丰富的健康检查信息,其中 `status` 以及 `counter` 的返回对于健康检查是至关重要的。在 APISIX 中,节点有四个状态:`healthy`、`unhealthy`、`mostly_unhealthy`、`mostly_healthy`。`mostly_healthy` 状态表示当前节点状态是健康的,但在健康检查期间,节点健康检测并不是一直是成功的。`mostly_unhealthy` 状态表示当前节点状态是不健康的,但在健康检查期间,节点健康检测并不是一直是失败的。节点的状态转换取决于本次健康检查的成功或失败,以及 `counter` 中记录的 `tcp_failure`、`http_failure`、`success`、`timeout_failure` 四个数据。 + +获取健康检查信息,通过以下 curl 命令可以获取健康检查信息: + +```shell +curl -i http://127.0.0.1:9090/v1/healthcheck +``` + +响应示例: + +```json +[ + { + "nodes": {}, + "name": "/apisix/routes/1", + "type": "http" + }, + { + "nodes": [ + { + "port": 1970, + "hostname": "127.0.0.1", + "status": "healthy", + "ip": "127.0.0.1", + "counter": { + "tcp_failure": 0, + "http_failure": 0, + "success": 0, + "timeout_failure": 0 + } + }, + { + "port": 1980, + "hostname": "127.0.0.1", + "status": "healthy", + "ip": "127.0.0.1", + "counter": { + "tcp_failure": 0, + "http_failure": 0, + "success": 0, + "timeout_failure": 0 + } + } + ], + "name": "/apisix/routes/example-hc-route", + "type": "http" + } +] +``` + +### 状态转换图 + + + +请注意,所有节点在没有初始探测的情况下都以`healthy`状态启动,计数器仅在状态更改时重置和更新。因此,当节点处于`healthy`状态且所有后续检查都成功时,`success`计数器不会更新,保持为零。 + +### counter 信息 + +若健康检查失败,`counter` 中的 `success` 计数将被置零。若健康检查成功,则会将 `tcp_failure`、`http_failure`、`timeout_failure` 数据置零。 + +| 名称 | 描述 | 作用 | +|----------------|------------------------|----------------------------------------------------------------------------| +|success | 健康检查成功的次数 |当 success 大于 healthy.successes 配置值时,节点会变为 healthy 状态 | +|tcp_failure | TCP 类型健康检查失败次数 |当 tcp_failure 大于 unhealthy.tcp_failures 配置值时,节点会变为 unhealthy 状态 | +|http_failure | HTTP 类型的健康检查失败次数 |当 http_failure 大于 unhealthy.http_failures 配置值时,节点会变为 unhealthy 状态 | +|timeout_failure | 节点健康检查超时次数 |当 timeout_failure 大于 unhealthy.timeouts 配置值时,节点会变为 unhealthy 状态 | diff --git a/CloudronPackages/APISIX/apisix-source/docs/zh/latest/tutorials/keycloak-oidc.md b/CloudronPackages/APISIX/apisix-source/docs/zh/latest/tutorials/keycloak-oidc.md new file mode 100644 index 0000000..94acab7 --- /dev/null +++ b/CloudronPackages/APISIX/apisix-source/docs/zh/latest/tutorials/keycloak-oidc.md @@ -0,0 +1,467 @@ +--- +title: Set Up SSO with Keycloak (OIDC) +keywords: + - APISIX + - API 网关 + - OIDC + - Keycloak +description: 本文介绍如何使用 openid-connect 插件,通过 authorization code grant、client credentials grant 和 password grant 将 APISIX 与 Keycloak 集成。 +--- + + + +[OpenID Connect (OIDC)](https://openid.net/connect/) 是 [OAuth 2.0 协议](https://www.rfc-editor.org/rfc/rfc6749) 之上的简单身份层。它允许客户端基于身份提供者执行的身份验证来验证最终用户的身份,以及以可互操作和类似 REST 的方式获取有关最终用户的基本个人资料信息。借助 APISIX 和 [Keycloak](https://www.keycloak.org/),您可以实现基于 OIDC 的身份验证流程来保护您的 API 并启用单点登录 (SSO)。 + +[Keycloak](https://www.keycloak.org/) 是适用于现代应用程序和服务的开源身份和访问管理解决方案。Keycloak 支持单点登录 (SSO),这使得服务能够通过 OIDC 和 OAuth 2.0 等协议与 Keycloak 进行交互。此外,Keycloak 还支持将身份验证委托给第三方身份提供商,例如 Facebook 和 Google。 + +本教程将向您展示如何使用 [`openid-connect`](/hub/openid-connect) 插件,通过 [authorization code grant](#implement-authorization-code-grant)、[client credentials grant](#implement-client-credentials-grant) 和 [password grant](#implement-password-grant) 将 APISIX 与 Keycloak 集成。 + +## 配置 Keycloak + +在 Docker 中以 [开发模式](https://www.keycloak.org/server/configuration#_starting_keycloak_in_development_mode) 启动一个名为 `apisix-quickstart-keycloak` 的 Keycloak 实例,管理员名称为 `quickstart-admin`,密码为 `quickstart-admin-pass`,暴露的端口映射到宿主机上的 `8080`: + +```shell +docker run -d --name "apisix-quickstart-keycloak" \ + -e 'KEYCLOAK_ADMIN=quickstart-admin' \ + -e 'KEYCLOAK_ADMIN_PASSWORD=quickstart-admin-pass' \ + -p 8080:8080 \ + quay.io/keycloak/keycloak:18.0.2 start-dev +``` + +Keycloak 提供了一个易于使用的 Web UI,帮助管理员管理所有资源,例如客户端、角色和用户。 + +在浏览器中导航到 `http://localhost:8080` 以访问 Keycloak 网页,然后单击 __管理控制台__: + + + +输入管理员用户名 `quickstart-admin` 和密码 `quickstart-admin-pass` 并登录: + + + +您需要在以下步骤中保持登录状态来配置 Keycloak。 + +### 创建 Realm + +Keycloak 中的 realm 是管理用户、凭证和角色等资源的工作区。不同领域中的资源彼此隔离。您需要为 APISIX 创建一个名为`quickstart-realm` 的 realm。 + +在左侧菜单中,将鼠标悬停在 **Master** 上,然后在下拉菜单中选择 __Add realm__: + + + +输入 realm 名称 `quickstart-realm`,然后单击 `__Create__` 进行创建: + + + +### 创建 Client + +Keycloak 中的 client 是请求 Keycloak 对用户进行身份验证的实体。更多情况下,client 是希望使用 Keycloak 保护自身安全并提供单点登录解决方案的应用程序。APISIX 相当于负责向 Keycloak 发起身份验证请求的 client,因此您需要创建其对应的客户端,名为 `apisix-quickstart-client`。 + +单击 __Clients__ > __Create__,打开 __Add Client__ 页面: + + + +输入 __Client ID__ 为 `apisix-quickstart-client`,然后选择 __Client Protocol__ 为 `openid-connect` 并 __Save__: + + + +Client `apisix-quickstart-client` 已创建。重定向到详细信息页面后,选择 `confidential` 作为 __Access Type__: + + + +当用户在 SSO 期间登录成功时,Keycloak 会携带状态和代码将客户端重定向到 __Valid Redirect URIs__ 中的地址。为简化操作,输入通配符 `*` 以将任何 URI 视为有效: + + + +如果您正在 [使用 PKCE authorization code grant](#implement-authorization-code-grant),请在客户端的高级设置中配置 PKCE 质询方法: + +