You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by gi...@apache.org on 2021/02/04 15:01:15 UTC

[apisix-website] branch asf-site updated: deploy: 99d6fae2163dbabe0adb9254eb3bebe273159e17

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/apisix-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new da77862  deploy: 99d6fae2163dbabe0adb9254eb3bebe273159e17
da77862 is described below

commit da7786246be0587111a0fcdce8c7d7fdf26ec8fd
Author: juzhiyuan <ju...@users.noreply.github.com>
AuthorDate: Thu Feb 4 15:01:04 2021 +0000

    deploy: 99d6fae2163dbabe0adb9254eb3bebe273159e17
---
 .asf.yaml                                          |  31 -
 0b71e11c.4ca11385.js                               |   1 +
 17896441.5f37a45d.js                               |   1 +
 1c89ab3b.79ecc6c6.js                               |   1 +
 1dba9094.931ac078.js                               |   1 +
 2.f5a2d546.js                                      |   2 +
 2.f5a2d546.js.LICENSE.txt                          |   5 +
 2275ea3b.7ebaada4.js                               |   1 +
 28.556d035e.js                                     |   2 +
 28.556d035e.js.LICENSE.txt                         |   1 +
 29.64851b6d.js                                     |   1 +
 2d8fe9ee.30394a0b.js                               |   1 +
 2da51850.9dfc310f.js                               |   1 +
 2fa.html                                           |  91 ---
 2fa/index.html                                     |  91 ---
 30.163c5ee4.js                                     |   1 +
 31.c3e6fc2a.js                                     |   1 +
 32.d4950b06.js                                     |   1 +
 33.d4f803a5.js                                     |   1 +
 34.f92ba19b.js                                     |   1 +
 37e3b3ea.f669081a.js                               |   1 +
 404.html                                           |  22 +
 514de2af.539501a7.js                               |   1 +
 5bb67ffc.2fa3b45c.js                               |   1 +
 638581dc.bbe5a508.js                               |   1 +
 749ed826.914caae4.js                               |   1 +
 7e37206e.1dcb01fa.js                               |   1 +
 812d7c14.d052589d.js                               |   1 +
 935f2afb.ce20228c.js                               |   1 +
 README.md                                          |  15 -
 a4a2cefa.03eff292.js                               |   1 +
 a6641250.7c404dbb.js                               |   1 +
 apisix/README.html                                 | 129 ----
 apisix/README/index.html                           | 129 ----
 apisix/admin-api.html                              | 830 --------------------
 apisix/admin-api/index.html                        | 830 --------------------
 apisix/architecture-design.html                    | 559 --------------
 apisix/architecture-design/index.html              | 559 --------------
 apisix/aws.html                                    | 246 ------
 apisix/aws/index.html                              | 246 ------
 apisix/batch-processor.html                        |  90 ---
 apisix/batch-processor/index.html                  |  90 ---
 apisix/benchmark.html                              | 115 ---
 apisix/benchmark/index.html                        | 115 ---
 apisix/control-api.html                            | 182 -----
 apisix/control-api/index.html                      | 182 -----
 apisix/customize-nginx-configuration.html          |  79 --
 apisix/customize-nginx-configuration/index.html    |  79 --
 apisix/debug-function.html                         | 153 ----
 apisix/debug-function/index.html                   | 153 ----
 apisix/discovery.html                              | 236 ------
 apisix/discovery/index.html                        | 236 ------
 .../plugins-hmac-auth-generate-signature.html      | 199 -----
 .../index.html                                     | 199 -----
 apisix/getting-started.html                        | 217 ------
 apisix/getting-started/index.html                  | 217 ------
 apisix/grpc-proxy.html                             |  81 --
 apisix/grpc-proxy/index.html                       |  81 --
 apisix/health-check.html                           | 133 ----
 apisix/health-check/index.html                     | 133 ----
 apisix/how-to-build.html                           | 174 -----
 apisix/how-to-build/index.html                     | 174 -----
 apisix/https.html                                  | 178 -----
 apisix/https/index.html                            | 178 -----
 apisix/install-dependencies.html                   | 152 ----
 apisix/install-dependencies/index.html             | 152 ----
 apisix/mtls.html                                   |  75 --
 apisix/mtls/index.html                             |  75 --
 apisix/plugin-develop.html                         | 305 --------
 apisix/plugin-develop/index.html                   | 305 --------
 apisix/plugin-interceptors.html                    |  71 --
 apisix/plugin-interceptors/index.html              |  71 --
 apisix/plugins.html                                |  53 --
 apisix/plugins/api-breaker.html                    | 125 ---
 apisix/plugins/api-breaker/index.html              | 125 ---
 apisix/plugins/authz-keycloak.html                 | 144 ----
 apisix/plugins/authz-keycloak/index.html           | 144 ----
 apisix/plugins/basic-auth.html                     | 151 ----
 apisix/plugins/basic-auth/index.html               | 151 ----
 apisix/plugins/batch-requests.html                 | 184 -----
 apisix/plugins/batch-requests/index.html           | 184 -----
 apisix/plugins/consumer-restriction.html           | 249 ------
 apisix/plugins/consumer-restriction/index.html     | 249 ------
 apisix/plugins/cors.html                           | 117 ---
 apisix/plugins/cors/index.html                     | 117 ---
 apisix/plugins/dubbo-proxy.html                    | 137 ----
 apisix/plugins/dubbo-proxy/index.html              | 137 ----
 apisix/plugins/echo.html                           | 115 ---
 apisix/plugins/echo/index.html                     | 115 ---
 apisix/plugins/error-log-logger.html               | 110 ---
 apisix/plugins/error-log-logger/index.html         | 110 ---
 apisix/plugins/fault-injection.html                | 148 ----
 apisix/plugins/fault-injection/index.html          | 148 ----
 apisix/plugins/grpc-transcode.html                 | 205 -----
 apisix/plugins/grpc-transcode/index.html           | 205 -----
 apisix/plugins/hmac-auth.html                      | 312 --------
 apisix/plugins/hmac-auth/index.html                | 312 --------
 apisix/plugins/http-logger.html                    | 156 ----
 apisix/plugins/http-logger/index.html              | 156 ----
 apisix/plugins/index.html                          |  53 --
 apisix/plugins/ip-restriction.html                 | 155 ----
 apisix/plugins/ip-restriction/index.html           | 155 ----
 apisix/plugins/jwt-auth.html                       | 208 -----
 apisix/plugins/jwt-auth/index.html                 | 208 -----
 apisix/plugins/kafka-logger.html                   | 157 ----
 apisix/plugins/kafka-logger/index.html             | 157 ----
 apisix/plugins/key-auth.html                       | 138 ----
 apisix/plugins/key-auth/index.html                 | 138 ----
 apisix/plugins/limit-conn.html                     | 131 ----
 apisix/plugins/limit-conn/index.html               | 131 ----
 apisix/plugins/limit-count.html                    | 198 -----
 apisix/plugins/limit-count/index.html              | 198 -----
 apisix/plugins/limit-req.html                      | 210 ------
 apisix/plugins/limit-req/index.html                | 210 ------
 apisix/plugins/log-rotate.html                     | 103 ---
 apisix/plugins/log-rotate/index.html               | 103 ---
 apisix/plugins/mqtt-proxy.html                     | 104 ---
 apisix/plugins/mqtt-proxy/index.html               | 104 ---
 apisix/plugins/node-status.html                    | 157 ----
 apisix/plugins/node-status/index.html              | 157 ----
 apisix/plugins/openid-connect.html                 | 208 -----
 apisix/plugins/openid-connect/index.html           | 208 -----
 apisix/plugins/prometheus.html                     | 190 -----
 apisix/plugins/prometheus/index.html               | 190 -----
 apisix/plugins/proxy-cache.html                    | 282 -------
 apisix/plugins/proxy-cache/index.html              | 282 -------
 apisix/plugins/proxy-mirror.html                   | 108 ---
 apisix/plugins/proxy-mirror/index.html             | 108 ---
 apisix/plugins/proxy-rewrite.html                  | 121 ---
 apisix/plugins/proxy-rewrite/index.html            | 121 ---
 apisix/plugins/redirect.html                       | 147 ----
 apisix/plugins/redirect/index.html                 | 147 ----
 apisix/plugins/referer-restriction.html            | 123 ---
 apisix/plugins/referer-restriction/index.html      | 123 ---
 apisix/plugins/request-id.html                     | 103 ---
 apisix/plugins/request-id/index.html               | 103 ---
 apisix/plugins/request-validation.html             | 244 ------
 apisix/plugins/request-validation/index.html       | 244 ------
 apisix/plugins/response-rewrite.html               | 134 ----
 apisix/plugins/response-rewrite/index.html         | 134 ----
 apisix/plugins/server-info.html                    | 128 ----
 apisix/plugins/server-info/index.html              | 128 ----
 apisix/plugins/serverless.html                     | 126 ----
 apisix/plugins/serverless/index.html               | 126 ----
 apisix/plugins/skywalking.html                     | 230 ------
 apisix/plugins/skywalking/index.html               | 230 ------
 apisix/plugins/sls-logger.html                     | 134 ----
 apisix/plugins/sls-logger/index.html               | 134 ----
 apisix/plugins/syslog.html                         | 124 ---
 apisix/plugins/syslog/index.html                   | 124 ---
 apisix/plugins/tcp-logger.html                     | 126 ----
 apisix/plugins/tcp-logger/index.html               | 126 ----
 apisix/plugins/traffic-split.html                  | 432 -----------
 apisix/plugins/traffic-split/index.html            | 432 -----------
 apisix/plugins/udp-logger.html                     | 122 ---
 apisix/plugins/udp-logger/index.html               | 122 ---
 apisix/plugins/uri-blocker.html                    | 109 ---
 apisix/plugins/uri-blocker/index.html              | 109 ---
 apisix/plugins/wolf-rbac.html                      | 248 ------
 apisix/plugins/wolf-rbac/index.html                | 248 ------
 apisix/plugins/zipkin.html                         | 165 ----
 apisix/plugins/zipkin/index.html                   | 165 ----
 apisix/powered-by.html                             |  92 ---
 apisix/powered-by/index.html                       |  92 ---
 apisix/profile.html                                |  66 --
 apisix/profile/index.html                          |  66 --
 apisix/router-radixtree.html                       | 160 ----
 apisix/router-radixtree/index.html                 | 160 ----
 apisix/stand-alone.html                            | 272 -------
 apisix/stand-alone/index.html                      | 272 -------
 apisix/stream-proxy.html                           |  89 ---
 apisix/stream-proxy/index.html                     |  89 ---
 apisix/zh-cn/README.html                           | 129 ----
 apisix/zh-cn/README/index.html                     | 129 ----
 apisix/zh-cn/admin-api.html                        | 838 ---------------------
 apisix/zh-cn/admin-api/index.html                  | 838 ---------------------
 apisix/zh-cn/architecture-design.html              | 575 --------------
 apisix/zh-cn/architecture-design/index.html        | 575 --------------
 apisix/zh-cn/batch-processor.html                  |  88 ---
 apisix/zh-cn/batch-processor/index.html            |  88 ---
 apisix/zh-cn/benchmark.html                        |  69 --
 apisix/zh-cn/benchmark/index.html                  |  69 --
 apisix/zh-cn/customize-nginx-configuration.html    |  79 --
 .../zh-cn/customize-nginx-configuration/index.html |  79 --
 apisix/zh-cn/debug-function.html                   | 147 ----
 apisix/zh-cn/debug-function/index.html             | 147 ----
 apisix/zh-cn/discovery.html                        | 244 ------
 apisix/zh-cn/discovery/index.html                  | 244 ------
 apisix/zh-cn/getting-started.html                  | 210 ------
 apisix/zh-cn/getting-started/index.html            | 210 ------
 apisix/zh-cn/grpc-proxy.html                       |  81 --
 apisix/zh-cn/grpc-proxy/index.html                 |  81 --
 apisix/zh-cn/health-check.html                     | 132 ----
 apisix/zh-cn/health-check/index.html               | 132 ----
 apisix/zh-cn/how-to-build.html                     | 168 -----
 apisix/zh-cn/how-to-build/index.html               | 168 -----
 apisix/zh-cn/https.html                            | 174 -----
 apisix/zh-cn/https/index.html                      | 174 -----
 apisix/zh-cn/install-dependencies.html             | 151 ----
 apisix/zh-cn/install-dependencies/index.html       | 151 ----
 apisix/zh-cn/mtls.html                             |  74 --
 apisix/zh-cn/mtls/index.html                       |  74 --
 apisix/zh-cn/plugin-develop.html                   | 287 -------
 apisix/zh-cn/plugin-develop/index.html             | 287 -------
 apisix/zh-cn/plugin-interceptors.html              |  66 --
 apisix/zh-cn/plugin-interceptors/index.html        |  66 --
 apisix/zh-cn/plugins.html                          |  53 --
 apisix/zh-cn/plugins/api-breaker.html              | 125 ---
 apisix/zh-cn/plugins/api-breaker/index.html        | 125 ---
 apisix/zh-cn/plugins/authz-keycloak.html           | 132 ----
 apisix/zh-cn/plugins/authz-keycloak/index.html     | 132 ----
 apisix/zh-cn/plugins/basic-auth.html               | 151 ----
 apisix/zh-cn/plugins/basic-auth/index.html         | 151 ----
 apisix/zh-cn/plugins/batch-requests.html           | 183 -----
 apisix/zh-cn/plugins/batch-requests/index.html     | 183 -----
 apisix/zh-cn/plugins/consumer-restriction.html     | 239 ------
 .../zh-cn/plugins/consumer-restriction/index.html  | 239 ------
 apisix/zh-cn/plugins/cors.html                     | 117 ---
 apisix/zh-cn/plugins/cors/index.html               | 117 ---
 apisix/zh-cn/plugins/echo.html                     | 114 ---
 apisix/zh-cn/plugins/echo/index.html               | 114 ---
 apisix/zh-cn/plugins/error-log-logger.html         | 109 ---
 apisix/zh-cn/plugins/error-log-logger/index.html   | 109 ---
 apisix/zh-cn/plugins/fault-injection.html          | 148 ----
 apisix/zh-cn/plugins/fault-injection/index.html    | 148 ----
 apisix/zh-cn/plugins/grpc-transcode.html           | 204 -----
 apisix/zh-cn/plugins/grpc-transcode/index.html     | 204 -----
 apisix/zh-cn/plugins/hmac-auth.html                | 309 --------
 apisix/zh-cn/plugins/hmac-auth/index.html          | 309 --------
 apisix/zh-cn/plugins/http-logger.html              | 155 ----
 apisix/zh-cn/plugins/http-logger/index.html        | 155 ----
 apisix/zh-cn/plugins/index.html                    |  53 --
 apisix/zh-cn/plugins/ip-restriction.html           | 115 ---
 apisix/zh-cn/plugins/ip-restriction/index.html     | 115 ---
 apisix/zh-cn/plugins/jwt-auth.html                 | 206 -----
 apisix/zh-cn/plugins/jwt-auth/index.html           | 206 -----
 apisix/zh-cn/plugins/kafka-logger.html             | 154 ----
 apisix/zh-cn/plugins/kafka-logger/index.html       | 154 ----
 apisix/zh-cn/plugins/key-auth.html                 | 138 ----
 apisix/zh-cn/plugins/key-auth/index.html           | 138 ----
 apisix/zh-cn/plugins/limit-conn.html               | 119 ---
 apisix/zh-cn/plugins/limit-conn/index.html         | 119 ---
 apisix/zh-cn/plugins/limit-count.html              | 197 -----
 apisix/zh-cn/plugins/limit-count/index.html        | 197 -----
 apisix/zh-cn/plugins/limit-req.html                | 201 -----
 apisix/zh-cn/plugins/limit-req/index.html          | 201 -----
 apisix/zh-cn/plugins/log-rotate.html               |  99 ---
 apisix/zh-cn/plugins/log-rotate/index.html         |  99 ---
 apisix/zh-cn/plugins/mqtt-proxy.html               | 108 ---
 apisix/zh-cn/plugins/mqtt-proxy/index.html         | 108 ---
 apisix/zh-cn/plugins/node-status.html              | 151 ----
 apisix/zh-cn/plugins/node-status/index.html        | 151 ----
 apisix/zh-cn/plugins/openid-connect.html           | 143 ----
 apisix/zh-cn/plugins/openid-connect/index.html     | 143 ----
 apisix/zh-cn/plugins/prometheus.html               | 187 -----
 apisix/zh-cn/plugins/prometheus/index.html         | 187 -----
 apisix/zh-cn/plugins/proxy-cache.html              | 274 -------
 apisix/zh-cn/plugins/proxy-cache/index.html        | 274 -------
 apisix/zh-cn/plugins/proxy-mirror.html             | 107 ---
 apisix/zh-cn/plugins/proxy-mirror/index.html       | 107 ---
 apisix/zh-cn/plugins/proxy-rewrite.html            | 119 ---
 apisix/zh-cn/plugins/proxy-rewrite/index.html      | 119 ---
 apisix/zh-cn/plugins/redirect.html                 | 139 ----
 apisix/zh-cn/plugins/redirect/index.html           | 139 ----
 apisix/zh-cn/plugins/referer-restriction.html      | 120 ---
 .../zh-cn/plugins/referer-restriction/index.html   | 120 ---
 apisix/zh-cn/plugins/request-id.html               | 101 ---
 apisix/zh-cn/plugins/request-id/index.html         | 101 ---
 apisix/zh-cn/plugins/request-validation.html       | 242 ------
 apisix/zh-cn/plugins/request-validation/index.html | 242 ------
 apisix/zh-cn/plugins/response-rewrite.html         | 128 ----
 apisix/zh-cn/plugins/response-rewrite/index.html   | 128 ----
 apisix/zh-cn/plugins/server-info.html              | 130 ----
 apisix/zh-cn/plugins/server-info/index.html        | 130 ----
 apisix/zh-cn/plugins/serverless.html               | 117 ---
 apisix/zh-cn/plugins/serverless/index.html         | 117 ---
 apisix/zh-cn/plugins/skywalking.html               | 229 ------
 apisix/zh-cn/plugins/skywalking/index.html         | 229 ------
 apisix/zh-cn/plugins/sls-logger.html               | 136 ----
 apisix/zh-cn/plugins/sls-logger/index.html         | 136 ----
 apisix/zh-cn/plugins/syslog.html                   | 125 ---
 apisix/zh-cn/plugins/syslog/index.html             | 125 ---
 apisix/zh-cn/plugins/tcp-logger.html               | 127 ----
 apisix/zh-cn/plugins/tcp-logger/index.html         | 127 ----
 apisix/zh-cn/plugins/traffic-split.html            | 434 -----------
 apisix/zh-cn/plugins/traffic-split/index.html      | 434 -----------
 apisix/zh-cn/plugins/udp-logger.html               | 123 ---
 apisix/zh-cn/plugins/udp-logger/index.html         | 123 ---
 apisix/zh-cn/plugins/uri-blocker.html              | 109 ---
 apisix/zh-cn/plugins/uri-blocker/index.html        | 109 ---
 apisix/zh-cn/plugins/wolf-rbac.html                | 246 ------
 apisix/zh-cn/plugins/wolf-rbac/index.html          | 246 ------
 apisix/zh-cn/plugins/zipkin.html                   | 163 ----
 apisix/zh-cn/plugins/zipkin/index.html             | 163 ----
 apisix/zh-cn/profile.html                          |  60 --
 apisix/zh-cn/profile/index.html                    |  60 --
 apisix/zh-cn/stand-alone.html                      | 272 -------
 apisix/zh-cn/stand-alone/index.html                | 272 -------
 apisix/zh-cn/stream-proxy.html                     |  89 ---
 apisix/zh-cn/stream-proxy/index.html               |  89 ---
 ...lease_flow-1dca59df2fab6c847f3fd02596ca6651.png | Bin 0 -> 76099 bytes
 b2b675dd.42a652db.js                               |   1 +
 blog/2020/08/22/new-website.html                   |  84 ---
 blog/2020/08/22/new-website/index.html             | 116 +--
 .../16/another-way-to-implement-envoy-filter.html  | 175 -----
 .../index.html                                     | 209 +----
 .../18/a-first-look-at-kubernetes-service-api.html | 194 -----
 .../index.html                                     | 226 +-----
 .../01/21/run-ingress-apisix-on-amazon-eks.html    | 181 -----
 .../21/run-ingress-apisix-on-amazon-eks/index.html | 214 +-----
 blog/atom.xml                                      |  60 +-
 blog/feed.xml                                      |  46 --
 blog/index.html                                    | 432 ++---------
 blog/rss.xml                                       |  39 +
 c4f5d8e4.d23d83fd.js                               |   1 +
 committer-guide.html                               | 121 ---
 committer-guide/index.html                         | 121 ---
 common.2d967526.js                                 |   1 +
 contributor-guide.html                             | 137 ----
 contributor-guide/index.html                       | 137 ----
 css/custom.css                                     |  21 +
 css/main.css                                       |   1 -
 css/prism.css                                      | 115 ---
 dcd70f61.ae3686bc.js                               |   1 +
 docs/2fa/index.html                                |  36 +
 docs/committer-guide/index.html                    |  36 +
 docs/contributor-guide/index.html                  |  36 +
 docs/downloads/index.html                          |  44 ++
 docs/index.html                                    |  36 +
 docs/release-guide/index.html                      |  54 ++
 docs/security/index.html                           |  36 +
 docs/team/index.html                               |  36 +
 downloads.html                                     |  83 --
 downloads/index.html                               |  83 --
 e02da2c5.0f2eca6c.js                               |   1 +
 en/help.html                                       |  31 -
 en/help/index.html                                 |  31 -
 en/index.html                                      |  27 -
 en/users.html                                      |  25 -
 en/users/index.html                                |  25 -
 f9e23376.86ab9048.js                               |   1 +
 fdbbc319.1c29101f.js                               |   1 +
 help.html                                          |  31 -
 help/index.html                                    |  59 +-
 images/apache.png                                  | Bin 7718 -> 0 bytes
 images/apisix.png                                  | Bin 111730 -> 0 bytes
 images/aws-caddy-php-welcome-page.png              | Bin 264558 -> 0 bytes
 images/aws-define-route.png                        | Bin 65062 -> 0 bytes
 images/aws-define-service.png                      | Bin 42793 -> 0 bytes
 images/aws-fargate-cdk.png                         | Bin 223795 -> 0 bytes
 images/aws-nlb-ip-addr.png                         | Bin 70628 -> 0 bytes
 images/benchmark-1.jpg                             | Bin 46823 -> 0 bytes
 images/benchmark-2.jpg                             | Bin 46767 -> 0 bytes
 images/consumer-internal.png                       | Bin 32911 -> 0 bytes
 images/consumer-who.png                            | Bin 21044 -> 0 bytes
 images/contributor-over-time.png                   | Bin 78386 -> 0 bytes
 images/dashboard.png                               | Bin 29182 -> 0 bytes
 images/discovery-cn.png                            | Bin 25676 -> 0 bytes
 images/discovery.png                               | Bin 27216 -> 0 bytes
 images/flamegraph-1.jpg                            | Bin 197526 -> 0 bytes
 images/flamegraph-2.jpg                            | Bin 217043 -> 0 bytes
 images/flow-load-plugin.png                        | Bin 298303 -> 0 bytes
 images/flow-plugin-internal.png                    | Bin 88216 -> 0 bytes
 images/latency-1.jpg                               | Bin 41942 -> 0 bytes
 images/latency-2.jpg                               | Bin 43001 -> 0 bytes
 images/plugin/authz-keycloak.png                   | Bin 45440 -> 0 bytes
 images/plugin/basic-auth-1.png                     | Bin 12725 -> 0 bytes
 images/plugin/basic-auth-2.png                     | Bin 24145 -> 0 bytes
 images/plugin/grafana_1.png                        | Bin 76557 -> 0 bytes
 images/plugin/grafana_2.png                        | Bin 86866 -> 0 bytes
 images/plugin/grafana_3.png                        | Bin 32059 -> 0 bytes
 images/plugin/jwt-auth-1.png                       | Bin 18775 -> 0 bytes
 images/plugin/jwt-auth-2.png                       | Bin 152137 -> 0 bytes
 images/plugin/key-auth-1.png                       | Bin 18476 -> 0 bytes
 images/plugin/key-auth-2.png                       | Bin 118760 -> 0 bytes
 images/plugin/limit-conn-1.png                     | Bin 33239 -> 0 bytes
 images/plugin/limit-conn-2.png                     | Bin 215818 -> 0 bytes
 images/plugin/limit-count-1.png                    | Bin 37725 -> 0 bytes
 images/plugin/limit-count-2.png                    | Bin 67413 -> 0 bytes
 images/plugin/limit-req-1.png                      | Bin 32730 -> 0 bytes
 images/plugin/limit-req-2.png                      | Bin 192690 -> 0 bytes
 images/plugin/oauth-1.png                          | Bin 34012 -> 0 bytes
 images/plugin/prometheus-1.png                     | Bin 32700 -> 0 bytes
 images/plugin/prometheus-2.png                     | Bin 153398 -> 0 bytes
 images/plugin/prometheus01.png                     | Bin 85848 -> 0 bytes
 images/plugin/prometheus02.png                     | Bin 115220 -> 0 bytes
 images/plugin/skywalking-1.png                     | Bin 17465 -> 0 bytes
 images/plugin/skywalking-2.png                     | Bin 23238 -> 0 bytes
 images/plugin/skywalking-3.png                     | Bin 40995 -> 0 bytes
 images/plugin/skywalking-4.png                     | Bin 25096 -> 0 bytes
 images/plugin/skywalking-5.png                     | Bin 38241 -> 0 bytes
 images/plugin/sls-logger-1.png                     | Bin 401450 -> 0 bytes
 images/plugin/wolf-rbac-1.png                      | Bin 46136 -> 0 bytes
 images/plugin/wolf-rbac-2.png                      | Bin 46638 -> 0 bytes
 images/plugin/zipkin-1.jpg                         | Bin 197361 -> 0 bytes
 images/plugin/zipkin-1.png                         | Bin 36854 -> 0 bytes
 images/plugin/zipkin-2.jpg                         | Bin 93062 -> 0 bytes
 images/plugin/zipkin-2.png                         | Bin 184217 -> 0 bytes
 images/routes-example.png                          | Bin 56920 -> 0 bytes
 images/service-example.png                         | Bin 64100 -> 0 bytes
 images/upstream-example.png                        | Bin 65898 -> 0 bytes
 img/asf_logo_wide_small.png                        | Bin 23022 -> 32278 bytes
 img/favicon.png                                    | Bin 80538 -> 85376 bytes
 img/language.svg                                   |   3 -
 img/logo.png                                       | Bin 4239 -> 5876 bytes
 img/release_flow.png                               | Bin 49012 -> 76099 bytes
 index.html                                         |  55 +-
 js/codetabs.js                                     |  31 -
 js/scrollSpy.js                                    |  83 --
 main.3e136775.js                                   |   2 +
 main.3e136775.js.LICENSE.txt                       |  44 ++
 opensearch.xml                                     |  11 +
 release-guide.html                                 | 277 -------
 release-guide/index.html                           | 277 -------
 runtime~main.330e0665.js                           |   1 +
 search/index.html                                  |  28 +
 security.html                                      |  84 ---
 security/index.html                                |  84 ---
 sitemap.xml                                        |   2 +-
 styles.992e9cec.js                                 |   1 +
 styles.dd2ce6a9.css                                |   1 +
 subscribe-guide.html                               |  88 ---
 subscribe-guide/index.html                         |  88 ---
 team.html                                          |  97 ---
 team/index.html                                    |  97 ---
 users.html                                         |  25 -
 users/index.html                                   |  53 +-
 427 files changed, 804 insertions(+), 50682 deletions(-)

diff --git a/.asf.yaml b/.asf.yaml
deleted file mode 100644
index 4e43bda..0000000
--- a/.asf.yaml
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-github:
-  description: Apache APISIX Website
-  homepage: https://apisix.apache.org/
-  labels:
-    - apisix
-    - website
-  features:
-    issues: true
-    projects: true
-  enabled_merge_buttons:
-    squash: true
-    merge: false
-    rebase: false
-publish:
-  whoami: asf-site
diff --git a/0b71e11c.4ca11385.js b/0b71e11c.4ca11385.js
new file mode 100644
index 0000000..9e96bf1
--- /dev/null
+++ b/0b71e11c.4ca11385.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{72:function(e,t,o){"use strict";o.r(t),o.d(t,"frontMatter",(function(){return r})),o.d(t,"metadata",(function(){return c})),o.d(t,"toc",(function(){return s})),o.d(t,"default",(function(){return d}));var n=o(3),a=o(7),i=(o(0),o(106)),r={id:"2fa",title:"2FA"},c={unversionedId:"2fa",id:"2fa",isDocsHomePage:!1,title:"2FA",description:"Two-factor authentication(2FA)",source:"@site/docs/2fa.md",slug:"/2fa",permalink:"/docs/2fa",editUrl: [...]
\ No newline at end of file
diff --git a/17896441.5f37a45d.js b/17896441.5f37a45d.js
new file mode 100644
index 0000000..58a3e30
--- /dev/null
+++ b/17896441.5f37a45d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{122:function(e,t,a){"use strict";var n=a(3),l=a(7),r=a(0),c=a.n(r),i=a(105),o=a(60),m=a.n(o);t.a=function(e){var t=e.className,a=Object(l.a)(e,["className"]);return c.a.createElement("svg",Object(n.a)({fill:"currentColor",height:"1.2em",width:"1.2em",preserveAspectRatio:"xMidYMid meet",role:"img",viewBox:"0 0 40 40",className:Object(i.a)(m.a.iconEdit,t)},a),c.a.createElement("g",null,c.a.createElement("path",{d:"m34.5 11.7l-3 3.1-6 [...]
\ No newline at end of file
diff --git a/1c89ab3b.79ecc6c6.js b/1c89ab3b.79ecc6c6.js
new file mode 100644
index 0000000..b2a3bbe
--- /dev/null
+++ b/1c89ab3b.79ecc6c6.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{76:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return r})),a.d(t,"metadata",(function(){return o})),a.d(t,"toc",(function(){return l})),a.d(t,"default",(function(){return p}));var n=a(3),s=a(7),i=(a(0),a(106)),r={title:"Run Ingress APISIX on Amazon EKS",author:"Chao Zhang",authorURL:"https://github.com/tokers",authorImageURL:"https://avatars0.githubusercontent.com/u/10428333?s=60&v=4"},o={permalink:"/blog/20 [...]
\ No newline at end of file
diff --git a/1dba9094.931ac078.js b/1dba9094.931ac078.js
new file mode 100644
index 0000000..3a11c78
--- /dev/null
+++ b/1dba9094.931ac078.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{77:function(e,t,n){"use strict";n.r(t);var a=n(22),l=n(110),r=n(107),s=n(0);t.default=function(){var e=Object(a.default)().siteConfig;if(0===(e.customFields.users||[]).length)return null;var t=e.customFields.users.filter((function(e){return e.pinned})).map((function(e){return s.createElement("a",{href:e.infoLink,key:e.infoLink},s.createElement("img",{className:"logo",src:e.image,alt:e.caption,title:e.caption}))}));return s.createEl [...]
\ No newline at end of file
diff --git a/2.f5a2d546.js b/2.f5a2d546.js
new file mode 100644
index 0000000..02d92e1
--- /dev/null
+++ b/2.f5a2d546.js
@@ -0,0 +1,2 @@
+/*! For license information please see 2.f5a2d546.js.LICENSE.txt */
+(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{110:function(e,t,a){"use strict";var n=a(0),r=a.n(n),c=a(105),o=a(64),l=a.n(o);var i=function(){return r.a.createElement("nav",{"aria-label":"Skip navigation links"},r.a.createElement("button",{type:"button",tabIndex:0,className:l.a.skipToContent,onKeyDown:function(e){if(13===e.keyCode){document.activeElement.blur();var t=document.querySelector("main:first-of-type");t&&t.scrollIntoView()}}},"Skip to main content"))},s=a(104),u=a(13 [...]
\ No newline at end of file
diff --git a/2.f5a2d546.js.LICENSE.txt b/2.f5a2d546.js.LICENSE.txt
new file mode 100644
index 0000000..bae6dd8
--- /dev/null
+++ b/2.f5a2d546.js.LICENSE.txt
@@ -0,0 +1,5 @@
+/*!
+  Copyright (c) 2017 Jed Watson.
+  Licensed under the MIT License (MIT), see
+  http://jedwatson.github.io/classnames
+*/
diff --git a/2275ea3b.7ebaada4.js b/2275ea3b.7ebaada4.js
new file mode 100644
index 0000000..81d763b
--- /dev/null
+++ b/2275ea3b.7ebaada4.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{78:function(t,e,a){"use strict";a.r(e),a.d(e,"frontMatter",(function(){return l})),a.d(e,"metadata",(function(){return i})),a.d(e,"toc",(function(){return m})),a.d(e,"default",(function(){return p}));var r=a(3),n=a(7),b=(a(0),a(106)),l={id:"team",title:"Team"},i={unversionedId:"team",id:"team",isDocsHomePage:!1,title:"Team",description:"Members",source:"@site/docs/team.md",slug:"/team",permalink:"/docs/team",editUrl:"https://github [...]
\ No newline at end of file
diff --git a/28.556d035e.js b/28.556d035e.js
new file mode 100644
index 0000000..661cc0c
--- /dev/null
+++ b/28.556d035e.js
@@ -0,0 +1,2 @@
+/*! For license information please see 28.556d035e.js.LICENSE.txt */
+(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{120:function(e,t,n){"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var n=0;n<e.length;n++)if(t(e[n]))return e[n]}},125:function(e,t,n){"use strict";function r(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function i(e,t){if(e===t)return e;for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n)){var a=t[n],s=e[n];void 0!==s&&void 0===a||(r(s)&&r(a)?e[n]=i(s, [...]
\ No newline at end of file
diff --git a/28.556d035e.js.LICENSE.txt b/28.556d035e.js.LICENSE.txt
new file mode 100644
index 0000000..0d29e78
--- /dev/null
+++ b/28.556d035e.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! algoliasearch-lite.umd.js | 4.8.4 | © Algolia, inc. | https://github.com/algolia/algoliasearch-client-javascript */
diff --git a/29.64851b6d.js b/29.64851b6d.js
new file mode 100644
index 0000000..4eac77f
--- /dev/null
+++ b/29.64851b6d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{102:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),l=a(110),o=a(123),c=a(107);var s=function(e){var t=e.nextItem,a=e.prevItem;return r.a.createElement("nav",{className:"pagination-nav","aria-label":"Blog post page navigation"},r.a.createElement("div",{className:"pagination-nav__item"},a&&r.a.createElement(c.a,{className:"pagination-nav__link",to:a.permalink},r.a.createElement("div",{className:"pagination-nav__sublabel"}," [...]
\ No newline at end of file
diff --git a/2d8fe9ee.30394a0b.js b/2d8fe9ee.30394a0b.js
new file mode 100644
index 0000000..b5e4b60
--- /dev/null
+++ b/2d8fe9ee.30394a0b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{79:function(e){e.exports=JSON.parse('{"title":"Recent posts","items":[{"title":"Run Ingress APISIX on Amazon EKS","permalink":"/blog/2021/01/21/run-ingress-apisix-on-amazon-eks"},{"title":"\u521d\u63a2 Kubernetes Service APIs","permalink":"/blog/2020/12/18/a-first-look-at-kubernetes-service-api"},{"title":"Envoy and Apache APISIX: Another way to implement the Envoy filter","permalink":"/blog/2020/12/16/another-way-to-implement-envo [...]
\ No newline at end of file
diff --git a/2da51850.9dfc310f.js b/2da51850.9dfc310f.js
new file mode 100644
index 0000000..a4d7a53
--- /dev/null
+++ b/2da51850.9dfc310f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{80:function(e,t,i){"use strict";i.r(t),i.d(t,"frontMatter",(function(){return n})),i.d(t,"metadata",(function(){return r})),i.d(t,"toc",(function(){return c})),i.d(t,"default",(function(){return p}));var a=i(3),o=i(7),s=(i(0),i(106)),n={id:"subscribe-guide",slug:"/",title:"Subscribe Guide"},r={unversionedId:"subscribe-guide",id:"subscribe-guide",isDocsHomePage:!1,title:"Subscribe Guide",description:"During the process of using Apac [...]
\ No newline at end of file
diff --git a/2fa.html b/2fa.html
deleted file mode 100644
index 2c3f217..0000000
--- a/2fa.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>2FA · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="## Two-factor authentication(2FA)"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="2FA · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" cont [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-            var coll = document.getElementsByClassName('collapsible');
-            var checkActiveCategory = true;
-            for (var i = 0; i < coll.length; i++) {
-              var links = coll[i].nextElementSibling.getElementsByTagName('*');
-              if (checkActiveCategory){
-                for (var j = 0; j < links.length; j++) {
-                  if (links[j].classList.contains('navListItemActive')){
-                    coll[i].nextElementSibling.classList.toggle('hide');
-                    coll[i].childNodes[1].classList.toggle('rotate');
-                    checkActiveCategory = false;
-                    break;
-                  }
-                }
-              }
-
-              coll[i].addEventListener('click', function() {
-                var arrow = this.childNodes[1];
-                arrow.classList.toggle('rotate');
-                var content = this.nextElementSibling;
-                content.classList.toggle('hide');
-              });
-            }
-
-            document.addEventListener('DOMContentLoaded', function() {
-              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
-              createToggler('#tocToggler', 'body', 'tocActive');
-
-              var headings = document.querySelector('.toc-headings');
-              headings && headings.addEventListener('click', function(event) {
-                var el = event.target;
-                while(el !== headings){
-                  if (el.tagName === 'A') {
-                    document.body.classList.remove('tocActive');
-                    break;
-                  } else{
-                    el = el.parentNode;
-                  }
-                }
-              }, false);
-
-              function createToggler(togglerSelector, targetSelector, className) {
-                var toggler = document.querySelector(togglerSelector);
-                var target = document.querySelector(targetSelector);
-
-                if (!toggler) {
-                  return;
-                }
-
-                toggler.onclick = function(event) {
-                  event.preventDefault();
-
-                  target.classList.toggle(className);
-                };
-              }
-            });
-        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">2FA</h1></header><article><div><span><h2><a class="anchor" aria-hidden="true" id="two-factor-authentication2fa"></a><a href="#two-factor-authentication2fa" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><pa [...]
-<p>Two factor authentication (2FA) refers to the authentication method that combines both passport and an object (credit card, SMS phone, token or biomarkers as fingerprint) to identify a user. To ensure the security of the committer’s account, we need you to enable 2FA to sign in and contribute codes on GitHub. More details, please refer to 2FA.</p>
-<p>Note:If you do not enable 2FA, you will be removed from the project and unable to access our repositories and the fork from our private repository.</p>
-<h2><a class="anchor" aria-hidden="true" id="enable-2fa-on-github"></a><a href="#enable-2fa-on-github" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
-<p>For detailed operations, please refer to Enable Two Factor Authentication with TOTP.</p>
-<p>After enabling 2FA, you need to sign in GitHub with the way of username/password + mobile phone authentication code.</p>
-<p>Tips: If you cannot download the APP through the page link, you can search and download the Google Authenticator in APP Store.</p>
-<h2><a class="anchor" aria-hidden="true" id="how-to-submit-codes"></a><a href="#how-to-submit-codes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>After enabling 2FA, you need to generate a private access Token to perform operations such as git submit and so on. At this time, you will use username + private access Token in replace of username + password to submit codes.</p>
-<p>For detailed operations, please refer to Create a Private Token.</p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 1/21/2021 by Alex Zhang</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/committer-guide"><span class="arrow-prev">← </span><span>Committer Guide</span></a><a class="docs-next button" href="/release-guide"><span>Release Guide</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#two-factor-authentication2fa">Two-factor au [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/2fa/index.html b/2fa/index.html
deleted file mode 100644
index 2c3f217..0000000
--- a/2fa/index.html
+++ /dev/null
@@ -1,91 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>2FA · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="## Two-factor authentication(2FA)"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="2FA · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" cont [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-            var coll = document.getElementsByClassName('collapsible');
-            var checkActiveCategory = true;
-            for (var i = 0; i < coll.length; i++) {
-              var links = coll[i].nextElementSibling.getElementsByTagName('*');
-              if (checkActiveCategory){
-                for (var j = 0; j < links.length; j++) {
-                  if (links[j].classList.contains('navListItemActive')){
-                    coll[i].nextElementSibling.classList.toggle('hide');
-                    coll[i].childNodes[1].classList.toggle('rotate');
-                    checkActiveCategory = false;
-                    break;
-                  }
-                }
-              }
-
-              coll[i].addEventListener('click', function() {
-                var arrow = this.childNodes[1];
-                arrow.classList.toggle('rotate');
-                var content = this.nextElementSibling;
-                content.classList.toggle('hide');
-              });
-            }
-
-            document.addEventListener('DOMContentLoaded', function() {
-              createToggler('#navToggler', '#docsNav', 'docsSliderActive');
-              createToggler('#tocToggler', 'body', 'tocActive');
-
-              var headings = document.querySelector('.toc-headings');
-              headings && headings.addEventListener('click', function(event) {
-                var el = event.target;
-                while(el !== headings){
-                  if (el.tagName === 'A') {
-                    document.body.classList.remove('tocActive');
-                    break;
-                  } else{
-                    el = el.parentNode;
-                  }
-                }
-              }, false);
-
-              function createToggler(togglerSelector, targetSelector, className) {
-                var toggler = document.querySelector(togglerSelector);
-                var target = document.querySelector(targetSelector);
-
-                if (!toggler) {
-                  return;
-                }
-
-                toggler.onclick = function(event) {
-                  event.preventDefault();
-
-                  target.classList.toggle(className);
-                };
-              }
-            });
-        </script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><h1 id="__docusaurus" class="postHeaderTitle">2FA</h1></header><article><div><span><h2><a class="anchor" aria-hidden="true" id="two-factor-authentication2fa"></a><a href="#two-factor-authentication2fa" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><pa [...]
-<p>Two factor authentication (2FA) refers to the authentication method that combines both passport and an object (credit card, SMS phone, token or biomarkers as fingerprint) to identify a user. To ensure the security of the committer’s account, we need you to enable 2FA to sign in and contribute codes on GitHub. More details, please refer to 2FA.</p>
-<p>Note:If you do not enable 2FA, you will be removed from the project and unable to access our repositories and the fork from our private repository.</p>
-<h2><a class="anchor" aria-hidden="true" id="enable-2fa-on-github"></a><a href="#enable-2fa-on-github" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
-<p>For detailed operations, please refer to Enable Two Factor Authentication with TOTP.</p>
-<p>After enabling 2FA, you need to sign in GitHub with the way of username/password + mobile phone authentication code.</p>
-<p>Tips: If you cannot download the APP through the page link, you can search and download the Google Authenticator in APP Store.</p>
-<h2><a class="anchor" aria-hidden="true" id="how-to-submit-codes"></a><a href="#how-to-submit-codes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>After enabling 2FA, you need to generate a private access Token to perform operations such as git submit and so on. At this time, you will use username + private access Token in replace of username + password to submit codes.</p>
-<p>For detailed operations, please refer to Create a Private Token.</p>
-</span></div></article></div><div class="docLastUpdate"><em>Last updated on 1/21/2021 by Alex Zhang</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/committer-guide"><span class="arrow-prev">← </span><span>Committer Guide</span></a><a class="docs-next button" href="/release-guide"><span>Release Guide</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#two-factor-authentication2fa">Two-factor au [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/30.163c5ee4.js b/30.163c5ee4.js
new file mode 100644
index 0000000..b07ae4b
--- /dev/null
+++ b/30.163c5ee4.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{101:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),l=a(22),o=a(110),s=a(123),c=a(107);var i=function(e){var t=e.metadata,a=t.previousPage,n=t.nextPage;return r.a.createElement("nav",{className:"pagination-nav","aria-label":"Blog list page navigation"},r.a.createElement("div",{className:"pagination-nav__item"},a&&r.a.createElement(c.a,{className:"pagination-nav__link",to:a},r.a.createElement("div",{className:"pagination-na [...]
\ No newline at end of file
diff --git a/31.c3e6fc2a.js b/31.c3e6fc2a.js
new file mode 100644
index 0000000..90e27be
--- /dev/null
+++ b/31.c3e6fc2a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[31,34],{100:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),l=a(106),c=a(22),o=a(26),i=a(110),s=a(3),u=a(7),m=a(105),p=a(104),d=a(133),h=a(139),b=a(140),y=a(138),f=a(107),g=a(119),v=a(150),k=function(e){return r.a.createElement("svg",Object(s.a)({width:"20",height:"20",role:"img"},e),r.a.createElement("g",{fill:"#7a7a7a"},r.a.createElement("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.5 [...]
\ No newline at end of file
diff --git a/32.d4950b06.js b/32.d4950b06.js
new file mode 100644
index 0000000..165fc2e
--- /dev/null
+++ b/32.d4950b06.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{186:function(e,t,r){"use strict";function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t,r){var a=t.initialState;return{getState:func [...]
\ No newline at end of file
diff --git a/33.d4f803a5.js b/33.d4f803a5.js
new file mode 100644
index 0000000..c043b4f
--- /dev/null
+++ b/33.d4f803a5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{185:function(n,i,o){"use strict";o.r(i);var r=o(63);for(var t in r)["default"].indexOf(t)<0&&function(n){o.d(i,n,(function(){return r[n]}))}(t)}}]);
\ No newline at end of file
diff --git a/34.f92ba19b.js b/34.f92ba19b.js
new file mode 100644
index 0000000..b0b605c
--- /dev/null
+++ b/34.f92ba19b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{129:function(e,t,a){"use strict";a.r(t);var n=a(0),o=a.n(n),l=a(110);t.default=function(){return o.a.createElement(l.a,{title:"Page Not Found"},o.a.createElement("main",{className:"container margin-vert--xl"},o.a.createElement("div",{className:"row"},o.a.createElement("div",{className:"col col--6 col--offset-3"},o.a.createElement("h1",{className:"hero__title"},"Page Not Found"),o.a.createElement("p",null,"We could not find what yo [...]
\ No newline at end of file
diff --git a/37e3b3ea.f669081a.js b/37e3b3ea.f669081a.js
new file mode 100644
index 0000000..39f21b1
--- /dev/null
+++ b/37e3b3ea.f669081a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{81:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return u})),n.d(t,"metadata",(function(){return c})),n.d(t,"toc",(function(){return i})),n.d(t,"default",(function(){return p}));var o=n(3),r=n(7),a=(n(0),n(106)),u={title:"New website for Apache APISIX",author:"juzhiyuan",authorURL:"https://github.com/juzhiyuan",authorImageURL:"https://avatars3.githubusercontent.com/u/2106987?s=460&u=f92e880ce95fe1fee18becd0a8 [...]
\ No newline at end of file
diff --git a/404.html b/404.html
new file mode 100644
index 0000000..d790581
--- /dev/null
+++ b/404.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width,initial-scale=1">
+<meta name="generator" content="Docusaurus v2.0.0-alpha.70">
+<link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Apache APISIX™ Blog RSS Feed">
+<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Apache APISIX™ Blog Atom Feed">
+<link rel="search" type="application/opensearchdescription+xml" title="Apache APISIX™" href="/opensearch.xml">
+<script src="https://buttons.github.io/buttons.js"></script><title data-react-helmet="true">Page Not Found | Apache APISIX™</title><meta data-react-helmet="true" property="og:title" content="Page Not Found | Apache APISIX™"><meta data-react-helmet="true" name="twitter:card" content="summary_large_image"><meta data-react-helmet="true" name="docsearch:language" content="en"><meta data-react-helmet="true" name="docsearch:docusaurus_tag" content="default"><link data-react-helmet="true" rel=" [...]
+<link rel="preload" href="/styles.992e9cec.js" as="script">
+<link rel="preload" href="/runtime~main.330e0665.js" as="script">
+<link rel="preload" href="/main.3e136775.js" as="script">
+</head>
+<body>
+<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
+<nav aria-label="Skip navigation links"><button type="button" tabindex="0" class="skipToContent_11B0">Skip to main content</button></nav><nav class="navbar navbar--fixed-top navbar--primary"><div class="navbar__inner"><div class="navbar__items"><div aria-label="Navigation bar toggle" class="navbar__toggle" role="button" tabindex="0"><svg aria-label="Menu" width="30" height="30" viewBox="0 0 30 30" role="img" focusable="false"><title>Menu</title><path stroke="currentColor" stroke-linecap= [...]
+<script src="/styles.992e9cec.js"></script>
+<script src="/runtime~main.330e0665.js"></script>
+<script src="/main.3e136775.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/514de2af.539501a7.js b/514de2af.539501a7.js
new file mode 100644
index 0000000..b5c2a0c
--- /dev/null
+++ b/514de2af.539501a7.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{82:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return r})),a.d(t,"metadata",(function(){return o})),a.d(t,"toc",(function(){return l})),a.d(t,"default",(function(){return p}));var n=a(3),s=a(7),i=(a(0),a(106)),r={title:"Run Ingress APISIX on Amazon EKS",author:"Chao Zhang",authorURL:"https://github.com/tokers",authorImageURL:"https://avatars0.githubusercontent.com/u/10428333?s=60&v=4"},o={permalink:"/blog/2 [...]
\ No newline at end of file
diff --git a/5bb67ffc.2fa3b45c.js b/5bb67ffc.2fa3b45c.js
new file mode 100644
index 0000000..45fb953
--- /dev/null
+++ b/5bb67ffc.2fa3b45c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{83:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return l})),a.d(t,"metadata",(function(){return s})),a.d(t,"toc",(function(){return i})),a.d(t,"default",(function(){return p}));var r=a(3),b=a(7),n=(a(0),a(106)),l={title:"\u521d\u63a2 Kubernetes Service APIs",author:"Wei Jin",authorURL:"https://github.com/gxthrj",authorImageURL:"https://avatars2.githubusercontent.com/u/4413028?s=400&u=e140a6d2bf19c426da6498b8 [...]
\ No newline at end of file
diff --git a/638581dc.bbe5a508.js b/638581dc.bbe5a508.js
new file mode 100644
index 0000000..d3ae84f
--- /dev/null
+++ b/638581dc.bbe5a508.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{84:function(e,t,i){"use strict";i.r(t),i.d(t,"frontMatter",(function(){return o})),i.d(t,"metadata",(function(){return n})),i.d(t,"toc",(function(){return c})),i.d(t,"default",(function(){return d}));var a=i(3),s=i(7),r=(i(0),i(106)),o={id:"security",title:"Security"},n={unversionedId:"security",id:"security",isDocsHomePage:!1,title:"Security",description:"The Apache Software Foundation takes a rigorous stance on eliminating secur [...]
\ No newline at end of file
diff --git a/749ed826.914caae4.js b/749ed826.914caae4.js
new file mode 100644
index 0000000..9ca8630
--- /dev/null
+++ b/749ed826.914caae4.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{85:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return r})),n.d(t,"metadata",(function(){return l})),n.d(t,"toc",(function(){return c})),n.d(t,"default",(function(){return p}));var a=n(3),i=n(7),o=(n(0),n(106)),r={title:"Envoy and Apache APISIX: Another way to implement the Envoy filter",author:"nic-chen",authorURL:"https://github.com/nic-chen",authorImageURL:"https://avatars0.githubusercontent.com/u/3300066 [...]
\ No newline at end of file
diff --git a/7e37206e.1dcb01fa.js b/7e37206e.1dcb01fa.js
new file mode 100644
index 0000000..d31564c
--- /dev/null
+++ b/7e37206e.1dcb01fa.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{86:function(e,t,a){"use strict";a.r(t);var l=a(110),n=a(0);function c(e){var t=e.config;e.language,t.baseUrl,t.docsUrl;return n.createElement("div",{className:"container"},n.createElement("div",{className:"row"},n.createElement("div",{className:"postHeader"},n.createElement("h1",null,"Need help?"))),n.createElement("div",{className:"row"},"This project is maintained by a dedicated group of people."),n.createElement("div",{classNam [...]
\ No newline at end of file
diff --git a/812d7c14.d052589d.js b/812d7c14.d052589d.js
new file mode 100644
index 0000000..811b660
--- /dev/null
+++ b/812d7c14.d052589d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{168:function(e,a,t){"use strict";t.r(a),a.default=t.p+"assets/images/release_flow-1dca59df2fab6c847f3fd02596ca6651.png"},87:function(e,a,t){"use strict";t.r(a),t.d(a,"frontMatter",(function(){return s})),t.d(a,"metadata",(function(){return l})),t.d(a,"toc",(function(){return o})),t.d(a,"default",(function(){return d}));var n=t(3),i=t(7),r=(t(0),t(106)),s={id:"release-guide",title:"Release Guide"},l={unversionedId:"release-guide",i [...]
\ No newline at end of file
diff --git a/935f2afb.ce20228c.js b/935f2afb.ce20228c.js
new file mode 100644
index 0000000..65edb2e
--- /dev/null
+++ b/935f2afb.ce20228c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{88:function(e){e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","isLast":true,"docsSidebars":{"docs":[{"collapsed":true,"type":"category","label":"Get Involved","items":[{"type":"link","label":"Security","href":"/docs/security"},{"type":"link","label":"Subscribe Guide","href":"/docs/"},{"type":"link","label":"Contributor Guide","href":"/docs/contributor-guide"},{"type":"link","label":"Committer Guide" [...]
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index 245e68d..0000000
--- a/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Apache APISIX™ Website
-
-The website of [Apache APISIX™](https://github.com/apache/apisix), a cloud-native microservices api gateway.
-
-## Usage
-
-```sh
-$ cd website
-
-$ yarn
-
-$ yarn start
-```
-
-Thanks to [docusaurus](https://docusaurus.io/)
diff --git a/a4a2cefa.03eff292.js b/a4a2cefa.03eff292.js
new file mode 100644
index 0000000..1518e41
--- /dev/null
+++ b/a4a2cefa.03eff292.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{89:function(e,t,a){"use strict";a.r(t),a.d(t,"frontMatter",(function(){return l})),a.d(t,"metadata",(function(){return s})),a.d(t,"toc",(function(){return i})),a.d(t,"default",(function(){return p}));var r=a(3),b=a(7),n=(a(0),a(106)),l={title:"\u521d\u63a2 Kubernetes Service APIs",author:"Wei Jin",authorURL:"https://github.com/gxthrj",authorImageURL:"https://avatars2.githubusercontent.com/u/4413028?s=400&u=e140a6d2bf19c426da6498b8 [...]
\ No newline at end of file
diff --git a/a6641250.7c404dbb.js b/a6641250.7c404dbb.js
new file mode 100644
index 0000000..79e6e44
--- /dev/null
+++ b/a6641250.7c404dbb.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{90:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return u})),n.d(t,"metadata",(function(){return i})),n.d(t,"toc",(function(){return c})),n.d(t,"default",(function(){return p}));var o=n(3),a=n(7),r=(n(0),n(106)),u={title:"New website for Apache APISIX",author:"juzhiyuan",authorURL:"https://github.com/juzhiyuan",authorImageURL:"https://avatars3.githubusercontent.com/u/2106987?s=460&u=f92e880ce95fe1fee18becd0a8 [...]
\ No newline at end of file
diff --git a/apisix/README.html b/apisix/README.html
deleted file mode 100644
index 3149263..0000000
--- a/apisix/README.html
+++ /dev/null
@@ -1,129 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/README · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/README · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" content="h [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<ul>
-<li><a href="/apisix/zh-cn/README">Chinese</a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="reference-documentation"></a><a href="#reference-documentation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
-<ul>
-<li><a href="/apisix/README">APISIX Readme</a></li>
-<li><a href="/apisix/architecture-design">Architecture Design</a></li>
-<li><a href="/apisix/getting-started">Getting Started Guide</a></li>
-<li><a href="/apisix/how-to-build">How to build Apache APISIX</a></li>
-<li><a href="/apisix/admin-api">Admin API</a></li>
-<li><a href="/apisix/control-api">Control API</a></li>
-<li><a href="/apisix/health-check">Health Check</a>: Enable health check on the upstream node, and will automatically filter unhealthy nodes during load balancing to ensure system stability.</li>
-<li><a href="/apisix/router-radixtree">Router radixtree</a></li>
-<li><a href="/apisix/stand-alone">Stand Alone Model</a>: Supports to load route rules from local yaml file, it is more friendly such as under the kubernetes(k8s).</li>
-<li><a href="/apisix/stream-proxy">Stream Proxy</a></li>
-<li><a href="/apisix/grpc-proxy">gRPC Proxy</a></li>
-<li><a href="/apisix/customize-nginx-configuration">Customize Nginx Configuration</a></li>
-<li><a href="../CHANGELOG.md">Changelog</a></li>
-<li><a href="/apisix/benchmark">Benchmark</a></li>
-<li><a href="../CODE_STYLE.md">Code Style</a></li>
-<li><a href="/apisix/debug-function">Debug Function</a></li>
-<li><a href="../FAQ.md">FAQ</a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="plugins"></a><a href="#plugins" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<h3><a class="anchor" aria-hidden="true" id="general"></a><a href="#general" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<ul>
-<li><a href="/apisix/plugins/batch-requests">batch-requests</a>: Allow you send multiple http api via <strong>http pipeline</strong>.</li>
-<li><a href="/apisix/plugins">hot reload</a>: Hot reload without reload service.</li>
-<li><a href="https.md">HTTPS/TLS</a>: Dynamic load the SSL Certificate by Server Name Indication (SNI).</li>
-<li><a href="/apisix/plugins/serverless">serverless</a>:Allows to dynamically run Lua code at <em>different</em> phase in APISIX.</li>
-<li><a href="/apisix/plugins/redirect">redirect</a>: URI redirect.</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="transformation"></a><a href="#transformation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<ul>
-<li><a href="/apisix/plugins/response-rewrite">response-rewrite</a>: Set customized response status code, body and header to the client.</li>
-<li><a href="/apisix/plugins/proxy-rewrite">proxy-rewrite</a>: Rewrite upstream request information.</li>
-<li><a href="/apisix/plugins/grpc-transcode">grpc-transcode</a>: REST &lt;--&gt; gRPC transcoding.</li>
-<li><a href="/apisix/plugins/fault-injection">fault-injection</a>: The specified response body, response code, and response time can be returned, which provides processing capabilities in different failure scenarios, such as service failure, service overload, and high service delay.</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="authentication"></a><a href="#authentication" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<ul>
-<li><a href="/apisix/plugins/key-auth">key-auth</a>: User authentication based on Key Authentication.</li>
-<li><a href="/apisix/plugins/jwt-auth">JWT-auth</a>: User authentication based on <a href="https://jwt.io/">JWT</a> (JSON Web Tokens) Authentication.</li>
-<li><a href="/apisix/plugins/basic-auth">basic-auth</a>: User authentication based on Basic Authentication.</li>
-<li><a href="/apisix/plugins/authz-keycloak">authz-keycloak</a>: Authorization with Keycloak Identity Server.</li>
-<li><a href="/apisix/plugins/wolf-rbac">wolf-rbac</a> User Authentication and Authorization based on <em>RBAC</em>.</li>
-<li><a href="/apisix/plugins/openid-connect">openid-connect</a></li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="security"></a><a href="#security" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<ul>
-<li><a href="/apisix/plugins/cors">cors</a>: Enable CORS(Cross-origin resource sharing) for your API.</li>
-<li><a href="/apisix/plugins/uri-blocker">uri-blocker</a>: Block client request by URI.</li>
-<li><a href="/apisix/plugins/ip-restriction">ip-restriction</a>: IP whitelist/blacklist.</li>
-<li><a href="/apisix/plugins/referer-restriction">referer-restriction</a>: Referer whitelist.</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="traffic"></a><a href="#traffic" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<ul>
-<li><a href="/apisix/plugins/limit-req">limit-req</a>: Request rate limiting and adjustment based on the &quot;leaky bucket&quot; method.</li>
-<li><a href="/apisix/plugins/limit-conn">limit-conn</a>: Limit request concurrency (or concurrent connections).</li>
-<li><a href="/apisix/plugins/limit-count">limit-count</a>: Rate limiting based on a &quot;fixed window&quot; implementation.</li>
-<li><a href="/apisix/plugins/proxy-cache">proxy-cache</a>: Provides the ability to cache upstream response data.</li>
-<li><a href="/apisix/plugins/request-validation">request-validation</a>: Validates requests before forwarding to upstream.</li>
-<li><a href="/apisix/plugins/proxy-mirror">proxy-mirror</a>: Provides the ability to mirror client requests.</li>
-<li><a href="/apisix/plugins/api-breaker">api-breaker</a>: Circuit Breaker for API that stops requests forwarding to upstream in case of unhealthy state.</li>
-<li><a href="/apisix/plugins/traffic-split">traffic-split</a>: Allows users to incrementally direct percentages of traffic between various upstreams.</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="monitoring"></a><a href="#monitoring" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<ul>
-<li><a href="/apisix/plugins/prometheus">prometheus</a>: Expose metrics related to APISIX and proxied upstream services in Prometheus exposition format, which can be scraped by a Prometheus Server.</li>
-<li><a href="/apisix/plugins/zipkin">OpenTracing</a>: Supports Zikpin and Apache SkyWalking.</li>
-<li><a href="/apisix/plugins/skywalking">Skywalking</a>: Supports Apache SkyWalking.</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="loggers"></a><a href="#loggers" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<ul>
-<li><a href="/apisix/plugins/http-logger">http-logger</a>: Log requests to http servers.</li>
-<li><a href="/apisix/plugins/tcp-logger">tcp-logger</a>: Log requests to TCP servers.</li>
-<li><a href="/apisix/plugins/kafka-logger">kafka-logger</a>: Log requests to External Kafka servers.</li>
-<li><a href="/apisix/plugins/udp-logger">udp-logger</a>: Log requests to UDP servers.</li>
-<li><a href="/apisix/plugins/syslog">sys-log</a>: Log requests to Syslog.</li>
-<li><a href="/apisix/plugins/log-rotate">log-rotate</a>: Rotate access/error log files.</li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="deploy"></a><a href="#deploy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<h3><a class="anchor" aria-hidden="true" id="aws"></a><a href="#aws" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
-<p>The recommended approach is to deploy APISIX with <a href="https://aws.amazon.com/cdk/">AWS CDK</a> on <a href="https://aws.amazon.com/fargate/">AWS Fargate</a> which helps you decouple the APISIX layer and the upstream layer on top of a fully-managed and secure serverless container compute environment with autoscaling capabilities.</p>
-<h3><a class="anchor" aria-hidden="true" id="kubernetes"></a><a href="#kubernetes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>See <a href="../kubernetes/README.md">this guide</a> and learn how to deploy apisix in Kubernetes.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#reference-documentation">Reference Documentation</a></li><li><a href="#plugins">Plugins</a><ul class="toc-headings"><li><a href="#general">General</a></li><li><a href="#transformation">Transformation</a></li><li><a href="#authentication">Authentication</a></li><li><a href="#security">Security</a></li><li><a href="#traffic">Traffic</a></li><li><a href="#m [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/README/index.html b/apisix/README/index.html
deleted file mode 100644
index 3149263..0000000
--- a/apisix/README/index.html
+++ /dev/null
@@ -1,129 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/README · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/README · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" content="h [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<ul>
-<li><a href="/apisix/zh-cn/README">Chinese</a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="reference-documentation"></a><a href="#reference-documentation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
-<ul>
-<li><a href="/apisix/README">APISIX Readme</a></li>
-<li><a href="/apisix/architecture-design">Architecture Design</a></li>
-<li><a href="/apisix/getting-started">Getting Started Guide</a></li>
-<li><a href="/apisix/how-to-build">How to build Apache APISIX</a></li>
-<li><a href="/apisix/admin-api">Admin API</a></li>
-<li><a href="/apisix/control-api">Control API</a></li>
-<li><a href="/apisix/health-check">Health Check</a>: Enable health check on the upstream node, and will automatically filter unhealthy nodes during load balancing to ensure system stability.</li>
-<li><a href="/apisix/router-radixtree">Router radixtree</a></li>
-<li><a href="/apisix/stand-alone">Stand Alone Model</a>: Supports to load route rules from local yaml file, it is more friendly such as under the kubernetes(k8s).</li>
-<li><a href="/apisix/stream-proxy">Stream Proxy</a></li>
-<li><a href="/apisix/grpc-proxy">gRPC Proxy</a></li>
-<li><a href="/apisix/customize-nginx-configuration">Customize Nginx Configuration</a></li>
-<li><a href="../CHANGELOG.md">Changelog</a></li>
-<li><a href="/apisix/benchmark">Benchmark</a></li>
-<li><a href="../CODE_STYLE.md">Code Style</a></li>
-<li><a href="/apisix/debug-function">Debug Function</a></li>
-<li><a href="../FAQ.md">FAQ</a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="plugins"></a><a href="#plugins" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<h3><a class="anchor" aria-hidden="true" id="general"></a><a href="#general" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<ul>
-<li><a href="/apisix/plugins/batch-requests">batch-requests</a>: Allow you send multiple http api via <strong>http pipeline</strong>.</li>
-<li><a href="/apisix/plugins">hot reload</a>: Hot reload without reload service.</li>
-<li><a href="https.md">HTTPS/TLS</a>: Dynamic load the SSL Certificate by Server Name Indication (SNI).</li>
-<li><a href="/apisix/plugins/serverless">serverless</a>:Allows to dynamically run Lua code at <em>different</em> phase in APISIX.</li>
-<li><a href="/apisix/plugins/redirect">redirect</a>: URI redirect.</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="transformation"></a><a href="#transformation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<ul>
-<li><a href="/apisix/plugins/response-rewrite">response-rewrite</a>: Set customized response status code, body and header to the client.</li>
-<li><a href="/apisix/plugins/proxy-rewrite">proxy-rewrite</a>: Rewrite upstream request information.</li>
-<li><a href="/apisix/plugins/grpc-transcode">grpc-transcode</a>: REST &lt;--&gt; gRPC transcoding.</li>
-<li><a href="/apisix/plugins/fault-injection">fault-injection</a>: The specified response body, response code, and response time can be returned, which provides processing capabilities in different failure scenarios, such as service failure, service overload, and high service delay.</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="authentication"></a><a href="#authentication" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<ul>
-<li><a href="/apisix/plugins/key-auth">key-auth</a>: User authentication based on Key Authentication.</li>
-<li><a href="/apisix/plugins/jwt-auth">JWT-auth</a>: User authentication based on <a href="https://jwt.io/">JWT</a> (JSON Web Tokens) Authentication.</li>
-<li><a href="/apisix/plugins/basic-auth">basic-auth</a>: User authentication based on Basic Authentication.</li>
-<li><a href="/apisix/plugins/authz-keycloak">authz-keycloak</a>: Authorization with Keycloak Identity Server.</li>
-<li><a href="/apisix/plugins/wolf-rbac">wolf-rbac</a> User Authentication and Authorization based on <em>RBAC</em>.</li>
-<li><a href="/apisix/plugins/openid-connect">openid-connect</a></li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="security"></a><a href="#security" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<ul>
-<li><a href="/apisix/plugins/cors">cors</a>: Enable CORS(Cross-origin resource sharing) for your API.</li>
-<li><a href="/apisix/plugins/uri-blocker">uri-blocker</a>: Block client request by URI.</li>
-<li><a href="/apisix/plugins/ip-restriction">ip-restriction</a>: IP whitelist/blacklist.</li>
-<li><a href="/apisix/plugins/referer-restriction">referer-restriction</a>: Referer whitelist.</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="traffic"></a><a href="#traffic" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<ul>
-<li><a href="/apisix/plugins/limit-req">limit-req</a>: Request rate limiting and adjustment based on the &quot;leaky bucket&quot; method.</li>
-<li><a href="/apisix/plugins/limit-conn">limit-conn</a>: Limit request concurrency (or concurrent connections).</li>
-<li><a href="/apisix/plugins/limit-count">limit-count</a>: Rate limiting based on a &quot;fixed window&quot; implementation.</li>
-<li><a href="/apisix/plugins/proxy-cache">proxy-cache</a>: Provides the ability to cache upstream response data.</li>
-<li><a href="/apisix/plugins/request-validation">request-validation</a>: Validates requests before forwarding to upstream.</li>
-<li><a href="/apisix/plugins/proxy-mirror">proxy-mirror</a>: Provides the ability to mirror client requests.</li>
-<li><a href="/apisix/plugins/api-breaker">api-breaker</a>: Circuit Breaker for API that stops requests forwarding to upstream in case of unhealthy state.</li>
-<li><a href="/apisix/plugins/traffic-split">traffic-split</a>: Allows users to incrementally direct percentages of traffic between various upstreams.</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="monitoring"></a><a href="#monitoring" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<ul>
-<li><a href="/apisix/plugins/prometheus">prometheus</a>: Expose metrics related to APISIX and proxied upstream services in Prometheus exposition format, which can be scraped by a Prometheus Server.</li>
-<li><a href="/apisix/plugins/zipkin">OpenTracing</a>: Supports Zikpin and Apache SkyWalking.</li>
-<li><a href="/apisix/plugins/skywalking">Skywalking</a>: Supports Apache SkyWalking.</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="loggers"></a><a href="#loggers" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<ul>
-<li><a href="/apisix/plugins/http-logger">http-logger</a>: Log requests to http servers.</li>
-<li><a href="/apisix/plugins/tcp-logger">tcp-logger</a>: Log requests to TCP servers.</li>
-<li><a href="/apisix/plugins/kafka-logger">kafka-logger</a>: Log requests to External Kafka servers.</li>
-<li><a href="/apisix/plugins/udp-logger">udp-logger</a>: Log requests to UDP servers.</li>
-<li><a href="/apisix/plugins/syslog">sys-log</a>: Log requests to Syslog.</li>
-<li><a href="/apisix/plugins/log-rotate">log-rotate</a>: Rotate access/error log files.</li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="deploy"></a><a href="#deploy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<h3><a class="anchor" aria-hidden="true" id="aws"></a><a href="#aws" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
-<p>The recommended approach is to deploy APISIX with <a href="https://aws.amazon.com/cdk/">AWS CDK</a> on <a href="https://aws.amazon.com/fargate/">AWS Fargate</a> which helps you decouple the APISIX layer and the upstream layer on top of a fully-managed and secure serverless container compute environment with autoscaling capabilities.</p>
-<h3><a class="anchor" aria-hidden="true" id="kubernetes"></a><a href="#kubernetes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>See <a href="../kubernetes/README.md">this guide</a> and learn how to deploy apisix in Kubernetes.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#reference-documentation">Reference Documentation</a></li><li><a href="#plugins">Plugins</a><ul class="toc-headings"><li><a href="#general">General</a></li><li><a href="#transformation">Transformation</a></li><li><a href="#authentication">Authentication</a></li><li><a href="#security">Security</a></li><li><a href="#traffic">Traffic</a></li><li><a href="#m [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/admin-api.html b/apisix/admin-api.html
deleted file mode 100644
index fda97a9..0000000
--- a/apisix/admin-api.html
+++ /dev/null
@@ -1,830 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/admin-api · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/admin-api · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" cont [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="table-of-contents"></a><a href="#table-of-contents" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<ul>
-<li><a href="#route">Route</a></li>
-<li><a href="#service">Service</a></li>
-<li><a href="#consumer">Consumer</a></li>
-<li><a href="#upstream">Upstream</a></li>
-<li><a href="#ssl">SSL</a></li>
-<li><a href="#global-rule">Global Rule</a></li>
-<li><a href="#plugin-metadata">Plugin Metadata</a></li>
-<li><a href="#plugin">Plugin</a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="route"></a><a href="#route" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p><em>API</em>:/apisix/admin/routes/{id}?ttl=0</p>
-<p><em>Description</em>:Route matches requests based on preset rules, and loads the appropriate plugin according to the matching result, then forwarding requests to target Upstream.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/routes</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/routes/{id}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/routes/{id}</td><td>{...}</td><td>Create resource by ID</td></tr>
-<tr><td>POST</td><td>/apisix/admin/routes</td><td>{...}</td><td>Create resource, and ID is generated by server</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/routes/{id}</td><td>NULL</td><td>Remove resource</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/routes/{id}</td><td>{...}</td><td>Standard PATCH. Update some attributes of the existing Route, and other attributes not involved will remain as they are; if you want to delete an attribute, set the value of the attribute Set to null to delete; especially, when the value of the attribute is an array, the attribute will be updated in full</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/routes/{id}/{path}</td><td>{...}</td><td>SubPath PATCH, specify the attribute of Route to be updated through {path}, update the value of this attribute in full, and other attributes that are not involved will remain as they are. The difference between the two PATCH can refer to the following examples</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>URI Request Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>parameter</th><th>Required</th><th>Type</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>ttl</td><td>False</td><td>Auxiliary</td><td>Expires after target seconds</td><td>ttl=1</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Parameter</th><th>Required</th><th>Type</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>name</td><td>False</td><td>Auxiliary</td><td>Identifies route names.</td><td>customer-xxxx</td></tr>
-<tr><td>desc</td><td>False</td><td>Auxiliary</td><td>route description, usage scenarios, and more.</td><td>customer xxxx</td></tr>
-<tr><td>uri</td><td>True, can't be used with <code>uris</code></td><td>Match Rules</td><td>In addition to full matching such as <code>/foo/bar</code>、<code>/foo/gloo</code>, using different <a href="/apisix/architecture-design#router">Router</a> allows more advanced matching, see <a href="/apisix/architecture-design#router">Router</a> for more.</td><td>&quot;/hello&quot;</td></tr>
-<tr><td>uris</td><td>True, can't be used with <code>uri</code></td><td>Match Rules</td><td>The <code>uri</code> in the form of a non-empty list means that multiple different uris are allowed, and match any one of them.</td><td>[&quot;/hello&quot;, &quot;/word&quot;]</td></tr>
-<tr><td>host</td><td>False, can't be used with <code>hosts</code></td><td>Match Rules</td><td>Currently requesting a domain name, such as <code>foo.com</code>; PAN domain names such as <code>*.foo.com</code> are also supported.</td><td>&quot;foo.com&quot;</td></tr>
-<tr><td>hosts</td><td>False, can't be used with <code>host</code></td><td>Match Rules</td><td>The <code>host</code> in the form of a non-empty list means that multiple different hosts are allowed, and match any one of them.</td><td>{&quot;foo.com&quot;, &quot;*.bar.com&quot;}</td></tr>
-<tr><td>remote_addr</td><td>False, can't be used with <code>remote_addrs</code></td><td>Match Rules</td><td>The client requests an IP address: <code>192.168.1.101</code>, <code>192.168.1.102</code>, and CIDR format support <code>192.168.1.0/24</code>. In particular, APISIX also fully supports IPv6 address matching: <code>::1</code>, <code>fe80::1</code>, <code>fe80::1/64</code>, etc.</td><td>&quot;192.168.1.0/24&quot;</td></tr>
-<tr><td>remote_addrs</td><td>False, can't be used with <code>remote_addr</code></td><td>Match Rules</td><td>The <code>remote_addr</code> in the form of a non-empty list indicates that multiple different IP addresses are allowed, and match any one of them.</td><td>{&quot;127.0.0.1&quot;, &quot;192.0.0.0/8&quot;, &quot;::1&quot;}</td></tr>
-<tr><td>methods</td><td>False</td><td>Match Rules</td><td>If empty or without this option, there are no <code>method</code> restrictions, and it can be a combination of one or more: <code>GET</code>,<code>POST</code>,<code>PUT</code>,<code>DELETE</code>,<code>PATCH</code>, <code>HEAD</code>,<code>OPTIONS</code>,<code>CONNECT</code>,<code>TRACE</code>.</td><td>{&quot;GET&quot;, &quot;POST&quot;}</td></tr>
-<tr><td>priority</td><td>False</td><td>Match Rules</td><td>If different routes contain the same <code>uri</code>, determine which route is matched first based on the attribute <code>priority</code>. Larger value means higher priority. The default value is 0.</td><td>priority = 10</td></tr>
-<tr><td>vars</td><td>False</td><td>Match Rules</td><td>A list of one or more <code>{var, operator, val}</code> elements, like this: <code>{{var, operator, val}, {var, operator, val}, ...}}</code>. For example: <code>{&quot;arg_name&quot;, &quot;==&quot;, &quot;json&quot;}</code> means that the current request parameter <code>name</code> is <code>json</code>. The <code>var</code> here is consistent with the internal variable name of Nginx, so you can also use <code>request_uri</code>, <co [...]
-<tr><td>filter_func</td><td>False</td><td>Match Rules</td><td>User-defined filtering function. You can use it to achieve matching requirements for special scenarios. This function accepts an input parameter named <code>vars</code> by default, which you can use to get Nginx variables.</td><td>function(vars) return vars[&quot;arg_name&quot;] == &quot;json&quot; end</td></tr>
-<tr><td>plugins</td><td>False</td><td>Plugin</td><td>See <a href="/apisix/architecture-design#plugin">Plugin</a> for more</td><td></td></tr>
-<tr><td>script</td><td>False</td><td>Script</td><td>See <a href="/apisix/architecture-design#script">Script</a> for more</td><td></td></tr>
-<tr><td>upstream</td><td>False</td><td>Upstream</td><td>Enabled Upstream configuration, see <a href="/apisix/architecture-design#upstream">Upstream</a> for more</td><td></td></tr>
-<tr><td>upstream_id</td><td>False</td><td>Upstream</td><td>Enabled upstream id, see <a href="/apisix/architecture-design#upstream">Upstream</a> for more</td><td></td></tr>
-<tr><td>service_id</td><td>False</td><td>Service</td><td>Binded Service configuration, see <a href="/apisix/architecture-design#service">Service</a> for more</td><td></td></tr>
-<tr><td>service_protocol</td><td>False</td><td>Upstream protocol type</td><td>only <code>grpc</code></td><td>Must set <code>grpc</code> if using <code>gRPC proxy</code> or <code>gRPC transcode</code>.</td></tr>
-<tr><td>labels</td><td>False</td><td>Match Rules</td><td>Key/value pairs to specify attributes</td><td>{&quot;version&quot;:&quot;v2&quot;,&quot;build&quot;:&quot;16&quot;,&quot;env&quot;:&quot;production&quot;}</td></tr>
-<tr><td>enable_websocket</td><td>False</td><td>Auxiliary</td><td>enable <code>websocket</code>(boolean), default <code>false</code>.</td><td></td></tr>
-<tr><td>status</td><td>False</td><td>Auxiliary</td><td>enable this route, default <code>1</code>.</td><td><code>1</code> to enable, <code>0</code> to disable</td></tr>
-<tr><td>create_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>update_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-</tbody>
-</table>
-<p>For the same type of parameters, such as <code>host</code> and <code>hosts</code>, <code>remote_addr</code> and <code>remote_addrs</code> cannot exist at the same time, only one of them can be selected. If enabled at the same time, the API will response an error.</p>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell">{
-    "id": "1",                  # id, unnecessary.
-    "uris": ["/a","/b"],        # A set of uri.
-    "methods": ["GET","POST"],  # Can fill multiple methods
-    "hosts": ["a.com","b.com"], # A set of host.
-    "plugins": {},              # Bound plugin
-    "priority": 0,              # If different routes contain the same `uri`, determine which route is matched first based on the attribute` priority`, the default value is 0.
-    "name": "route-xxx",
-    "desc": "hello world",
-    "remote_addrs": ["127.0.0.1"], # A set of Client IP.
-    "vars": [],                 # A list of one or more `{var, operator, val}` elements
-    "upstream_id": "1",         # upstream id, recommended
-    "upstream": {},             # upstream, not recommended
-    "filter_func": "",          # User-defined filtering function
-}
-</code></pre>
-<p>Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> Create a route</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/index.html",
-    "hosts": ["foo.com", "*.bar.com"],
-    "remote_addrs": ["127.0.0.0/8"],
-    "methods": ["PUT", "GET"],
-    "enable_websocket": true,
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-
-HTTP/1.1 201 Created
-Date: Sat, 31 Aug 2019 01:17:15 GMT
-...
-<span class="hljs-meta">
-#</span><span class="bash"><span class="hljs-string"> Create a route expires after 60 seconds, then it'</span>s deleted automatically</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/2?ttl=60 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/aa/index.html",
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-
-HTTP/1.1 201 Created
-Date: Sat, 31 Aug 2019 01:17:15 GMT
-...
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Add an upstream node to the Route</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.216:80": 1
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 1
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Update the weight of an upstream node to the Route</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.216:80": 10
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Delete an upstream node for the Route</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.215:80": null
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Replace methods of the Route  --  array</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'{</span></span>
-    "methods": ["GET", "POST"]
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, methods will not retain the original data, and the entire update is:
-["GET", "POST"]
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Replace upstream nodes of the Route -- sub path</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/1/upstream/nodes -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "39.97.63.200:80": 1
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, nodes will not retain the original data, and the entire update is:
-{
-    "39.97.63.200:80": 1
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Replace methods of the Route -- sub path</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1/methods -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d<span class="hljs-string">'["POST", "DELETE", " PATCH"]'</span></span>
-HTTP/1.1 200 OK
-...
-
-After successful execution, methods will not retain the original data, and the entire update is:
-["POST", "DELETE", "PATCH"]
-<span class="hljs-meta">
-
-#</span><span class="bash"> <span class="hljs-built_in">disable</span> route</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "status": 0
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, status nodes will be updated to:
-{
-    "status": 0
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> enable route</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H '</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "status": 1
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, status nodes will be updated to:
-{
-    "status": 1
-}
-
-
-</code></pre>
-<blockquote>
-<p>Response Parameters</p>
-</blockquote>
-<p>Return response from etcd currently.</p>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-<h2><a class="anchor" aria-hidden="true" id="service"></a><a href="#service" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p><em>API</em>:/apisix/admin/services/{id}</p>
-<p><em>Description</em>:A <code>Service</code> is an abstraction of an API (which can also be understood as a set of Route abstractions). It usually corresponds to the upstream service abstraction. Between <code>Route</code> and <code>Service</code>, usually the relationship of N:1.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/services</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/services/{id}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/services/{id}</td><td>{...}</td><td>Create resource by ID</td></tr>
-<tr><td>POST</td><td>/apisix/admin/services</td><td>{...}</td><td>Create resource, and ID is generated by server</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/services/{id}</td><td>NULL</td><td>Remove resource</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/services/{id}</td><td>{...}</td><td>Standard PATCH. Update some attributes of the existing Service, and other attributes not involved will remain as they are; if you want to delete an attribute, set the value of the attribute Set to null to delete; especially, when the value of the attribute is an array, the attribute will be updated in full</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/services/{id}/{path}</td><td>{...}</td><td>SubPath PATCH, specify the attribute of Service to be updated through {path}, update the value of this attribute in full, and other attributes that are not involved will remain as they are. The difference between the two PATCH can refer to the following examples</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Parameter</th><th>Required</th><th>Type</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>plugins</td><td>False</td><td>Plugin</td><td>See <a href="/apisix/architecture-design#plugin">Plugin</a> for more</td><td></td></tr>
-<tr><td>upstream</td><td>False</td><td>Upstream</td><td>Enabled Upstream configuration, see <a href="/apisix/architecture-design#upstream">Upstream</a> for more</td><td></td></tr>
-<tr><td>upstream_id</td><td>False</td><td>Upstream</td><td>Enabled upstream id, see <a href="/apisix/architecture-design#upstream">Upstream</a> for more</td><td></td></tr>
-<tr><td>name</td><td>False</td><td>Auxiliary</td><td>Identifies service names.</td><td>customer-xxxx</td></tr>
-<tr><td>desc</td><td>False</td><td>Auxiliary</td><td>service usage scenarios, and more.</td><td>customer xxxx</td></tr>
-<tr><td>labels</td><td>False</td><td>Match Rules</td><td>Key/value pairs to specify attributes</td><td>{&quot;version&quot;:&quot;v2&quot;,&quot;build&quot;:&quot;16&quot;,&quot;env&quot;:&quot;production&quot;}</td></tr>
-<tr><td>enable_websocket</td><td>False</td><td>Auxiliary</td><td>enable <code>websocket</code>(boolean), default <code>false</code>.</td><td></td></tr>
-<tr><td>create_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>update_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-</tbody>
-</table>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell">{
-    "id": "1",          # id
-    "plugins": {},      # Bound plugin
-    "upstream_id": "1", # upstream id, recommended
-    "upstream": {},     # upstream, not recommended
-    "name": "service-test",
-    "desc": "hello world",
-    "enable_websocket": true,
-}
-</code></pre>
-<p>Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/services/201  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    },
-    "enable_websocket": true,
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-
-HTTP/1.1 201 Created
-...
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Add an upstream node to the Service</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/services/201 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.216:80": 1
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 1
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Update the weight of an upstream node to the Service</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/services/201 -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.216:80": 10
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Delete an upstream node for the Service</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/services/201 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.215:80": null
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Replace upstream nodes of the Service</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/services/201/upstream/nodes -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "39.97.63.200:80": 1
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will not retain the original data, and the entire update is:
-{
-    "39.97.63.200:80": 1
-}
-
-</code></pre>
-<blockquote>
-<p>Response Parameters</p>
-</blockquote>
-<p>Return response from etcd currently.</p>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-<h2><a class="anchor" aria-hidden="true" id="consumer"></a><a href="#consumer" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p><em>API</em>:/apisix/admin/consumers/{username}</p>
-<p><em>Description</em>:Consumers are consumers of certain types of services and can only be used in conjunction with a user authentication system. Consumer regards the <code>username</code> property as the identity, so only the HTTP <code>PUT</code> method is supported for creating a new consumer.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/consumers</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/consumers/{username}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/consumers</td><td>{...}</td><td>Create resource by username</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/consumers/{username}</td><td>NULL</td><td>Remove resource</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Parameter</th><th>Required</th><th>Type</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>username</td><td>True</td><td>Name</td><td>Consumer name</td><td></td></tr>
-<tr><td>plugins</td><td>False</td><td>Plugin</td><td>See <a href="/apisix/architecture-design#plugin">Plugin</a> for more</td><td></td></tr>
-<tr><td>desc</td><td>False</td><td>Auxiliary</td><td>Identifies route names, usage scenarios, and more.</td><td>customer xxxx</td></tr>
-<tr><td>labels</td><td>False</td><td>Match Rules</td><td>Key/value pairs to specify attributes</td><td>{&quot;version&quot;:&quot;v2&quot;,&quot;build&quot;:&quot;16&quot;,&quot;env&quot;:&quot;production&quot;}</td></tr>
-<tr><td>create_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>update_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-</tbody>
-</table>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell">{
-    "plugins": {},          # Bound plugin
-    "username": "name",     # Consumer name
-    "desc": "hello world",  # Consumer desc
-}
-</code></pre>
-<p>The binding authentication plug-in is a bit special. When it needs to be used in conjunction with the consumer, it needs to provide user name, password and other information; on the other hand, when it is bound with route / service, it does not require any parameters. Because at this time, it is based on the user request data to infer which consumer the user corresponds to.</p>
-<p>Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/consumers  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "username": "jack",
-    "plugins": {
-        "key-auth": {
-            "key": "auth-one"
-        },
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    }
-}'
-HTTP/1.1 200 OK
-Date: Thu, 26 Dec 2019 08:17:49 GMT
-...
-
-{"node":{"value":{"username":"jack","plugins":{"key-auth":{"key":"auth-one"},"limit-count":{"time_window":60,"count":2,"rejected_code":503,"key":"remote_addr","policy":"local"}}},"createdIndex":64,"key":"\/apisix\/consumers\/jack","modifiedIndex":64},"prevNode":{"value":"{\"username\":\"jack\",\"plugins\":{\"key-auth\":{\"key\":\"auth-one\"},\"limit-count\":{\"time_window\":60,\"count\":2,\"rejected_code\":503,\"key\":\"remote_addr\",\"policy\":\"local\"}}}","createdIndex":63,"key":"\/ap [...]
-</code></pre>
-<p>Since <code>v2.2</code>, we can bind multiple authentication plugins to the same consumer.</p>
-<blockquote>
-<p>Response Parameters</p>
-</blockquote>
-<p>Return response from etcd currently.</p>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-<h2><a class="anchor" aria-hidden="true" id="upstream"></a><a href="#upstream" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p><em>API</em>:/apisix/admin/upstreams/{id}</p>
-<p><em>Description</em>:Upstream configuration can be directly bound to the specified <code>Route</code> or it can be bound to <code>Service</code>, but the configuration in <code>Route</code> has a higher priority. The priority behavior here is very similar to <code>Plugin</code>.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/upstreams</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/upstreams/{id}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/upstreams/{id}</td><td>{...}</td><td>Create resource by ID</td></tr>
-<tr><td>POST</td><td>/apisix/admin/upstreams</td><td>{...}</td><td>Create resource, and ID is generated by server</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/upstreams/{id}</td><td>NULL</td><td>Remove resource</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/upstreams/{id}</td><td>{...}</td><td>Standard PATCH. Update some attributes of the existing Upstream, and other attributes not involved will remain as they are; if you want to delete an attribute, set the value of the attribute Set to null to delete; especially, when the value of the attribute is an array, the attribute will be updated in full</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/upstreams/{id}/{path}</td><td>{...}</td><td>SubPath PATCH, specify the attribute of Upstream to be updated through {path}, update the value of this attribute in full, and other attributes that are not involved will remain as they are. The difference between the two PATCH can refer to the following example</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<p>In addition to the basic complex equalization algorithm selection, APISIX's Upstream also supports logic for upstream passive health check and retry, see the table below.</p>
-<table>
-<thead>
-<tr><th>Name</th><th>Optional</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>type</td><td>required</td><td>the balancer algorithm</td></tr>
-<tr><td>nodes</td><td>required, can't be used with <code>service_name</code></td><td>Hash table, the key of the internal element is the upstream machine address list, the format is <code>Address + Port</code>, where the address part can be IP or domain name, such as <code>192.168.1.100:80</code>, <code>foo.com:80</code>, etc. Value is the weight of the node. In particular, when the weight value is <code>0</code>, it has a special meaning, which usually means that the upstream node is inv [...]
-<tr><td>service_name</td><td>required, can't be used with <code>nodes</code></td><td>the name of service used in the service discovery, see <a href="/apisix/discovery">discovery</a> for more details</td></tr>
-<tr><td>discovery_type</td><td>required, if <code>server_name</code> is used</td><td>the type of service discovery, see <a href="/apisix/discovery">discovery</a> for more details</td></tr>
-<tr><td>hash_on</td><td>optional</td><td>This option is only valid if the <code>type</code> is <code>chash</code>. Supported types <code>vars</code>(Nginx variables), <code>header</code>(custom header), <code>cookie</code>, <code>consumer</code>, the default value is <code>vars</code>.</td></tr>
-<tr><td>key</td><td>optional</td><td>This option is only valid if the <code>type</code> is <code>chash</code>. Find the corresponding node <code>id</code> according to <code>hash_on</code> and <code>key</code>. When <code>hash_on</code> is set as <code>vars</code>, <code>key</code> is the required parameter, for now, it support nginx built-in variables like <code>uri, server_name, server_addr, request_uri, remote_port, remote_addr, query_string, host, hostname, arg_***</code>, <code>arg_ [...]
-<tr><td>checks</td><td>optional</td><td>Configure the parameters of the health check. For details, refer to <a href="/apisix/health-check">health-check</a>.</td></tr>
-<tr><td>retries</td><td>optional</td><td>Pass the request to the next upstream using the underlying Nginx retry mechanism, the retry mechanism is enabled by default and set the number of retries according to the number of available backend nodes. If <code>retries</code> option is explicitly set, it will override the default value. <code>0</code> means disable retry mechanism.</td></tr>
-<tr><td>timeout</td><td>optional</td><td>Set the timeout for connection, sending and receiving messages.</td></tr>
-<tr><td>name</td><td>optional</td><td>Identifies upstream names</td></tr>
-<tr><td>desc</td><td>optional</td><td>upstream usage scenarios, and more.</td></tr>
-<tr><td>pass_host</td><td>optional</td><td><code>pass</code> pass the client request host, <code>node</code> not pass the client request host, using the upstream node host, <code>rewrite</code> rewrite host by the configured <code>upstream_host</code>.</td></tr>
-<tr><td>upstream_host</td><td>optional</td><td>This option is only valid if the <code>pass_host</code> is <code>rewrite</code>.</td></tr>
-<tr><td>labels</td><td>optional</td><td>Key/value pairs to specify attributes</td><td>{&quot;version&quot;:&quot;v2&quot;,&quot;build&quot;:&quot;16&quot;,&quot;env&quot;:&quot;production&quot;}</td></tr>
-<tr><td>create_time</td><td>optional</td><td>epoch timestamp in second, like <code>1602883670</code>, will be created automatically if missing</td></tr>
-<tr><td>update_time</td><td>optional</td><td>epoch timestamp in second, like <code>1602883670</code>, will be created automatically if missing</td></tr>
-</tbody>
-</table>
-<p><code>type</code> can be one of:</p>
-<ul>
-<li><code>roundrobin</code>: roundrobin with weight</li>
-<li><code>chash</code>: consistent hash</li>
-<li><code>ewma</code>: pick one of node which has minimum latency. See <a href="https://en.wikipedia.org/wiki/EWMA_chart">https://en.wikipedia.org/wiki/EWMA_chart</a> for details.</li>
-<li><code>least_conn</code>: pick node which has the lowest <code>(active_conn + 1) / weight</code>. Note the <code>active connection</code> concept is the same with Nginx: it is a connection in used by a request.</li>
-</ul>
-<p><code>hash_on</code> can be set to different types:</p>
-<ol>
-<li>when it is <code>vars</code>, the <code>key</code> is required. The <code>key</code> can be any <a href="http://nginx.org/en/docs/varindex.html">Nginx builtin variables</a>, without the prefix '$'.</li>
-<li>when it is <code>header</code>, the <code>key</code> is required. It is equal to &quot;http_<code>key</code>&quot;.</li>
-<li>when it is <code>cookie</code>, the <code>key</code> is required. It is equal to &quot;cookie_<code>key</code>&quot;.</li>
-<li>when it is <code>consumer</code>, the <code>key</code> is optional. The key is the <code>consumer_name</code> set by authentication plugin.</li>
-<li>when it is <code>vars_combinations</code>, the <code>key</code> is required. The <code>key</code> can be any <a href="http://nginx.org/en/docs/varindex.html">Nginx builtin variables</a> combinations, such as <code>$request_uri$remote_addr</code>.</li>
-<li>If there is no value for either <code>hash_on</code> or <code>key</code>, <code>remote_addr</code> will be used as key.</li>
-</ol>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell">{
-    "id": "1",                  # id
-    "retries": 1,               # retry times
-    "timeout": {                # Set the timeout for connection, sending and receiving messages.
-        "connect":15,
-        "send":15,
-        "read":15,
-    },
-    "nodes": {"host:80": 100},  # Upstream machine address list, the format is `Address + Port`
-    "type":"roundrobin",
-    "checks": {},               # Health check parameters
-    "hash_on": "",
-    "key": "",
-    "name": "upstream-for-test",
-    "desc": "hello world",
-}
-</code></pre>
-<p>Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/upstreams/100  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -i -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "type":"roundrobin",
-    "nodes":{
-        "127.0.0.1:80":1,
-        "127.0.0.2:80":2,
-        "foo.com:80":3
-    }
-}'
-HTTP/1.1 201 Created
-Date: Thu, 26 Dec 2019 04:19:34 GMT
-Content-Type: text/plain
-...
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Add a node to the Upstream</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/upstreams/100 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "nodes": {
-        "39.97.63.216:80": 1
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 1
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Update the weight of a node to the Upstream</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/upstreams/100 -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "nodes": {
-        "39.97.63.216:80": 10
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Delete a node for the Upstream</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/upstreams/100 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "nodes": {
-        "39.97.63.215:80": null
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, nodes will be updated to:
-{
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Replace the nodes of the Upstream</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/upstreams/100/nodes -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "39.97.63.200:80": 1
-}'
-HTTP/1.1 200 OK
-...
-
-After the execution is successful, nodes will not retain the original data, and the entire update is:
-{
-    "39.97.63.200:80": 1
-}
-
-</code></pre>
-<blockquote>
-<p>Response Parameters</p>
-</blockquote>
-<p>Return response from etcd currently.</p>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-<h2><a class="anchor" aria-hidden="true" id="ssl"></a><a href="#ssl" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
-<p><em>API</em>:/apisix/admin/ssl/{id}</p>
-<p><em>Description</em>:SSL.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/ssl</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/ssl/{id}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/ssl/{id}</td><td>{...}</td><td>Create resource by ID</td></tr>
-<tr><td>POST</td><td>/apisix/admin/ssl</td><td>{...}</td><td>Create resource, and ID is generated by server</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/ssl/{id}</td><td>NULL</td><td>Remove resource</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Parameter</th><th>Required</th><th>Type</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>cert</td><td>True</td><td>Certificate</td><td>https certificate</td><td></td></tr>
-<tr><td>key</td><td>True</td><td>Private key</td><td>https private key</td><td></td></tr>
-<tr><td>certs</td><td>False</td><td>An array of certificate</td><td>when you need to configure multiple certificate for the same domain, you can pass extra https certificates (excluding the one given as cert) in this field</td><td></td></tr>
-<tr><td>keys</td><td>False</td><td>An array of private key</td><td>https private keys. The keys should be paired with certs above</td><td></td></tr>
-<tr><td>snis</td><td>True</td><td>Match Rules</td><td>a non-empty arrays of https SNI</td><td></td></tr>
-<tr><td>labels</td><td>False</td><td>Match Rules</td><td>Key/value pairs to specify attributes</td><td>{&quot;version&quot;:&quot;v2&quot;,&quot;build&quot;:&quot;16&quot;,&quot;env&quot;:&quot;production&quot;}</td></tr>
-<tr><td>create_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>update_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>status</td><td>False</td><td>Auxiliary</td><td>enable this SSL, default <code>1</code>.</td><td><code>1</code> to enable, <code>0</code> to disable</td></tr>
-</tbody>
-</table>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell">{
-    "id": "1",      # id
-    "cert": "cert", # Certificate
-    "key": "key",   # Private key
-    "snis": ["t.com"]    # https SNI
-}
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="global-rule"></a><a href="#global-rule" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p><em>API</em>:/apisix/admin/global_rules/{id}</p>
-<p><em>Description</em>: Set plugins which run globally. Those plugins will be run before any Route/Service level plugins.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/global_rules</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/global_rules/{id}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/global_rules/{id}</td><td>{...}</td><td>Create resource by ID</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/global_rules/{id}</td><td>NULL</td><td>Remove resource</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/global_rules/{id}</td><td>{...}</td><td>Standard PATCH. Update some attributes of the existing global rule, and other attributes not involved will remain as they are; if you want to delete an attribute, set the value of the attribute Set to null to delete; especially, when the value of the attribute is an array, the attribute will be updated in full</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/global_rules/{id}/{path}</td><td>{...}</td><td>SubPath PATCH, specify the attribute of global rule to be updated through {path}, update the value of this attribute in full, and other attributes that are not involved will remain as they are.</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Parameter</th><th>Required</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>plugins</td><td>True</td><td>See <a href="/apisix/architecture-design#plugin">Plugin</a></td><td></td></tr>
-<tr><td>create_time</td><td>False</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>update_time</td><td>False</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-</tbody>
-</table>
-<h2><a class="anchor" aria-hidden="true" id="plugin-metadata"></a><a href="#plugin-metadata" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<p><em>API</em>:/apisix/admin/plugin_metadata/{plugin_name}</p>
-<p><em>Description</em>: plugin metadata.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/plugin_metadata/{plugin_name}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/plugin_metadata/{plugin_name}</td><td>{...}</td><td>Create resource by plugin name</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/plugin_metadata/{plugin_name}</td><td>NULL</td><td>Remove resource</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<p>A json object with a data structure defined according to <code>metadata_schema</code> of the plugin ({plugin_name}).</p>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/example-plugin  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -i -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "skey": "val",
-    "ikey": 1
-}'
-HTTP/1.1 201 Created
-Date: Thu, 26 Dec 2019 04:19:34 GMT
-Content-Type: text/plain
-</code></pre>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-<h2><a class="anchor" aria-hidden="true" id="plugin"></a><a href="#plugin" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p><em>API</em>:/apisix/admin/plugins/{plugin_name}</p>
-<p><em>Description</em>: plugin</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/plugins/list</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/plugins/{plugin_name}</td><td>NULL</td><td>Fetch resource</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<p>Get the plugin ({plugin_name}) of the data structure.</p>
-<p>Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl <span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/plugins/list"</span> -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span></span>
-["zipkin","request-id",...]
-<span class="hljs-meta">
-$</span><span class="bash"> curl <span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/plugins/key-auth"</span> -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span></span>
-{"properties":{"disable":{"type":"boolean"}},"additionalProperties":false,"type":"object"}
-</code></pre>
-<p><em>API</em>:/apisix/admin/plugins?all=true</p>
-<p><em>Description</em>: all the attributes of all plugins, each plugin includes <code>name</code>, <code>priority</code>, <code>type</code>, <code>schema</code>, <code>consumer_schema</code> and <code>version</code>.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/plugins?all=true</td><td>NULL</td><td>Fetch resource</td></tr>
-</tbody>
-</table>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#route">Route</a></li><li><a href="#service">Service</a></li><li><a href="#consumer">Consumer</a></li><li><a href="#upstream">Upstream</a></li><li><a href="#ssl">SSL</a></li><li><a href="#global-rule">Global Rule</a></li><li><a href="#plugin-metadata">Plugin Metadata</a></li><li><a href="#plugin">Plugin</a></li></ul></nav></div><footer class="nav-footer"  [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/admin-api/index.html b/apisix/admin-api/index.html
deleted file mode 100644
index fda97a9..0000000
--- a/apisix/admin-api/index.html
+++ /dev/null
@@ -1,830 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/admin-api · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/admin-api · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" cont [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="table-of-contents"></a><a href="#table-of-contents" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<ul>
-<li><a href="#route">Route</a></li>
-<li><a href="#service">Service</a></li>
-<li><a href="#consumer">Consumer</a></li>
-<li><a href="#upstream">Upstream</a></li>
-<li><a href="#ssl">SSL</a></li>
-<li><a href="#global-rule">Global Rule</a></li>
-<li><a href="#plugin-metadata">Plugin Metadata</a></li>
-<li><a href="#plugin">Plugin</a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="route"></a><a href="#route" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p><em>API</em>:/apisix/admin/routes/{id}?ttl=0</p>
-<p><em>Description</em>:Route matches requests based on preset rules, and loads the appropriate plugin according to the matching result, then forwarding requests to target Upstream.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/routes</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/routes/{id}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/routes/{id}</td><td>{...}</td><td>Create resource by ID</td></tr>
-<tr><td>POST</td><td>/apisix/admin/routes</td><td>{...}</td><td>Create resource, and ID is generated by server</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/routes/{id}</td><td>NULL</td><td>Remove resource</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/routes/{id}</td><td>{...}</td><td>Standard PATCH. Update some attributes of the existing Route, and other attributes not involved will remain as they are; if you want to delete an attribute, set the value of the attribute Set to null to delete; especially, when the value of the attribute is an array, the attribute will be updated in full</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/routes/{id}/{path}</td><td>{...}</td><td>SubPath PATCH, specify the attribute of Route to be updated through {path}, update the value of this attribute in full, and other attributes that are not involved will remain as they are. The difference between the two PATCH can refer to the following examples</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>URI Request Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>parameter</th><th>Required</th><th>Type</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>ttl</td><td>False</td><td>Auxiliary</td><td>Expires after target seconds</td><td>ttl=1</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Parameter</th><th>Required</th><th>Type</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>name</td><td>False</td><td>Auxiliary</td><td>Identifies route names.</td><td>customer-xxxx</td></tr>
-<tr><td>desc</td><td>False</td><td>Auxiliary</td><td>route description, usage scenarios, and more.</td><td>customer xxxx</td></tr>
-<tr><td>uri</td><td>True, can't be used with <code>uris</code></td><td>Match Rules</td><td>In addition to full matching such as <code>/foo/bar</code>、<code>/foo/gloo</code>, using different <a href="/apisix/architecture-design#router">Router</a> allows more advanced matching, see <a href="/apisix/architecture-design#router">Router</a> for more.</td><td>&quot;/hello&quot;</td></tr>
-<tr><td>uris</td><td>True, can't be used with <code>uri</code></td><td>Match Rules</td><td>The <code>uri</code> in the form of a non-empty list means that multiple different uris are allowed, and match any one of them.</td><td>[&quot;/hello&quot;, &quot;/word&quot;]</td></tr>
-<tr><td>host</td><td>False, can't be used with <code>hosts</code></td><td>Match Rules</td><td>Currently requesting a domain name, such as <code>foo.com</code>; PAN domain names such as <code>*.foo.com</code> are also supported.</td><td>&quot;foo.com&quot;</td></tr>
-<tr><td>hosts</td><td>False, can't be used with <code>host</code></td><td>Match Rules</td><td>The <code>host</code> in the form of a non-empty list means that multiple different hosts are allowed, and match any one of them.</td><td>{&quot;foo.com&quot;, &quot;*.bar.com&quot;}</td></tr>
-<tr><td>remote_addr</td><td>False, can't be used with <code>remote_addrs</code></td><td>Match Rules</td><td>The client requests an IP address: <code>192.168.1.101</code>, <code>192.168.1.102</code>, and CIDR format support <code>192.168.1.0/24</code>. In particular, APISIX also fully supports IPv6 address matching: <code>::1</code>, <code>fe80::1</code>, <code>fe80::1/64</code>, etc.</td><td>&quot;192.168.1.0/24&quot;</td></tr>
-<tr><td>remote_addrs</td><td>False, can't be used with <code>remote_addr</code></td><td>Match Rules</td><td>The <code>remote_addr</code> in the form of a non-empty list indicates that multiple different IP addresses are allowed, and match any one of them.</td><td>{&quot;127.0.0.1&quot;, &quot;192.0.0.0/8&quot;, &quot;::1&quot;}</td></tr>
-<tr><td>methods</td><td>False</td><td>Match Rules</td><td>If empty or without this option, there are no <code>method</code> restrictions, and it can be a combination of one or more: <code>GET</code>,<code>POST</code>,<code>PUT</code>,<code>DELETE</code>,<code>PATCH</code>, <code>HEAD</code>,<code>OPTIONS</code>,<code>CONNECT</code>,<code>TRACE</code>.</td><td>{&quot;GET&quot;, &quot;POST&quot;}</td></tr>
-<tr><td>priority</td><td>False</td><td>Match Rules</td><td>If different routes contain the same <code>uri</code>, determine which route is matched first based on the attribute <code>priority</code>. Larger value means higher priority. The default value is 0.</td><td>priority = 10</td></tr>
-<tr><td>vars</td><td>False</td><td>Match Rules</td><td>A list of one or more <code>{var, operator, val}</code> elements, like this: <code>{{var, operator, val}, {var, operator, val}, ...}}</code>. For example: <code>{&quot;arg_name&quot;, &quot;==&quot;, &quot;json&quot;}</code> means that the current request parameter <code>name</code> is <code>json</code>. The <code>var</code> here is consistent with the internal variable name of Nginx, so you can also use <code>request_uri</code>, <co [...]
-<tr><td>filter_func</td><td>False</td><td>Match Rules</td><td>User-defined filtering function. You can use it to achieve matching requirements for special scenarios. This function accepts an input parameter named <code>vars</code> by default, which you can use to get Nginx variables.</td><td>function(vars) return vars[&quot;arg_name&quot;] == &quot;json&quot; end</td></tr>
-<tr><td>plugins</td><td>False</td><td>Plugin</td><td>See <a href="/apisix/architecture-design#plugin">Plugin</a> for more</td><td></td></tr>
-<tr><td>script</td><td>False</td><td>Script</td><td>See <a href="/apisix/architecture-design#script">Script</a> for more</td><td></td></tr>
-<tr><td>upstream</td><td>False</td><td>Upstream</td><td>Enabled Upstream configuration, see <a href="/apisix/architecture-design#upstream">Upstream</a> for more</td><td></td></tr>
-<tr><td>upstream_id</td><td>False</td><td>Upstream</td><td>Enabled upstream id, see <a href="/apisix/architecture-design#upstream">Upstream</a> for more</td><td></td></tr>
-<tr><td>service_id</td><td>False</td><td>Service</td><td>Binded Service configuration, see <a href="/apisix/architecture-design#service">Service</a> for more</td><td></td></tr>
-<tr><td>service_protocol</td><td>False</td><td>Upstream protocol type</td><td>only <code>grpc</code></td><td>Must set <code>grpc</code> if using <code>gRPC proxy</code> or <code>gRPC transcode</code>.</td></tr>
-<tr><td>labels</td><td>False</td><td>Match Rules</td><td>Key/value pairs to specify attributes</td><td>{&quot;version&quot;:&quot;v2&quot;,&quot;build&quot;:&quot;16&quot;,&quot;env&quot;:&quot;production&quot;}</td></tr>
-<tr><td>enable_websocket</td><td>False</td><td>Auxiliary</td><td>enable <code>websocket</code>(boolean), default <code>false</code>.</td><td></td></tr>
-<tr><td>status</td><td>False</td><td>Auxiliary</td><td>enable this route, default <code>1</code>.</td><td><code>1</code> to enable, <code>0</code> to disable</td></tr>
-<tr><td>create_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>update_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-</tbody>
-</table>
-<p>For the same type of parameters, such as <code>host</code> and <code>hosts</code>, <code>remote_addr</code> and <code>remote_addrs</code> cannot exist at the same time, only one of them can be selected. If enabled at the same time, the API will response an error.</p>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell">{
-    "id": "1",                  # id, unnecessary.
-    "uris": ["/a","/b"],        # A set of uri.
-    "methods": ["GET","POST"],  # Can fill multiple methods
-    "hosts": ["a.com","b.com"], # A set of host.
-    "plugins": {},              # Bound plugin
-    "priority": 0,              # If different routes contain the same `uri`, determine which route is matched first based on the attribute` priority`, the default value is 0.
-    "name": "route-xxx",
-    "desc": "hello world",
-    "remote_addrs": ["127.0.0.1"], # A set of Client IP.
-    "vars": [],                 # A list of one or more `{var, operator, val}` elements
-    "upstream_id": "1",         # upstream id, recommended
-    "upstream": {},             # upstream, not recommended
-    "filter_func": "",          # User-defined filtering function
-}
-</code></pre>
-<p>Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> Create a route</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/index.html",
-    "hosts": ["foo.com", "*.bar.com"],
-    "remote_addrs": ["127.0.0.0/8"],
-    "methods": ["PUT", "GET"],
-    "enable_websocket": true,
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-
-HTTP/1.1 201 Created
-Date: Sat, 31 Aug 2019 01:17:15 GMT
-...
-<span class="hljs-meta">
-#</span><span class="bash"><span class="hljs-string"> Create a route expires after 60 seconds, then it'</span>s deleted automatically</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/2?ttl=60 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/aa/index.html",
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-
-HTTP/1.1 201 Created
-Date: Sat, 31 Aug 2019 01:17:15 GMT
-...
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Add an upstream node to the Route</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.216:80": 1
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 1
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Update the weight of an upstream node to the Route</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.216:80": 10
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Delete an upstream node for the Route</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.215:80": null
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Replace methods of the Route  --  array</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'{</span></span>
-    "methods": ["GET", "POST"]
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, methods will not retain the original data, and the entire update is:
-["GET", "POST"]
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Replace upstream nodes of the Route -- sub path</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/1/upstream/nodes -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "39.97.63.200:80": 1
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, nodes will not retain the original data, and the entire update is:
-{
-    "39.97.63.200:80": 1
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Replace methods of the Route -- sub path</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1/methods -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d<span class="hljs-string">'["POST", "DELETE", " PATCH"]'</span></span>
-HTTP/1.1 200 OK
-...
-
-After successful execution, methods will not retain the original data, and the entire update is:
-["POST", "DELETE", "PATCH"]
-<span class="hljs-meta">
-
-#</span><span class="bash"> <span class="hljs-built_in">disable</span> route</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "status": 0
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, status nodes will be updated to:
-{
-    "status": 0
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> enable route</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H '</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "status": 1
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, status nodes will be updated to:
-{
-    "status": 1
-}
-
-
-</code></pre>
-<blockquote>
-<p>Response Parameters</p>
-</blockquote>
-<p>Return response from etcd currently.</p>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-<h2><a class="anchor" aria-hidden="true" id="service"></a><a href="#service" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p><em>API</em>:/apisix/admin/services/{id}</p>
-<p><em>Description</em>:A <code>Service</code> is an abstraction of an API (which can also be understood as a set of Route abstractions). It usually corresponds to the upstream service abstraction. Between <code>Route</code> and <code>Service</code>, usually the relationship of N:1.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/services</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/services/{id}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/services/{id}</td><td>{...}</td><td>Create resource by ID</td></tr>
-<tr><td>POST</td><td>/apisix/admin/services</td><td>{...}</td><td>Create resource, and ID is generated by server</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/services/{id}</td><td>NULL</td><td>Remove resource</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/services/{id}</td><td>{...}</td><td>Standard PATCH. Update some attributes of the existing Service, and other attributes not involved will remain as they are; if you want to delete an attribute, set the value of the attribute Set to null to delete; especially, when the value of the attribute is an array, the attribute will be updated in full</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/services/{id}/{path}</td><td>{...}</td><td>SubPath PATCH, specify the attribute of Service to be updated through {path}, update the value of this attribute in full, and other attributes that are not involved will remain as they are. The difference between the two PATCH can refer to the following examples</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Parameter</th><th>Required</th><th>Type</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>plugins</td><td>False</td><td>Plugin</td><td>See <a href="/apisix/architecture-design#plugin">Plugin</a> for more</td><td></td></tr>
-<tr><td>upstream</td><td>False</td><td>Upstream</td><td>Enabled Upstream configuration, see <a href="/apisix/architecture-design#upstream">Upstream</a> for more</td><td></td></tr>
-<tr><td>upstream_id</td><td>False</td><td>Upstream</td><td>Enabled upstream id, see <a href="/apisix/architecture-design#upstream">Upstream</a> for more</td><td></td></tr>
-<tr><td>name</td><td>False</td><td>Auxiliary</td><td>Identifies service names.</td><td>customer-xxxx</td></tr>
-<tr><td>desc</td><td>False</td><td>Auxiliary</td><td>service usage scenarios, and more.</td><td>customer xxxx</td></tr>
-<tr><td>labels</td><td>False</td><td>Match Rules</td><td>Key/value pairs to specify attributes</td><td>{&quot;version&quot;:&quot;v2&quot;,&quot;build&quot;:&quot;16&quot;,&quot;env&quot;:&quot;production&quot;}</td></tr>
-<tr><td>enable_websocket</td><td>False</td><td>Auxiliary</td><td>enable <code>websocket</code>(boolean), default <code>false</code>.</td><td></td></tr>
-<tr><td>create_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>update_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-</tbody>
-</table>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell">{
-    "id": "1",          # id
-    "plugins": {},      # Bound plugin
-    "upstream_id": "1", # upstream id, recommended
-    "upstream": {},     # upstream, not recommended
-    "name": "service-test",
-    "desc": "hello world",
-    "enable_websocket": true,
-}
-</code></pre>
-<p>Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/services/201  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    },
-    "enable_websocket": true,
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-
-HTTP/1.1 201 Created
-...
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Add an upstream node to the Service</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/services/201 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.216:80": 1
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 1
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Update the weight of an upstream node to the Service</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/services/201 -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.216:80": 10
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Delete an upstream node for the Service</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/services/201 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "upstream": {
-        "nodes": {
-            "39.97.63.215:80": null
-        }
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will be updated to:
-{
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Replace upstream nodes of the Service</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/services/201/upstream/nodes -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "39.97.63.200:80": 1
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, upstream nodes will not retain the original data, and the entire update is:
-{
-    "39.97.63.200:80": 1
-}
-
-</code></pre>
-<blockquote>
-<p>Response Parameters</p>
-</blockquote>
-<p>Return response from etcd currently.</p>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-<h2><a class="anchor" aria-hidden="true" id="consumer"></a><a href="#consumer" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p><em>API</em>:/apisix/admin/consumers/{username}</p>
-<p><em>Description</em>:Consumers are consumers of certain types of services and can only be used in conjunction with a user authentication system. Consumer regards the <code>username</code> property as the identity, so only the HTTP <code>PUT</code> method is supported for creating a new consumer.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/consumers</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/consumers/{username}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/consumers</td><td>{...}</td><td>Create resource by username</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/consumers/{username}</td><td>NULL</td><td>Remove resource</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Parameter</th><th>Required</th><th>Type</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>username</td><td>True</td><td>Name</td><td>Consumer name</td><td></td></tr>
-<tr><td>plugins</td><td>False</td><td>Plugin</td><td>See <a href="/apisix/architecture-design#plugin">Plugin</a> for more</td><td></td></tr>
-<tr><td>desc</td><td>False</td><td>Auxiliary</td><td>Identifies route names, usage scenarios, and more.</td><td>customer xxxx</td></tr>
-<tr><td>labels</td><td>False</td><td>Match Rules</td><td>Key/value pairs to specify attributes</td><td>{&quot;version&quot;:&quot;v2&quot;,&quot;build&quot;:&quot;16&quot;,&quot;env&quot;:&quot;production&quot;}</td></tr>
-<tr><td>create_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>update_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-</tbody>
-</table>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell">{
-    "plugins": {},          # Bound plugin
-    "username": "name",     # Consumer name
-    "desc": "hello world",  # Consumer desc
-}
-</code></pre>
-<p>The binding authentication plug-in is a bit special. When it needs to be used in conjunction with the consumer, it needs to provide user name, password and other information; on the other hand, when it is bound with route / service, it does not require any parameters. Because at this time, it is based on the user request data to infer which consumer the user corresponds to.</p>
-<p>Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/consumers  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "username": "jack",
-    "plugins": {
-        "key-auth": {
-            "key": "auth-one"
-        },
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    }
-}'
-HTTP/1.1 200 OK
-Date: Thu, 26 Dec 2019 08:17:49 GMT
-...
-
-{"node":{"value":{"username":"jack","plugins":{"key-auth":{"key":"auth-one"},"limit-count":{"time_window":60,"count":2,"rejected_code":503,"key":"remote_addr","policy":"local"}}},"createdIndex":64,"key":"\/apisix\/consumers\/jack","modifiedIndex":64},"prevNode":{"value":"{\"username\":\"jack\",\"plugins\":{\"key-auth\":{\"key\":\"auth-one\"},\"limit-count\":{\"time_window\":60,\"count\":2,\"rejected_code\":503,\"key\":\"remote_addr\",\"policy\":\"local\"}}}","createdIndex":63,"key":"\/ap [...]
-</code></pre>
-<p>Since <code>v2.2</code>, we can bind multiple authentication plugins to the same consumer.</p>
-<blockquote>
-<p>Response Parameters</p>
-</blockquote>
-<p>Return response from etcd currently.</p>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-<h2><a class="anchor" aria-hidden="true" id="upstream"></a><a href="#upstream" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p><em>API</em>:/apisix/admin/upstreams/{id}</p>
-<p><em>Description</em>:Upstream configuration can be directly bound to the specified <code>Route</code> or it can be bound to <code>Service</code>, but the configuration in <code>Route</code> has a higher priority. The priority behavior here is very similar to <code>Plugin</code>.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/upstreams</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/upstreams/{id}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/upstreams/{id}</td><td>{...}</td><td>Create resource by ID</td></tr>
-<tr><td>POST</td><td>/apisix/admin/upstreams</td><td>{...}</td><td>Create resource, and ID is generated by server</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/upstreams/{id}</td><td>NULL</td><td>Remove resource</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/upstreams/{id}</td><td>{...}</td><td>Standard PATCH. Update some attributes of the existing Upstream, and other attributes not involved will remain as they are; if you want to delete an attribute, set the value of the attribute Set to null to delete; especially, when the value of the attribute is an array, the attribute will be updated in full</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/upstreams/{id}/{path}</td><td>{...}</td><td>SubPath PATCH, specify the attribute of Upstream to be updated through {path}, update the value of this attribute in full, and other attributes that are not involved will remain as they are. The difference between the two PATCH can refer to the following example</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<p>In addition to the basic complex equalization algorithm selection, APISIX's Upstream also supports logic for upstream passive health check and retry, see the table below.</p>
-<table>
-<thead>
-<tr><th>Name</th><th>Optional</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>type</td><td>required</td><td>the balancer algorithm</td></tr>
-<tr><td>nodes</td><td>required, can't be used with <code>service_name</code></td><td>Hash table, the key of the internal element is the upstream machine address list, the format is <code>Address + Port</code>, where the address part can be IP or domain name, such as <code>192.168.1.100:80</code>, <code>foo.com:80</code>, etc. Value is the weight of the node. In particular, when the weight value is <code>0</code>, it has a special meaning, which usually means that the upstream node is inv [...]
-<tr><td>service_name</td><td>required, can't be used with <code>nodes</code></td><td>the name of service used in the service discovery, see <a href="/apisix/discovery">discovery</a> for more details</td></tr>
-<tr><td>discovery_type</td><td>required, if <code>server_name</code> is used</td><td>the type of service discovery, see <a href="/apisix/discovery">discovery</a> for more details</td></tr>
-<tr><td>hash_on</td><td>optional</td><td>This option is only valid if the <code>type</code> is <code>chash</code>. Supported types <code>vars</code>(Nginx variables), <code>header</code>(custom header), <code>cookie</code>, <code>consumer</code>, the default value is <code>vars</code>.</td></tr>
-<tr><td>key</td><td>optional</td><td>This option is only valid if the <code>type</code> is <code>chash</code>. Find the corresponding node <code>id</code> according to <code>hash_on</code> and <code>key</code>. When <code>hash_on</code> is set as <code>vars</code>, <code>key</code> is the required parameter, for now, it support nginx built-in variables like <code>uri, server_name, server_addr, request_uri, remote_port, remote_addr, query_string, host, hostname, arg_***</code>, <code>arg_ [...]
-<tr><td>checks</td><td>optional</td><td>Configure the parameters of the health check. For details, refer to <a href="/apisix/health-check">health-check</a>.</td></tr>
-<tr><td>retries</td><td>optional</td><td>Pass the request to the next upstream using the underlying Nginx retry mechanism, the retry mechanism is enabled by default and set the number of retries according to the number of available backend nodes. If <code>retries</code> option is explicitly set, it will override the default value. <code>0</code> means disable retry mechanism.</td></tr>
-<tr><td>timeout</td><td>optional</td><td>Set the timeout for connection, sending and receiving messages.</td></tr>
-<tr><td>name</td><td>optional</td><td>Identifies upstream names</td></tr>
-<tr><td>desc</td><td>optional</td><td>upstream usage scenarios, and more.</td></tr>
-<tr><td>pass_host</td><td>optional</td><td><code>pass</code> pass the client request host, <code>node</code> not pass the client request host, using the upstream node host, <code>rewrite</code> rewrite host by the configured <code>upstream_host</code>.</td></tr>
-<tr><td>upstream_host</td><td>optional</td><td>This option is only valid if the <code>pass_host</code> is <code>rewrite</code>.</td></tr>
-<tr><td>labels</td><td>optional</td><td>Key/value pairs to specify attributes</td><td>{&quot;version&quot;:&quot;v2&quot;,&quot;build&quot;:&quot;16&quot;,&quot;env&quot;:&quot;production&quot;}</td></tr>
-<tr><td>create_time</td><td>optional</td><td>epoch timestamp in second, like <code>1602883670</code>, will be created automatically if missing</td></tr>
-<tr><td>update_time</td><td>optional</td><td>epoch timestamp in second, like <code>1602883670</code>, will be created automatically if missing</td></tr>
-</tbody>
-</table>
-<p><code>type</code> can be one of:</p>
-<ul>
-<li><code>roundrobin</code>: roundrobin with weight</li>
-<li><code>chash</code>: consistent hash</li>
-<li><code>ewma</code>: pick one of node which has minimum latency. See <a href="https://en.wikipedia.org/wiki/EWMA_chart">https://en.wikipedia.org/wiki/EWMA_chart</a> for details.</li>
-<li><code>least_conn</code>: pick node which has the lowest <code>(active_conn + 1) / weight</code>. Note the <code>active connection</code> concept is the same with Nginx: it is a connection in used by a request.</li>
-</ul>
-<p><code>hash_on</code> can be set to different types:</p>
-<ol>
-<li>when it is <code>vars</code>, the <code>key</code> is required. The <code>key</code> can be any <a href="http://nginx.org/en/docs/varindex.html">Nginx builtin variables</a>, without the prefix '$'.</li>
-<li>when it is <code>header</code>, the <code>key</code> is required. It is equal to &quot;http_<code>key</code>&quot;.</li>
-<li>when it is <code>cookie</code>, the <code>key</code> is required. It is equal to &quot;cookie_<code>key</code>&quot;.</li>
-<li>when it is <code>consumer</code>, the <code>key</code> is optional. The key is the <code>consumer_name</code> set by authentication plugin.</li>
-<li>when it is <code>vars_combinations</code>, the <code>key</code> is required. The <code>key</code> can be any <a href="http://nginx.org/en/docs/varindex.html">Nginx builtin variables</a> combinations, such as <code>$request_uri$remote_addr</code>.</li>
-<li>If there is no value for either <code>hash_on</code> or <code>key</code>, <code>remote_addr</code> will be used as key.</li>
-</ol>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell">{
-    "id": "1",                  # id
-    "retries": 1,               # retry times
-    "timeout": {                # Set the timeout for connection, sending and receiving messages.
-        "connect":15,
-        "send":15,
-        "read":15,
-    },
-    "nodes": {"host:80": 100},  # Upstream machine address list, the format is `Address + Port`
-    "type":"roundrobin",
-    "checks": {},               # Health check parameters
-    "hash_on": "",
-    "key": "",
-    "name": "upstream-for-test",
-    "desc": "hello world",
-}
-</code></pre>
-<p>Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/upstreams/100  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -i -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "type":"roundrobin",
-    "nodes":{
-        "127.0.0.1:80":1,
-        "127.0.0.2:80":2,
-        "foo.com:80":3
-    }
-}'
-HTTP/1.1 201 Created
-Date: Thu, 26 Dec 2019 04:19:34 GMT
-Content-Type: text/plain
-...
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Add a node to the Upstream</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/upstreams/100 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "nodes": {
-        "39.97.63.216:80": 1
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 1
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Update the weight of a node to the Upstream</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/upstreams/100 -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "nodes": {
-        "39.97.63.216:80": 10
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, nodes will be updated to:
-{
-    "39.97.63.215:80": 1,
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"><span class="hljs-string"> Delete a node for the Upstream</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/upstreams/100 -H'</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PATCH -i -d '</span></span>
-{
-    "nodes": {
-        "39.97.63.215:80": null
-    }
-}'
-HTTP/1.1 200 OK
-...
-
-After successful execution, nodes will be updated to:
-{
-    "39.97.63.216:80": 10
-}
-<span class="hljs-meta">
-
-#</span><span class="bash"> Replace the nodes of the Upstream</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/upstreams/100/nodes -H<span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PATCH -i -d <span class="hljs-string">'</span></span>
-{
-    "39.97.63.200:80": 1
-}'
-HTTP/1.1 200 OK
-...
-
-After the execution is successful, nodes will not retain the original data, and the entire update is:
-{
-    "39.97.63.200:80": 1
-}
-
-</code></pre>
-<blockquote>
-<p>Response Parameters</p>
-</blockquote>
-<p>Return response from etcd currently.</p>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-<h2><a class="anchor" aria-hidden="true" id="ssl"></a><a href="#ssl" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
-<p><em>API</em>:/apisix/admin/ssl/{id}</p>
-<p><em>Description</em>:SSL.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/ssl</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/ssl/{id}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/ssl/{id}</td><td>{...}</td><td>Create resource by ID</td></tr>
-<tr><td>POST</td><td>/apisix/admin/ssl</td><td>{...}</td><td>Create resource, and ID is generated by server</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/ssl/{id}</td><td>NULL</td><td>Remove resource</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Parameter</th><th>Required</th><th>Type</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>cert</td><td>True</td><td>Certificate</td><td>https certificate</td><td></td></tr>
-<tr><td>key</td><td>True</td><td>Private key</td><td>https private key</td><td></td></tr>
-<tr><td>certs</td><td>False</td><td>An array of certificate</td><td>when you need to configure multiple certificate for the same domain, you can pass extra https certificates (excluding the one given as cert) in this field</td><td></td></tr>
-<tr><td>keys</td><td>False</td><td>An array of private key</td><td>https private keys. The keys should be paired with certs above</td><td></td></tr>
-<tr><td>snis</td><td>True</td><td>Match Rules</td><td>a non-empty arrays of https SNI</td><td></td></tr>
-<tr><td>labels</td><td>False</td><td>Match Rules</td><td>Key/value pairs to specify attributes</td><td>{&quot;version&quot;:&quot;v2&quot;,&quot;build&quot;:&quot;16&quot;,&quot;env&quot;:&quot;production&quot;}</td></tr>
-<tr><td>create_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>update_time</td><td>False</td><td>Auxiliary</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>status</td><td>False</td><td>Auxiliary</td><td>enable this SSL, default <code>1</code>.</td><td><code>1</code> to enable, <code>0</code> to disable</td></tr>
-</tbody>
-</table>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell">{
-    "id": "1",      # id
-    "cert": "cert", # Certificate
-    "key": "key",   # Private key
-    "snis": ["t.com"]    # https SNI
-}
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="global-rule"></a><a href="#global-rule" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p><em>API</em>:/apisix/admin/global_rules/{id}</p>
-<p><em>Description</em>: Set plugins which run globally. Those plugins will be run before any Route/Service level plugins.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/global_rules</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/global_rules/{id}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/global_rules/{id}</td><td>{...}</td><td>Create resource by ID</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/global_rules/{id}</td><td>NULL</td><td>Remove resource</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/global_rules/{id}</td><td>{...}</td><td>Standard PATCH. Update some attributes of the existing global rule, and other attributes not involved will remain as they are; if you want to delete an attribute, set the value of the attribute Set to null to delete; especially, when the value of the attribute is an array, the attribute will be updated in full</td></tr>
-<tr><td>PATCH</td><td>/apisix/admin/global_rules/{id}/{path}</td><td>{...}</td><td>SubPath PATCH, specify the attribute of global rule to be updated through {path}, update the value of this attribute in full, and other attributes that are not involved will remain as they are.</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Parameter</th><th>Required</th><th>Description</th><th>Example</th></tr>
-</thead>
-<tbody>
-<tr><td>plugins</td><td>True</td><td>See <a href="/apisix/architecture-design#plugin">Plugin</a></td><td></td></tr>
-<tr><td>create_time</td><td>False</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-<tr><td>update_time</td><td>False</td><td>epoch timestamp in second, will be created automatically if missing</td><td>1602883670</td></tr>
-</tbody>
-</table>
-<h2><a class="anchor" aria-hidden="true" id="plugin-metadata"></a><a href="#plugin-metadata" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<p><em>API</em>:/apisix/admin/plugin_metadata/{plugin_name}</p>
-<p><em>Description</em>: plugin metadata.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/plugin_metadata/{plugin_name}</td><td>NULL</td><td>Fetch resource</td></tr>
-<tr><td>PUT</td><td>/apisix/admin/plugin_metadata/{plugin_name}</td><td>{...}</td><td>Create resource by plugin name</td></tr>
-<tr><td>DELETE</td><td>/apisix/admin/plugin_metadata/{plugin_name}</td><td>NULL</td><td>Remove resource</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<p>A json object with a data structure defined according to <code>metadata_schema</code> of the plugin ({plugin_name}).</p>
-<p>Config Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/example-plugin  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -i -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "skey": "val",
-    "ikey": 1
-}'
-HTTP/1.1 201 Created
-Date: Thu, 26 Dec 2019 04:19:34 GMT
-Content-Type: text/plain
-</code></pre>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-<h2><a class="anchor" aria-hidden="true" id="plugin"></a><a href="#plugin" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p><em>API</em>:/apisix/admin/plugins/{plugin_name}</p>
-<p><em>Description</em>: plugin</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/plugins/list</td><td>NULL</td><td>Fetch resource list</td></tr>
-<tr><td>GET</td><td>/apisix/admin/plugins/{plugin_name}</td><td>NULL</td><td>Fetch resource</td></tr>
-</tbody>
-</table>
-<blockquote>
-<p>Request Body Parameters:</p>
-</blockquote>
-<p>Get the plugin ({plugin_name}) of the data structure.</p>
-<p>Example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl <span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/plugins/list"</span> -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span></span>
-["zipkin","request-id",...]
-<span class="hljs-meta">
-$</span><span class="bash"> curl <span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/plugins/key-auth"</span> -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span></span>
-{"properties":{"disable":{"type":"boolean"}},"additionalProperties":false,"type":"object"}
-</code></pre>
-<p><em>API</em>:/apisix/admin/plugins?all=true</p>
-<p><em>Description</em>: all the attributes of all plugins, each plugin includes <code>name</code>, <code>priority</code>, <code>type</code>, <code>schema</code>, <code>consumer_schema</code> and <code>version</code>.</p>
-<blockquote>
-<p>Request Methods:</p>
-</blockquote>
-<table>
-<thead>
-<tr><th>Method</th><th>Request URI</th><th>Request Body</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>GET</td><td>/apisix/admin/plugins?all=true</td><td>NULL</td><td>Fetch resource</td></tr>
-</tbody>
-</table>
-<p><a href="#Table-of-Contents">Back to TOC</a></p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#route">Route</a></li><li><a href="#service">Service</a></li><li><a href="#consumer">Consumer</a></li><li><a href="#upstream">Upstream</a></li><li><a href="#ssl">SSL</a></li><li><a href="#global-rule">Global Rule</a></li><li><a href="#plugin-metadata">Plugin Metadata</a></li><li><a href="#plugin">Plugin</a></li></ul></nav></div><footer class="nav-footer"  [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/architecture-design.html b/apisix/architecture-design.html
deleted file mode 100644
index 2a45df7..0000000
--- a/apisix/architecture-design.html
+++ /dev/null
@@ -1,559 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/architecture-design · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/architecture-design · Apache APISIX™"/><meta property="og:type" content="website"/><meta pr [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/architecture-design">Chinese</a></p>
-<h2><a class="anchor" aria-hidden="true" id="table-of-contents"></a><a href="#table-of-contents" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<ul>
-<li><a href="#apisix"><strong>APISIX</strong></a></li>
-<li><a href="#apisix-config"><strong>APISIX Config</strong></a></li>
-<li><a href="#route"><strong>Route</strong></a></li>
-<li><a href="#service"><strong>Service</strong></a></li>
-<li><a href="#plugin"><strong>Plugin</strong></a></li>
-<li><a href="#script"><strong>Script</strong></a></li>
-<li><a href="#upstream"><strong>Upstream</strong></a></li>
-<li><a href="#router"><strong>Router</strong></a></li>
-<li><a href="#consumer-1"><strong>Consumer</strong></a></li>
-<li><a href="#global-rule"><strong>Global Rule</strong></a></li>
-<li><a href="#debug-mode"><strong>Debug mode</strong></a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="apisix"></a><a href="#apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<h3><a class="anchor" aria-hidden="true" id="plugin-loading-process"></a><a href="#plugin-loading-process" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
-<p><img src="https://apisix.apache.org/images/flow-load-plugin.png" alt="flow-load-plugin"></p>
-<h3><a class="anchor" aria-hidden="true" id="plugin-hierarchy-structure"></a><a href="#plugin-hierarchy-structure" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
-<p><img src="https://apisix.apache.org/images/flow-plugin-internal.png" width="50%" height="50%"></p>
-<h2><a class="anchor" aria-hidden="true" id="apisix-config"></a><a href="#apisix-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>For example, set the default listening port of APISIX to 8000, and keep other configurations as default. The configuration in <code>conf/config.yaml</code> should be like this:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">apisix:</span>
-  <span class="hljs-attr">node_listen:</span> <span class="hljs-number">8000</span>             <span class="hljs-comment"># APISIX listening port</span>
-</code></pre>
-<p>Set the default listening port of APISIX to 8000, set the <code>etcd</code> address to <code>http://foo:2379</code>,
-and keep other configurations as default. The configuration in <code>conf/config.yaml</code> should be like this:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">apisix:</span>
-  <span class="hljs-attr">node_listen:</span> <span class="hljs-number">8000</span>             <span class="hljs-comment"># APISIX listening port</span>
-
-<span class="hljs-attr">etcd:</span>
-  <span class="hljs-attr">host:</span> <span class="hljs-string">"http://foo:2379"</span>       <span class="hljs-comment"># etcd address</span>
-</code></pre>
-<p>Other default configurations can be found in the <code>conf/config-default.yaml</code> file, which is bound to the APISIX source code. <strong>Never</strong> manually modify the <code>conf/config-default.yaml</code> file. If you need to customize any configuration, you should update the <code>conf/config.yaml</code> file.</p>
-<p><strong>Note</strong> <code>APISIX</code> will generate <code>conf/nginx.conf</code> file automatically, so please <em>DO NOT EDIT</em> <code>conf/nginx.conf</code> file too.</p>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="route"></a><a href="#route" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>The route matches the client's request by defining rules, then loads and executes the corresponding plugin based on the matching result, and forwards the request to the specified Upstream.</p>
-<p>The route mainly consists of three parts: matching rules (e.g uri, host, remote_addr, etc.), plugin configuration (current-limit &amp; rate-limit, etc.) and upstream information.</p>
-<p>The following image shows an example of some Route rules. When some attribute values are the same, the figure is identified by the same color.</p>
-<p><img src="https://apisix.apache.org/images/routes-example.png" width="50%" height="50%"></p>
-<p>We configure all the parameters directly in the Route, it's easy to set up, and each Route has a relatively high degree of freedom. But when our Route has more repetitive configurations (such as enabling the same plugin configuration or upstream information), once we need update these same properties, we have to traverse all the Routes and modify them, so it adding a lot of complexity of management and maintenance.</p>
-<p>The shortcomings mentioned above are independently abstracted in APISIX by the two concepts <a href="#service">Service</a> and <a href="#upstream">Upstream</a>.</p>
-<p>The route example created below is to proxy the request with URL <code>/index.html</code> to the Upstream service with the address <code>39.97.63.215:80</code>:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/index.html",
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-
-HTTP/1.1 201 Created
-Date: Sat, 31 Aug 2019 01:17:15 GMT
-Content-Type: text/plain
-Transfer-Encoding: chunked
-Connection: keep-alive
-Server: APISIX web server
-
-{"node":{"value":{"uri":"\/index.html","upstream":{"nodes":{"39.97.63.215:80":1},"type":"roundrobin"}},"createdIndex":61925,"key":"\/apisix\/routes\/1","modifiedIndex":61925},"action":"create"}
-</code></pre>
-<p>When we receive a successful response, it indicates that the route was successfully created.</p>
-<p>For specific options of Route, please refer to <a href="/apisix/admin-api#route">Admin API</a>.</p>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="service"></a><a href="#service" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>A <code>Service</code> is an abstraction of an API (which can also be understood as a set of Route abstractions). It usually corresponds to the upstream service abstraction. Between <code>Route</code> and <code>Service</code>, usually the relationship of N:1, please see the following image.</p>
-<p><img src="https://apisix.apache.org/images/service-example.png" width="50%" height="50%"></p>
-<p>Different Route rules are bound to a Service at the same time. These Routes will have the same upstream and plugin configuration, reducing redundant configuration.</p>
-<p>The following example creates a Service that enables the current-limit plugin, and then binds the Route with the id of <code>100</code> and <code>101</code> to the Service.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> create new Service</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/services/200 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    },
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-<span class="hljs-meta">
-#</span><span class="bash"><span class="hljs-string"> create new Route and reference the service by id `200`</span></span>
-curl http://127.0.0.1:9080/apisix/admin/routes/100 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "methods": ["GET"],
-    "uri": "/index.html",
-    "service_id": "200"
-}'
-
-curl http://127.0.0.1:9080/apisix/admin/routes/101 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "methods": ["GET"],
-    "uri": "/foo/index.html",
-    "service_id": "200"
-}'
-</code></pre>
-<p>Of course, we can also specify different plugin parameters or upstream for Route. Some of the following Routes have different current-limit parameters. Other parts (such as upstream) continue to use the configuration parameters in Service.</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/102 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/bar/index.html",
-    "id": "102",
-    "service_id": "200",
-    "plugins": {
-        "limit-count": {
-            "count": 2000,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    }
-}'
-</code></pre>
-<p>Note: When both Route and Service enable the same plugin, the Route parameter has a higher priority than Service.</p>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="plugin"></a><a href="#plugin" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p><code>Plugin</code> represents the plugin configuration that will be executed during the <code>HTTP</code> request/response lifecycle.</p>
-<p>The <code>Plugin</code> configuration can be bound directly to <code>Route</code> or it can be bound to <code>Service</code> or <code>Consumer</code>. For the configuration of the same plugin, only one copy is valid, and the configuration selection priority is always <code>Consumer</code> &gt; <code>Route</code> &gt; <code>Service</code>.</p>
-<p>In <code>conf/config.yaml</code>, you can declare which plugins are supported by the local APISIX node. This is a whitelisting mechanism. Plugins that are not in this whitelist will be automatically ignored. This feature can be used to temporarily turn off or turn on specific plugins, which is very effective in dealing with unexpected situations. If you want to add new plugins based on existing plugins, you need to copy the data of <code>plugins</code> node which in <code>conf/config- [...]
-<p>The configuration of the plugin can be directly bound to the specified Route, or it can be bound to the Service, but the plugin configuration in Route has a higher priority.</p>
-<p>A plugin will only be executed once in a single request, even if it is bound to multiple different objects (such as Route or Service).</p>
-<p>The order in which plugins are run is determined by the priority of the plugin itself, for example:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> _M = {
-    version = <span class="hljs-number">0.1</span>,
-    priority = <span class="hljs-number">0</span>, <span class="hljs-comment">-- the priority of this plugin will be 0</span>
-    name = plugin_name,
-    schema = schema,
-    metadata_schema = metadata_schema,
-}
-</code></pre>
-<p>The plugin configuration is submitted as part of Route or Service and placed under <code>plugins</code>. It internally uses the plugin name as the hash's key to hold configuration items for different plugins.</p>
-<pre><code class="hljs css language-json">{
-    ...
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        },
-        "prometheus": {}
-    }
-}
-</code></pre>
-<p>Not all plugins have specific configuration items. For example, there is no specific configuration item under <code>prometheus</code>. In this case, an empty object identifier can be used.</p>
-<p>If a request is rejected by a plugin, there will be warn level log like <code>ip-restriction exits with http status code 403</code>.</p>
-<p><a href="/apisix/README#plugins">APISIX supported plugin list</a></p>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="script"></a><a href="#script" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p><code>Script</code> represents a script that will be executed during the <code>HTTP</code> request/response life cycle.</p>
-<p>The <code>Script</code> configuration can be directly bound to the <code>Route</code>.</p>
-<p><code>Script</code> and <code>Plugin</code> are mutually exclusive, and <code>Script</code> is executed first. This means that after configuring <code>Script</code>, the <code>Plugin</code> configured on <code>Route</code> will not be executed.</p>
-<p>In theory, you can write arbitrary Lua code in <code>Script</code>, or you can directly call existing plugins to reuse existing code.</p>
-<p><code>Script</code> also has the concept of execution phase, supporting <code>access</code>, <code>header_filer</code>, <code>body_filter</code> and <code>log</code> phase. The system will automatically execute the code of the corresponding phase in the <code>Script</code> script in the corresponding phase.</p>
-<pre><code class="hljs css language-json">{
-    ...
-    "script": "local _M = {} \n function _M.access(api_ctx) \n ngx.log(ngx.INFO,\"hit access phase\") \n end \nreturn _M"
-}
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="upstream"></a><a href="#upstream" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Upstream is a virtual host abstraction that performs load balancing on a given set of service nodes according to configuration rules. Upstream address information can be directly configured to <code>Route</code> (or <code>Service</code>). When Upstream has duplicates, you need to use &quot;reference&quot; to avoid duplication.</p>
-<p><img src="https://apisix.apache.org/images/upstream-example.png" width="50%" height="50%"></p>
-<p>As shown in the image above, by creating an Upstream object and referencing it by ID in <code>Route</code>, you can ensure that only the value of an object is maintained.</p>
-<p>Upstream configuration can be directly bound to the specified <code>Route</code> or it can be bound to <code>Service</code>, but the configuration in <code>Route</code> has a higher priority. The priority behavior here is very similar to <code>Plugin</code>.</p>
-<h3><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>In addition to the basic complex equalization algorithm selection, APISIX's Upstream also supports logic for upstream passive health check and retry, see the link below.</p>
-<p><a href="https://github.com/apache/apisix/blob/master/doc/admin-api.md#upstream">https://github.com/apache/apisix/blob/master/doc/admin-api.md#upstream</a></p>
-<p>Create an upstream object use case:</p>
-<pre><code class="hljs css language-json">curl http://127.0.0.1:9080/apisix/admin/upstreams/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "type": "chash",
-    "key": "remote_addr",
-    "nodes": {
-        "127.0.0.1:80": 1,
-        "foo.com:80": 2
-    }
-}'
-</code></pre>
-<p>After the upstream object is created, it can be referenced by specific <code>Route</code> or <code>Service</code>, for example:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/index.html",
-    "upstream_id": 1
-}'
-</code></pre>
-<p>For convenience, you can also directly bind the upstream address to a <code>Route</code> or <code>Service</code>, for example:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/index.html",
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    },
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-</code></pre>
-<p>Here's an example of configuring a health check:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/index.html",
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    },
-    "upstream": {
-         "nodes": {
-            "39.97.63.215:80": 1
-        }
-        "type": "roundrobin",
-        "retries": 2,
-        "checks": {
-            "active": {
-                "http_path": "/status",
-                "host": "foo.com",
-                "healthy": {
-                    "interval": 2,
-                    "successes": 1
-                },
-                "unhealthy": {
-                    "interval": 1,
-                    "http_failures": 2
-                }
-            }
-        }
-    }
-}'
-</code></pre>
-<p>More details can be found in <a href="/apisix/health-check">Health Checking Documents</a>.</p>
-<p>Here are some examples of configurations using different <code>hash_on</code> types:</p>
-<h4><a class="anchor" aria-hidden="true" id="consumer"></a><a href="#consumer" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Create a consumer object:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "username": "jack",
-    "plugins": {
-       "key-auth": {
-            "key": "auth-jack"
-        }
-    }
-}'
-</code></pre>
-<p>Create route object and enable <code>key-auth</code> plugin authentication:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "plugins": {
-        "key-auth": {}
-    },
-    "upstream": {
-        "nodes": {
-            "127.0.0.1:1980": 1,
-            "127.0.0.1:1981": 1
-        },
-        "type": "chash",
-        "hash_on": "consumer"
-    },
-    "uri": "/server_port"
-}'
-</code></pre>
-<p>Test request, the <code>consumer_name</code> after authentication is passed will be used as the hash value of the load balancing hash algorithm:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/server_port -H "apikey: auth-jack"
-</code></pre>
-<h4><a class="anchor" aria-hidden="true" id="cookie"></a><a href="#cookie" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p>Create route and upstream object, <code>hash_on</code> is <code>cookie</code>:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/hash_on_cookie",
-    "upstream": {
-        "key": "sid",
-        "type ": "chash",
-        "hash_on ": "cookie",
-        "nodes ": {
-            "127.0.0.1:1980": 1,
-            "127.0.0.1:1981": 1
-        }
-    }
-}'
-</code></pre>
-<p>The client requests with <code>Cookie</code>:</p>
-<pre><code class="hljs css language-shell"> curl http://127.0.0.1:9080/hash_on_cookie -H "Cookie: sid=3c183a30cffcda1408daf1c61d47b274"
-</code></pre>
-<h4><a class="anchor" aria-hidden="true" id="header"></a><a href="#header" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p>Create route and upstream object, <code>hash_on</code> is <code>header</code>, <code>key</code> is <code>Content-Type</code>:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/hash_on_header",
-    "upstream": {
-        "key": "content-type",
-        "type ": "chash",
-        "hash_on ": "header",
-        "nodes ": {
-            "127.0.0.1:1980": 1,
-            "127.0.0.1:1981": 1
-        }
-    }
-}'
-</code></pre>
-<p>The client requests with header <code>Content-Type</code>:</p>
-<pre><code class="hljs css language-shell"> curl http://127.0.0.1:9080/hash_on_header -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -H "Content-Type: application/json"
-</code></pre>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="router"></a><a href="#router" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p>A distinguishing feature of APISIX from other API gateways is that it allows users to choose different routers to better match free services, making the best choice between performance and freedom.</p>
-<p>Set the route that best suits your business needs in the local configuration <code>conf/config.yaml</code>.</p>
-<ul>
-<li><p><code>apisix.router.http</code>: HTTP Request Route。</p>
-<ul>
-<li><code>radixtree_uri</code>: (Default) only use <code>uri</code> as the primary index. Support for full and deep prefix matching based on the <code>radixtree</code> engine, see <a href="/apisix/router-radixtree">How to use router-radixtree</a>.
-<ul>
-<li><code>Absolute match</code>: Complete match for the given <code>uri</code>, such as <code>/foo/bar</code>,<code>/foo/glo</code>.</li>
-<li><code>Prefix match</code>: Use <code>*</code> at the end to represent the given <code>uri</code> as a prefix match. For example, <code>/foo*</code> allows matching <code>/foo/</code>, <code>/foo/a</code> and <code>/foo/b</code>.</li>
-<li><code>match priority</code>: first try absolute match, if you can't hit absolute match, try prefix match.</li>
-<li><code>Any filter attribute</code>: Allows you to specify any Nginx built-in variable as a filter, such as URL request parameters, request headers, cookies, and so on.</li>
-</ul></li>
-<li><code>radixtree_uri_with_parameter</code>: Like <code>radixtree_uri</code> but also support parameter match.</li>
-<li><code>radixtree_host_uri</code>: Use <code>host + uri</code> as the primary index (based on the <code>radixtree</code> engine), matching both host and URL for the current request.</li>
-</ul></li>
-<li><p><code>apisix.router.ssl</code>: SSL loads the matching route.</p>
-<ul>
-<li><code>radixtree_sni</code>: (Default) Use <code>SNI</code> (Server Name Indication) as the primary index (based on the radixtree engine).</li>
-</ul></li>
-</ul>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="consumer-1"></a><a href="#consumer-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>For the API gateway, it is usually possible to identify a certain type of requester by using a domain name such as a request domain name, a client IP address, etc., and then perform plugin filtering and forward the request to the specified upstream, but sometimes the depth is insufficient.</p>
-<p><img src="https://apisix.apache.org/images/consumer-who.png" width="50%" height="50%"></p>
-<p>As shown in the image above, as an API gateway, you should know who the API Consumer is, so you can configure different rules for different API Consumers.</p>
-<table>
-<thead>
-<tr><th>Field</th><th>Required</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>username</td><td>Yes</td><td>Consumer Name.</td></tr>
-<tr><td>plugins</td><td>No</td><td>The corresponding plugin configuration of the Consumer, which has the highest priority: Consumer &gt; Route &gt; Service. For specific plugin configurations, refer to the <a href="#plugin">Plugins</a> section.</td></tr>
-</tbody>
-</table>
-<p>In APISIX, the process of identifying a Consumer is as follows:</p>
-<p><img src="https://apisix.apache.org/images/consumer-internal.png" width="50%" height="50%"></p>
-<ol>
-<li>Authorization certification: e.g <a href="/apisix/plugins/key-auth">key-auth</a>, <a href="/apisix/plugins/jwt-auth">JWT</a>, etc.</li>
-<li>Get consumer_name: By authorization, you can naturally get the corresponding Consumer <code>id</code>, which is the unique identifier of the Consumer object.</li>
-<li>Get the Plugin or Upstream information bound to the Consumer: Complete the different configurations for different Consumers.</li>
-</ol>
-<p>To sum up, Consumer is a consumer of certain types of services and needs to be used in conjunction with the user authentication system.</p>
-<p>For example, different consumers request the same API, and the gateway service corresponds to different Plugin or Upstream configurations according to the current request user information.</p>
-<p>In addition, you can refer to the <a href="/apisix/plugins/key-auth">key-auth</a> authentication authorization plugin call logic to help you further understand the Consumer concept and usage.</p>
-<p>How to enable a specific plugin for a Consumer, you can see the following example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> Create a Consumer, specify the authentication plugin key-auth, and <span class="hljs-built_in">enable</span> the specific plugin <span class="hljs-built_in">limit</span>-count</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/consumers -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "username": "jack",
-    "plugins": {
-        "key-auth": {
-            "key": "auth-one"
-        },
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    }
-}'
-<span class="hljs-meta">
-#</span><span class="bash"><span class="hljs-string"> Create a Router, set routing rules and enable plugin configuration</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H '</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PUT -d '</span></span>
-{
-    "plugins": {
-        "key-auth": {}
-    },
-    "upstream": {
-        "nodes": {
-            "127.0.0.1:1980": 1
-        },
-        "type": "roundrobin"
-    },
-    "uri": "/hello"
-}'
-<span class="hljs-meta">
-#</span><span class="bash"> Send a <span class="hljs-built_in">test</span> request, the first two <span class="hljs-built_in">return</span> to normal, did not reach the speed <span class="hljs-built_in">limit</span> threshold</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/hello -H <span class="hljs-string">'apikey: auth-one'</span> -I</span>
-...
-<span class="hljs-meta">
-$</span><span class="bash"> curl http://127.0.0.1:9080/hello -H <span class="hljs-string">'apikey: auth-one'</span> -I</span>
-...
-<span class="hljs-meta">
-#</span><span class="bash"> The third <span class="hljs-built_in">test</span> returns 503 and the request is restricted</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/hello -H <span class="hljs-string">'apikey: auth-one'</span> -I</span>
-HTTP/1.1 503 Service Temporarily Unavailable
-...
-
-</code></pre>
-<p>Use the <a href="/apisix/plugins/consumer-restriction">consumer-restriction</a> plug-in to restrict the access of Jack to this API.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> Add Jack to the blacklist</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "plugins": {
-        "key-auth": {},
-        "consumer-restriction": {
-            "blacklist": [
-                "jack"
-            ]
-        }
-    },
-    "upstream": {
-        "nodes": {
-            "127.0.0.1:1980": 1
-        },
-        "type": "roundrobin"
-    },
-    "uri": "/hello"
-}'
-<span class="hljs-meta">
-#</span><span class="bash"><span class="hljs-string"> Repeated tests, all return 403; Jack is forbidden to access this API</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/hello -H '</span>apikey: auth-one<span class="hljs-string">' -I</span></span>
-HTTP/1.1 403
-...
-
-</code></pre>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="global-rule"></a><a href="#global-rule" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p><a href="#plugin">Plugin</a> just can be binded to <a href="#service">Service</a> or <a href="#route">Route</a>, if we want a <a href="#plugin">Plugin</a> work on all requests, how to do it?
-We can register a global <a href="#plugin">Plugin</a> with <code>GlobalRule</code>:</p>
-<pre><code class="hljs css language-shell">curl -X PUT \
-  https://{apisix_listen_address}/apisix/admin/global_rules/1 \
-  -H 'Content-Type: application/json' \
-  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
-  -d '{
-        "plugins": {
-            "limit-count": {
-                "time_window": 60,
-                "policy": "local",
-                "count": 2,
-                "key": "remote_addr",
-                "rejected_code": 503
-            }
-        }
-    }'
-</code></pre>
-<p>Now, the <code>limit-count</code> plugin will work on all requests</p>
-<p>we can list all <code>GlobalRule</code> via admin api as below:</p>
-<pre><code class="hljs css language-shell">curl https://{apisix_listen_address}/apisix/admin/global_rules
-</code></pre>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="debug-mode"></a><a href="#debug-mode" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<h3><a class="anchor" aria-hidden="true" id="basic-debug-mode"></a><a href="#basic-debug-mode" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>Enable basic debug mode just by setting <code>apisix.enable_debug = true</code> in <code>conf/config.yaml</code> file.</p>
-<p>e.g Using both <code>limit-conn</code> and <code>limit-count</code> plugins for a <code>/hello</code> request, there will have a response header called <code>Apisix-Plugins: limit-conn, limit-count</code>.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:1984/hello -i</span>
-HTTP/1.1 200 OK
-Content-Type: text/plain
-Transfer-Encoding: chunked
-Connection: keep-alive
-Apisix-Plugins: limit-conn, limit-count
-X-RateLimit-Limit: 2
-X-RateLimit-Remaining: 1
-Server: openresty
-
-hello world
-</code></pre>
-<p>If the information can be delivered via HTTP response header, for example, the plugin is in stream
-subsystem, the information will be logged in the error log with <code>warn</code> level.</p>
-<h3><a class="anchor" aria-hidden="true" id="advanced-debug-mode"></a><a href="#advanced-debug-mode" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Enable advanced debug mode by modifying the configuration in <code>conf/debug.yaml</code> file. Because there will be a check every second, only the checker reads the <code>#END</code> flag, and the file would be considered as closed.</p>
-<p>The checker would judge whether the file data changed according to the last modification time of the file. If there has any change, reload it. If there was no change, skip this check. So it's hot reload for enabling or disabling advanced debug mode.</p>
-<table>
-<thead>
-<tr><th>Key</th><th>Optional</th><th>Description</th><th>Default</th></tr>
-</thead>
-<tbody>
-<tr><td>hook_conf.enable</td><td>required</td><td>Enable/Disable hook debug trace. Target module function's input arguments or returned value would be printed once this option is enabled.</td><td>false</td></tr>
-<tr><td>hook_conf.name</td><td>required</td><td>The module list name of hook which has enabled debug trace</td><td></td></tr>
-<tr><td>hook_conf.log_level</td><td>required</td><td>Logging levels for input arguments &amp; returned value</td><td>warn</td></tr>
-<tr><td>hook_conf.is_print_input_args</td><td>required</td><td>Enable/Disable input arguments print</td><td>true</td></tr>
-<tr><td>hook_conf.is_print_return_value</td><td>required</td><td>Enable/Disable returned value print</td><td>true</td></tr>
-</tbody>
-</table>
-<p>Example:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">hook_conf:</span>
-  <span class="hljs-attr">enable:</span> <span class="hljs-literal">false</span>                 <span class="hljs-comment"># Enable/Disable Hook Debug Trace</span>
-  <span class="hljs-attr">name:</span> <span class="hljs-string">hook_phase</span>              <span class="hljs-comment"># The Module List Name of Hook which has enabled Debug Trace</span>
-  <span class="hljs-attr">log_level:</span> <span class="hljs-string">warn</span>               <span class="hljs-comment"># Logging Levels</span>
-  <span class="hljs-attr">is_print_input_args:</span> <span class="hljs-literal">true</span>     <span class="hljs-comment"># Enable/Disable Input Arguments Print</span>
-  <span class="hljs-attr">is_print_return_value:</span> <span class="hljs-literal">true</span>   <span class="hljs-comment"># Enable/Disable Returned Value Print</span>
-
-<span class="hljs-attr">hook_phase:</span>                     <span class="hljs-comment"># Module Function List, Name: hook_phase</span>
-  <span class="hljs-attr">apisix:</span>                       <span class="hljs-comment"># Referenced Module Name</span>
-    <span class="hljs-bullet">-</span> <span class="hljs-string">http_access_phase</span>         <span class="hljs-comment"># Function Names:Array</span>
-    <span class="hljs-bullet">-</span> <span class="hljs-string">http_header_filter_phase</span>
-    <span class="hljs-bullet">-</span> <span class="hljs-string">http_body_filter_phase</span>
-    <span class="hljs-bullet">-</span> <span class="hljs-string">http_log_phase</span>
-
-<span class="hljs-comment">#END</span>
-</code></pre>
-<p><a href="#table-of-contents">Back to top</a></p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#table-of-contents">Table of Contents</a></li><li><a href="#apisix">APISIX</a><ul class="toc-headings"><li><a href="#plugin-loading-process">Plugin Loading Process</a></li><li><a href="#plugin-hierarchy-structure">Plugin Hierarchy Structure</a></li></ul></li><li><a href="#apisix-config">APISIX Config</a></li><li><a href="#route">Route</a></li><li><a href= [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/architecture-design/index.html b/apisix/architecture-design/index.html
deleted file mode 100644
index 2a45df7..0000000
--- a/apisix/architecture-design/index.html
+++ /dev/null
@@ -1,559 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/architecture-design · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/architecture-design · Apache APISIX™"/><meta property="og:type" content="website"/><meta pr [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/architecture-design">Chinese</a></p>
-<h2><a class="anchor" aria-hidden="true" id="table-of-contents"></a><a href="#table-of-contents" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<ul>
-<li><a href="#apisix"><strong>APISIX</strong></a></li>
-<li><a href="#apisix-config"><strong>APISIX Config</strong></a></li>
-<li><a href="#route"><strong>Route</strong></a></li>
-<li><a href="#service"><strong>Service</strong></a></li>
-<li><a href="#plugin"><strong>Plugin</strong></a></li>
-<li><a href="#script"><strong>Script</strong></a></li>
-<li><a href="#upstream"><strong>Upstream</strong></a></li>
-<li><a href="#router"><strong>Router</strong></a></li>
-<li><a href="#consumer-1"><strong>Consumer</strong></a></li>
-<li><a href="#global-rule"><strong>Global Rule</strong></a></li>
-<li><a href="#debug-mode"><strong>Debug mode</strong></a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="apisix"></a><a href="#apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<h3><a class="anchor" aria-hidden="true" id="plugin-loading-process"></a><a href="#plugin-loading-process" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
-<p><img src="https://apisix.apache.org/images/flow-load-plugin.png" alt="flow-load-plugin"></p>
-<h3><a class="anchor" aria-hidden="true" id="plugin-hierarchy-structure"></a><a href="#plugin-hierarchy-structure" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
-<p><img src="https://apisix.apache.org/images/flow-plugin-internal.png" width="50%" height="50%"></p>
-<h2><a class="anchor" aria-hidden="true" id="apisix-config"></a><a href="#apisix-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>For example, set the default listening port of APISIX to 8000, and keep other configurations as default. The configuration in <code>conf/config.yaml</code> should be like this:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">apisix:</span>
-  <span class="hljs-attr">node_listen:</span> <span class="hljs-number">8000</span>             <span class="hljs-comment"># APISIX listening port</span>
-</code></pre>
-<p>Set the default listening port of APISIX to 8000, set the <code>etcd</code> address to <code>http://foo:2379</code>,
-and keep other configurations as default. The configuration in <code>conf/config.yaml</code> should be like this:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">apisix:</span>
-  <span class="hljs-attr">node_listen:</span> <span class="hljs-number">8000</span>             <span class="hljs-comment"># APISIX listening port</span>
-
-<span class="hljs-attr">etcd:</span>
-  <span class="hljs-attr">host:</span> <span class="hljs-string">"http://foo:2379"</span>       <span class="hljs-comment"># etcd address</span>
-</code></pre>
-<p>Other default configurations can be found in the <code>conf/config-default.yaml</code> file, which is bound to the APISIX source code. <strong>Never</strong> manually modify the <code>conf/config-default.yaml</code> file. If you need to customize any configuration, you should update the <code>conf/config.yaml</code> file.</p>
-<p><strong>Note</strong> <code>APISIX</code> will generate <code>conf/nginx.conf</code> file automatically, so please <em>DO NOT EDIT</em> <code>conf/nginx.conf</code> file too.</p>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="route"></a><a href="#route" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>The route matches the client's request by defining rules, then loads and executes the corresponding plugin based on the matching result, and forwards the request to the specified Upstream.</p>
-<p>The route mainly consists of three parts: matching rules (e.g uri, host, remote_addr, etc.), plugin configuration (current-limit &amp; rate-limit, etc.) and upstream information.</p>
-<p>The following image shows an example of some Route rules. When some attribute values are the same, the figure is identified by the same color.</p>
-<p><img src="https://apisix.apache.org/images/routes-example.png" width="50%" height="50%"></p>
-<p>We configure all the parameters directly in the Route, it's easy to set up, and each Route has a relatively high degree of freedom. But when our Route has more repetitive configurations (such as enabling the same plugin configuration or upstream information), once we need update these same properties, we have to traverse all the Routes and modify them, so it adding a lot of complexity of management and maintenance.</p>
-<p>The shortcomings mentioned above are independently abstracted in APISIX by the two concepts <a href="#service">Service</a> and <a href="#upstream">Upstream</a>.</p>
-<p>The route example created below is to proxy the request with URL <code>/index.html</code> to the Upstream service with the address <code>39.97.63.215:80</code>:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/index.html",
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-
-HTTP/1.1 201 Created
-Date: Sat, 31 Aug 2019 01:17:15 GMT
-Content-Type: text/plain
-Transfer-Encoding: chunked
-Connection: keep-alive
-Server: APISIX web server
-
-{"node":{"value":{"uri":"\/index.html","upstream":{"nodes":{"39.97.63.215:80":1},"type":"roundrobin"}},"createdIndex":61925,"key":"\/apisix\/routes\/1","modifiedIndex":61925},"action":"create"}
-</code></pre>
-<p>When we receive a successful response, it indicates that the route was successfully created.</p>
-<p>For specific options of Route, please refer to <a href="/apisix/admin-api#route">Admin API</a>.</p>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="service"></a><a href="#service" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>A <code>Service</code> is an abstraction of an API (which can also be understood as a set of Route abstractions). It usually corresponds to the upstream service abstraction. Between <code>Route</code> and <code>Service</code>, usually the relationship of N:1, please see the following image.</p>
-<p><img src="https://apisix.apache.org/images/service-example.png" width="50%" height="50%"></p>
-<p>Different Route rules are bound to a Service at the same time. These Routes will have the same upstream and plugin configuration, reducing redundant configuration.</p>
-<p>The following example creates a Service that enables the current-limit plugin, and then binds the Route with the id of <code>100</code> and <code>101</code> to the Service.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> create new Service</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/services/200 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    },
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-<span class="hljs-meta">
-#</span><span class="bash"><span class="hljs-string"> create new Route and reference the service by id `200`</span></span>
-curl http://127.0.0.1:9080/apisix/admin/routes/100 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "methods": ["GET"],
-    "uri": "/index.html",
-    "service_id": "200"
-}'
-
-curl http://127.0.0.1:9080/apisix/admin/routes/101 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "methods": ["GET"],
-    "uri": "/foo/index.html",
-    "service_id": "200"
-}'
-</code></pre>
-<p>Of course, we can also specify different plugin parameters or upstream for Route. Some of the following Routes have different current-limit parameters. Other parts (such as upstream) continue to use the configuration parameters in Service.</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/102 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/bar/index.html",
-    "id": "102",
-    "service_id": "200",
-    "plugins": {
-        "limit-count": {
-            "count": 2000,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    }
-}'
-</code></pre>
-<p>Note: When both Route and Service enable the same plugin, the Route parameter has a higher priority than Service.</p>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="plugin"></a><a href="#plugin" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p><code>Plugin</code> represents the plugin configuration that will be executed during the <code>HTTP</code> request/response lifecycle.</p>
-<p>The <code>Plugin</code> configuration can be bound directly to <code>Route</code> or it can be bound to <code>Service</code> or <code>Consumer</code>. For the configuration of the same plugin, only one copy is valid, and the configuration selection priority is always <code>Consumer</code> &gt; <code>Route</code> &gt; <code>Service</code>.</p>
-<p>In <code>conf/config.yaml</code>, you can declare which plugins are supported by the local APISIX node. This is a whitelisting mechanism. Plugins that are not in this whitelist will be automatically ignored. This feature can be used to temporarily turn off or turn on specific plugins, which is very effective in dealing with unexpected situations. If you want to add new plugins based on existing plugins, you need to copy the data of <code>plugins</code> node which in <code>conf/config- [...]
-<p>The configuration of the plugin can be directly bound to the specified Route, or it can be bound to the Service, but the plugin configuration in Route has a higher priority.</p>
-<p>A plugin will only be executed once in a single request, even if it is bound to multiple different objects (such as Route or Service).</p>
-<p>The order in which plugins are run is determined by the priority of the plugin itself, for example:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> _M = {
-    version = <span class="hljs-number">0.1</span>,
-    priority = <span class="hljs-number">0</span>, <span class="hljs-comment">-- the priority of this plugin will be 0</span>
-    name = plugin_name,
-    schema = schema,
-    metadata_schema = metadata_schema,
-}
-</code></pre>
-<p>The plugin configuration is submitted as part of Route or Service and placed under <code>plugins</code>. It internally uses the plugin name as the hash's key to hold configuration items for different plugins.</p>
-<pre><code class="hljs css language-json">{
-    ...
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        },
-        "prometheus": {}
-    }
-}
-</code></pre>
-<p>Not all plugins have specific configuration items. For example, there is no specific configuration item under <code>prometheus</code>. In this case, an empty object identifier can be used.</p>
-<p>If a request is rejected by a plugin, there will be warn level log like <code>ip-restriction exits with http status code 403</code>.</p>
-<p><a href="/apisix/README#plugins">APISIX supported plugin list</a></p>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="script"></a><a href="#script" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p><code>Script</code> represents a script that will be executed during the <code>HTTP</code> request/response life cycle.</p>
-<p>The <code>Script</code> configuration can be directly bound to the <code>Route</code>.</p>
-<p><code>Script</code> and <code>Plugin</code> are mutually exclusive, and <code>Script</code> is executed first. This means that after configuring <code>Script</code>, the <code>Plugin</code> configured on <code>Route</code> will not be executed.</p>
-<p>In theory, you can write arbitrary Lua code in <code>Script</code>, or you can directly call existing plugins to reuse existing code.</p>
-<p><code>Script</code> also has the concept of execution phase, supporting <code>access</code>, <code>header_filer</code>, <code>body_filter</code> and <code>log</code> phase. The system will automatically execute the code of the corresponding phase in the <code>Script</code> script in the corresponding phase.</p>
-<pre><code class="hljs css language-json">{
-    ...
-    "script": "local _M = {} \n function _M.access(api_ctx) \n ngx.log(ngx.INFO,\"hit access phase\") \n end \nreturn _M"
-}
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="upstream"></a><a href="#upstream" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Upstream is a virtual host abstraction that performs load balancing on a given set of service nodes according to configuration rules. Upstream address information can be directly configured to <code>Route</code> (or <code>Service</code>). When Upstream has duplicates, you need to use &quot;reference&quot; to avoid duplication.</p>
-<p><img src="https://apisix.apache.org/images/upstream-example.png" width="50%" height="50%"></p>
-<p>As shown in the image above, by creating an Upstream object and referencing it by ID in <code>Route</code>, you can ensure that only the value of an object is maintained.</p>
-<p>Upstream configuration can be directly bound to the specified <code>Route</code> or it can be bound to <code>Service</code>, but the configuration in <code>Route</code> has a higher priority. The priority behavior here is very similar to <code>Plugin</code>.</p>
-<h3><a class="anchor" aria-hidden="true" id="configuration"></a><a href="#configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>In addition to the basic complex equalization algorithm selection, APISIX's Upstream also supports logic for upstream passive health check and retry, see the link below.</p>
-<p><a href="https://github.com/apache/apisix/blob/master/doc/admin-api.md#upstream">https://github.com/apache/apisix/blob/master/doc/admin-api.md#upstream</a></p>
-<p>Create an upstream object use case:</p>
-<pre><code class="hljs css language-json">curl http://127.0.0.1:9080/apisix/admin/upstreams/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "type": "chash",
-    "key": "remote_addr",
-    "nodes": {
-        "127.0.0.1:80": 1,
-        "foo.com:80": 2
-    }
-}'
-</code></pre>
-<p>After the upstream object is created, it can be referenced by specific <code>Route</code> or <code>Service</code>, for example:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/index.html",
-    "upstream_id": 1
-}'
-</code></pre>
-<p>For convenience, you can also directly bind the upstream address to a <code>Route</code> or <code>Service</code>, for example:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/index.html",
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    },
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "39.97.63.215:80": 1
-        }
-    }
-}'
-</code></pre>
-<p>Here's an example of configuring a health check:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/index.html",
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    },
-    "upstream": {
-         "nodes": {
-            "39.97.63.215:80": 1
-        }
-        "type": "roundrobin",
-        "retries": 2,
-        "checks": {
-            "active": {
-                "http_path": "/status",
-                "host": "foo.com",
-                "healthy": {
-                    "interval": 2,
-                    "successes": 1
-                },
-                "unhealthy": {
-                    "interval": 1,
-                    "http_failures": 2
-                }
-            }
-        }
-    }
-}'
-</code></pre>
-<p>More details can be found in <a href="/apisix/health-check">Health Checking Documents</a>.</p>
-<p>Here are some examples of configurations using different <code>hash_on</code> types:</p>
-<h4><a class="anchor" aria-hidden="true" id="consumer"></a><a href="#consumer" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Create a consumer object:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "username": "jack",
-    "plugins": {
-       "key-auth": {
-            "key": "auth-jack"
-        }
-    }
-}'
-</code></pre>
-<p>Create route object and enable <code>key-auth</code> plugin authentication:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "plugins": {
-        "key-auth": {}
-    },
-    "upstream": {
-        "nodes": {
-            "127.0.0.1:1980": 1,
-            "127.0.0.1:1981": 1
-        },
-        "type": "chash",
-        "hash_on": "consumer"
-    },
-    "uri": "/server_port"
-}'
-</code></pre>
-<p>Test request, the <code>consumer_name</code> after authentication is passed will be used as the hash value of the load balancing hash algorithm:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/server_port -H "apikey: auth-jack"
-</code></pre>
-<h4><a class="anchor" aria-hidden="true" id="cookie"></a><a href="#cookie" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p>Create route and upstream object, <code>hash_on</code> is <code>cookie</code>:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/hash_on_cookie",
-    "upstream": {
-        "key": "sid",
-        "type ": "chash",
-        "hash_on ": "cookie",
-        "nodes ": {
-            "127.0.0.1:1980": 1,
-            "127.0.0.1:1981": 1
-        }
-    }
-}'
-</code></pre>
-<p>The client requests with <code>Cookie</code>:</p>
-<pre><code class="hljs css language-shell"> curl http://127.0.0.1:9080/hash_on_cookie -H "Cookie: sid=3c183a30cffcda1408daf1c61d47b274"
-</code></pre>
-<h4><a class="anchor" aria-hidden="true" id="header"></a><a href="#header" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p>Create route and upstream object, <code>hash_on</code> is <code>header</code>, <code>key</code> is <code>Content-Type</code>:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/hash_on_header",
-    "upstream": {
-        "key": "content-type",
-        "type ": "chash",
-        "hash_on ": "header",
-        "nodes ": {
-            "127.0.0.1:1980": 1,
-            "127.0.0.1:1981": 1
-        }
-    }
-}'
-</code></pre>
-<p>The client requests with header <code>Content-Type</code>:</p>
-<pre><code class="hljs css language-shell"> curl http://127.0.0.1:9080/hash_on_header -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -H "Content-Type: application/json"
-</code></pre>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="router"></a><a href="#router" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<p>A distinguishing feature of APISIX from other API gateways is that it allows users to choose different routers to better match free services, making the best choice between performance and freedom.</p>
-<p>Set the route that best suits your business needs in the local configuration <code>conf/config.yaml</code>.</p>
-<ul>
-<li><p><code>apisix.router.http</code>: HTTP Request Route。</p>
-<ul>
-<li><code>radixtree_uri</code>: (Default) only use <code>uri</code> as the primary index. Support for full and deep prefix matching based on the <code>radixtree</code> engine, see <a href="/apisix/router-radixtree">How to use router-radixtree</a>.
-<ul>
-<li><code>Absolute match</code>: Complete match for the given <code>uri</code>, such as <code>/foo/bar</code>,<code>/foo/glo</code>.</li>
-<li><code>Prefix match</code>: Use <code>*</code> at the end to represent the given <code>uri</code> as a prefix match. For example, <code>/foo*</code> allows matching <code>/foo/</code>, <code>/foo/a</code> and <code>/foo/b</code>.</li>
-<li><code>match priority</code>: first try absolute match, if you can't hit absolute match, try prefix match.</li>
-<li><code>Any filter attribute</code>: Allows you to specify any Nginx built-in variable as a filter, such as URL request parameters, request headers, cookies, and so on.</li>
-</ul></li>
-<li><code>radixtree_uri_with_parameter</code>: Like <code>radixtree_uri</code> but also support parameter match.</li>
-<li><code>radixtree_host_uri</code>: Use <code>host + uri</code> as the primary index (based on the <code>radixtree</code> engine), matching both host and URL for the current request.</li>
-</ul></li>
-<li><p><code>apisix.router.ssl</code>: SSL loads the matching route.</p>
-<ul>
-<li><code>radixtree_sni</code>: (Default) Use <code>SNI</code> (Server Name Indication) as the primary index (based on the radixtree engine).</li>
-</ul></li>
-</ul>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="consumer-1"></a><a href="#consumer-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>For the API gateway, it is usually possible to identify a certain type of requester by using a domain name such as a request domain name, a client IP address, etc., and then perform plugin filtering and forward the request to the specified upstream, but sometimes the depth is insufficient.</p>
-<p><img src="https://apisix.apache.org/images/consumer-who.png" width="50%" height="50%"></p>
-<p>As shown in the image above, as an API gateway, you should know who the API Consumer is, so you can configure different rules for different API Consumers.</p>
-<table>
-<thead>
-<tr><th>Field</th><th>Required</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>username</td><td>Yes</td><td>Consumer Name.</td></tr>
-<tr><td>plugins</td><td>No</td><td>The corresponding plugin configuration of the Consumer, which has the highest priority: Consumer &gt; Route &gt; Service. For specific plugin configurations, refer to the <a href="#plugin">Plugins</a> section.</td></tr>
-</tbody>
-</table>
-<p>In APISIX, the process of identifying a Consumer is as follows:</p>
-<p><img src="https://apisix.apache.org/images/consumer-internal.png" width="50%" height="50%"></p>
-<ol>
-<li>Authorization certification: e.g <a href="/apisix/plugins/key-auth">key-auth</a>, <a href="/apisix/plugins/jwt-auth">JWT</a>, etc.</li>
-<li>Get consumer_name: By authorization, you can naturally get the corresponding Consumer <code>id</code>, which is the unique identifier of the Consumer object.</li>
-<li>Get the Plugin or Upstream information bound to the Consumer: Complete the different configurations for different Consumers.</li>
-</ol>
-<p>To sum up, Consumer is a consumer of certain types of services and needs to be used in conjunction with the user authentication system.</p>
-<p>For example, different consumers request the same API, and the gateway service corresponds to different Plugin or Upstream configurations according to the current request user information.</p>
-<p>In addition, you can refer to the <a href="/apisix/plugins/key-auth">key-auth</a> authentication authorization plugin call logic to help you further understand the Consumer concept and usage.</p>
-<p>How to enable a specific plugin for a Consumer, you can see the following example:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> Create a Consumer, specify the authentication plugin key-auth, and <span class="hljs-built_in">enable</span> the specific plugin <span class="hljs-built_in">limit</span>-count</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/consumers -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "username": "jack",
-    "plugins": {
-        "key-auth": {
-            "key": "auth-one"
-        },
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    }
-}'
-<span class="hljs-meta">
-#</span><span class="bash"><span class="hljs-string"> Create a Router, set routing rules and enable plugin configuration</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H '</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PUT -d '</span></span>
-{
-    "plugins": {
-        "key-auth": {}
-    },
-    "upstream": {
-        "nodes": {
-            "127.0.0.1:1980": 1
-        },
-        "type": "roundrobin"
-    },
-    "uri": "/hello"
-}'
-<span class="hljs-meta">
-#</span><span class="bash"> Send a <span class="hljs-built_in">test</span> request, the first two <span class="hljs-built_in">return</span> to normal, did not reach the speed <span class="hljs-built_in">limit</span> threshold</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/hello -H <span class="hljs-string">'apikey: auth-one'</span> -I</span>
-...
-<span class="hljs-meta">
-$</span><span class="bash"> curl http://127.0.0.1:9080/hello -H <span class="hljs-string">'apikey: auth-one'</span> -I</span>
-...
-<span class="hljs-meta">
-#</span><span class="bash"> The third <span class="hljs-built_in">test</span> returns 503 and the request is restricted</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/hello -H <span class="hljs-string">'apikey: auth-one'</span> -I</span>
-HTTP/1.1 503 Service Temporarily Unavailable
-...
-
-</code></pre>
-<p>Use the <a href="/apisix/plugins/consumer-restriction">consumer-restriction</a> plug-in to restrict the access of Jack to this API.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> Add Jack to the blacklist</span>
-<span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "plugins": {
-        "key-auth": {},
-        "consumer-restriction": {
-            "blacklist": [
-                "jack"
-            ]
-        }
-    },
-    "upstream": {
-        "nodes": {
-            "127.0.0.1:1980": 1
-        },
-        "type": "roundrobin"
-    },
-    "uri": "/hello"
-}'
-<span class="hljs-meta">
-#</span><span class="bash"><span class="hljs-string"> Repeated tests, all return 403; Jack is forbidden to access this API</span></span>
-<span class="hljs-meta">$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/hello -H '</span>apikey: auth-one<span class="hljs-string">' -I</span></span>
-HTTP/1.1 403
-...
-
-</code></pre>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="global-rule"></a><a href="#global-rule" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p><a href="#plugin">Plugin</a> just can be binded to <a href="#service">Service</a> or <a href="#route">Route</a>, if we want a <a href="#plugin">Plugin</a> work on all requests, how to do it?
-We can register a global <a href="#plugin">Plugin</a> with <code>GlobalRule</code>:</p>
-<pre><code class="hljs css language-shell">curl -X PUT \
-  https://{apisix_listen_address}/apisix/admin/global_rules/1 \
-  -H 'Content-Type: application/json' \
-  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
-  -d '{
-        "plugins": {
-            "limit-count": {
-                "time_window": 60,
-                "policy": "local",
-                "count": 2,
-                "key": "remote_addr",
-                "rejected_code": 503
-            }
-        }
-    }'
-</code></pre>
-<p>Now, the <code>limit-count</code> plugin will work on all requests</p>
-<p>we can list all <code>GlobalRule</code> via admin api as below:</p>
-<pre><code class="hljs css language-shell">curl https://{apisix_listen_address}/apisix/admin/global_rules
-</code></pre>
-<p><a href="#table-of-contents">Back to top</a></p>
-<h2><a class="anchor" aria-hidden="true" id="debug-mode"></a><a href="#debug-mode" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<h3><a class="anchor" aria-hidden="true" id="basic-debug-mode"></a><a href="#basic-debug-mode" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>Enable basic debug mode just by setting <code>apisix.enable_debug = true</code> in <code>conf/config.yaml</code> file.</p>
-<p>e.g Using both <code>limit-conn</code> and <code>limit-count</code> plugins for a <code>/hello</code> request, there will have a response header called <code>Apisix-Plugins: limit-conn, limit-count</code>.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:1984/hello -i</span>
-HTTP/1.1 200 OK
-Content-Type: text/plain
-Transfer-Encoding: chunked
-Connection: keep-alive
-Apisix-Plugins: limit-conn, limit-count
-X-RateLimit-Limit: 2
-X-RateLimit-Remaining: 1
-Server: openresty
-
-hello world
-</code></pre>
-<p>If the information can be delivered via HTTP response header, for example, the plugin is in stream
-subsystem, the information will be logged in the error log with <code>warn</code> level.</p>
-<h3><a class="anchor" aria-hidden="true" id="advanced-debug-mode"></a><a href="#advanced-debug-mode" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Enable advanced debug mode by modifying the configuration in <code>conf/debug.yaml</code> file. Because there will be a check every second, only the checker reads the <code>#END</code> flag, and the file would be considered as closed.</p>
-<p>The checker would judge whether the file data changed according to the last modification time of the file. If there has any change, reload it. If there was no change, skip this check. So it's hot reload for enabling or disabling advanced debug mode.</p>
-<table>
-<thead>
-<tr><th>Key</th><th>Optional</th><th>Description</th><th>Default</th></tr>
-</thead>
-<tbody>
-<tr><td>hook_conf.enable</td><td>required</td><td>Enable/Disable hook debug trace. Target module function's input arguments or returned value would be printed once this option is enabled.</td><td>false</td></tr>
-<tr><td>hook_conf.name</td><td>required</td><td>The module list name of hook which has enabled debug trace</td><td></td></tr>
-<tr><td>hook_conf.log_level</td><td>required</td><td>Logging levels for input arguments &amp; returned value</td><td>warn</td></tr>
-<tr><td>hook_conf.is_print_input_args</td><td>required</td><td>Enable/Disable input arguments print</td><td>true</td></tr>
-<tr><td>hook_conf.is_print_return_value</td><td>required</td><td>Enable/Disable returned value print</td><td>true</td></tr>
-</tbody>
-</table>
-<p>Example:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">hook_conf:</span>
-  <span class="hljs-attr">enable:</span> <span class="hljs-literal">false</span>                 <span class="hljs-comment"># Enable/Disable Hook Debug Trace</span>
-  <span class="hljs-attr">name:</span> <span class="hljs-string">hook_phase</span>              <span class="hljs-comment"># The Module List Name of Hook which has enabled Debug Trace</span>
-  <span class="hljs-attr">log_level:</span> <span class="hljs-string">warn</span>               <span class="hljs-comment"># Logging Levels</span>
-  <span class="hljs-attr">is_print_input_args:</span> <span class="hljs-literal">true</span>     <span class="hljs-comment"># Enable/Disable Input Arguments Print</span>
-  <span class="hljs-attr">is_print_return_value:</span> <span class="hljs-literal">true</span>   <span class="hljs-comment"># Enable/Disable Returned Value Print</span>
-
-<span class="hljs-attr">hook_phase:</span>                     <span class="hljs-comment"># Module Function List, Name: hook_phase</span>
-  <span class="hljs-attr">apisix:</span>                       <span class="hljs-comment"># Referenced Module Name</span>
-    <span class="hljs-bullet">-</span> <span class="hljs-string">http_access_phase</span>         <span class="hljs-comment"># Function Names:Array</span>
-    <span class="hljs-bullet">-</span> <span class="hljs-string">http_header_filter_phase</span>
-    <span class="hljs-bullet">-</span> <span class="hljs-string">http_body_filter_phase</span>
-    <span class="hljs-bullet">-</span> <span class="hljs-string">http_log_phase</span>
-
-<span class="hljs-comment">#END</span>
-</code></pre>
-<p><a href="#table-of-contents">Back to top</a></p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#table-of-contents">Table of Contents</a></li><li><a href="#apisix">APISIX</a><ul class="toc-headings"><li><a href="#plugin-loading-process">Plugin Loading Process</a></li><li><a href="#plugin-hierarchy-structure">Plugin Hierarchy Structure</a></li></ul></li><li><a href="#apisix-config">APISIX Config</a></li><li><a href="#route">Route</a></li><li><a href= [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/aws.html b/apisix/aws.html
deleted file mode 100644
index 4e2e4db..0000000
--- a/apisix/aws.html
+++ /dev/null
@@ -1,246 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/aws · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/aws · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" content="https:/ [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="running-apisix-in-aws-with-aws-cdk"></a><a href="#running-apisix-in-aws-with-aws-cdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
-<p><a href="https://github.com/apache/apisix">APISIX</a> is a cloud-native microservices API gateway, delivering the ultimate performance, security, open source and scalable platform for all your APIs and microservices.</p>
-<h2><a class="anchor" aria-hidden="true" id="architecture"></a><a href="#architecture" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>This reference architecture walks you through building <strong>APISIX</strong> as a serverless container API Gateway on top of AWS Fargate with AWS CDK.</p>
-<p><img src="https://apisix.apache.org/images/aws-fargate-cdk.png" alt=""></p>
-<h2><a class="anchor" aria-hidden="true" id="generate-an-aws-cdk-project-with-projen"></a><a href="#generate-an-aws-cdk-project-with-projen" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2  [...]
-<pre><code class="hljs css language-bash">$ mkdir apisix-aws
-$ <span class="hljs-built_in">cd</span> <span class="hljs-variable">$_</span>
-$ npx projen new awscdk-app-ts
-</code></pre>
-<p>update the <code>.projenrc.js</code> with the following content:</p>
-<pre><code class="hljs css language-js"><span class="hljs-keyword">const</span> { AwsCdkTypeScriptApp } = <span class="hljs-built_in">require</span>(<span class="hljs-string">'projen'</span>);
-
-<span class="hljs-keyword">const</span> project = <span class="hljs-keyword">new</span> AwsCdkTypeScriptApp({
-  <span class="hljs-attr">cdkVersion</span>: <span class="hljs-string">"1.70.0"</span>,
-  <span class="hljs-attr">name</span>: <span class="hljs-string">"apisix-aws"</span>,
-  <span class="hljs-attr">cdkDependencies</span>: [
-    <span class="hljs-string">'@aws-cdk/aws-ec2'</span>,
-    <span class="hljs-string">'@aws-cdk/aws-ecs'</span>,
-    <span class="hljs-string">'@aws-cdk/aws-ecs-patterns'</span>,
-  ]
-});
-
-project.synth();
-</code></pre>
-<p>update the project:</p>
-<pre><code class="hljs css language-ts">$ npx projen
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="update-srcmaints"></a><a href="#update-srcmaints" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<pre><code class="hljs css language-ts"><span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> cdk <span class="hljs-keyword">from</span> <span class="hljs-string">'@aws-cdk/core'</span>;
-<span class="hljs-keyword">import</span> { Vpc, Port } <span class="hljs-keyword">from</span> <span class="hljs-string">'@aws-cdk/aws-ec2'</span>;
-<span class="hljs-keyword">import</span> { Cluster, ContainerImage, TaskDefinition, Compatibility } <span class="hljs-keyword">from</span> <span class="hljs-string">'@aws-cdk/aws-ecs'</span>;
-<span class="hljs-keyword">import</span> { ApplicationLoadBalancedFargateService, NetworkLoadBalancedFargateService } <span class="hljs-keyword">from</span> <span class="hljs-string">'@aws-cdk/aws-ecs-patterns'</span>;
-
-<span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> ApiSixStack <span class="hljs-keyword">extends</span> cdk.Stack {
-  <span class="hljs-keyword">constructor</span>(<span class="hljs-params">scope: cdk.Construct, id: <span class="hljs-built_in">string</span>, props?: cdk.StackProps</span>) {
-    <span class="hljs-keyword">super</span>(scope, id, props);
-
-    <span class="hljs-keyword">const</span> vpc = Vpc.fromLookup(<span class="hljs-keyword">this</span>, <span class="hljs-string">'VPC'</span>, {
-      isDefault: <span class="hljs-literal">true</span>
-    })
-
-    <span class="hljs-keyword">const</span> cluster = <span class="hljs-keyword">new</span> Cluster(<span class="hljs-keyword">this</span>, <span class="hljs-string">'Cluster'</span>, {
-      vpc
-    })
-
-    <span class="hljs-comment">/**
-     * ApiSix service
-     */</span>
-    <span class="hljs-keyword">const</span> taskDefinition = <span class="hljs-keyword">new</span> TaskDefinition(<span class="hljs-keyword">this</span>, <span class="hljs-string">'TaskApiSix'</span>, {
-      compatibility: Compatibility.FARGATE,
-      memoryMiB: <span class="hljs-string">'512'</span>,
-      cpu: <span class="hljs-string">'256'</span>
-    })
-
-    taskDefinition
-      .addContainer(<span class="hljs-string">'apisix'</span>, {
-        image: ContainerImage.fromRegistry(<span class="hljs-string">'iresty/apisix'</span>),
-      })
-      .addPortMappings({
-        containerPort: <span class="hljs-number">9080</span>
-      })
-
-    taskDefinition
-      .addContainer(<span class="hljs-string">'etcd'</span>, {
-        image: ContainerImage.fromRegistry(<span class="hljs-string">'gcr.azk8s.cn/etcd-development/etcd:v3.3.12'</span>),
-        <span class="hljs-comment">// image: ContainerImage.fromRegistry('gcr.io/etcd-development/etcd:v3.3.12'),</span>
-      })
-      .addPortMappings({
-        containerPort: <span class="hljs-number">2379</span>
-      })
-
-    <span class="hljs-keyword">const</span> svc = <span class="hljs-keyword">new</span> ApplicationLoadBalancedFargateService(<span class="hljs-keyword">this</span>, <span class="hljs-string">'ApiSixService'</span>, {
-      cluster,
-      taskDefinition,
-    })
-
-    svc.targetGroup.setAttribute(<span class="hljs-string">'deregistration_delay.timeout_seconds'</span>, <span class="hljs-string">'30'</span>)
-    svc.targetGroup.configureHealthCheck({
-      interval: cdk.Duration.seconds(<span class="hljs-number">5</span>),
-      healthyHttpCodes: <span class="hljs-string">'404'</span>,
-      healthyThresholdCount: <span class="hljs-number">2</span>,
-      unhealthyThresholdCount: <span class="hljs-number">3</span>,
-      timeout: cdk.Duration.seconds(<span class="hljs-number">4</span>)
-    })
-
-    <span class="hljs-comment">/**
-     * PHP service
-     */</span>
-    <span class="hljs-keyword">const</span> taskDefinitionPHP = <span class="hljs-keyword">new</span> TaskDefinition(<span class="hljs-keyword">this</span>, <span class="hljs-string">'TaskPHP'</span>, {
-      compatibility: Compatibility.FARGATE,
-      memoryMiB: <span class="hljs-string">'512'</span>,
-      cpu: <span class="hljs-string">'256'</span>
-    })
-
-    taskDefinitionPHP
-      .addContainer(<span class="hljs-string">'php'</span>, {
-        image: ContainerImage.fromRegistry(<span class="hljs-string">'abiosoft/caddy:php'</span>),
-      })
-      .addPortMappings({
-        containerPort: <span class="hljs-number">2015</span>
-      })
-
-    <span class="hljs-keyword">const</span> svcPHP = <span class="hljs-keyword">new</span> NetworkLoadBalancedFargateService(<span class="hljs-keyword">this</span>, <span class="hljs-string">'PhpService'</span>, {
-      cluster,
-      taskDefinition: taskDefinitionPHP,
-      assignPublicIp: <span class="hljs-literal">true</span>,
-    })
-
-    <span class="hljs-comment">// allow Fargate task behind NLB to accept all traffic</span>
-    svcPHP.service.connections.allowFromAnyIpv4(Port.tcp(<span class="hljs-number">2015</span>))
-    svcPHP.targetGroup.setAttribute(<span class="hljs-string">'deregistration_delay.timeout_seconds'</span>, <span class="hljs-string">'30'</span>)
-    svcPHP.loadBalancer.setAttribute(<span class="hljs-string">'load_balancing.cross_zone.enabled'</span>, <span class="hljs-string">'true'</span>)
-
-    <span class="hljs-keyword">new</span> cdk.CfnOutput(<span class="hljs-keyword">this</span>, <span class="hljs-string">'ApiSixDashboardURL'</span>, {
-      value: <span class="hljs-string">`http://<span class="hljs-subst">${svc.loadBalancer.loadBalancerDnsName}</span>/apisix/dashboard/`</span>
-    })
-  }
-}
-
-<span class="hljs-keyword">const</span> devEnv = {
-  account: process.env.CDK_DEFAULT_ACCOUNT,
-  region: process.env.CDK_DEFAULT_REGION,
-};
-
-<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> cdk.App();
-
-<span class="hljs-keyword">new</span> ApiSixStack(app, <span class="hljs-string">'apisix-stack-dev'</span>, { env: devEnv });
-
-app.synth();
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="deploy-the-apisix-stack-with-aws-cdk"></a><a href="#deploy-the-apisix-stack-with-aws-cdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 [...]
-<pre><code class="hljs css language-bash">$ cdk diff
-$ cdk deploy
-</code></pre>
-<p>On deployment complete, some outputs will be returned:</p>
-<pre><code class="hljs css language-bash">Outputs:
-apiSix.PhpServiceLoadBalancerDNS5E5BAB1B = apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-apiSix.ApiSixDashboardURL = http://apiSi-ApiSi-1TM103DN35GRY-1477666967.us-west-2.elb.amazonaws.com/apisix/dashboard/
-apiSix.ApiSixServiceLoadBalancerDNSD4E5B8CB = apiSi-ApiSi-1TM103DN35GRY-1477666967.us-west-2.elb.amazonaws.com
-apiSix.ApiSixServiceServiceURLF6EC7872 = http://apiSi-ApiSi-1TM103DN35GRY-1477666967.us-west-2.elb.amazonaws.com
-</code></pre>
-<p>Open the <code>apiSix.ApiSixDashboardURL</code> from your browser and you will see the login prompt.</p>
-<h3><a class="anchor" aria-hidden="true" id="configure-the-upstream-nodes"></a><a href="#configure-the-upstream-nodes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
-<p>All upstream nodes are running as <strong>AWS Fargate</strong> tasks and registered to the <strong>NLB(Network Load Balancer)</strong> exposing multiple static IP addresses. We can query the IP addresses by <strong>nslookup</strong> the <strong>apiSix.PhpServiceLoadBalancerDNS5E5BAB1B</strong> like this:</p>
-<pre><code class="hljs css language-bash">$ nslookup apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-Server:         192.168.31.1
-Address:        192.168.31.1<span class="hljs-comment">#53</span>
-
-Non-authoritative answer:
-Name:   apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-Address: 44.224.124.213
-Name:   apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-Address: 18.236.43.167
-Name:   apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-Address: 35.164.164.178
-Name:   apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-Address: 44.226.102.63
-</code></pre>
-<p>Configure the IP addresses returned as your upstream nodes in your <strong>APISIX</strong> dashboard followed by the <strong>Services</strong> and <strong>Routes</strong> configuration. Let's say we have a <code>/index.php</code> as the URI for the first route for our first <strong>Service</strong> from the <strong>Upstream</strong> IP addresses.</p>
-<p><img src="https://apisix.apache.org/images/aws-nlb-ip-addr.png" alt="">
-<img src="https://apisix.apache.org/images/aws-define-service.png" alt="">
-<img src="https://apisix.apache.org/images/aws-define-route.png" alt=""></p>
-<h2><a class="anchor" aria-hidden="true" id="validation"></a><a href="#validation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>OK. Let's test the <code>/index.php</code> on <code>{apiSix.ApiSixServiceServiceURL}/index.php</code></p>
-<p><img src="https://apisix.apache.org/images/aws-caddy-php-welcome-page.png" alt=""></p>
-<p>Now we have been successfully running <strong>APISIX</strong> in AWS Fargate as serverless container API Gateway service.</p>
-<h2><a class="anchor" aria-hidden="true" id="clean-up"></a><a href="#clean-up" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<pre><code class="hljs css language-bash">$ cdk destroy
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="running-apisix-in-aws-china-regions"></a><a href="#running-apisix-in-aws-china-regions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2 [...]
-<p>update <code>src/main.ts</code></p>
-<pre><code class="hljs css language-js">  taskDefinition
-    .addContainer(<span class="hljs-string">'etcd'</span>, {
-      <span class="hljs-attr">image</span>: ContainerImage.fromRegistry(<span class="hljs-string">'gcr.azk8s.cn/etcd-development/etcd:v3.3.12'</span>),
-      <span class="hljs-comment">// image: ContainerImage.fromRegistry('gcr.io/etcd-development/etcd:v3.3.12'),</span>
-    })
-    .addPortMappings({
-      <span class="hljs-attr">containerPort</span>: <span class="hljs-number">2379</span>
-    })
-</code></pre>
-<p><em>(read <a href="https://github.com/iresty/docker-apisix/blob/9a731f698171f4838e9bc0f1c05d6dda130ca89b/example/docker-compose.yml#L18-L19">here</a> for more reference)</em></p>
-<p>Run <code>cdk deploy</code> and specify your preferred AWS region in China.</p>
-<pre><code class="hljs css language-bash"><span class="hljs-comment"># let's say we have another AWS_PROFILE for China regions called 'cn'</span>
-<span class="hljs-comment"># make sure you have aws configure --profile=cn properly.</span>
-<span class="hljs-comment">#</span>
-<span class="hljs-comment"># deploy to NingXia region</span>
-$ cdk deploy --profile cn -c region=cn-northwest-1
-<span class="hljs-comment"># deploy to Beijing region</span>
-$ cdk deploy --profile cn -c region=cn-north-1
-</code></pre>
-<p>In the following case, we got the <code>Outputs</code> returned for <strong>AWS Ningxia region(cn-northwest-1)</strong>:</p>
-<pre><code class="hljs css language-bash">Outputs:
-apiSix.PhpServiceLoadBalancerDNS5E5BAB1B = apiSi-PhpSe-1760FFS3K7TXH-562fa1f7f642ec24.elb.cn-northwest-1.amazonaws.com.cn
-apiSix.ApiSixDashboardURL = http://apiSi-ApiSi-123HOROQKWZKA-1268325233.cn-northwest-1.elb.amazonaws.com.cn/apisix/dashboard/
-apiSix.ApiSixServiceLoadBalancerDNSD4E5B8CB = apiSi-ApiSi-123HOROQKWZKA-1268325233.cn-northwest-1.elb.amazonaws.com.cn
-apiSix.ApiSixServiceServiceURLF6EC7872 = http://apiSi-ApiSi-123HOROQKWZKA-1268325233.cn-northwest-1.elb.amazonaws.com.cn
-</code></pre>
-<p>Open the <code>apiSix.ApiSixDashboardURL</code> URL and log in to configure your <strong>APISIX</strong> in AWS China region.</p>
-<p><em>TBD</em></p>
-<h2><a class="anchor" aria-hidden="true" id="decouple-apisix-and-etcd3-on-aws"></a><a href="#decouple-apisix-and-etcd3-on-aws" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
-<p>For high availability and state consistency consideration, you might be interested to decouple the <strong>etcd3</strong> as a separate cluster from <strong>APISIX</strong> not only for performance but also high availability and fault tolerance yet with highly reliable state consistency.</p>
-<p><em>TBD</em></p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#architecture">Architecture</a></li><li><a href="#generate-an-aws-cdk-project-with-projen">Generate an AWS CDK project with <code>projen</code></a></li><li><a href="#update-srcmaints">update <code>src/main.ts</code></a></li><li><a href="#deploy-the-apisix-stack-with-aws-cdk">Deploy the APISIX Stack with AWS CDK</a><ul class="toc-headings"><li><a href="#co [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/aws/index.html b/apisix/aws/index.html
deleted file mode 100644
index 4e2e4db..0000000
--- a/apisix/aws/index.html
+++ /dev/null
@@ -1,246 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/aws · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/aws · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" content="https:/ [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="running-apisix-in-aws-with-aws-cdk"></a><a href="#running-apisix-in-aws-with-aws-cdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
-<p><a href="https://github.com/apache/apisix">APISIX</a> is a cloud-native microservices API gateway, delivering the ultimate performance, security, open source and scalable platform for all your APIs and microservices.</p>
-<h2><a class="anchor" aria-hidden="true" id="architecture"></a><a href="#architecture" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>This reference architecture walks you through building <strong>APISIX</strong> as a serverless container API Gateway on top of AWS Fargate with AWS CDK.</p>
-<p><img src="https://apisix.apache.org/images/aws-fargate-cdk.png" alt=""></p>
-<h2><a class="anchor" aria-hidden="true" id="generate-an-aws-cdk-project-with-projen"></a><a href="#generate-an-aws-cdk-project-with-projen" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2  [...]
-<pre><code class="hljs css language-bash">$ mkdir apisix-aws
-$ <span class="hljs-built_in">cd</span> <span class="hljs-variable">$_</span>
-$ npx projen new awscdk-app-ts
-</code></pre>
-<p>update the <code>.projenrc.js</code> with the following content:</p>
-<pre><code class="hljs css language-js"><span class="hljs-keyword">const</span> { AwsCdkTypeScriptApp } = <span class="hljs-built_in">require</span>(<span class="hljs-string">'projen'</span>);
-
-<span class="hljs-keyword">const</span> project = <span class="hljs-keyword">new</span> AwsCdkTypeScriptApp({
-  <span class="hljs-attr">cdkVersion</span>: <span class="hljs-string">"1.70.0"</span>,
-  <span class="hljs-attr">name</span>: <span class="hljs-string">"apisix-aws"</span>,
-  <span class="hljs-attr">cdkDependencies</span>: [
-    <span class="hljs-string">'@aws-cdk/aws-ec2'</span>,
-    <span class="hljs-string">'@aws-cdk/aws-ecs'</span>,
-    <span class="hljs-string">'@aws-cdk/aws-ecs-patterns'</span>,
-  ]
-});
-
-project.synth();
-</code></pre>
-<p>update the project:</p>
-<pre><code class="hljs css language-ts">$ npx projen
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="update-srcmaints"></a><a href="#update-srcmaints" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<pre><code class="hljs css language-ts"><span class="hljs-keyword">import</span> * <span class="hljs-keyword">as</span> cdk <span class="hljs-keyword">from</span> <span class="hljs-string">'@aws-cdk/core'</span>;
-<span class="hljs-keyword">import</span> { Vpc, Port } <span class="hljs-keyword">from</span> <span class="hljs-string">'@aws-cdk/aws-ec2'</span>;
-<span class="hljs-keyword">import</span> { Cluster, ContainerImage, TaskDefinition, Compatibility } <span class="hljs-keyword">from</span> <span class="hljs-string">'@aws-cdk/aws-ecs'</span>;
-<span class="hljs-keyword">import</span> { ApplicationLoadBalancedFargateService, NetworkLoadBalancedFargateService } <span class="hljs-keyword">from</span> <span class="hljs-string">'@aws-cdk/aws-ecs-patterns'</span>;
-
-<span class="hljs-keyword">export</span> <span class="hljs-keyword">class</span> ApiSixStack <span class="hljs-keyword">extends</span> cdk.Stack {
-  <span class="hljs-keyword">constructor</span>(<span class="hljs-params">scope: cdk.Construct, id: <span class="hljs-built_in">string</span>, props?: cdk.StackProps</span>) {
-    <span class="hljs-keyword">super</span>(scope, id, props);
-
-    <span class="hljs-keyword">const</span> vpc = Vpc.fromLookup(<span class="hljs-keyword">this</span>, <span class="hljs-string">'VPC'</span>, {
-      isDefault: <span class="hljs-literal">true</span>
-    })
-
-    <span class="hljs-keyword">const</span> cluster = <span class="hljs-keyword">new</span> Cluster(<span class="hljs-keyword">this</span>, <span class="hljs-string">'Cluster'</span>, {
-      vpc
-    })
-
-    <span class="hljs-comment">/**
-     * ApiSix service
-     */</span>
-    <span class="hljs-keyword">const</span> taskDefinition = <span class="hljs-keyword">new</span> TaskDefinition(<span class="hljs-keyword">this</span>, <span class="hljs-string">'TaskApiSix'</span>, {
-      compatibility: Compatibility.FARGATE,
-      memoryMiB: <span class="hljs-string">'512'</span>,
-      cpu: <span class="hljs-string">'256'</span>
-    })
-
-    taskDefinition
-      .addContainer(<span class="hljs-string">'apisix'</span>, {
-        image: ContainerImage.fromRegistry(<span class="hljs-string">'iresty/apisix'</span>),
-      })
-      .addPortMappings({
-        containerPort: <span class="hljs-number">9080</span>
-      })
-
-    taskDefinition
-      .addContainer(<span class="hljs-string">'etcd'</span>, {
-        image: ContainerImage.fromRegistry(<span class="hljs-string">'gcr.azk8s.cn/etcd-development/etcd:v3.3.12'</span>),
-        <span class="hljs-comment">// image: ContainerImage.fromRegistry('gcr.io/etcd-development/etcd:v3.3.12'),</span>
-      })
-      .addPortMappings({
-        containerPort: <span class="hljs-number">2379</span>
-      })
-
-    <span class="hljs-keyword">const</span> svc = <span class="hljs-keyword">new</span> ApplicationLoadBalancedFargateService(<span class="hljs-keyword">this</span>, <span class="hljs-string">'ApiSixService'</span>, {
-      cluster,
-      taskDefinition,
-    })
-
-    svc.targetGroup.setAttribute(<span class="hljs-string">'deregistration_delay.timeout_seconds'</span>, <span class="hljs-string">'30'</span>)
-    svc.targetGroup.configureHealthCheck({
-      interval: cdk.Duration.seconds(<span class="hljs-number">5</span>),
-      healthyHttpCodes: <span class="hljs-string">'404'</span>,
-      healthyThresholdCount: <span class="hljs-number">2</span>,
-      unhealthyThresholdCount: <span class="hljs-number">3</span>,
-      timeout: cdk.Duration.seconds(<span class="hljs-number">4</span>)
-    })
-
-    <span class="hljs-comment">/**
-     * PHP service
-     */</span>
-    <span class="hljs-keyword">const</span> taskDefinitionPHP = <span class="hljs-keyword">new</span> TaskDefinition(<span class="hljs-keyword">this</span>, <span class="hljs-string">'TaskPHP'</span>, {
-      compatibility: Compatibility.FARGATE,
-      memoryMiB: <span class="hljs-string">'512'</span>,
-      cpu: <span class="hljs-string">'256'</span>
-    })
-
-    taskDefinitionPHP
-      .addContainer(<span class="hljs-string">'php'</span>, {
-        image: ContainerImage.fromRegistry(<span class="hljs-string">'abiosoft/caddy:php'</span>),
-      })
-      .addPortMappings({
-        containerPort: <span class="hljs-number">2015</span>
-      })
-
-    <span class="hljs-keyword">const</span> svcPHP = <span class="hljs-keyword">new</span> NetworkLoadBalancedFargateService(<span class="hljs-keyword">this</span>, <span class="hljs-string">'PhpService'</span>, {
-      cluster,
-      taskDefinition: taskDefinitionPHP,
-      assignPublicIp: <span class="hljs-literal">true</span>,
-    })
-
-    <span class="hljs-comment">// allow Fargate task behind NLB to accept all traffic</span>
-    svcPHP.service.connections.allowFromAnyIpv4(Port.tcp(<span class="hljs-number">2015</span>))
-    svcPHP.targetGroup.setAttribute(<span class="hljs-string">'deregistration_delay.timeout_seconds'</span>, <span class="hljs-string">'30'</span>)
-    svcPHP.loadBalancer.setAttribute(<span class="hljs-string">'load_balancing.cross_zone.enabled'</span>, <span class="hljs-string">'true'</span>)
-
-    <span class="hljs-keyword">new</span> cdk.CfnOutput(<span class="hljs-keyword">this</span>, <span class="hljs-string">'ApiSixDashboardURL'</span>, {
-      value: <span class="hljs-string">`http://<span class="hljs-subst">${svc.loadBalancer.loadBalancerDnsName}</span>/apisix/dashboard/`</span>
-    })
-  }
-}
-
-<span class="hljs-keyword">const</span> devEnv = {
-  account: process.env.CDK_DEFAULT_ACCOUNT,
-  region: process.env.CDK_DEFAULT_REGION,
-};
-
-<span class="hljs-keyword">const</span> app = <span class="hljs-keyword">new</span> cdk.App();
-
-<span class="hljs-keyword">new</span> ApiSixStack(app, <span class="hljs-string">'apisix-stack-dev'</span>, { env: devEnv });
-
-app.synth();
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="deploy-the-apisix-stack-with-aws-cdk"></a><a href="#deploy-the-apisix-stack-with-aws-cdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 [...]
-<pre><code class="hljs css language-bash">$ cdk diff
-$ cdk deploy
-</code></pre>
-<p>On deployment complete, some outputs will be returned:</p>
-<pre><code class="hljs css language-bash">Outputs:
-apiSix.PhpServiceLoadBalancerDNS5E5BAB1B = apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-apiSix.ApiSixDashboardURL = http://apiSi-ApiSi-1TM103DN35GRY-1477666967.us-west-2.elb.amazonaws.com/apisix/dashboard/
-apiSix.ApiSixServiceLoadBalancerDNSD4E5B8CB = apiSi-ApiSi-1TM103DN35GRY-1477666967.us-west-2.elb.amazonaws.com
-apiSix.ApiSixServiceServiceURLF6EC7872 = http://apiSi-ApiSi-1TM103DN35GRY-1477666967.us-west-2.elb.amazonaws.com
-</code></pre>
-<p>Open the <code>apiSix.ApiSixDashboardURL</code> from your browser and you will see the login prompt.</p>
-<h3><a class="anchor" aria-hidden="true" id="configure-the-upstream-nodes"></a><a href="#configure-the-upstream-nodes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
-<p>All upstream nodes are running as <strong>AWS Fargate</strong> tasks and registered to the <strong>NLB(Network Load Balancer)</strong> exposing multiple static IP addresses. We can query the IP addresses by <strong>nslookup</strong> the <strong>apiSix.PhpServiceLoadBalancerDNS5E5BAB1B</strong> like this:</p>
-<pre><code class="hljs css language-bash">$ nslookup apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-Server:         192.168.31.1
-Address:        192.168.31.1<span class="hljs-comment">#53</span>
-
-Non-authoritative answer:
-Name:   apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-Address: 44.224.124.213
-Name:   apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-Address: 18.236.43.167
-Name:   apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-Address: 35.164.164.178
-Name:   apiSi-PhpSe-FOL2MM4TW7G8-09029e095ab36fcc.elb.us-west-2.amazonaws.com
-Address: 44.226.102.63
-</code></pre>
-<p>Configure the IP addresses returned as your upstream nodes in your <strong>APISIX</strong> dashboard followed by the <strong>Services</strong> and <strong>Routes</strong> configuration. Let's say we have a <code>/index.php</code> as the URI for the first route for our first <strong>Service</strong> from the <strong>Upstream</strong> IP addresses.</p>
-<p><img src="https://apisix.apache.org/images/aws-nlb-ip-addr.png" alt="">
-<img src="https://apisix.apache.org/images/aws-define-service.png" alt="">
-<img src="https://apisix.apache.org/images/aws-define-route.png" alt=""></p>
-<h2><a class="anchor" aria-hidden="true" id="validation"></a><a href="#validation" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>OK. Let's test the <code>/index.php</code> on <code>{apiSix.ApiSixServiceServiceURL}/index.php</code></p>
-<p><img src="https://apisix.apache.org/images/aws-caddy-php-welcome-page.png" alt=""></p>
-<p>Now we have been successfully running <strong>APISIX</strong> in AWS Fargate as serverless container API Gateway service.</p>
-<h2><a class="anchor" aria-hidden="true" id="clean-up"></a><a href="#clean-up" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<pre><code class="hljs css language-bash">$ cdk destroy
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="running-apisix-in-aws-china-regions"></a><a href="#running-apisix-in-aws-china-regions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2 [...]
-<p>update <code>src/main.ts</code></p>
-<pre><code class="hljs css language-js">  taskDefinition
-    .addContainer(<span class="hljs-string">'etcd'</span>, {
-      <span class="hljs-attr">image</span>: ContainerImage.fromRegistry(<span class="hljs-string">'gcr.azk8s.cn/etcd-development/etcd:v3.3.12'</span>),
-      <span class="hljs-comment">// image: ContainerImage.fromRegistry('gcr.io/etcd-development/etcd:v3.3.12'),</span>
-    })
-    .addPortMappings({
-      <span class="hljs-attr">containerPort</span>: <span class="hljs-number">2379</span>
-    })
-</code></pre>
-<p><em>(read <a href="https://github.com/iresty/docker-apisix/blob/9a731f698171f4838e9bc0f1c05d6dda130ca89b/example/docker-compose.yml#L18-L19">here</a> for more reference)</em></p>
-<p>Run <code>cdk deploy</code> and specify your preferred AWS region in China.</p>
-<pre><code class="hljs css language-bash"><span class="hljs-comment"># let's say we have another AWS_PROFILE for China regions called 'cn'</span>
-<span class="hljs-comment"># make sure you have aws configure --profile=cn properly.</span>
-<span class="hljs-comment">#</span>
-<span class="hljs-comment"># deploy to NingXia region</span>
-$ cdk deploy --profile cn -c region=cn-northwest-1
-<span class="hljs-comment"># deploy to Beijing region</span>
-$ cdk deploy --profile cn -c region=cn-north-1
-</code></pre>
-<p>In the following case, we got the <code>Outputs</code> returned for <strong>AWS Ningxia region(cn-northwest-1)</strong>:</p>
-<pre><code class="hljs css language-bash">Outputs:
-apiSix.PhpServiceLoadBalancerDNS5E5BAB1B = apiSi-PhpSe-1760FFS3K7TXH-562fa1f7f642ec24.elb.cn-northwest-1.amazonaws.com.cn
-apiSix.ApiSixDashboardURL = http://apiSi-ApiSi-123HOROQKWZKA-1268325233.cn-northwest-1.elb.amazonaws.com.cn/apisix/dashboard/
-apiSix.ApiSixServiceLoadBalancerDNSD4E5B8CB = apiSi-ApiSi-123HOROQKWZKA-1268325233.cn-northwest-1.elb.amazonaws.com.cn
-apiSix.ApiSixServiceServiceURLF6EC7872 = http://apiSi-ApiSi-123HOROQKWZKA-1268325233.cn-northwest-1.elb.amazonaws.com.cn
-</code></pre>
-<p>Open the <code>apiSix.ApiSixDashboardURL</code> URL and log in to configure your <strong>APISIX</strong> in AWS China region.</p>
-<p><em>TBD</em></p>
-<h2><a class="anchor" aria-hidden="true" id="decouple-apisix-and-etcd3-on-aws"></a><a href="#decouple-apisix-and-etcd3-on-aws" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
-<p>For high availability and state consistency consideration, you might be interested to decouple the <strong>etcd3</strong> as a separate cluster from <strong>APISIX</strong> not only for performance but also high availability and fault tolerance yet with highly reliable state consistency.</p>
-<p><em>TBD</em></p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#architecture">Architecture</a></li><li><a href="#generate-an-aws-cdk-project-with-projen">Generate an AWS CDK project with <code>projen</code></a></li><li><a href="#update-srcmaints">update <code>src/main.ts</code></a></li><li><a href="#deploy-the-apisix-stack-with-aws-cdk">Deploy the APISIX Stack with AWS CDK</a><ul class="toc-headings"><li><a href="#co [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/batch-processor.html b/apisix/batch-processor.html
deleted file mode 100644
index 75ec732..0000000
--- a/apisix/batch-processor.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/batch-processor · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/batch-processor · Apache APISIX™"/><meta property="og:type" content="website"/><meta property=" [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="batch-processor"></a><a href="#batch-processor" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<p>The batch processor can be used to aggregate entries(logs/any data) and process them in a batch.
-When the batch_max_size is set to zero the processor will execute each entry immediately. Setting the batch max size more
-than 1 will start aggregating the entries until it reaches the max size or the timeout expires.</p>
-<h2><a class="anchor" aria-hidden="true" id="configurations"></a><a href="#configurations" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>The only mandatory parameter to create a batch processor is a function. The function will be executed when the batch reaches the max size
-or when the buffer duration exceeds.</p>
-<table>
-<thead>
-<tr><th>Name</th><th>Requirement</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>id</td><td>optional</td><td>A unique identifier to identity the batch processor</td></tr>
-<tr><td>batch_max_size</td><td>optional</td><td>Max size of each batch, default is 1000</td></tr>
-<tr><td>inactive_timeout</td><td>optional</td><td>maximum age in seconds when the buffer will be flushed if inactive, default is 5s</td></tr>
-<tr><td>buffer_duration</td><td>optional</td><td>Maximum age in seconds of the oldest entry in a batch before the batch must be processed, default is 5</td></tr>
-<tr><td>max_retry_count</td><td>optional</td><td>Maximum number of retries before removing from the processing pipe line; default is zero</td></tr>
-<tr><td>retry_delay</td><td>optional</td><td>Number of seconds the process execution should be delayed if the execution fails; default is 1</td></tr>
-</tbody>
-</table>
-<p>The following code shows an example of how to use a batch processor. The batch processor takes a function to be executed as the first
-argument and the batch configuration as the second parameter.</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> bp = <span class="hljs-built_in">require</span>(<span class="hljs-string">"apisix.plugins.batch-processor"</span>)
-<span class="hljs-keyword">local</span> func_to_execute = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(entries)</span></span>
-            <span class="hljs-comment">-- serialize to json array core.json.encode(entries)</span>
-            <span class="hljs-comment">-- process/send data</span>
-            <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>
-       <span class="hljs-keyword">end</span>
-
-<span class="hljs-keyword">local</span> <span class="hljs-built_in">config</span> = {
-    max_retry_count  = <span class="hljs-number">2</span>,
-    buffer_duration  = <span class="hljs-number">60</span>,
-    inactive_timeout  = <span class="hljs-number">5</span>,
-    batch_max_size = <span class="hljs-number">1</span>,
-    retry_delay  = <span class="hljs-number">0</span>
-}
-
-
-<span class="hljs-keyword">local</span> batch_processor, err = bp:new(func_to_execute, <span class="hljs-built_in">config</span>)
-
-<span class="hljs-keyword">if</span> batch_processor <span class="hljs-keyword">then</span>
-    batch_processor:push({hello=<span class="hljs-string">'world'</span>})
-<span class="hljs-keyword">end</span>
-</code></pre>
-<p>Note: Please make sure the batch max size (entry count) is within the limits of the function execution.
-The timer to flush the batch runs based on the <code>inactive_timeout</code> configuration. Thus, for optimal usage,
-keep the <code>inactive_timeout</code> smaller than the <code>buffer_duration</code>.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#configurations">Configurations</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/s [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/batch-processor/index.html b/apisix/batch-processor/index.html
deleted file mode 100644
index 75ec732..0000000
--- a/apisix/batch-processor/index.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/batch-processor · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/batch-processor · Apache APISIX™"/><meta property="og:type" content="website"/><meta property=" [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="batch-processor"></a><a href="#batch-processor" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<p>The batch processor can be used to aggregate entries(logs/any data) and process them in a batch.
-When the batch_max_size is set to zero the processor will execute each entry immediately. Setting the batch max size more
-than 1 will start aggregating the entries until it reaches the max size or the timeout expires.</p>
-<h2><a class="anchor" aria-hidden="true" id="configurations"></a><a href="#configurations" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>The only mandatory parameter to create a batch processor is a function. The function will be executed when the batch reaches the max size
-or when the buffer duration exceeds.</p>
-<table>
-<thead>
-<tr><th>Name</th><th>Requirement</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>id</td><td>optional</td><td>A unique identifier to identity the batch processor</td></tr>
-<tr><td>batch_max_size</td><td>optional</td><td>Max size of each batch, default is 1000</td></tr>
-<tr><td>inactive_timeout</td><td>optional</td><td>maximum age in seconds when the buffer will be flushed if inactive, default is 5s</td></tr>
-<tr><td>buffer_duration</td><td>optional</td><td>Maximum age in seconds of the oldest entry in a batch before the batch must be processed, default is 5</td></tr>
-<tr><td>max_retry_count</td><td>optional</td><td>Maximum number of retries before removing from the processing pipe line; default is zero</td></tr>
-<tr><td>retry_delay</td><td>optional</td><td>Number of seconds the process execution should be delayed if the execution fails; default is 1</td></tr>
-</tbody>
-</table>
-<p>The following code shows an example of how to use a batch processor. The batch processor takes a function to be executed as the first
-argument and the batch configuration as the second parameter.</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> bp = <span class="hljs-built_in">require</span>(<span class="hljs-string">"apisix.plugins.batch-processor"</span>)
-<span class="hljs-keyword">local</span> func_to_execute = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(entries)</span></span>
-            <span class="hljs-comment">-- serialize to json array core.json.encode(entries)</span>
-            <span class="hljs-comment">-- process/send data</span>
-            <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>
-       <span class="hljs-keyword">end</span>
-
-<span class="hljs-keyword">local</span> <span class="hljs-built_in">config</span> = {
-    max_retry_count  = <span class="hljs-number">2</span>,
-    buffer_duration  = <span class="hljs-number">60</span>,
-    inactive_timeout  = <span class="hljs-number">5</span>,
-    batch_max_size = <span class="hljs-number">1</span>,
-    retry_delay  = <span class="hljs-number">0</span>
-}
-
-
-<span class="hljs-keyword">local</span> batch_processor, err = bp:new(func_to_execute, <span class="hljs-built_in">config</span>)
-
-<span class="hljs-keyword">if</span> batch_processor <span class="hljs-keyword">then</span>
-    batch_processor:push({hello=<span class="hljs-string">'world'</span>})
-<span class="hljs-keyword">end</span>
-</code></pre>
-<p>Note: Please make sure the batch max size (entry count) is within the limits of the function execution.
-The timer to flush the batch runs based on the <code>inactive_timeout</code> configuration. Thus, for optimal usage,
-keep the <code>inactive_timeout</code> smaller than the <code>buffer_duration</code>.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#configurations">Configurations</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/s [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/benchmark.html b/apisix/benchmark.html
deleted file mode 100644
index d480d08..0000000
--- a/apisix/benchmark.html
+++ /dev/null
@@ -1,115 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/benchmark · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/benchmark · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" cont [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/benchmark">Chinese</a></p>
-<h3><a class="anchor" aria-hidden="true" id="benchmark-environments"></a><a href="#benchmark-environments" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
-<p>n1-highcpu-8 (8 vCPUs, 7.2 GB memory) on Google Cloud</p>
-<p>But we <strong>only</strong> used 4 cores to run APISIX, and left 4 cores for system and <a href="https://github.com/wg/wrk">wrk</a>,
-which is the HTTP benchmarking tool.</p>
-<h3><a class="anchor" aria-hidden="true" id="benchmark-test-for-reverse-proxy"></a><a href="#benchmark-test-for-reverse-proxy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
-<p>Only used APISIX as the reverse proxy server, with no logging, limit rate, or other plugins enabled,
-and the response size was 1KB.</p>
-<h4><a class="anchor" aria-hidden="true" id="qps"></a><a href="#qps" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
-<p>The x-axis means the size of CPU core, and the y-axis is QPS.</p>
-<p><img src="https://apisix.apache.org/images/benchmark-1.jpg" width="70%" height="70%"></p>
-<h4><a class="anchor" aria-hidden="true" id="latency"></a><a href="#latency" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Note the y-axis latency in <strong>microsecond(μs)</strong> not millisecond.</p>
-<p><img src="https://apisix.apache.org/images/latency-1.jpg" width="70%" height="70%"></p>
-<h4><a class="anchor" aria-hidden="true" id="flame-graph"></a><a href="#flame-graph" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p>The result of Flame Graph:
-<img src="../doc/images/flamegraph-1.jpg" alt="flamegraph-1"></p>
-<p>And if you want to run the benchmark test in your machine, you should run another Nginx to listen 80 port.</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "methods": ["GET"],
-    "uri": "/hello",
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:80": 1,
-            "127.0.0.2:80": 1
-        }
-    }
-}'
-</code></pre>
-<p>then run wrk:</p>
-<pre><code class="hljs css language-shell">wrk -d 60 --latency http://127.0.0.1:9080/hello
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="benchmark-test-for-reverse-proxy-enabled-2-plugins"></a><a href="#benchmark-test-for-reverse-proxy-enabled-2-plugins" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9  [...]
-<p>Only used APISIX as the reverse proxy server, enabled the limit rate and prometheus plugins,
-and the response size was 1KB.</p>
-<h4><a class="anchor" aria-hidden="true" id="qps-1"></a><a href="#qps-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>The x-axis means the size of CPU core, and the y-axis is QPS.</p>
-<p><img src="https://apisix.apache.org/images/benchmark-2.jpg" width="70%" height="70%"></p>
-<h4><a class="anchor" aria-hidden="true" id="latency-1"></a><a href="#latency-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
-<p>Note the y-axis latency in <strong>microsecond(μs)</strong> not millisecond.</p>
-<p><img src="https://apisix.apache.org/images/latency-2.jpg" width="70%" height="70%"></p>
-<h4><a class="anchor" aria-hidden="true" id="flame-graph-1"></a><a href="#flame-graph-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>The result of Flame Graph:
-<img src="https://apisix.apache.org/images/flamegraph-2.jpg" alt="flamegraph-2"></p>
-<p>And if you want to run the benchmark test in your machine, you should run another Nginx to listen 80 port.</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "methods": ["GET"],
-    "uri": "/hello",
-    "plugins": {
-        "limit-count": {
-            "count": 999999999,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        },
-        "prometheus":{}
-    },
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:80": 1,
-            "127.0.0.2:80": 1
-        }
-    }
-}'
-</code></pre>
-<p>then run wrk:</p>
-<pre><code class="hljs css language-shell">wrk -d 60 --latency http://127.0.0.1:9080/hello
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/security/">Security</a><a href="https://www.apache.org/foundation/sponsorship.html"> [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/benchmark/index.html b/apisix/benchmark/index.html
deleted file mode 100644
index d480d08..0000000
--- a/apisix/benchmark/index.html
+++ /dev/null
@@ -1,115 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/benchmark · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/benchmark · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" cont [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/benchmark">Chinese</a></p>
-<h3><a class="anchor" aria-hidden="true" id="benchmark-environments"></a><a href="#benchmark-environments" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
-<p>n1-highcpu-8 (8 vCPUs, 7.2 GB memory) on Google Cloud</p>
-<p>But we <strong>only</strong> used 4 cores to run APISIX, and left 4 cores for system and <a href="https://github.com/wg/wrk">wrk</a>,
-which is the HTTP benchmarking tool.</p>
-<h3><a class="anchor" aria-hidden="true" id="benchmark-test-for-reverse-proxy"></a><a href="#benchmark-test-for-reverse-proxy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
-<p>Only used APISIX as the reverse proxy server, with no logging, limit rate, or other plugins enabled,
-and the response size was 1KB.</p>
-<h4><a class="anchor" aria-hidden="true" id="qps"></a><a href="#qps" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
-<p>The x-axis means the size of CPU core, and the y-axis is QPS.</p>
-<p><img src="https://apisix.apache.org/images/benchmark-1.jpg" width="70%" height="70%"></p>
-<h4><a class="anchor" aria-hidden="true" id="latency"></a><a href="#latency" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Note the y-axis latency in <strong>microsecond(μs)</strong> not millisecond.</p>
-<p><img src="https://apisix.apache.org/images/latency-1.jpg" width="70%" height="70%"></p>
-<h4><a class="anchor" aria-hidden="true" id="flame-graph"></a><a href="#flame-graph" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p>The result of Flame Graph:
-<img src="../doc/images/flamegraph-1.jpg" alt="flamegraph-1"></p>
-<p>And if you want to run the benchmark test in your machine, you should run another Nginx to listen 80 port.</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "methods": ["GET"],
-    "uri": "/hello",
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:80": 1,
-            "127.0.0.2:80": 1
-        }
-    }
-}'
-</code></pre>
-<p>then run wrk:</p>
-<pre><code class="hljs css language-shell">wrk -d 60 --latency http://127.0.0.1:9080/hello
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="benchmark-test-for-reverse-proxy-enabled-2-plugins"></a><a href="#benchmark-test-for-reverse-proxy-enabled-2-plugins" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9  [...]
-<p>Only used APISIX as the reverse proxy server, enabled the limit rate and prometheus plugins,
-and the response size was 1KB.</p>
-<h4><a class="anchor" aria-hidden="true" id="qps-1"></a><a href="#qps-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>The x-axis means the size of CPU core, and the y-axis is QPS.</p>
-<p><img src="https://apisix.apache.org/images/benchmark-2.jpg" width="70%" height="70%"></p>
-<h4><a class="anchor" aria-hidden="true" id="latency-1"></a><a href="#latency-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
-<p>Note the y-axis latency in <strong>microsecond(μs)</strong> not millisecond.</p>
-<p><img src="https://apisix.apache.org/images/latency-2.jpg" width="70%" height="70%"></p>
-<h4><a class="anchor" aria-hidden="true" id="flame-graph-1"></a><a href="#flame-graph-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>The result of Flame Graph:
-<img src="https://apisix.apache.org/images/flamegraph-2.jpg" alt="flamegraph-2"></p>
-<p>And if you want to run the benchmark test in your machine, you should run another Nginx to listen 80 port.</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "methods": ["GET"],
-    "uri": "/hello",
-    "plugins": {
-        "limit-count": {
-            "count": 999999999,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        },
-        "prometheus":{}
-    },
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:80": 1,
-            "127.0.0.2:80": 1
-        }
-    }
-}'
-</code></pre>
-<p>then run wrk:</p>
-<pre><code class="hljs css language-shell">wrk -d 60 --latency http://127.0.0.1:9080/hello
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/security/">Security</a><a href="https://www.apache.org/foundation/sponsorship.html"> [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/control-api.html b/apisix/control-api.html
deleted file mode 100644
index 3bbda56..0000000
--- a/apisix/control-api.html
+++ /dev/null
@@ -1,182 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/control-api · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/control-api · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url"  [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p>The control API can be used to</p>
-<ul>
-<li>expose APISIX internal state</li>
-<li>control the behavior of a single isolate APISIX data panel</li>
-</ul>
-<p>By default, the control API server is enabled and listens to <code>127.0.0.1:9090</code>. You can change it via
-the <code>control</code> section under <code>apisix</code> in <code>conf/config.yaml</code>:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">apisix:</span>
-  <span class="hljs-string">...</span>
-  <span class="hljs-attr">enable_control:</span> <span class="hljs-literal">true</span>
-  <span class="hljs-attr">control:</span>
-    <span class="hljs-attr">ip:</span> <span class="hljs-string">"127.0.0.1"</span>
-    <span class="hljs-attr">port:</span> <span class="hljs-number">9090</span>
-</code></pre>
-<p>Note that the control API server should not be configured to listen to the public traffic!</p>
-<h2><a class="anchor" aria-hidden="true" id="control-api-added-via-plugin"></a><a href="#control-api-added-via-plugin" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
-<p>Plugin can add its control API when it is enabled.
-If a plugin adds such a control API, please refer to each plugin's documentation for those APIs.</p>
-<h2><a class="anchor" aria-hidden="true" id="plugin-independent-control-api"></a><a href="#plugin-independent-control-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
-<p>Here is the supported API:</p>
-<h3><a class="anchor" aria-hidden="true" id="get-v1schema"></a><a href="#get-v1schema" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Introduced since <code>v2.2</code>.</p>
-<p>Return the jsonschema used by this APISIX instance in the format below:</p>
-<pre><code class="hljs css language-json">{
-    "main": {
-        "route": {
-            "properties": {...}
-        },
-        "upstream": {
-            "properties": {...}
-        },
-        ...
-    },
-    "plugins": {
-        "example-plugin": {
-            "consumer_schema": {...},
-            "metadata_schema": {...},
-            "schema": {...},
-            "type": ...,
-            "priority": 0,
-            "version": 0.1
-        },
-        ...
-    }
-}
-</code></pre>
-<p>For <code>plugins</code> part, only enabled plugins will be returned. Some plugins may lack
-of fields like <code>consumer_schema</code> or <code>type</code>, it is dependended by the plugin's
-definition.</p>
-<h3><a class="anchor" aria-hidden="true" id="get-v1healthcheck"></a><a href="#get-v1healthcheck" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Introduced since <code>v2.3</code>.</p>
-<p>Return current <a href="/apisix/health-check">health check</a> status in the format below:</p>
-<pre><code class="hljs css language-json">[
-    {
-        <span class="hljs-attr">"healthy_nodes"</span>: [
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            }
-        ],
-        <span class="hljs-attr">"name"</span>: <span class="hljs-string">"upstream#/upstreams/1"</span>,
-        <span class="hljs-attr">"nodes"</span>: [
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            },
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.2"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1988</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            }
-        ],
-        <span class="hljs-attr">"src_id"</span>: <span class="hljs-string">"1"</span>,
-        <span class="hljs-attr">"src_type"</span>: <span class="hljs-string">"upstreams"</span>
-    },
-    {
-        <span class="hljs-attr">"healthy_nodes"</span>: [
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            }
-        ],
-        <span class="hljs-attr">"name"</span>: <span class="hljs-string">"upstream#/routes/1"</span>,
-        <span class="hljs-attr">"nodes"</span>: [
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            },
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1988</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            }
-        ],
-        <span class="hljs-attr">"src_id"</span>: <span class="hljs-string">"1"</span>,
-        <span class="hljs-attr">"src_type"</span>: <span class="hljs-string">"routes"</span>
-    }
-]
-</code></pre>
-<p>Each entry contains fields below:</p>
-<ul>
-<li>src_type: where the health checker comes from. The value is one of <code>[&quot;routes&quot;, &quot;services&quot;, &quot;upstreams&quot;]</code>.</li>
-<li>src_id: the id of object which creates the health checker. For example, if Upstream
-object with id 1 creates a health checker, the <code>src_type</code> is <code>upstreams</code> and the <code>src_id</code> is <code>1</code>.</li>
-<li>name: the name of the health checker.</li>
-<li>nodes: the target nodes of the health checker.</li>
-<li>healthy_nodes: the healthy node known by the health checker.</li>
-</ul>
-<p>User can also use <code>/v1/healthcheck/$src_type/$src_id</code> can get the status of a health checker.</p>
-<p>For example, <code>GET /v1/healthcheck/upstreams/1</code> returns:</p>
-<pre><code class="hljs css language-json">{
-    <span class="hljs-attr">"healthy_nodes"</span>: [
-        {
-            <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-            <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-            <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-        }
-    ],
-    <span class="hljs-attr">"name"</span>: <span class="hljs-string">"upstream#/upstreams/1"</span>,
-    <span class="hljs-attr">"nodes"</span>: [
-        {
-            <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-            <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-            <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-        },
-        {
-            <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.2"</span>,
-            <span class="hljs-attr">"port"</span>: <span class="hljs-number">1988</span>,
-            <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-        }
-    ],
-    <span class="hljs-attr">"src_id"</span>: <span class="hljs-string">"1"</span>,
-    <span class="hljs-attr">"src_type"</span>: <span class="hljs-string">"upstreams"</span>
-}
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#control-api-added-via-plugin">Control API Added via plugin</a></li><li><a href="#plugin-independent-control-api">Plugin independent Control API</a><ul class="toc-headings"><li><a href="#get-v1schema">GET /v1/schema</a></li><li><a href="#get-v1healthcheck">GET /v1/healthcheck</a></li></ul></li></ul></nav></div><footer class="nav-footer" id="footer"><secti [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/control-api/index.html b/apisix/control-api/index.html
deleted file mode 100644
index 3bbda56..0000000
--- a/apisix/control-api/index.html
+++ /dev/null
@@ -1,182 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/control-api · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/control-api · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url"  [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p>The control API can be used to</p>
-<ul>
-<li>expose APISIX internal state</li>
-<li>control the behavior of a single isolate APISIX data panel</li>
-</ul>
-<p>By default, the control API server is enabled and listens to <code>127.0.0.1:9090</code>. You can change it via
-the <code>control</code> section under <code>apisix</code> in <code>conf/config.yaml</code>:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">apisix:</span>
-  <span class="hljs-string">...</span>
-  <span class="hljs-attr">enable_control:</span> <span class="hljs-literal">true</span>
-  <span class="hljs-attr">control:</span>
-    <span class="hljs-attr">ip:</span> <span class="hljs-string">"127.0.0.1"</span>
-    <span class="hljs-attr">port:</span> <span class="hljs-number">9090</span>
-</code></pre>
-<p>Note that the control API server should not be configured to listen to the public traffic!</p>
-<h2><a class="anchor" aria-hidden="true" id="control-api-added-via-plugin"></a><a href="#control-api-added-via-plugin" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
-<p>Plugin can add its control API when it is enabled.
-If a plugin adds such a control API, please refer to each plugin's documentation for those APIs.</p>
-<h2><a class="anchor" aria-hidden="true" id="plugin-independent-control-api"></a><a href="#plugin-independent-control-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
-<p>Here is the supported API:</p>
-<h3><a class="anchor" aria-hidden="true" id="get-v1schema"></a><a href="#get-v1schema" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Introduced since <code>v2.2</code>.</p>
-<p>Return the jsonschema used by this APISIX instance in the format below:</p>
-<pre><code class="hljs css language-json">{
-    "main": {
-        "route": {
-            "properties": {...}
-        },
-        "upstream": {
-            "properties": {...}
-        },
-        ...
-    },
-    "plugins": {
-        "example-plugin": {
-            "consumer_schema": {...},
-            "metadata_schema": {...},
-            "schema": {...},
-            "type": ...,
-            "priority": 0,
-            "version": 0.1
-        },
-        ...
-    }
-}
-</code></pre>
-<p>For <code>plugins</code> part, only enabled plugins will be returned. Some plugins may lack
-of fields like <code>consumer_schema</code> or <code>type</code>, it is dependended by the plugin's
-definition.</p>
-<h3><a class="anchor" aria-hidden="true" id="get-v1healthcheck"></a><a href="#get-v1healthcheck" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Introduced since <code>v2.3</code>.</p>
-<p>Return current <a href="/apisix/health-check">health check</a> status in the format below:</p>
-<pre><code class="hljs css language-json">[
-    {
-        <span class="hljs-attr">"healthy_nodes"</span>: [
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            }
-        ],
-        <span class="hljs-attr">"name"</span>: <span class="hljs-string">"upstream#/upstreams/1"</span>,
-        <span class="hljs-attr">"nodes"</span>: [
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            },
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.2"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1988</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            }
-        ],
-        <span class="hljs-attr">"src_id"</span>: <span class="hljs-string">"1"</span>,
-        <span class="hljs-attr">"src_type"</span>: <span class="hljs-string">"upstreams"</span>
-    },
-    {
-        <span class="hljs-attr">"healthy_nodes"</span>: [
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            }
-        ],
-        <span class="hljs-attr">"name"</span>: <span class="hljs-string">"upstream#/routes/1"</span>,
-        <span class="hljs-attr">"nodes"</span>: [
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            },
-            {
-                <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-                <span class="hljs-attr">"port"</span>: <span class="hljs-number">1988</span>,
-                <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-            }
-        ],
-        <span class="hljs-attr">"src_id"</span>: <span class="hljs-string">"1"</span>,
-        <span class="hljs-attr">"src_type"</span>: <span class="hljs-string">"routes"</span>
-    }
-]
-</code></pre>
-<p>Each entry contains fields below:</p>
-<ul>
-<li>src_type: where the health checker comes from. The value is one of <code>[&quot;routes&quot;, &quot;services&quot;, &quot;upstreams&quot;]</code>.</li>
-<li>src_id: the id of object which creates the health checker. For example, if Upstream
-object with id 1 creates a health checker, the <code>src_type</code> is <code>upstreams</code> and the <code>src_id</code> is <code>1</code>.</li>
-<li>name: the name of the health checker.</li>
-<li>nodes: the target nodes of the health checker.</li>
-<li>healthy_nodes: the healthy node known by the health checker.</li>
-</ul>
-<p>User can also use <code>/v1/healthcheck/$src_type/$src_id</code> can get the status of a health checker.</p>
-<p>For example, <code>GET /v1/healthcheck/upstreams/1</code> returns:</p>
-<pre><code class="hljs css language-json">{
-    <span class="hljs-attr">"healthy_nodes"</span>: [
-        {
-            <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-            <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-            <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-        }
-    ],
-    <span class="hljs-attr">"name"</span>: <span class="hljs-string">"upstream#/upstreams/1"</span>,
-    <span class="hljs-attr">"nodes"</span>: [
-        {
-            <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.1"</span>,
-            <span class="hljs-attr">"port"</span>: <span class="hljs-number">1980</span>,
-            <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-        },
-        {
-            <span class="hljs-attr">"host"</span>: <span class="hljs-string">"127.0.0.2"</span>,
-            <span class="hljs-attr">"port"</span>: <span class="hljs-number">1988</span>,
-            <span class="hljs-attr">"weight"</span>: <span class="hljs-number">1</span>
-        }
-    ],
-    <span class="hljs-attr">"src_id"</span>: <span class="hljs-string">"1"</span>,
-    <span class="hljs-attr">"src_type"</span>: <span class="hljs-string">"upstreams"</span>
-}
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#control-api-added-via-plugin">Control API Added via plugin</a></li><li><a href="#plugin-independent-control-api">Plugin independent Control API</a><ul class="toc-headings"><li><a href="#get-v1schema">GET /v1/schema</a></li><li><a href="#get-v1healthcheck">GET /v1/healthcheck</a></li></ul></li></ul></nav></div><footer class="nav-footer" id="footer"><secti [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/customize-nginx-configuration.html b/apisix/customize-nginx-configuration.html
deleted file mode 100644
index 251ad97..0000000
--- a/apisix/customize-nginx-configuration.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/customize-nginx-configuration · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/customize-nginx-configuration · Apache APISIX™"/><meta property="og:type" content [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/customize-nginx-configuration">中文</a></p>
-<h1><a class="anchor" aria-hidden="true" id="customize-nginx-configuration"></a><a href="#customize-nginx-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
-<p>The Nginx configuration used by APISIX is generated via the template file <code>apisix/ngx_tpl.lua</code> and the options from <code>conf/config-default.yaml</code> / <code>conf/config.yaml</code>.</p>
-<p>You can take a look at the generated Nginx configuration in <code>conf/nginx.conf</code> after running <code>./bin/apisix start</code>.</p>
-<p>If you want to customize the Nginx configuration, please read through the <code>nginx_config</code> in <code>conf/config-default.yaml</code>. You can override the default value in the <code>conf/config.yaml</code>. For instance, you can inject some snippets in the <code>conf/nginx.conf</code> via configuring the <code>xxx_snippet</code> entries:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-string">...</span>
-<span class="hljs-comment"># put this in config.yaml:</span>
-<span class="hljs-attr">nginx_config:</span>
-    <span class="hljs-attr">main_configuration_snippet:</span> <span class="hljs-string">|
-        daemon on;
-</span>    <span class="hljs-attr">http_configuration_snippet:</span> <span class="hljs-string">|
-        server
-        {
-            listen 45651;
-            server_name _;
-            access_log off;
-</span>
-            <span class="hljs-string">location</span> <span class="hljs-string">/ysec_status</span> <span class="hljs-string">{</span>
-                <span class="hljs-string">req_status_show;</span>
-                <span class="hljs-string">allow</span> <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><span class="hljs-string">;</span>
-                <span class="hljs-string">deny</span> <span class="hljs-string">all;</span>
-            <span class="hljs-string">}</span>
-        <span class="hljs-string">}</span>
-
-        <span class="hljs-string">chunked_transfer_encoding</span> <span class="hljs-string">on;</span>
-
-    <span class="hljs-attr">http_server_configuration_snippet:</span> <span class="hljs-string">|
-        set $my "var";
-</span>    <span class="hljs-attr">http_admin_configuration_snippet:</span> <span class="hljs-string">|
-        log_format admin "$request_time $pipe";
-</span>    <span class="hljs-attr">http_end_configuration_snippet:</span> <span class="hljs-string">|
-        server_names_hash_bucket_size 128;
-</span>    <span class="hljs-attr">stream_configuration_snippet:</span> <span class="hljs-string">|
-        tcp_nodelay off;
-</span><span class="hljs-string">...</span>
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/security/">Security</a><a href="https://www.apache.org/foundation/sponsorship.html"> [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/customize-nginx-configuration/index.html b/apisix/customize-nginx-configuration/index.html
deleted file mode 100644
index 251ad97..0000000
--- a/apisix/customize-nginx-configuration/index.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/customize-nginx-configuration · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/customize-nginx-configuration · Apache APISIX™"/><meta property="og:type" content [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/customize-nginx-configuration">中文</a></p>
-<h1><a class="anchor" aria-hidden="true" id="customize-nginx-configuration"></a><a href="#customize-nginx-configuration" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12  [...]
-<p>The Nginx configuration used by APISIX is generated via the template file <code>apisix/ngx_tpl.lua</code> and the options from <code>conf/config-default.yaml</code> / <code>conf/config.yaml</code>.</p>
-<p>You can take a look at the generated Nginx configuration in <code>conf/nginx.conf</code> after running <code>./bin/apisix start</code>.</p>
-<p>If you want to customize the Nginx configuration, please read through the <code>nginx_config</code> in <code>conf/config-default.yaml</code>. You can override the default value in the <code>conf/config.yaml</code>. For instance, you can inject some snippets in the <code>conf/nginx.conf</code> via configuring the <code>xxx_snippet</code> entries:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-string">...</span>
-<span class="hljs-comment"># put this in config.yaml:</span>
-<span class="hljs-attr">nginx_config:</span>
-    <span class="hljs-attr">main_configuration_snippet:</span> <span class="hljs-string">|
-        daemon on;
-</span>    <span class="hljs-attr">http_configuration_snippet:</span> <span class="hljs-string">|
-        server
-        {
-            listen 45651;
-            server_name _;
-            access_log off;
-</span>
-            <span class="hljs-string">location</span> <span class="hljs-string">/ysec_status</span> <span class="hljs-string">{</span>
-                <span class="hljs-string">req_status_show;</span>
-                <span class="hljs-string">allow</span> <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span><span class="hljs-string">;</span>
-                <span class="hljs-string">deny</span> <span class="hljs-string">all;</span>
-            <span class="hljs-string">}</span>
-        <span class="hljs-string">}</span>
-
-        <span class="hljs-string">chunked_transfer_encoding</span> <span class="hljs-string">on;</span>
-
-    <span class="hljs-attr">http_server_configuration_snippet:</span> <span class="hljs-string">|
-        set $my "var";
-</span>    <span class="hljs-attr">http_admin_configuration_snippet:</span> <span class="hljs-string">|
-        log_format admin "$request_time $pipe";
-</span>    <span class="hljs-attr">http_end_configuration_snippet:</span> <span class="hljs-string">|
-        server_names_hash_bucket_size 128;
-</span>    <span class="hljs-attr">stream_configuration_snippet:</span> <span class="hljs-string">|
-        tcp_nodelay off;
-</span><span class="hljs-string">...</span>
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/security/">Security</a><a href="https://www.apache.org/foundation/sponsorship.html"> [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/debug-function.html b/apisix/debug-function.html
deleted file mode 100644
index 8bcea16..0000000
--- a/apisix/debug-function.html
+++ /dev/null
@@ -1,153 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/debug-function · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/debug-function · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/debug-function">Chinese</a></p>
-<h2><a class="anchor" aria-hidden="true" id="5xx-response-status-code"></a><a href="#5xx-response-status-code" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>Similar <code>5xx</code> status codes such as 500, 502, 503, etc., are the status codes in response to a server error. When a request has a <code>5xx</code> status code; it may come from <code>APISIX</code> or <code>Upstream</code>. How to identify the source of these response status codes is a very meaningful thing. It can quickly help us determine the problem.</p>
-<h2><a class="anchor" aria-hidden="true" id="how-to-identify-the-source-of-the-5xx-response-status-code"></a><a href="#how-to-identify-the-source-of-the-5xx-response-status-code" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 [...]
-<p>In the response header of the request, through the response header of <code>X-APISIX-Upstream-Status</code>, we can effectively identify the source of the <code>5xx</code> status code. When the <code>5xx</code> status code comes from <code>Upstream</code>, the response header <code>X-APISIX-Upstream-Status</code> can be seen in the response header, and the value of this response header is the response status code. When the <code>5xx</code> status code is derived from <code>APISIX</cod [...]
-<h2><a class="anchor" aria-hidden="true" id="example"></a><a href="#example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<blockquote>
-<p>Example 1: <code>502</code> response status code comes from <code>Upstream</code> (IP address is not available)</p>
-</blockquote>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "methods": ["GET"],
-    "upstream": {
-        "nodes": {
-            "127.0.0.1:1": 1
-        },
-        "type": "roundrobin"
-    },
-    "uri": "/hello"
-}'
-</code></pre>
-<p>Test:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/hello -v</span>
-......
-&lt; HTTP/1.1 502 Bad Gateway
-&lt; Date: Wed, 25 Nov 2020 14:40:22 GMT
-&lt; Content-Type: text/html; charset=utf-8
-&lt; Content-Length: 154
-&lt; Connection: keep-alive
-&lt; Server: APISIX/2.0
-&lt; X-APISIX-Upstream-Status: 502
-&lt;
-&lt;html&gt;
-&lt;head&gt;&lt;title&gt;502 Bad Gateway&lt;/title&gt;&lt;/head&gt;
-&lt;body&gt;
-&lt;center&gt;&lt;h1&gt;502 Bad Gateway&lt;/h1&gt;&lt;/center&gt;
-&lt;hr&gt;&lt;center&gt;openresty&lt;/center&gt;
-&lt;/body&gt;
-&lt;/html&gt;
-
-</code></pre>
-<p>It has a response header of <code>X-APISIX-Upstream-Status: 502</code>.</p>
-<blockquote>
-<p>Example 2: <code>502</code> response status code comes from <code>APISIX</code></p>
-</blockquote>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "plugins": {
-        "fault-injection": {
-            "abort": {
-                "http_status": 500,
-                "body": "Fault Injection!\n"
-            }
-        }
-    },
-    "uri": "/hello"
-}'
-</code></pre>
-<p>Test:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/hello -v</span>
-......
-&lt; HTTP/1.1 500 Internal Server Error
-&lt; Date: Wed, 25 Nov 2020 14:50:20 GMT
-&lt; Content-Type: text/plain; charset=utf-8
-&lt; Transfer-Encoding: chunked
-&lt; Connection: keep-alive
-&lt; Server: APISIX/2.0
-&lt;
-Fault Injection!
-</code></pre>
-<p>There is no response header for <code>X-APISIX-Upstream-Status</code>.</p>
-<blockquote>
-<p>Example 3: <code>Upstream</code> has multiple nodes, and all nodes are unavailable</p>
-</blockquote>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/upstreams/1  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "nodes": {
-        "127.0.0.3:1": 1,
-        "127.0.0.2:1": 1,
-        "127.0.0.1:1": 1
-    },
-    "retries": 2,
-    "type": "roundrobin"
-}'
-</code></pre>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/hello",
-    "upstream_id": "1"
-}'
-</code></pre>
-<p>Test:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/hello -v</span>
-&lt; HTTP/1.1 502 Bad Gateway
-&lt; Date: Wed, 25 Nov 2020 15:07:34 GMT
-&lt; Content-Type: text/html; charset=utf-8
-&lt; Content-Length: 154
-&lt; Connection: keep-alive
-&lt; Server: APISIX/2.0
-&lt; X-APISIX-Upstream-Status: 502, 502, 502
-&lt;
-&lt;html&gt;
-&lt;head&gt;&lt;title&gt;502 Bad Gateway&lt;/title&gt;&lt;/head&gt;
-&lt;body&gt;
-&lt;center&gt;&lt;h1&gt;502 Bad Gateway&lt;/h1&gt;&lt;/center&gt;
-&lt;hr&gt;&lt;center&gt;openresty&lt;/center&gt;
-&lt;/body&gt;
-&lt;/html&gt;
-</code></pre>
-<p>It has a response header of <code>X-APISIX-Upstream-Status: 502, 502, 502</code>.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#5xx-response-status-code"><code>5xx</code> response status code</a></li><li><a href="#how-to-identify-the-source-of-the-5xx-response-status-code">How to identify the source of the <code>5xx</code> response status code</a></li><li><a href="#example">Example</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/ [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/debug-function/index.html b/apisix/debug-function/index.html
deleted file mode 100644
index 8bcea16..0000000
--- a/apisix/debug-function/index.html
+++ /dev/null
@@ -1,153 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/debug-function · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/debug-function · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/debug-function">Chinese</a></p>
-<h2><a class="anchor" aria-hidden="true" id="5xx-response-status-code"></a><a href="#5xx-response-status-code" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>Similar <code>5xx</code> status codes such as 500, 502, 503, etc., are the status codes in response to a server error. When a request has a <code>5xx</code> status code; it may come from <code>APISIX</code> or <code>Upstream</code>. How to identify the source of these response status codes is a very meaningful thing. It can quickly help us determine the problem.</p>
-<h2><a class="anchor" aria-hidden="true" id="how-to-identify-the-source-of-the-5xx-response-status-code"></a><a href="#how-to-identify-the-source-of-the-5xx-response-status-code" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 [...]
-<p>In the response header of the request, through the response header of <code>X-APISIX-Upstream-Status</code>, we can effectively identify the source of the <code>5xx</code> status code. When the <code>5xx</code> status code comes from <code>Upstream</code>, the response header <code>X-APISIX-Upstream-Status</code> can be seen in the response header, and the value of this response header is the response status code. When the <code>5xx</code> status code is derived from <code>APISIX</cod [...]
-<h2><a class="anchor" aria-hidden="true" id="example"></a><a href="#example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<blockquote>
-<p>Example 1: <code>502</code> response status code comes from <code>Upstream</code> (IP address is not available)</p>
-</blockquote>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "methods": ["GET"],
-    "upstream": {
-        "nodes": {
-            "127.0.0.1:1": 1
-        },
-        "type": "roundrobin"
-    },
-    "uri": "/hello"
-}'
-</code></pre>
-<p>Test:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/hello -v</span>
-......
-&lt; HTTP/1.1 502 Bad Gateway
-&lt; Date: Wed, 25 Nov 2020 14:40:22 GMT
-&lt; Content-Type: text/html; charset=utf-8
-&lt; Content-Length: 154
-&lt; Connection: keep-alive
-&lt; Server: APISIX/2.0
-&lt; X-APISIX-Upstream-Status: 502
-&lt;
-&lt;html&gt;
-&lt;head&gt;&lt;title&gt;502 Bad Gateway&lt;/title&gt;&lt;/head&gt;
-&lt;body&gt;
-&lt;center&gt;&lt;h1&gt;502 Bad Gateway&lt;/h1&gt;&lt;/center&gt;
-&lt;hr&gt;&lt;center&gt;openresty&lt;/center&gt;
-&lt;/body&gt;
-&lt;/html&gt;
-
-</code></pre>
-<p>It has a response header of <code>X-APISIX-Upstream-Status: 502</code>.</p>
-<blockquote>
-<p>Example 2: <code>502</code> response status code comes from <code>APISIX</code></p>
-</blockquote>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "plugins": {
-        "fault-injection": {
-            "abort": {
-                "http_status": 500,
-                "body": "Fault Injection!\n"
-            }
-        }
-    },
-    "uri": "/hello"
-}'
-</code></pre>
-<p>Test:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/hello -v</span>
-......
-&lt; HTTP/1.1 500 Internal Server Error
-&lt; Date: Wed, 25 Nov 2020 14:50:20 GMT
-&lt; Content-Type: text/plain; charset=utf-8
-&lt; Transfer-Encoding: chunked
-&lt; Connection: keep-alive
-&lt; Server: APISIX/2.0
-&lt;
-Fault Injection!
-</code></pre>
-<p>There is no response header for <code>X-APISIX-Upstream-Status</code>.</p>
-<blockquote>
-<p>Example 3: <code>Upstream</code> has multiple nodes, and all nodes are unavailable</p>
-</blockquote>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/upstreams/1  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "nodes": {
-        "127.0.0.3:1": 1,
-        "127.0.0.2:1": 1,
-        "127.0.0.1:1": 1
-    },
-    "retries": 2,
-    "type": "roundrobin"
-}'
-</code></pre>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1  -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/hello",
-    "upstream_id": "1"
-}'
-</code></pre>
-<p>Test:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/hello -v</span>
-&lt; HTTP/1.1 502 Bad Gateway
-&lt; Date: Wed, 25 Nov 2020 15:07:34 GMT
-&lt; Content-Type: text/html; charset=utf-8
-&lt; Content-Length: 154
-&lt; Connection: keep-alive
-&lt; Server: APISIX/2.0
-&lt; X-APISIX-Upstream-Status: 502, 502, 502
-&lt;
-&lt;html&gt;
-&lt;head&gt;&lt;title&gt;502 Bad Gateway&lt;/title&gt;&lt;/head&gt;
-&lt;body&gt;
-&lt;center&gt;&lt;h1&gt;502 Bad Gateway&lt;/h1&gt;&lt;/center&gt;
-&lt;hr&gt;&lt;center&gt;openresty&lt;/center&gt;
-&lt;/body&gt;
-&lt;/html&gt;
-</code></pre>
-<p>It has a response header of <code>X-APISIX-Upstream-Status: 502, 502, 502</code>.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#5xx-response-status-code"><code>5xx</code> response status code</a></li><li><a href="#how-to-identify-the-source-of-the-5xx-response-status-code">How to identify the source of the <code>5xx</code> response status code</a></li><li><a href="#example">Example</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/ [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/discovery.html b/apisix/discovery.html
deleted file mode 100644
index c3bc364..0000000
--- a/apisix/discovery.html
+++ /dev/null
@@ -1,236 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/discovery · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/discovery · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" cont [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-[Chinese](/apisix/zh-cn/discovery)
-<h1><a class="anchor" aria-hidden="true" id="integration-service-discovery-registry"></a><a href="#integration-service-discovery-registry" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1. [...]
-<ul>
-<li><a href="#Summary"><strong>Summary</strong></a></li>
-<li><a href="#how-extend-the-discovery-client"><strong>How extend the discovery client?</strong></a>
-<ul>
-<li><a href="#basic-steps"><strong>Basic steps</strong></a></li>
-<li><a href="#the-example-of-eureka"><strong>the example of Eureka</strong></a>
-<ul>
-<li><a href="#implementation-of-eurekalua"><strong>Implementation of eureka.lua</strong></a></li>
-<li><a href="#how-convert-eurekas-instance-data-to-apisixs-node"><strong>How convert Eureka's instance data to APISIX's node?</strong></a></li>
-</ul></li>
-</ul></li>
-<li><a href="#configuration-for-discovery-client"><strong>Configuration for discovery client</strong></a>
-<ul>
-<li><a href="#initial-service-discovery"><strong>Initial service discovery</strong></a></li>
-<li><a href="#configuration-for-eureka"><strong>Configuration for Eureka</strong></a></li>
-</ul></li>
-<li><a href="#upstream-setting"><strong>Upstream setting</strong></a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="summary"></a><a href="#summary" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>When system traffic changes, the number of servers of the upstream service also increases or decreases, or the server needs to be replaced due to its hardware failure. If the gateway maintains upstream service information through configuration, the maintenance costs in the microservices architecture pattern are unpredictable. Furthermore, due to the untimely update of these information, will also bring a certain impact for the business, and the impact of human error operation can not  [...]
-<p><img src="https://apisix.apache.org/images/discovery.png" alt=""></p>
-<ol>
-<li>When the service starts, it will report some of its information, such as the service name, IP, port and other information to the registry. The services communicate with the registry using a mechanism such as a heartbeat, and if the registry and the service are unable to communicate for a long time, the instance will be cancel.When the service goes offline, the registry will delete the instance information.</li>
-<li>The gateway gets service instance information from the registry in near-real time.</li>
-<li>When the user requests the service through the gateway, the gateway selects one instance from the registry for proxy.</li>
-</ol>
-<p>Common registries: Eureka, Etcd, Consul, Zookeeper, Nacos etc.</p>
-<h2><a class="anchor" aria-hidden="true" id="how-extend-the-discovery-client"></a><a href="#how-extend-the-discovery-client" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<h3><a class="anchor" aria-hidden="true" id="basic-steps"></a><a href="#basic-steps" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p>It is very easy for APISIX to extend the discovery client, the basic steps are as follows</p>
-<ol>
-<li><p>Add the implementation of registry client in the 'apisix/discovery/' directory;</p></li>
-<li><p>Implement the <code>_M. init_worker()</code> function for initialization and the <code>_M. nodes(service_name)</code> function for obtaining the list of service instance nodes;</p></li>
-<li><p>Convert the registry data into data in APISIX;</p></li>
-</ol>
-<h3><a class="anchor" aria-hidden="true" id="the-example-of-eureka"></a><a href="#the-example-of-eureka" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
-<h4><a class="anchor" aria-hidden="true" id="implementation-of-eurekalua"></a><a href="#implementation-of-eurekalua" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>First, add <a href="../apisix/discovery/eureka.lua"><code>eureka.lua</code></a> in the <code>apisix/discovery/</code> directory;</p>
-<p>Then implement the <code>_M.init_worker()</code> function for initialization and the <code>_M.nodes(service_name)</code> function for obtaining the list of service instance nodes in <code>eureka.lua</code>:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> _M = {
-    version = <span class="hljs-number">1.0</span>,
-}
-
-
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.nodes</span><span class="hljs-params">(service_name)</span></span>
-    ... ...
-<span class="hljs-keyword">end</span>
-
-
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.init_worker</span><span class="hljs-params">()</span></span>
-    ... ...
-<span class="hljs-keyword">end</span>
-
-
-<span class="hljs-keyword">return</span> _M
-</code></pre>
-<h4><a class="anchor" aria-hidden="true" id="how-convert-eurekas-instance-data-to-apisixs-node"></a><a href="#how-convert-eurekas-instance-data-to-apisixs-node" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4  [...]
-<p>Here's an example of Eureka's data:</p>
-<pre><code class="hljs css language-json">{
-  "applications": {
-      "application": [
-          {
-              "name": "USER-SERVICE",                 # service name
-              "instance": [
-                  {
-                      "instanceId": "192.168.1.100:8761",
-                      "hostName": "192.168.1.100",
-                      "app": "USER-SERVICE",          # service name
-                      "ipAddr": "192.168.1.100",      # IP address
-                      "status": "UP",
-                      "overriddenStatus": "UNKNOWN",
-                      "port": {
-                          "$": 8761,
-                          "@enabled": "true"
-                      },
-                      "securePort": {
-                          "$": 443,
-                          "@enabled": "false"
-                      },
-                      "metadata": {
-                          "management.port": "8761",
-                          "weight": 100               # Setting by 'eureka.instance.metadata-map.weight' of the spring boot application
-                      },
-                      "homePageUrl": "http://192.168.1.100:8761/",
-                      "statusPageUrl": "http://192.168.1.100:8761/actuator/info",
-                      "healthCheckUrl": "http://192.168.1.100:8761/actuator/health",
-                      ... ...
-                  }
-              ]
-          }
-      ]
-  }
-}
-</code></pre>
-<p>Deal with the Eureka's instance data need the following steps :</p>
-<ol>
-<li>select the UP instance. When the value of <code>overriddenStatus</code> is &quot;UP&quot; or the value of <code>overriddenStatus</code> is &quot;UNKNOWN&quot; and the value of <code>status</code> is &quot;UP&quot;.</li>
-<li>Host. The <code>ipAddr</code> is the IP address of instance; and must be IPv4 or IPv6.</li>
-<li>Port. If the value of <code>port[&quot;@enabled&quot;]</code> is equal to &quot;true&quot;, using the value of <code>port[&quot;\$&quot;]</code>, If the value of <code>securePort[&quot;@enabled&quot;]</code> is equal to &quot;true&quot;, using the value of <code>securePort[&quot;\$&quot;]</code>.</li>
-<li>Weight. <code>local weight = metadata.weight or local_conf.eureka.weight or 100</code></li>
-</ol>
-<p>The result of this example is as follows:</p>
-<pre><code class="hljs css language-json">[
-  {
-    <span class="hljs-attr">"host"</span> : <span class="hljs-string">"192.168.1.100"</span>,
-    <span class="hljs-attr">"port"</span> : <span class="hljs-number">8761</span>,
-    <span class="hljs-attr">"weight"</span> : <span class="hljs-number">100</span>,
-    <span class="hljs-attr">"metadata"</span> : {
-      <span class="hljs-attr">"management.port"</span>: <span class="hljs-string">"8761"</span>,
-    }
-  }
-]
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="configuration-for-discovery-client"></a><a href="#configuration-for-discovery-client" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
-<h3><a class="anchor" aria-hidden="true" id="initial-service-discovery"></a><a href="#initial-service-discovery" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
-<p>Add the following configuration to <code>conf/config.yaml</code> to add different service discovery clients for dynamic selection during use:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">discovery:</span>
-  <span class="hljs-attr">eureka:</span>
-      <span class="hljs-string">...</span>
-</code></pre>
-<p>This name should be consistent with the file name of the implementation registry in the <code>apisix/discovery/</code> directory.</p>
-<p>The supported discovery client: Eureka.</p>
-<h3><a class="anchor" aria-hidden="true" id="configuration-for-eureka"></a><a href="#configuration-for-eureka" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>Add following configuration in <code>conf/config.yaml</code> :</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">discovery:</span>
-  <span class="hljs-attr">eureka:</span>
-    <span class="hljs-attr">host:</span>                            <span class="hljs-comment"># it's possible to define multiple eureka hosts addresses of the same eureka cluster.</span>
-      <span class="hljs-bullet">-</span> <span class="hljs-string">"http://${username}:${password}@${eureka_host1}:${eureka_port1}"</span>
-      <span class="hljs-bullet">-</span> <span class="hljs-string">"http://${username}:${password}@${eureka_host2}:${eureka_port2}"</span>
-    <span class="hljs-attr">prefix:</span> <span class="hljs-string">"/eureka/"</span>
-    <span class="hljs-attr">fetch_interval:</span> <span class="hljs-number">30</span>               <span class="hljs-comment"># 30s</span>
-    <span class="hljs-attr">weight:</span> <span class="hljs-number">100</span>                      <span class="hljs-comment"># default weight for node</span>
-    <span class="hljs-attr">timeout:</span>
-      <span class="hljs-attr">connect:</span> <span class="hljs-number">2000</span>                  <span class="hljs-comment"># 2000ms</span>
-      <span class="hljs-attr">send:</span> <span class="hljs-number">2000</span>                     <span class="hljs-comment"># 2000ms</span>
-      <span class="hljs-attr">read:</span> <span class="hljs-number">5000</span>                     <span class="hljs-comment"># 5000ms</span>
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="upstream-setting"></a><a href="#upstream-setting" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>Here is an example of routing a request with a URL of &quot;/user/*&quot; to a service which named &quot;user-service&quot; and use eureka discovery client in the registry :</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/user/*",
-    "upstream": {
-        "service_name": "USER-SERVICE",
-        "type": "roundrobin",
-        "discovery_type": "eureka"
-    }
-}'
-
-HTTP/1.1 201 Created
-Date: Sat, 31 Aug 2019 01:17:15 GMT
-Content-Type: text/plain
-Transfer-Encoding: chunked
-Connection: keep-alive
-Server: APISIX web server
-
-{"node":{"value":{"uri":"\/user\/*","upstream": {"service_name": "USER-SERVICE", "type": "roundrobin", "discovery_type": "eureka"}},"createdIndex":61925,"key":"\/apisix\/routes\/1","modifiedIndex":61925},"action":"create"}
-</code></pre>
-<p>Because the upstream interface URL may have conflict, usually in the gateway by prefix to distinguish:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/a/*",
-    "plugins": {
-        "proxy-rewrite" : {
-            regex_uri: ["^/a/(.*)", "/${1}"]
-        }
-    }
-    "upstream": {
-        "service_name": "A-SERVICE",
-        "type": "roundrobin",
-        "discovery_type": "eureka"
-    }
-}'
-<span class="hljs-meta">
-$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/2 -H '</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PUT -i -d '</span></span>
-{
-    "uri": "/b/*",
-    "plugins": {
-        "proxy-rewrite" : {
-            regex_uri: ["^/b/(.*)", "/${1}"]
-        }
-    }
-    "upstream": {
-        "service_name": "B-SERVICE",
-        "type": "roundrobin",
-        "discovery_type": "eureka"
-    }
-}'
-</code></pre>
-<p>Suppose both A-SERVICE and B-SERVICE provide a <code>/test</code> API. The above configuration allows access to A-SERVICE's <code>/test</code> API through <code>/a/test</code> and B-SERVICE's <code>/test</code> API through <code>/b/test</code>.</p>
-<p><strong>Notice</strong>:When configuring <code>upstream.service_name</code>,  <code>upstream.nodes</code> will no longer take effect, but will be replaced by 'nodes' obtained from the registry.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#summary">Summary</a></li><li><a href="#how-extend-the-discovery-client">How extend the discovery client?</a><ul class="toc-headings"><li><a href="#basic-steps">Basic steps</a></li><li><a href="#the-example-of-eureka">the example of Eureka</a></li></ul></li><li><a href="#configuration-for-discovery-client">Configuration for discovery client</a><ul class=" [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/discovery/index.html b/apisix/discovery/index.html
deleted file mode 100644
index c3bc364..0000000
--- a/apisix/discovery/index.html
+++ /dev/null
@@ -1,236 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/discovery · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/discovery · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" cont [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-[Chinese](/apisix/zh-cn/discovery)
-<h1><a class="anchor" aria-hidden="true" id="integration-service-discovery-registry"></a><a href="#integration-service-discovery-registry" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1. [...]
-<ul>
-<li><a href="#Summary"><strong>Summary</strong></a></li>
-<li><a href="#how-extend-the-discovery-client"><strong>How extend the discovery client?</strong></a>
-<ul>
-<li><a href="#basic-steps"><strong>Basic steps</strong></a></li>
-<li><a href="#the-example-of-eureka"><strong>the example of Eureka</strong></a>
-<ul>
-<li><a href="#implementation-of-eurekalua"><strong>Implementation of eureka.lua</strong></a></li>
-<li><a href="#how-convert-eurekas-instance-data-to-apisixs-node"><strong>How convert Eureka's instance data to APISIX's node?</strong></a></li>
-</ul></li>
-</ul></li>
-<li><a href="#configuration-for-discovery-client"><strong>Configuration for discovery client</strong></a>
-<ul>
-<li><a href="#initial-service-discovery"><strong>Initial service discovery</strong></a></li>
-<li><a href="#configuration-for-eureka"><strong>Configuration for Eureka</strong></a></li>
-</ul></li>
-<li><a href="#upstream-setting"><strong>Upstream setting</strong></a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="summary"></a><a href="#summary" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>When system traffic changes, the number of servers of the upstream service also increases or decreases, or the server needs to be replaced due to its hardware failure. If the gateway maintains upstream service information through configuration, the maintenance costs in the microservices architecture pattern are unpredictable. Furthermore, due to the untimely update of these information, will also bring a certain impact for the business, and the impact of human error operation can not  [...]
-<p><img src="https://apisix.apache.org/images/discovery.png" alt=""></p>
-<ol>
-<li>When the service starts, it will report some of its information, such as the service name, IP, port and other information to the registry. The services communicate with the registry using a mechanism such as a heartbeat, and if the registry and the service are unable to communicate for a long time, the instance will be cancel.When the service goes offline, the registry will delete the instance information.</li>
-<li>The gateway gets service instance information from the registry in near-real time.</li>
-<li>When the user requests the service through the gateway, the gateway selects one instance from the registry for proxy.</li>
-</ol>
-<p>Common registries: Eureka, Etcd, Consul, Zookeeper, Nacos etc.</p>
-<h2><a class="anchor" aria-hidden="true" id="how-extend-the-discovery-client"></a><a href="#how-extend-the-discovery-client" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<h3><a class="anchor" aria-hidden="true" id="basic-steps"></a><a href="#basic-steps" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p>It is very easy for APISIX to extend the discovery client, the basic steps are as follows</p>
-<ol>
-<li><p>Add the implementation of registry client in the 'apisix/discovery/' directory;</p></li>
-<li><p>Implement the <code>_M. init_worker()</code> function for initialization and the <code>_M. nodes(service_name)</code> function for obtaining the list of service instance nodes;</p></li>
-<li><p>Convert the registry data into data in APISIX;</p></li>
-</ol>
-<h3><a class="anchor" aria-hidden="true" id="the-example-of-eureka"></a><a href="#the-example-of-eureka" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
-<h4><a class="anchor" aria-hidden="true" id="implementation-of-eurekalua"></a><a href="#implementation-of-eurekalua" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>First, add <a href="../apisix/discovery/eureka.lua"><code>eureka.lua</code></a> in the <code>apisix/discovery/</code> directory;</p>
-<p>Then implement the <code>_M.init_worker()</code> function for initialization and the <code>_M.nodes(service_name)</code> function for obtaining the list of service instance nodes in <code>eureka.lua</code>:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> _M = {
-    version = <span class="hljs-number">1.0</span>,
-}
-
-
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.nodes</span><span class="hljs-params">(service_name)</span></span>
-    ... ...
-<span class="hljs-keyword">end</span>
-
-
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.init_worker</span><span class="hljs-params">()</span></span>
-    ... ...
-<span class="hljs-keyword">end</span>
-
-
-<span class="hljs-keyword">return</span> _M
-</code></pre>
-<h4><a class="anchor" aria-hidden="true" id="how-convert-eurekas-instance-data-to-apisixs-node"></a><a href="#how-convert-eurekas-instance-data-to-apisixs-node" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4  [...]
-<p>Here's an example of Eureka's data:</p>
-<pre><code class="hljs css language-json">{
-  "applications": {
-      "application": [
-          {
-              "name": "USER-SERVICE",                 # service name
-              "instance": [
-                  {
-                      "instanceId": "192.168.1.100:8761",
-                      "hostName": "192.168.1.100",
-                      "app": "USER-SERVICE",          # service name
-                      "ipAddr": "192.168.1.100",      # IP address
-                      "status": "UP",
-                      "overriddenStatus": "UNKNOWN",
-                      "port": {
-                          "$": 8761,
-                          "@enabled": "true"
-                      },
-                      "securePort": {
-                          "$": 443,
-                          "@enabled": "false"
-                      },
-                      "metadata": {
-                          "management.port": "8761",
-                          "weight": 100               # Setting by 'eureka.instance.metadata-map.weight' of the spring boot application
-                      },
-                      "homePageUrl": "http://192.168.1.100:8761/",
-                      "statusPageUrl": "http://192.168.1.100:8761/actuator/info",
-                      "healthCheckUrl": "http://192.168.1.100:8761/actuator/health",
-                      ... ...
-                  }
-              ]
-          }
-      ]
-  }
-}
-</code></pre>
-<p>Deal with the Eureka's instance data need the following steps :</p>
-<ol>
-<li>select the UP instance. When the value of <code>overriddenStatus</code> is &quot;UP&quot; or the value of <code>overriddenStatus</code> is &quot;UNKNOWN&quot; and the value of <code>status</code> is &quot;UP&quot;.</li>
-<li>Host. The <code>ipAddr</code> is the IP address of instance; and must be IPv4 or IPv6.</li>
-<li>Port. If the value of <code>port[&quot;@enabled&quot;]</code> is equal to &quot;true&quot;, using the value of <code>port[&quot;\$&quot;]</code>, If the value of <code>securePort[&quot;@enabled&quot;]</code> is equal to &quot;true&quot;, using the value of <code>securePort[&quot;\$&quot;]</code>.</li>
-<li>Weight. <code>local weight = metadata.weight or local_conf.eureka.weight or 100</code></li>
-</ol>
-<p>The result of this example is as follows:</p>
-<pre><code class="hljs css language-json">[
-  {
-    <span class="hljs-attr">"host"</span> : <span class="hljs-string">"192.168.1.100"</span>,
-    <span class="hljs-attr">"port"</span> : <span class="hljs-number">8761</span>,
-    <span class="hljs-attr">"weight"</span> : <span class="hljs-number">100</span>,
-    <span class="hljs-attr">"metadata"</span> : {
-      <span class="hljs-attr">"management.port"</span>: <span class="hljs-string">"8761"</span>,
-    }
-  }
-]
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="configuration-for-discovery-client"></a><a href="#configuration-for-discovery-client" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
-<h3><a class="anchor" aria-hidden="true" id="initial-service-discovery"></a><a href="#initial-service-discovery" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
-<p>Add the following configuration to <code>conf/config.yaml</code> to add different service discovery clients for dynamic selection during use:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">discovery:</span>
-  <span class="hljs-attr">eureka:</span>
-      <span class="hljs-string">...</span>
-</code></pre>
-<p>This name should be consistent with the file name of the implementation registry in the <code>apisix/discovery/</code> directory.</p>
-<p>The supported discovery client: Eureka.</p>
-<h3><a class="anchor" aria-hidden="true" id="configuration-for-eureka"></a><a href="#configuration-for-eureka" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>Add following configuration in <code>conf/config.yaml</code> :</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">discovery:</span>
-  <span class="hljs-attr">eureka:</span>
-    <span class="hljs-attr">host:</span>                            <span class="hljs-comment"># it's possible to define multiple eureka hosts addresses of the same eureka cluster.</span>
-      <span class="hljs-bullet">-</span> <span class="hljs-string">"http://${username}:${password}@${eureka_host1}:${eureka_port1}"</span>
-      <span class="hljs-bullet">-</span> <span class="hljs-string">"http://${username}:${password}@${eureka_host2}:${eureka_port2}"</span>
-    <span class="hljs-attr">prefix:</span> <span class="hljs-string">"/eureka/"</span>
-    <span class="hljs-attr">fetch_interval:</span> <span class="hljs-number">30</span>               <span class="hljs-comment"># 30s</span>
-    <span class="hljs-attr">weight:</span> <span class="hljs-number">100</span>                      <span class="hljs-comment"># default weight for node</span>
-    <span class="hljs-attr">timeout:</span>
-      <span class="hljs-attr">connect:</span> <span class="hljs-number">2000</span>                  <span class="hljs-comment"># 2000ms</span>
-      <span class="hljs-attr">send:</span> <span class="hljs-number">2000</span>                     <span class="hljs-comment"># 2000ms</span>
-      <span class="hljs-attr">read:</span> <span class="hljs-number">5000</span>                     <span class="hljs-comment"># 5000ms</span>
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="upstream-setting"></a><a href="#upstream-setting" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>Here is an example of routing a request with a URL of &quot;/user/*&quot; to a service which named &quot;user-service&quot; and use eureka discovery client in the registry :</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/user/*",
-    "upstream": {
-        "service_name": "USER-SERVICE",
-        "type": "roundrobin",
-        "discovery_type": "eureka"
-    }
-}'
-
-HTTP/1.1 201 Created
-Date: Sat, 31 Aug 2019 01:17:15 GMT
-Content-Type: text/plain
-Transfer-Encoding: chunked
-Connection: keep-alive
-Server: APISIX web server
-
-{"node":{"value":{"uri":"\/user\/*","upstream": {"service_name": "USER-SERVICE", "type": "roundrobin", "discovery_type": "eureka"}},"createdIndex":61925,"key":"\/apisix\/routes\/1","modifiedIndex":61925},"action":"create"}
-</code></pre>
-<p>Because the upstream interface URL may have conflict, usually in the gateway by prefix to distinguish:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes/1 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -i -d <span class="hljs-string">'</span></span>
-{
-    "uri": "/a/*",
-    "plugins": {
-        "proxy-rewrite" : {
-            regex_uri: ["^/a/(.*)", "/${1}"]
-        }
-    }
-    "upstream": {
-        "service_name": "A-SERVICE",
-        "type": "roundrobin",
-        "discovery_type": "eureka"
-    }
-}'
-<span class="hljs-meta">
-$</span><span class="bash"><span class="hljs-string"> curl http://127.0.0.1:9080/apisix/admin/routes/2 -H '</span>X-API-KEY: edd1c9f034335f136f87ad84b625c8f1<span class="hljs-string">' -X PUT -i -d '</span></span>
-{
-    "uri": "/b/*",
-    "plugins": {
-        "proxy-rewrite" : {
-            regex_uri: ["^/b/(.*)", "/${1}"]
-        }
-    }
-    "upstream": {
-        "service_name": "B-SERVICE",
-        "type": "roundrobin",
-        "discovery_type": "eureka"
-    }
-}'
-</code></pre>
-<p>Suppose both A-SERVICE and B-SERVICE provide a <code>/test</code> API. The above configuration allows access to A-SERVICE's <code>/test</code> API through <code>/a/test</code> and B-SERVICE's <code>/test</code> API through <code>/b/test</code>.</p>
-<p><strong>Notice</strong>:When configuring <code>upstream.service_name</code>,  <code>upstream.nodes</code> will no longer take effect, but will be replaced by 'nodes' obtained from the registry.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#summary">Summary</a></li><li><a href="#how-extend-the-discovery-client">How extend the discovery client?</a><ul class="toc-headings"><li><a href="#basic-steps">Basic steps</a></li><li><a href="#the-example-of-eureka">the example of Eureka</a></li></ul></li><li><a href="#configuration-for-discovery-client">Configuration for discovery client</a><ul class=" [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/examples/plugins-hmac-auth-generate-signature.html b/apisix/examples/plugins-hmac-auth-generate-signature.html
deleted file mode 100644
index bd20a2f..0000000
--- a/apisix/examples/plugins-hmac-auth-generate-signature.html
+++ /dev/null
@@ -1,199 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/examples/plugins-hmac-auth-generate-signature · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/examples/plugins-hmac-auth-generate-signature · Apache APISIX™"/> [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="hmac-generate-signature-examples"></a><a href="#hmac-generate-signature-examples" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
-<h2><a class="anchor" aria-hidden="true" id="python-3"></a><a href="#python-3" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<pre><code class="hljs css language-python"><span class="hljs-keyword">import</span> hashlib
-<span class="hljs-keyword">import</span> hmac
-<span class="hljs-keyword">import</span> base64
-
-secret = bytes(<span class="hljs-string">'the shared secret key here'</span>, <span class="hljs-string">'utf-8'</span>)
-message = bytes(<span class="hljs-string">'this is signature string'</span>, <span class="hljs-string">'utf-8'</span>)
-
-
-hash = hmac.new(secret, message, hashlib.sha256)
-
-<span class="hljs-comment"># to lowercase hexits</span>
-hash.hexdigest()
-
-<span class="hljs-comment"># to lowercase base64</span>
-base64.b64encode(hash.digest())
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
-<pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> javax.crypto.Mac;
-<span class="hljs-keyword">import</span> javax.crypto.spec.SecretKeySpec;
-<span class="hljs-keyword">import</span> java.security.NoSuchAlgorithmException;
-<span class="hljs-keyword">import</span> java.security.InvalidKeyException;
-<span class="hljs-keyword">import</span> javax.xml.bind.DatatypeConverter;
-
-<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Main</span> </span>{
-  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-   <span class="hljs-keyword">try</span> {
-     String secret = <span class="hljs-string">"the shared secret key here"</span>;
-     String message = <span class="hljs-string">"this is signature string"</span>;
-
-     Mac hasher = Mac.getInstance(<span class="hljs-string">"HmacSHA256"</span>);
-     hasher.init(<span class="hljs-keyword">new</span> SecretKeySpec(secret.getBytes(), <span class="hljs-string">"HmacSHA256"</span>));
-
-     <span class="hljs-keyword">byte</span>[] hash = hasher.doFinal(message.getBytes());
-
-     <span class="hljs-comment">// to lowercase hexits</span>
-     DatatypeConverter.printHexBinary(hash);
-
-     <span class="hljs-comment">// to base64</span>
-     DatatypeConverter.printBase64Binary(hash);
-   }
-   <span class="hljs-keyword">catch</span> (NoSuchAlgorithmException e) {}
-   <span class="hljs-keyword">catch</span> (InvalidKeyException e) {}
-  }
-}
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="go"></a><a href="#go" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c [...]
-<pre><code class="hljs css language-go"><span class="hljs-keyword">package</span> main
-
-<span class="hljs-keyword">import</span> (
-    <span class="hljs-string">"crypto/hmac"</span>
-    <span class="hljs-string">"crypto/sha256"</span>
-    <span class="hljs-string">"encoding/base64"</span>
-    <span class="hljs-string">"encoding/hex"</span>
-)
-
-<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
-    secret := []<span class="hljs-keyword">byte</span>(<span class="hljs-string">"the shared secret key here"</span>)
-    message := []<span class="hljs-keyword">byte</span>(<span class="hljs-string">"this is signature string"</span>)
-
-    hash := hmac.New(sha256.New, secret)
-    hash.Write(message)
-
-    <span class="hljs-comment">// to lowercase hexits</span>
-    hex.EncodeToString(hash.Sum(<span class="hljs-literal">nil</span>))
-
-    <span class="hljs-comment">// to base64</span>
-    base64.StdEncoding.EncodeToString(hash.Sum(<span class="hljs-literal">nil</span>))
-}
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="ruby"></a><a href="#ruby" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
-<pre><code class="hljs css language-ruby"><span class="hljs-keyword">require</span> <span class="hljs-string">'openssl'</span>
-<span class="hljs-keyword">require</span> <span class="hljs-string">'base64'</span>
-
-secret = <span class="hljs-string">'the shared secret key here'</span>
-message = <span class="hljs-string">'this is signature string'</span>
-
-<span class="hljs-comment"># to lowercase hexits</span>
-OpenSSL::HMAC.hexdigest(<span class="hljs-string">'sha256'</span>, secret, message)
-
-<span class="hljs-comment"># to base64</span>
-Base64.encode64(OpenSSL::HMAC.digest(<span class="hljs-string">'sha256'</span>, secret, message))
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="nodejs"></a><a href="#nodejs" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<pre><code class="hljs css language-js"><span class="hljs-keyword">var</span> crypto = <span class="hljs-built_in">require</span>(<span class="hljs-string">'crypto'</span>);
-
-<span class="hljs-keyword">var</span> secret = <span class="hljs-string">'the shared secret key here'</span>;
-<span class="hljs-keyword">var</span> message = <span class="hljs-string">'this is signature string'</span>;
-
-<span class="hljs-keyword">var</span> hash = crypto.createHmac(<span class="hljs-string">'sha256'</span>, secret).update(message);
-
-<span class="hljs-comment">// to lowercase hexits</span>
-hash.digest(<span class="hljs-string">'hex'</span>);
-
-<span class="hljs-comment">// to base64</span>
-hash.digest(<span class="hljs-string">'base64'</span>);
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="javascript-es6"></a><a href="#javascript-es6" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<pre><code class="hljs css language-js"><span class="hljs-keyword">const</span> secret = <span class="hljs-string">'the shared secret key here'</span>;
-<span class="hljs-keyword">const</span> message = <span class="hljs-string">'this is signature string'</span>;
-
-<span class="hljs-keyword">const</span> getUtf8Bytes = <span class="hljs-function"><span class="hljs-params">str</span> =&gt;</span>
-  <span class="hljs-keyword">new</span> <span class="hljs-built_in">Uint8Array</span>(
-    [...unescape(<span class="hljs-built_in">encodeURIComponent</span>(str))].map(<span class="hljs-function"><span class="hljs-params">c</span> =&gt;</span> c.charCodeAt(<span class="hljs-number">0</span>))
-  );
-
-<span class="hljs-keyword">const</span> secretBytes = getUtf8Bytes(secret);
-<span class="hljs-keyword">const</span> messageBytes = getUtf8Bytes(message);
-
-<span class="hljs-keyword">const</span> cryptoKey = <span class="hljs-keyword">await</span> crypto.subtle.importKey(
-  <span class="hljs-string">'raw'</span>, secretBytes, { <span class="hljs-attr">name</span>: <span class="hljs-string">'HMAC'</span>, <span class="hljs-attr">hash</span>: <span class="hljs-string">'SHA-256'</span> },
-  <span class="hljs-literal">true</span>, [<span class="hljs-string">'sign'</span>]
-);
-<span class="hljs-keyword">const</span> sig = <span class="hljs-keyword">await</span> crypto.subtle.sign(<span class="hljs-string">'HMAC'</span>, cryptoKey, messageBytes);
-
-<span class="hljs-comment">// to lowercase hexits</span>
-[...new <span class="hljs-built_in">Uint8Array</span>(sig)].map(<span class="hljs-function"><span class="hljs-params">b</span> =&gt;</span> b.toString(<span class="hljs-number">16</span>).padStart(<span class="hljs-number">2</span>, <span class="hljs-string">'0'</span>)).join(<span class="hljs-string">''</span>);
-
-<span class="hljs-comment">// to base64</span>
-btoa(<span class="hljs-built_in">String</span>.fromCharCode(...new <span class="hljs-built_in">Uint8Array</span>(sig)));
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="php"></a><a href="#php" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
-<pre><code class="hljs css language-php"><span class="hljs-meta">&lt;?php</span>
-
-$secret = <span class="hljs-string">'the shared secret key here'</span>;
-$message = <span class="hljs-string">'this is signature string'</span>;
-
-<span class="hljs-comment">// to lowercase hexits</span>
-hash_hmac(<span class="hljs-string">'sha256'</span>, $message, $secret);
-
-<span class="hljs-comment">// to base64</span>
-base64_encode(hash_hmac(<span class="hljs-string">'sha256'</span>, $message, $secret, <span class="hljs-keyword">true</span>));
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="lua"></a><a href="#lua" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> hmac = <span class="hljs-built_in">require</span>(<span class="hljs-string">"resty.hmac"</span>)
-<span class="hljs-keyword">local</span> secret = <span class="hljs-string">'the shared secret key here'</span>
-<span class="hljs-keyword">local</span> message = <span class="hljs-string">'this is signature string'</span>
-<span class="hljs-keyword">local</span> digest = hmac:new(secret, hmac.ALGOS.SHA256):final(message)
-
-<span class="hljs-comment">--to lowercase hexits</span>
-ngx.say(digest)
-
-<span class="hljs-comment">--to base64</span>
-ngx.say(ngx.encode_base64(digest))
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="shell"></a><a href="#shell" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<pre><code class="hljs css language-bash">SECRET=<span class="hljs-string">"the shared secret key here"</span>
-MESSAGE=<span class="hljs-string">"this is signature string"</span>
-
-<span class="hljs-comment"># to lowercase hexits</span>
-<span class="hljs-built_in">echo</span> -e <span class="hljs-variable">$MESSAGE</span> | openssl dgst -sha256 -hmac <span class="hljs-variable">$SECRET</span>
-
-<span class="hljs-comment"># to base64</span>
-<span class="hljs-built_in">echo</span> -e <span class="hljs-variable">$MESSAGE</span> | openssl dgst -sha256 -hmac <span class="hljs-variable">$SECRET</span> -binary | base64
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#python-3">Python 3</a></li><li><a href="#java">Java</a></li><li><a href="#go">Go</a></li><li><a href="#ruby">Ruby</a></li><li><a href="#nodejs">NodeJs</a></li><li><a href="#javascript-es6">JavaScript ES6</a></li><li><a href="#php">PHP</a></li><li><a href="#lua">Lua</a></li><li><a href="#shell">Shell</a></li></ul></nav></div><footer class="nav-footer" id= [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/examples/plugins-hmac-auth-generate-signature/index.html b/apisix/examples/plugins-hmac-auth-generate-signature/index.html
deleted file mode 100644
index bd20a2f..0000000
--- a/apisix/examples/plugins-hmac-auth-generate-signature/index.html
+++ /dev/null
@@ -1,199 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/examples/plugins-hmac-auth-generate-signature · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/examples/plugins-hmac-auth-generate-signature · Apache APISIX™"/> [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="hmac-generate-signature-examples"></a><a href="#hmac-generate-signature-examples" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
-<h2><a class="anchor" aria-hidden="true" id="python-3"></a><a href="#python-3" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<pre><code class="hljs css language-python"><span class="hljs-keyword">import</span> hashlib
-<span class="hljs-keyword">import</span> hmac
-<span class="hljs-keyword">import</span> base64
-
-secret = bytes(<span class="hljs-string">'the shared secret key here'</span>, <span class="hljs-string">'utf-8'</span>)
-message = bytes(<span class="hljs-string">'this is signature string'</span>, <span class="hljs-string">'utf-8'</span>)
-
-
-hash = hmac.new(secret, message, hashlib.sha256)
-
-<span class="hljs-comment"># to lowercase hexits</span>
-hash.hexdigest()
-
-<span class="hljs-comment"># to lowercase base64</span>
-base64.b64encode(hash.digest())
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
-<pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> javax.crypto.Mac;
-<span class="hljs-keyword">import</span> javax.crypto.spec.SecretKeySpec;
-<span class="hljs-keyword">import</span> java.security.NoSuchAlgorithmException;
-<span class="hljs-keyword">import</span> java.security.InvalidKeyException;
-<span class="hljs-keyword">import</span> javax.xml.bind.DatatypeConverter;
-
-<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Main</span> </span>{
-  <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{
-   <span class="hljs-keyword">try</span> {
-     String secret = <span class="hljs-string">"the shared secret key here"</span>;
-     String message = <span class="hljs-string">"this is signature string"</span>;
-
-     Mac hasher = Mac.getInstance(<span class="hljs-string">"HmacSHA256"</span>);
-     hasher.init(<span class="hljs-keyword">new</span> SecretKeySpec(secret.getBytes(), <span class="hljs-string">"HmacSHA256"</span>));
-
-     <span class="hljs-keyword">byte</span>[] hash = hasher.doFinal(message.getBytes());
-
-     <span class="hljs-comment">// to lowercase hexits</span>
-     DatatypeConverter.printHexBinary(hash);
-
-     <span class="hljs-comment">// to base64</span>
-     DatatypeConverter.printBase64Binary(hash);
-   }
-   <span class="hljs-keyword">catch</span> (NoSuchAlgorithmException e) {}
-   <span class="hljs-keyword">catch</span> (InvalidKeyException e) {}
-  }
-}
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="go"></a><a href="#go" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c [...]
-<pre><code class="hljs css language-go"><span class="hljs-keyword">package</span> main
-
-<span class="hljs-keyword">import</span> (
-    <span class="hljs-string">"crypto/hmac"</span>
-    <span class="hljs-string">"crypto/sha256"</span>
-    <span class="hljs-string">"encoding/base64"</span>
-    <span class="hljs-string">"encoding/hex"</span>
-)
-
-<span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">main</span><span class="hljs-params">()</span></span> {
-    secret := []<span class="hljs-keyword">byte</span>(<span class="hljs-string">"the shared secret key here"</span>)
-    message := []<span class="hljs-keyword">byte</span>(<span class="hljs-string">"this is signature string"</span>)
-
-    hash := hmac.New(sha256.New, secret)
-    hash.Write(message)
-
-    <span class="hljs-comment">// to lowercase hexits</span>
-    hex.EncodeToString(hash.Sum(<span class="hljs-literal">nil</span>))
-
-    <span class="hljs-comment">// to base64</span>
-    base64.StdEncoding.EncodeToString(hash.Sum(<span class="hljs-literal">nil</span>))
-}
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="ruby"></a><a href="#ruby" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
-<pre><code class="hljs css language-ruby"><span class="hljs-keyword">require</span> <span class="hljs-string">'openssl'</span>
-<span class="hljs-keyword">require</span> <span class="hljs-string">'base64'</span>
-
-secret = <span class="hljs-string">'the shared secret key here'</span>
-message = <span class="hljs-string">'this is signature string'</span>
-
-<span class="hljs-comment"># to lowercase hexits</span>
-OpenSSL::HMAC.hexdigest(<span class="hljs-string">'sha256'</span>, secret, message)
-
-<span class="hljs-comment"># to base64</span>
-Base64.encode64(OpenSSL::HMAC.digest(<span class="hljs-string">'sha256'</span>, secret, message))
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="nodejs"></a><a href="#nodejs" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<pre><code class="hljs css language-js"><span class="hljs-keyword">var</span> crypto = <span class="hljs-built_in">require</span>(<span class="hljs-string">'crypto'</span>);
-
-<span class="hljs-keyword">var</span> secret = <span class="hljs-string">'the shared secret key here'</span>;
-<span class="hljs-keyword">var</span> message = <span class="hljs-string">'this is signature string'</span>;
-
-<span class="hljs-keyword">var</span> hash = crypto.createHmac(<span class="hljs-string">'sha256'</span>, secret).update(message);
-
-<span class="hljs-comment">// to lowercase hexits</span>
-hash.digest(<span class="hljs-string">'hex'</span>);
-
-<span class="hljs-comment">// to base64</span>
-hash.digest(<span class="hljs-string">'base64'</span>);
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="javascript-es6"></a><a href="#javascript-es6" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<pre><code class="hljs css language-js"><span class="hljs-keyword">const</span> secret = <span class="hljs-string">'the shared secret key here'</span>;
-<span class="hljs-keyword">const</span> message = <span class="hljs-string">'this is signature string'</span>;
-
-<span class="hljs-keyword">const</span> getUtf8Bytes = <span class="hljs-function"><span class="hljs-params">str</span> =&gt;</span>
-  <span class="hljs-keyword">new</span> <span class="hljs-built_in">Uint8Array</span>(
-    [...unescape(<span class="hljs-built_in">encodeURIComponent</span>(str))].map(<span class="hljs-function"><span class="hljs-params">c</span> =&gt;</span> c.charCodeAt(<span class="hljs-number">0</span>))
-  );
-
-<span class="hljs-keyword">const</span> secretBytes = getUtf8Bytes(secret);
-<span class="hljs-keyword">const</span> messageBytes = getUtf8Bytes(message);
-
-<span class="hljs-keyword">const</span> cryptoKey = <span class="hljs-keyword">await</span> crypto.subtle.importKey(
-  <span class="hljs-string">'raw'</span>, secretBytes, { <span class="hljs-attr">name</span>: <span class="hljs-string">'HMAC'</span>, <span class="hljs-attr">hash</span>: <span class="hljs-string">'SHA-256'</span> },
-  <span class="hljs-literal">true</span>, [<span class="hljs-string">'sign'</span>]
-);
-<span class="hljs-keyword">const</span> sig = <span class="hljs-keyword">await</span> crypto.subtle.sign(<span class="hljs-string">'HMAC'</span>, cryptoKey, messageBytes);
-
-<span class="hljs-comment">// to lowercase hexits</span>
-[...new <span class="hljs-built_in">Uint8Array</span>(sig)].map(<span class="hljs-function"><span class="hljs-params">b</span> =&gt;</span> b.toString(<span class="hljs-number">16</span>).padStart(<span class="hljs-number">2</span>, <span class="hljs-string">'0'</span>)).join(<span class="hljs-string">''</span>);
-
-<span class="hljs-comment">// to base64</span>
-btoa(<span class="hljs-built_in">String</span>.fromCharCode(...new <span class="hljs-built_in">Uint8Array</span>(sig)));
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="php"></a><a href="#php" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
-<pre><code class="hljs css language-php"><span class="hljs-meta">&lt;?php</span>
-
-$secret = <span class="hljs-string">'the shared secret key here'</span>;
-$message = <span class="hljs-string">'this is signature string'</span>;
-
-<span class="hljs-comment">// to lowercase hexits</span>
-hash_hmac(<span class="hljs-string">'sha256'</span>, $message, $secret);
-
-<span class="hljs-comment">// to base64</span>
-base64_encode(hash_hmac(<span class="hljs-string">'sha256'</span>, $message, $secret, <span class="hljs-keyword">true</span>));
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="lua"></a><a href="#lua" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> hmac = <span class="hljs-built_in">require</span>(<span class="hljs-string">"resty.hmac"</span>)
-<span class="hljs-keyword">local</span> secret = <span class="hljs-string">'the shared secret key here'</span>
-<span class="hljs-keyword">local</span> message = <span class="hljs-string">'this is signature string'</span>
-<span class="hljs-keyword">local</span> digest = hmac:new(secret, hmac.ALGOS.SHA256):final(message)
-
-<span class="hljs-comment">--to lowercase hexits</span>
-ngx.say(digest)
-
-<span class="hljs-comment">--to base64</span>
-ngx.say(ngx.encode_base64(digest))
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="shell"></a><a href="#shell" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<pre><code class="hljs css language-bash">SECRET=<span class="hljs-string">"the shared secret key here"</span>
-MESSAGE=<span class="hljs-string">"this is signature string"</span>
-
-<span class="hljs-comment"># to lowercase hexits</span>
-<span class="hljs-built_in">echo</span> -e <span class="hljs-variable">$MESSAGE</span> | openssl dgst -sha256 -hmac <span class="hljs-variable">$SECRET</span>
-
-<span class="hljs-comment"># to base64</span>
-<span class="hljs-built_in">echo</span> -e <span class="hljs-variable">$MESSAGE</span> | openssl dgst -sha256 -hmac <span class="hljs-variable">$SECRET</span> -binary | base64
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#python-3">Python 3</a></li><li><a href="#java">Java</a></li><li><a href="#go">Go</a></li><li><a href="#ruby">Ruby</a></li><li><a href="#nodejs">NodeJs</a></li><li><a href="#javascript-es6">JavaScript ES6</a></li><li><a href="#php">PHP</a></li><li><a href="#lua">Lua</a></li><li><a href="#shell">Shell</a></li></ul></nav></div><footer class="nav-footer" id= [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/getting-started.html b/apisix/getting-started.html
deleted file mode 100644
index 5009685..0000000
--- a/apisix/getting-started.html
+++ /dev/null
@@ -1,217 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/getting-started · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/getting-started · Apache APISIX™"/><meta property="og:type" content="website"/><meta property=" [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/getting-started">Chinese</a></p>
-<h1><a class="anchor" aria-hidden="true" id="quick-start-guide"></a><a href="#quick-start-guide" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>The goal of this guide is to get started with APISIX and to configure a secured public API with APISIX.
-By the end of this guide, you will have a working APISIX setup and a new service which will route to a public API, which is secured by an API key.</p>
-<p>The following GET endpoint will be used for the purpose of this tutorial. This will act as an echo endpoint and will return the parameters which are sent to the API.</p>
-<pre><code class="hljs css language-bash">$ curl --location --request GET <span class="hljs-string">"https://httpbin.org/get?foo1=bar1&amp;foo2=bar2"</span>
-</code></pre>
-<p>Let's deconstruct the above URL.</p>
-<ul>
-<li>Scheme: HTTPS</li>
-<li>Host/Address: httpbin.org</li>
-<li>Port: 443</li>
-<li>URI: /get</li>
-<li>Query Parameters: foo1, foo2</li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="prerequisites"></a><a href="#prerequisites" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<ul>
-<li>This guide uses docker and docker-compose to setup APISIX. But if you have already installed APISIX in other ways, you can just skip to <a href="/apisix/getting-started#step-2-create-a-route-in-apisix">step 2</a>.</li>
-<li>Curl: The guide uses curl command for API testing, but you can also use any other tool of your choice (Eg- Postman).</li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="step-1-install-apisix"></a><a href="#step-1-install-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
-<p>APISIX is available to install in multiple operating environments. The <a href="/apisix/how-to-build#installation-via-source-release">following document</a> shows the installation steps in multiple platforms.
-For the quick start let's use the docker based set up. To start the APISIX server, clone the following <a href="https://github.com/apache/apisix-docker">repository</a> and navigate to the example folder and execute the following commands.</p>
-<p>This command will start the APISIX server and the admin API will be available in 9080 port (HTTPS port: 9443).</p>
-<pre><code class="hljs css language-bash">$ git <span class="hljs-built_in">clone</span> https://github.com/apache/apisix-docker.git
-$ <span class="hljs-built_in">cd</span> apisix-docker/example
-$ docker-compose -p docker-apisix up -d
-</code></pre>
-<p>It will take a while to download the source for the first time. But the consequent loads will be very fast.
-After the docker containers have started visit the following link to check if you are getting a successful response.</p>
-<pre><code class="hljs css language-bash">$ curl <span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/services/"</span> -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span>
-</code></pre>
-<p>The following will be the response from the Admin API.</p>
-<pre><code class="hljs css language-json">{
-    <span class="hljs-attr">"node"</span>: {
-        <span class="hljs-attr">"createdIndex"</span>: <span class="hljs-number">6</span>,
-        <span class="hljs-attr">"modifiedIndex"</span>: <span class="hljs-number">6</span>,
-        <span class="hljs-attr">"key"</span>: <span class="hljs-string">"/apisix/services"</span>,
-        <span class="hljs-attr">"dir"</span>: <span class="hljs-literal">true</span>
-        },
-    <span class="hljs-attr">"action"</span>: <span class="hljs-string">"get"</span>
-}
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="step-2-create-a-route-in-apisix"></a><a href="#step-2-create-a-route-in-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<p>APISIX provides a powerful Admin API and a <a href="https://github.com/apache/apisix-dashboard">dashboard</a> for configuring the routes/services/plugins.
-The quickstart guide will use the Admin API for configuring the routes.</p>
-<p>A micro-service can be configured via APISIX through the relationship between several entities such as routes, services, upstream, and plugins.
-The route matches the client request and specifies how they are sent to the upstream (backend API/Service) after they reach APISIX.
-Services provide an abstraction to the upstream services. Therefore, you can create a single service and reference it in multiple routes.
-Check out the architecture document for more information.</p>
-<p>Technically all this information(upstream or service, plugins) can be included inside a route configuration. The route consists of three main parts.</p>
-<ul>
-<li><p>Matching Rules:</p>
-<p>Let's take the following scenario.
-<a href="http://example.com/services/users">http://example.com/services/users</a></p>
-<p>The URL above hosts all the micro services related to the users(getUser/ GetAllUsers) in the system. For example the GetAllUsers endpoint can be reached via the following URL (<a href="http://example.com/services/users/GetAllUsers">http://example.com/services/users/GetAllUsers</a>)
-Now you want to expose all the <code>GET</code> endpoints(micro-services) under the <code>users</code> path. The following will be the route configuration for matching such request.</p>
-<pre><code class="hljs css language-json">{
-    "methods": ["GET"],
-    "host": "example.com",
-    "uri": "/services/users/*",
-    ... Additional Configurations
-}
-</code></pre>
-<p>With the above matching rule you can communicate to APISIX via the following command.</p>
-<pre><code class="hljs css language-bash">curl -i -X GET <span class="hljs-string">"http://{apisix_server.com}:{port}/services/users/getAllUsers?limit=10"</span> -H <span class="hljs-string">"Host: example.com"</span>
-</code></pre></li>
-<li><p>Upstream information:</p>
-<p>Upstream is a virtual host abstraction that performs load balancing on a given set of service nodes according to configuration rules.
-Thus a single upstream configuration can comprise of multiple servers which offers the same service. Each node will comprise of a key(address/ip : port) and a value(weight of the node).
-The service can be load balanced through a round robin or consistent hashing (cHash) mechanism.</p>
-<p>When configuring a route you can either set the upstream information or use service abstraction to refer the upstream information.</p></li>
-<li><p>Plugins</p>
-<p>Plugins allows you to extend the capabilities of APISIX and to implement arbitrary logic which can interface with the HTTP request/response lifecycle.
-Therefore, if you want to authenticate the API then you can include the Key Auth plugin to enforce authentication for each request.</p></li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="create-an-upstream"></a><a href="#create-an-upstream" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Execute the following command to create an upstream with the id of '50' in APISIX. Let's use the round-robin mechanism for load balancing.</p>
-<pre><code class="hljs css language-bash">curl <span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/upstreams/50"</span> -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'
-{
-    "type": "roundrobin",
-    "nodes": {
-        "httpbin.org:443": 1
-    }
-}'</span>
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="add-a-route-to-access-the-upstream"></a><a href="#add-a-route-to-access-the-upstream" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
-<p>By default APISIX proxies the request via the HTTP protocol. As our backend is hosted in a HTTPS environment, let's use the proxy-rewrite plugin to change the scheme to HTTPS.</p>
-<pre><code class="hljs css language-bash">curl <span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/routes/5"</span> -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'
-{
-    "uri": "/get",
-    "host": "httpbin.org",
-    "plugins": {
-        "proxy-rewrite": {
-          "scheme": "https"
-        }
-    },
-    "upstream_id": 50
-}'</span>
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="call-apisix"></a><a href="#call-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p>Now lets call APISIX to test the newly configured route.</p>
-<pre><code class="hljs css language-bash">curl -i -X GET <span class="hljs-string">"http://127.0.0.1:9080/get?foo1=bar1&amp;foo2=bar2"</span> -H <span class="hljs-string">"Host: httpbin.org"</span>
-</code></pre>
-<p>The API is available via the HTTPs(9443) endpoint as well. If you are using a self signed certificate then use the <code>-k</code> parameter to ignore the self-signed certificate error by the curl command.</p>
-<pre><code class="hljs css language-bash">curl -i -k -X GET <span class="hljs-string">"https://127.0.0.1:9443/get?foo1=bar1&amp;foo2=bar2"</span> -H <span class="hljs-string">"Host: httpbin.org"</span>
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="step-3-add-authentication-for-the-service"></a><a href="#step-3-add-authentication-for-the-service" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1  [...]
-<p>Now lets protect the newly created APISIX endpoint/route as it is currently open to the public.
-Execute the following command to create a user called John with a dedicated api-key.</p>
-<p>Note: APISIX supports multiple authentication mechanism, view the plugin docs to learn more.</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "username": "john",
-    "plugins": {
-        "key-auth": {
-            "key": "superSecretAPIKey"
-        }
-    }
-}'
-</code></pre>
-<p>Now, let's configure our endpoint to include the key-auth plugin.</p>
-<pre><code class="hljs css language-bash">curl http://127.0.0.1:9080/apisix/admin/routes/5 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'
-{
-    "uri": "/get",
-    "host": "httpbin.org",
-    "plugins": {
-        "proxy-rewrite": {
-          "scheme": "https"
-        },
-        "key-auth": {}
-    },
-    "upstream_id": 50
-}'</span>
-</code></pre>
-<p>As the route is secured by the key-auth plugin the former curl command to access the API will produce an unauthorized access error.
-Use the command below to securely access the endpoint now.</p>
-<pre><code class="hljs css language-bash">curl -i -X GET http://127.0.0.1:9080/get -H <span class="hljs-string">"Host: httpbin.org"</span> -H <span class="hljs-string">'apikey: superSecretAPIKey'</span>
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="add-a-prefix-to-the-route"></a><a href="#add-a-prefix-to-the-route" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
-<p>Now lets say you want to add a prefix (eg: samplePrefix) to the route and do not want to use the <code>host</code> header then you can use
-the proxy rewrite plugin to do it.</p>
-<pre><code class="hljs css language-bash">curl http://127.0.0.1:9080/apisix/admin/routes/5 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'
-{
-    "uri": "/samplePrefix/get",
-    "plugins": {
-        "proxy-rewrite": {
-          "scheme": "https",
-          "regex_uri": ["^/samplePrefix/get(.*)", "/get$1"]
-        },
-        "key-auth": {}
-    },
-    "upstream_id": 50
-}'</span>
-</code></pre>
-<p>Now you can invoke the route with the following command:</p>
-<pre><code class="hljs css language-bash">curl -i -X GET <span class="hljs-string">'http://127.0.0.1:9080/samplePrefix/get?param1=foo&amp;param2=bar'</span> -H <span class="hljs-string">'apikey: superSecretAPIKey'</span>
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="apisix-dashboard"></a><a href="#apisix-dashboard" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>As of now the API calls to the APISIX has been orchestrated by using the Admin API. However, APISIX also provides
-a web application to perform the similar. The dashboard is available in the following
-<a href="https://github.com/apache/apisix">repository</a>. The dashboard is intuitive and you can orchestrate the
-same route configurations via the dashboard as well.</p>
-<p><img src="https://apisix.apache.org/images/dashboard.png" alt="Dashboard"></p>
-<h3><a class="anchor" aria-hidden="true" id="troubleshooting"></a><a href="#troubleshooting" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<ul>
-<li><p>Make sure the required ports are not being used by other systems/processes (The default ports are: 9080, 9443, 2379).
-The following is the command to kill a process which is listening to a specific port (in unix based systems).</p>
-<pre><code class="hljs css language-bash">sudo fuser -k 9443/tcp
-</code></pre></li>
-<li><p>If the docker container is continuously restarting/failing, login to the container and observe the logs to diagnose the issue.</p>
-<pre><code class="hljs css language-bash">docker logs -f --tail container_id
-</code></pre></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#step-1-install-apisix">Step 1: Install APISIX</a></li><li><a href="#step-2-create-a-route-in-apisix">Step 2: Create a Route in APISIX</a><ul class="toc-headings"><li><a href="#create-an-upstream">Create an Upstream</a></li><li><a href="#add-a-route-to-access-the-upstream">Add a Route to Access the Upstre [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/getting-started/index.html b/apisix/getting-started/index.html
deleted file mode 100644
index 5009685..0000000
--- a/apisix/getting-started/index.html
+++ /dev/null
@@ -1,217 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/getting-started · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/getting-started · Apache APISIX™"/><meta property="og:type" content="website"/><meta property=" [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/getting-started">Chinese</a></p>
-<h1><a class="anchor" aria-hidden="true" id="quick-start-guide"></a><a href="#quick-start-guide" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>The goal of this guide is to get started with APISIX and to configure a secured public API with APISIX.
-By the end of this guide, you will have a working APISIX setup and a new service which will route to a public API, which is secured by an API key.</p>
-<p>The following GET endpoint will be used for the purpose of this tutorial. This will act as an echo endpoint and will return the parameters which are sent to the API.</p>
-<pre><code class="hljs css language-bash">$ curl --location --request GET <span class="hljs-string">"https://httpbin.org/get?foo1=bar1&amp;foo2=bar2"</span>
-</code></pre>
-<p>Let's deconstruct the above URL.</p>
-<ul>
-<li>Scheme: HTTPS</li>
-<li>Host/Address: httpbin.org</li>
-<li>Port: 443</li>
-<li>URI: /get</li>
-<li>Query Parameters: foo1, foo2</li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="prerequisites"></a><a href="#prerequisites" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<ul>
-<li>This guide uses docker and docker-compose to setup APISIX. But if you have already installed APISIX in other ways, you can just skip to <a href="/apisix/getting-started#step-2-create-a-route-in-apisix">step 2</a>.</li>
-<li>Curl: The guide uses curl command for API testing, but you can also use any other tool of your choice (Eg- Postman).</li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="step-1-install-apisix"></a><a href="#step-1-install-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
-<p>APISIX is available to install in multiple operating environments. The <a href="/apisix/how-to-build#installation-via-source-release">following document</a> shows the installation steps in multiple platforms.
-For the quick start let's use the docker based set up. To start the APISIX server, clone the following <a href="https://github.com/apache/apisix-docker">repository</a> and navigate to the example folder and execute the following commands.</p>
-<p>This command will start the APISIX server and the admin API will be available in 9080 port (HTTPS port: 9443).</p>
-<pre><code class="hljs css language-bash">$ git <span class="hljs-built_in">clone</span> https://github.com/apache/apisix-docker.git
-$ <span class="hljs-built_in">cd</span> apisix-docker/example
-$ docker-compose -p docker-apisix up -d
-</code></pre>
-<p>It will take a while to download the source for the first time. But the consequent loads will be very fast.
-After the docker containers have started visit the following link to check if you are getting a successful response.</p>
-<pre><code class="hljs css language-bash">$ curl <span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/services/"</span> -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span>
-</code></pre>
-<p>The following will be the response from the Admin API.</p>
-<pre><code class="hljs css language-json">{
-    <span class="hljs-attr">"node"</span>: {
-        <span class="hljs-attr">"createdIndex"</span>: <span class="hljs-number">6</span>,
-        <span class="hljs-attr">"modifiedIndex"</span>: <span class="hljs-number">6</span>,
-        <span class="hljs-attr">"key"</span>: <span class="hljs-string">"/apisix/services"</span>,
-        <span class="hljs-attr">"dir"</span>: <span class="hljs-literal">true</span>
-        },
-    <span class="hljs-attr">"action"</span>: <span class="hljs-string">"get"</span>
-}
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="step-2-create-a-route-in-apisix"></a><a href="#step-2-create-a-route-in-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<p>APISIX provides a powerful Admin API and a <a href="https://github.com/apache/apisix-dashboard">dashboard</a> for configuring the routes/services/plugins.
-The quickstart guide will use the Admin API for configuring the routes.</p>
-<p>A micro-service can be configured via APISIX through the relationship between several entities such as routes, services, upstream, and plugins.
-The route matches the client request and specifies how they are sent to the upstream (backend API/Service) after they reach APISIX.
-Services provide an abstraction to the upstream services. Therefore, you can create a single service and reference it in multiple routes.
-Check out the architecture document for more information.</p>
-<p>Technically all this information(upstream or service, plugins) can be included inside a route configuration. The route consists of three main parts.</p>
-<ul>
-<li><p>Matching Rules:</p>
-<p>Let's take the following scenario.
-<a href="http://example.com/services/users">http://example.com/services/users</a></p>
-<p>The URL above hosts all the micro services related to the users(getUser/ GetAllUsers) in the system. For example the GetAllUsers endpoint can be reached via the following URL (<a href="http://example.com/services/users/GetAllUsers">http://example.com/services/users/GetAllUsers</a>)
-Now you want to expose all the <code>GET</code> endpoints(micro-services) under the <code>users</code> path. The following will be the route configuration for matching such request.</p>
-<pre><code class="hljs css language-json">{
-    "methods": ["GET"],
-    "host": "example.com",
-    "uri": "/services/users/*",
-    ... Additional Configurations
-}
-</code></pre>
-<p>With the above matching rule you can communicate to APISIX via the following command.</p>
-<pre><code class="hljs css language-bash">curl -i -X GET <span class="hljs-string">"http://{apisix_server.com}:{port}/services/users/getAllUsers?limit=10"</span> -H <span class="hljs-string">"Host: example.com"</span>
-</code></pre></li>
-<li><p>Upstream information:</p>
-<p>Upstream is a virtual host abstraction that performs load balancing on a given set of service nodes according to configuration rules.
-Thus a single upstream configuration can comprise of multiple servers which offers the same service. Each node will comprise of a key(address/ip : port) and a value(weight of the node).
-The service can be load balanced through a round robin or consistent hashing (cHash) mechanism.</p>
-<p>When configuring a route you can either set the upstream information or use service abstraction to refer the upstream information.</p></li>
-<li><p>Plugins</p>
-<p>Plugins allows you to extend the capabilities of APISIX and to implement arbitrary logic which can interface with the HTTP request/response lifecycle.
-Therefore, if you want to authenticate the API then you can include the Key Auth plugin to enforce authentication for each request.</p></li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="create-an-upstream"></a><a href="#create-an-upstream" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Execute the following command to create an upstream with the id of '50' in APISIX. Let's use the round-robin mechanism for load balancing.</p>
-<pre><code class="hljs css language-bash">curl <span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/upstreams/50"</span> -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'
-{
-    "type": "roundrobin",
-    "nodes": {
-        "httpbin.org:443": 1
-    }
-}'</span>
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="add-a-route-to-access-the-upstream"></a><a href="#add-a-route-to-access-the-upstream" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
-<p>By default APISIX proxies the request via the HTTP protocol. As our backend is hosted in a HTTPS environment, let's use the proxy-rewrite plugin to change the scheme to HTTPS.</p>
-<pre><code class="hljs css language-bash">curl <span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/routes/5"</span> -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'
-{
-    "uri": "/get",
-    "host": "httpbin.org",
-    "plugins": {
-        "proxy-rewrite": {
-          "scheme": "https"
-        }
-    },
-    "upstream_id": 50
-}'</span>
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="call-apisix"></a><a href="#call-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p>Now lets call APISIX to test the newly configured route.</p>
-<pre><code class="hljs css language-bash">curl -i -X GET <span class="hljs-string">"http://127.0.0.1:9080/get?foo1=bar1&amp;foo2=bar2"</span> -H <span class="hljs-string">"Host: httpbin.org"</span>
-</code></pre>
-<p>The API is available via the HTTPs(9443) endpoint as well. If you are using a self signed certificate then use the <code>-k</code> parameter to ignore the self-signed certificate error by the curl command.</p>
-<pre><code class="hljs css language-bash">curl -i -k -X GET <span class="hljs-string">"https://127.0.0.1:9443/get?foo1=bar1&amp;foo2=bar2"</span> -H <span class="hljs-string">"Host: httpbin.org"</span>
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="step-3-add-authentication-for-the-service"></a><a href="#step-3-add-authentication-for-the-service" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1  [...]
-<p>Now lets protect the newly created APISIX endpoint/route as it is currently open to the public.
-Execute the following command to create a user called John with a dedicated api-key.</p>
-<p>Note: APISIX supports multiple authentication mechanism, view the plugin docs to learn more.</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "username": "john",
-    "plugins": {
-        "key-auth": {
-            "key": "superSecretAPIKey"
-        }
-    }
-}'
-</code></pre>
-<p>Now, let's configure our endpoint to include the key-auth plugin.</p>
-<pre><code class="hljs css language-bash">curl http://127.0.0.1:9080/apisix/admin/routes/5 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'
-{
-    "uri": "/get",
-    "host": "httpbin.org",
-    "plugins": {
-        "proxy-rewrite": {
-          "scheme": "https"
-        },
-        "key-auth": {}
-    },
-    "upstream_id": 50
-}'</span>
-</code></pre>
-<p>As the route is secured by the key-auth plugin the former curl command to access the API will produce an unauthorized access error.
-Use the command below to securely access the endpoint now.</p>
-<pre><code class="hljs css language-bash">curl -i -X GET http://127.0.0.1:9080/get -H <span class="hljs-string">"Host: httpbin.org"</span> -H <span class="hljs-string">'apikey: superSecretAPIKey'</span>
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="add-a-prefix-to-the-route"></a><a href="#add-a-prefix-to-the-route" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
-<p>Now lets say you want to add a prefix (eg: samplePrefix) to the route and do not want to use the <code>host</code> header then you can use
-the proxy rewrite plugin to do it.</p>
-<pre><code class="hljs css language-bash">curl http://127.0.0.1:9080/apisix/admin/routes/5 -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -X PUT -d <span class="hljs-string">'
-{
-    "uri": "/samplePrefix/get",
-    "plugins": {
-        "proxy-rewrite": {
-          "scheme": "https",
-          "regex_uri": ["^/samplePrefix/get(.*)", "/get$1"]
-        },
-        "key-auth": {}
-    },
-    "upstream_id": 50
-}'</span>
-</code></pre>
-<p>Now you can invoke the route with the following command:</p>
-<pre><code class="hljs css language-bash">curl -i -X GET <span class="hljs-string">'http://127.0.0.1:9080/samplePrefix/get?param1=foo&amp;param2=bar'</span> -H <span class="hljs-string">'apikey: superSecretAPIKey'</span>
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="apisix-dashboard"></a><a href="#apisix-dashboard" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>As of now the API calls to the APISIX has been orchestrated by using the Admin API. However, APISIX also provides
-a web application to perform the similar. The dashboard is available in the following
-<a href="https://github.com/apache/apisix">repository</a>. The dashboard is intuitive and you can orchestrate the
-same route configurations via the dashboard as well.</p>
-<p><img src="https://apisix.apache.org/images/dashboard.png" alt="Dashboard"></p>
-<h3><a class="anchor" aria-hidden="true" id="troubleshooting"></a><a href="#troubleshooting" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<ul>
-<li><p>Make sure the required ports are not being used by other systems/processes (The default ports are: 9080, 9443, 2379).
-The following is the command to kill a process which is listening to a specific port (in unix based systems).</p>
-<pre><code class="hljs css language-bash">sudo fuser -k 9443/tcp
-</code></pre></li>
-<li><p>If the docker container is continuously restarting/failing, login to the container and observe the logs to diagnose the issue.</p>
-<pre><code class="hljs css language-bash">docker logs -f --tail container_id
-</code></pre></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#step-1-install-apisix">Step 1: Install APISIX</a></li><li><a href="#step-2-create-a-route-in-apisix">Step 2: Create a Route in APISIX</a><ul class="toc-headings"><li><a href="#create-an-upstream">Create an Upstream</a></li><li><a href="#add-a-route-to-access-the-upstream">Add a Route to Access the Upstre [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/grpc-proxy.html b/apisix/grpc-proxy.html
deleted file mode 100644
index 8fd05f1..0000000
--- a/apisix/grpc-proxy.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/grpc-proxy · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/grpc-proxy · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" co [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/grpc-proxy">中文</a></p>
-<h1><a class="anchor" aria-hidden="true" id="grpc-proxy"></a><a href="#grpc-proxy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>proxying gRPC traffic:
-gRPC client -&gt; APISIX -&gt; gRPC server</p>
-<h2><a class="anchor" aria-hidden="true" id="parameters"></a><a href="#parameters" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<ul>
-<li><code>service_protocol</code>:  the route's option <code>service_protocol</code> must be <code>grpc</code></li>
-<li><code>uri</code>:   format likes /service/method, Example:/helloworld.Greeter/SayHello</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="example"></a><a href="#example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<h4><a class="anchor" aria-hidden="true" id="create-proxying-grpc-route"></a><a href="#create-proxying-grpc-route" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
-<p>Here's an example, to proxying gRPC service by specified route:</p>
-<ul>
-<li>attention: the route's option <code>service_protocol</code> must be <code>grpc</code></li>
-<li>attention: APISIX use TLS‑encrypted HTTP/2 to expose gRPC service, so need to <a href="https.md">config SSL certificate</a></li>
-<li>the grpc server example:<a href="https://github.com/iresty/grpc_server_example">grpc_server_example</a></li>
-</ul>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "methods": ["POST", "GET"],
-    "uri": "/helloworld.Greeter/SayHello",
-    "service_protocol": "grpc",
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:50051": 1
-        }
-    }
-}'
-</code></pre>
-<h4><a class="anchor" aria-hidden="true" id="testing"></a><a href="#testing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Invoking the route created before:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> grpcurl -insecure -import-path /pathtoprotos  -proto helloworld.proto  -d <span class="hljs-string">'{"name":"apisix"}'</span> 127.0.0.1:9443 helloworld.Greeter.SayHello</span>
-{
-  "message": "Hello apisix"
-}
-</code></pre>
-<p>This means that the proxying is working.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#parameters">Parameters</a><ul class="toc-headings"><li><a href="#example">Example</a></li></ul></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.ap [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/grpc-proxy/index.html b/apisix/grpc-proxy/index.html
deleted file mode 100644
index 8fd05f1..0000000
--- a/apisix/grpc-proxy/index.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/grpc-proxy · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/grpc-proxy · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" co [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/grpc-proxy">中文</a></p>
-<h1><a class="anchor" aria-hidden="true" id="grpc-proxy"></a><a href="#grpc-proxy" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>proxying gRPC traffic:
-gRPC client -&gt; APISIX -&gt; gRPC server</p>
-<h2><a class="anchor" aria-hidden="true" id="parameters"></a><a href="#parameters" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<ul>
-<li><code>service_protocol</code>:  the route's option <code>service_protocol</code> must be <code>grpc</code></li>
-<li><code>uri</code>:   format likes /service/method, Example:/helloworld.Greeter/SayHello</li>
-</ul>
-<h3><a class="anchor" aria-hidden="true" id="example"></a><a href="#example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<h4><a class="anchor" aria-hidden="true" id="create-proxying-grpc-route"></a><a href="#create-proxying-grpc-route" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
-<p>Here's an example, to proxying gRPC service by specified route:</p>
-<ul>
-<li>attention: the route's option <code>service_protocol</code> must be <code>grpc</code></li>
-<li>attention: APISIX use TLS‑encrypted HTTP/2 to expose gRPC service, so need to <a href="https.md">config SSL certificate</a></li>
-<li>the grpc server example:<a href="https://github.com/iresty/grpc_server_example">grpc_server_example</a></li>
-</ul>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "methods": ["POST", "GET"],
-    "uri": "/helloworld.Greeter/SayHello",
-    "service_protocol": "grpc",
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:50051": 1
-        }
-    }
-}'
-</code></pre>
-<h4><a class="anchor" aria-hidden="true" id="testing"></a><a href="#testing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Invoking the route created before:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> grpcurl -insecure -import-path /pathtoprotos  -proto helloworld.proto  -d <span class="hljs-string">'{"name":"apisix"}'</span> 127.0.0.1:9443 helloworld.Greeter.SayHello</span>
-{
-  "message": "Hello apisix"
-}
-</code></pre>
-<p>This means that the proxying is working.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#parameters">Parameters</a><ul class="toc-headings"><li><a href="#example">Example</a></li></ul></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.ap [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/health-check.html b/apisix/health-check.html
deleted file mode 100644
index 4c80e28..0000000
--- a/apisix/health-check.html
+++ /dev/null
@@ -1,133 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/health-check · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/health-check · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="health-checks-for-upstream"></a><a href="#health-checks-for-upstream" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
-<p>Health Check of APISIX is based on <a href="https://github.com/Kong/lua-resty-healthcheck">lua-resty-healthcheck</a>,
-you can use it for upstream.</p>
-<p>Note that we only start the health check when the upstream is hit by a request.
-There won't be any health check if an upstream is configured but isn't in used.</p>
-<p>The following is an example of health check:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/index.html",
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    },
-    "upstream": {
-         "nodes": {
-            "127.0.0.1:1980": 1,
-            "127.0.0.1:1970": 1
-        },
-        "type": "roundrobin",
-        "retries": 2,
-        "checks": {
-            "active": {
-                "timeout": 5,
-                "http_path": "/status",
-                "host": "foo.com",
-                "healthy": {
-                    "interval": 2,
-                    "successes": 1
-                },
-                "unhealthy": {
-                    "interval": 1,
-                    "http_failures": 2
-                },
-                "req_headers": ["User-Agent: curl/7.29.0"]
-            },
-            "passive": {
-                "healthy": {
-                    "http_statuses": [200, 201],
-                    "successes": 3
-                },
-                "unhealthy": {
-                    "http_statuses": [500],
-                    "http_failures": 3,
-                    "tcp_failures": 3
-                }
-            }
-        }
-    }
-}'
-</code></pre>
-<p>The configures in <code>checks</code> are belong to health check, the type of <code>checks</code>
-contains: <code>active</code> or <code>passive</code>.</p>
-<ul>
-<li><p><code>active</code>: To enable active health checks, you need to specify the configuration items under <code>checks.active</code> in the Upstream object configuration.</p>
-<ul>
-<li><p><code>active.timeout</code>: Socket timeout for active checks (in seconds), support decimals. For example <code>1.01</code> means <code>1010</code> milliseconds, <code>2</code> means <code>2000</code> milliseconds.</p></li>
-<li><p><code>active.http_path</code>: The HTTP GET request path used to detect if the upstream is healthy.</p></li>
-<li><p><code>active.host</code>: The HTTP request host used to detect if the upstream is healthy.</p></li>
-<li><p><code>active.port</code>: The customize health check host port (optional), this will override the port in the <code>upstream</code> node.</p></li>
-</ul>
-<p>The threshold fields of <code>healthy</code> are:</p>
-<ul>
-<li><code>active.healthy.interval</code>: Interval between health checks for healthy targets (in seconds), the minimum is 1.</li>
-<li><code>active.healthy.successes</code>: The number of success times to determine the target is healthy, the minimum is 1.</li>
-</ul>
-<p>The threshold fields of  <code>unhealthy</code> are:</p>
-<ul>
-<li><code>active.unhealthy.interval</code>: Interval between health checks for unhealthy targets (in seconds), the minimum is 1.</li>
-<li><code>active.unhealthy.http_failures</code>: The number of http failures times to determine the target is unhealthy, the minimum is 1.</li>
-<li><code>active.req_headers</code>: Additional request headers. Array format, so you can fill in multiple headers.</li>
-</ul></li>
-<li><p><code>passive</code>: To enable passive health checks, you need to specify the configuration items under <code>checks.passive</code> in the Upstream object configuration.</p>
-<p>The threshold fields of <code>healthy</code> are:</p>
-<ul>
-<li><code>passive.healthy.http_statuses</code>: If the current response code is equal to any of these, set the upstream node to the <code>healthy</code> state. Otherwise ignore this request.</li>
-<li><code>passive.healthy.successes</code>: Number of successes in proxied traffic (as defined by <code>passive.healthy.http_statuses</code>) to consider a target healthy, as observed by passive health checks.</li>
-</ul>
-<p>The threshold fields of <code>unhealthy</code> are:</p>
-<ul>
-<li><code>passive.unhealthy.http_statuses</code>: If the current response code is equal to any of these, set the upstream node to the <code>unhealthy</code> state. Otherwise ignore this request.</li>
-<li><code>passive.unhealthy.tcp_failures</code>: Number of TCP failures in proxied traffic to consider a target unhealthy, as observed by passive health checks.</li>
-<li><code>passive.unhealthy.timeouts</code>: Number of timeouts in proxied traffic to consider a target unhealthy, as observed by passive health checks.</li>
-<li><code>passive.unhealthy.http_failures</code>: Number of HTTP failures in proxied traffic (as defined by <code>passive.unhealthy.http_statuses</code>) to consider a target unhealthy, as observed by passive health checks.</li>
-</ul></li>
-</ul>
-<p>The health check status can be fetched via <code>GET /v1/healthcheck</code> in <a href="/apisix/control-api">control API</a>.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/security/">Security</a><a href="https://www.apache.org/foundation/sponsorship.html"> [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/health-check/index.html b/apisix/health-check/index.html
deleted file mode 100644
index 4c80e28..0000000
--- a/apisix/health-check/index.html
+++ /dev/null
@@ -1,133 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/health-check · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/health-check · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="health-checks-for-upstream"></a><a href="#health-checks-for-upstream" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H [...]
-<p>Health Check of APISIX is based on <a href="https://github.com/Kong/lua-resty-healthcheck">lua-resty-healthcheck</a>,
-you can use it for upstream.</p>
-<p>Note that we only start the health check when the upstream is hit by a request.
-There won't be any health check if an upstream is configured but isn't in used.</p>
-<p>The following is an example of health check:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/index.html",
-    "plugins": {
-        "limit-count": {
-            "count": 2,
-            "time_window": 60,
-            "rejected_code": 503,
-            "key": "remote_addr"
-        }
-    },
-    "upstream": {
-         "nodes": {
-            "127.0.0.1:1980": 1,
-            "127.0.0.1:1970": 1
-        },
-        "type": "roundrobin",
-        "retries": 2,
-        "checks": {
-            "active": {
-                "timeout": 5,
-                "http_path": "/status",
-                "host": "foo.com",
-                "healthy": {
-                    "interval": 2,
-                    "successes": 1
-                },
-                "unhealthy": {
-                    "interval": 1,
-                    "http_failures": 2
-                },
-                "req_headers": ["User-Agent: curl/7.29.0"]
-            },
-            "passive": {
-                "healthy": {
-                    "http_statuses": [200, 201],
-                    "successes": 3
-                },
-                "unhealthy": {
-                    "http_statuses": [500],
-                    "http_failures": 3,
-                    "tcp_failures": 3
-                }
-            }
-        }
-    }
-}'
-</code></pre>
-<p>The configures in <code>checks</code> are belong to health check, the type of <code>checks</code>
-contains: <code>active</code> or <code>passive</code>.</p>
-<ul>
-<li><p><code>active</code>: To enable active health checks, you need to specify the configuration items under <code>checks.active</code> in the Upstream object configuration.</p>
-<ul>
-<li><p><code>active.timeout</code>: Socket timeout for active checks (in seconds), support decimals. For example <code>1.01</code> means <code>1010</code> milliseconds, <code>2</code> means <code>2000</code> milliseconds.</p></li>
-<li><p><code>active.http_path</code>: The HTTP GET request path used to detect if the upstream is healthy.</p></li>
-<li><p><code>active.host</code>: The HTTP request host used to detect if the upstream is healthy.</p></li>
-<li><p><code>active.port</code>: The customize health check host port (optional), this will override the port in the <code>upstream</code> node.</p></li>
-</ul>
-<p>The threshold fields of <code>healthy</code> are:</p>
-<ul>
-<li><code>active.healthy.interval</code>: Interval between health checks for healthy targets (in seconds), the minimum is 1.</li>
-<li><code>active.healthy.successes</code>: The number of success times to determine the target is healthy, the minimum is 1.</li>
-</ul>
-<p>The threshold fields of  <code>unhealthy</code> are:</p>
-<ul>
-<li><code>active.unhealthy.interval</code>: Interval between health checks for unhealthy targets (in seconds), the minimum is 1.</li>
-<li><code>active.unhealthy.http_failures</code>: The number of http failures times to determine the target is unhealthy, the minimum is 1.</li>
-<li><code>active.req_headers</code>: Additional request headers. Array format, so you can fill in multiple headers.</li>
-</ul></li>
-<li><p><code>passive</code>: To enable passive health checks, you need to specify the configuration items under <code>checks.passive</code> in the Upstream object configuration.</p>
-<p>The threshold fields of <code>healthy</code> are:</p>
-<ul>
-<li><code>passive.healthy.http_statuses</code>: If the current response code is equal to any of these, set the upstream node to the <code>healthy</code> state. Otherwise ignore this request.</li>
-<li><code>passive.healthy.successes</code>: Number of successes in proxied traffic (as defined by <code>passive.healthy.http_statuses</code>) to consider a target healthy, as observed by passive health checks.</li>
-</ul>
-<p>The threshold fields of <code>unhealthy</code> are:</p>
-<ul>
-<li><code>passive.unhealthy.http_statuses</code>: If the current response code is equal to any of these, set the upstream node to the <code>unhealthy</code> state. Otherwise ignore this request.</li>
-<li><code>passive.unhealthy.tcp_failures</code>: Number of TCP failures in proxied traffic to consider a target unhealthy, as observed by passive health checks.</li>
-<li><code>passive.unhealthy.timeouts</code>: Number of timeouts in proxied traffic to consider a target unhealthy, as observed by passive health checks.</li>
-<li><code>passive.unhealthy.http_failures</code>: Number of HTTP failures in proxied traffic (as defined by <code>passive.unhealthy.http_statuses</code>) to consider a target unhealthy, as observed by passive health checks.</li>
-</ul></li>
-</ul>
-<p>The health check status can be fetched via <code>GET /v1/healthcheck</code> in <a href="/apisix/control-api">control API</a>.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/security/">Security</a><a href="https://www.apache.org/foundation/sponsorship.html"> [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/how-to-build.html b/apisix/how-to-build.html
deleted file mode 100644
index 5ab1699..0000000
--- a/apisix/how-to-build.html
+++ /dev/null
@@ -1,174 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/how-to-build · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/how-to-build · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="build-apache-apisix"></a><a href="#build-apache-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<h2><a class="anchor" aria-hidden="true" id="1-install-dependencies"></a><a href="#1-install-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
-<p>The runtime environment for Apache APISIX requires Nginx and etcd.</p>
-<p>So before installation, please follow the different operating systems <a href="/apisix/install-dependencies">install Dependencies</a>.</p>
-<h2><a class="anchor" aria-hidden="true" id="2-install-apache-apisix"></a><a href="#2-install-apache-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
-<p>You can install Apache APISIX in a variety of ways, including source code packages, Docker, and Luarocks.</p>
-<h3><a class="anchor" aria-hidden="true" id="installation-via-source-release"></a><a href="#installation-via-source-release" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<p>You need to download the Apache source release first:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> mkdir apisix-2.2</span>
-<span class="hljs-meta">$</span><span class="bash"> wget https://downloads.apache.org/apisix/2.2/apache-apisix-2.2-src.tgz</span>
-<span class="hljs-meta">$</span><span class="bash"> tar zxvf apache-apisix-2.2-src.tgz -C apisix-2.2</span>
-</code></pre>
-<p>Install the Lua libraries that the runtime depends on:</p>
-<pre><code class="hljs css language-shell">cd apache-apisix-2.2
-make deps
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="installation-via-rpm-package-centos-7"></a><a href="#installation-via-rpm-package-centos-7" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 [...]
-<pre><code class="hljs css language-shell">sudo yum install -y https://github.com/apache/apisix/releases/download/2.2/apisix-2.2-0.x86_64.rpm
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="installation-via-luarocks-macos-not-supported"></a><a href="#installation-via-luarocks-macos-not-supported" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h- [...]
-<p>Execute the following command in the terminal to complete the installation of APISIX (only recommended for developers):</p>
-<blockquote>
-<p>Install the code for the master branch via a script</p>
-</blockquote>
-<pre><code class="hljs css language-shell">sudo sh -c "$(curl -fsSL https://raw.githubusercontent.com/apache/apisix/master/utils/install-apisix.sh)"
-</code></pre>
-<blockquote>
-<p>Install the specified version via Luarocks:</p>
-</blockquote>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> Install version 2.2</span>
-sudo luarocks install --lua-dir=/path/openresty/luajit apisix 2.2
-<span class="hljs-meta">
-#</span><span class="bash"> old luarocks not support the `lua-dir` parameter, you can remove this option</span>
-sudo luarocks install apisix 2.2
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="3-manage-startstop-apisix-server"></a><a href="#3-manage-startstop-apisix-server" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
-<p>We can start the APISIX server by command <code>make run</code> in APISIX home folder,
-or we can stop APISIX server by command <code>make stop</code>.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> init nginx config file and etcd</span>
-<span class="hljs-meta">$</span><span class="bash"> make init</span>
-<span class="hljs-meta">
-#</span><span class="bash"> start APISIX server</span>
-<span class="hljs-meta">$</span><span class="bash"> make run</span>
-<span class="hljs-meta">
-#</span><span class="bash"> stop APISIX server</span>
-<span class="hljs-meta">$</span><span class="bash"> make stop</span>
-<span class="hljs-meta">
-#</span><span class="bash"> more actions find by `<span class="hljs-built_in">help</span>`</span>
-<span class="hljs-meta">$</span><span class="bash"> make <span class="hljs-built_in">help</span></span>
-Makefile rules:
-
-    help:             Show Makefile rules
-    deps:             Installation dependencies
-    utils:            Installation tools
-    lint:             Lint Lua source code
-    init:             Initialize the runtime environment
-    run:              Start the apisix server
-    stop:             Stop the apisix server
-    verify:           Verify the configuration of apisix server
-    clean:            Remove generated files
-    reload:           Reload the apisix server
-    install:          Install the apisix (only for luarocks)
-    test:             Run the test case
-    license-check:    Check Lua source code for Apache License
-</code></pre>
-<p>Environment variable can be used to configure APISIX. Please take a look at <code>conf/config.yaml</code> to
-see how to do it.</p>
-<h2><a class="anchor" aria-hidden="true" id="4-test"></a><a href="#4-test" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<ol>
-<li>Install perl's package manager <code>cpanminus</code> first</li>
-<li>Then install <code>test-nginx</code>'s dependencies via <code>cpanm</code>::<code>sudo cpanm --notest Test::Nginx IPC::Run &gt; build.log 2&gt;&amp;1 || (cat build.log &amp;&amp; exit 1)</code></li>
-<li>Clone source code:<code>git clone https://github.com/iresty/test-nginx.git</code>. Note that we should use our fork.</li>
-<li>Load the <code>test-nginx</code> library with perl's <code>prove</code> command and run the test cases in the <code>/t</code> directory:
-<ul>
-<li>Set PERL5LIB for perl module: <code>export PERL5LIB=.:$PERL5LIB</code></li>
-<li>Run the test cases: <code>make test</code></li>
-<li>To set the path of nginx to run the test cases: <code>TEST_NGINX_BINARY=/usr/local/bin/openresty prove -Itest-nginx/lib -r t</code></li>
-</ul></li>
-</ol>
-<h3><a class="anchor" aria-hidden="true" id="troubleshoot-testing"></a><a href="#troubleshoot-testing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
-<p><strong>Set Nginx Path</strong></p>
-<ul>
-<li>If you run in to an issue <code>Error unknown directive &quot;lua_package_path&quot; in /API_ASPIX/apisix/t/servroot/conf/nginx.conf</code>
-make sure to set openresty as default nginx. And export the path as below.</li>
-</ul>
-<ul>
-<li>export PATH=/usr/local/openresty/nginx/sbin:$PATH
-<ul>
-<li>Linux default installation path:
-<ul>
-<li>export PATH=/usr/local/openresty/nginx/sbin:$PATH</li>
-</ul></li>
-<li>OSx default installation path via homebrew:
-<ul>
-<li>export PATH=/usr/local/opt/openresty/nginx/sbin:$PATH</li>
-</ul></li>
-</ul></li>
-</ul>
-<p><strong>Run Individual Test Cases</strong></p>
-<ul>
-<li>Use the following command to run test cases constrained to a file:
-<ul>
-<li>prove -Itest-nginx/lib -r t/plugin/openid-connect.t</li>
-</ul></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="5-update-admin-api-token-to-protect-apache-apisix"></a><a href="#5-update-admin-api-token-to-protect-apache-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4  [...]
-<p>Changes the <code>apisix.admin_key</code> in the file <code>conf/config.yaml</code> and restart the service.
-Here is an example:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">apisix:</span>
-  <span class="hljs-comment"># ... ...</span>
-  <span class="hljs-string">admin_key</span>
-    <span class="hljs-bullet">-</span>
-      <span class="hljs-attr">name:</span> <span class="hljs-string">"admin"</span>
-      <span class="hljs-attr">key:</span> <span class="hljs-string">abcdefghabcdefgh</span>
-      <span class="hljs-attr">role:</span> <span class="hljs-string">admin</span>
-</code></pre>
-<p>When calling the Admin API, <code>key</code> can be used as a token.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes?api_key=abcdefghabcdefgh -i</span>
-HTTP/1.1 200 OK
-Date: Fri, 28 Feb 2020 07:48:04 GMT
-Content-Type: text/plain
-... ...
-{"node":{...},"action":"get"}
-<span class="hljs-meta">
-$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes?api_key=abcdefghabcdefgh-invalid -i</span>
-HTTP/1.1 401 Unauthorized
-Date: Fri, 28 Feb 2020 08:17:58 GMT
-Content-Type: text/html
-... ...
-{"node":{...},"action":"get"}
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#1-install-dependencies">1. Install dependencies</a></li><li><a href="#2-install-apache-apisix">2. Install Apache APISIX</a><ul class="toc-headings"><li><a href="#installation-via-source-release">Installation via source release</a></li><li><a href="#installation-via-rpm-package-centos-7">Installation via RPM package (CentOS 7)</a></li><li><a href="#instal [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/how-to-build/index.html b/apisix/how-to-build/index.html
deleted file mode 100644
index 5ab1699..0000000
--- a/apisix/how-to-build/index.html
+++ /dev/null
@@ -1,174 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/how-to-build · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/how-to-build · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="build-apache-apisix"></a><a href="#build-apache-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<h2><a class="anchor" aria-hidden="true" id="1-install-dependencies"></a><a href="#1-install-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0 [...]
-<p>The runtime environment for Apache APISIX requires Nginx and etcd.</p>
-<p>So before installation, please follow the different operating systems <a href="/apisix/install-dependencies">install Dependencies</a>.</p>
-<h2><a class="anchor" aria-hidden="true" id="2-install-apache-apisix"></a><a href="#2-install-apache-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
-<p>You can install Apache APISIX in a variety of ways, including source code packages, Docker, and Luarocks.</p>
-<h3><a class="anchor" aria-hidden="true" id="installation-via-source-release"></a><a href="#installation-via-source-release" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 [...]
-<p>You need to download the Apache source release first:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> mkdir apisix-2.2</span>
-<span class="hljs-meta">$</span><span class="bash"> wget https://downloads.apache.org/apisix/2.2/apache-apisix-2.2-src.tgz</span>
-<span class="hljs-meta">$</span><span class="bash"> tar zxvf apache-apisix-2.2-src.tgz -C apisix-2.2</span>
-</code></pre>
-<p>Install the Lua libraries that the runtime depends on:</p>
-<pre><code class="hljs css language-shell">cd apache-apisix-2.2
-make deps
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="installation-via-rpm-package-centos-7"></a><a href="#installation-via-rpm-package-centos-7" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 [...]
-<pre><code class="hljs css language-shell">sudo yum install -y https://github.com/apache/apisix/releases/download/2.2/apisix-2.2-0.x86_64.rpm
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="installation-via-luarocks-macos-not-supported"></a><a href="#installation-via-luarocks-macos-not-supported" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h- [...]
-<p>Execute the following command in the terminal to complete the installation of APISIX (only recommended for developers):</p>
-<blockquote>
-<p>Install the code for the master branch via a script</p>
-</blockquote>
-<pre><code class="hljs css language-shell">sudo sh -c "$(curl -fsSL https://raw.githubusercontent.com/apache/apisix/master/utils/install-apisix.sh)"
-</code></pre>
-<blockquote>
-<p>Install the specified version via Luarocks:</p>
-</blockquote>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> Install version 2.2</span>
-sudo luarocks install --lua-dir=/path/openresty/luajit apisix 2.2
-<span class="hljs-meta">
-#</span><span class="bash"> old luarocks not support the `lua-dir` parameter, you can remove this option</span>
-sudo luarocks install apisix 2.2
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="3-manage-startstop-apisix-server"></a><a href="#3-manage-startstop-apisix-server" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13. [...]
-<p>We can start the APISIX server by command <code>make run</code> in APISIX home folder,
-or we can stop APISIX server by command <code>make stop</code>.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> init nginx config file and etcd</span>
-<span class="hljs-meta">$</span><span class="bash"> make init</span>
-<span class="hljs-meta">
-#</span><span class="bash"> start APISIX server</span>
-<span class="hljs-meta">$</span><span class="bash"> make run</span>
-<span class="hljs-meta">
-#</span><span class="bash"> stop APISIX server</span>
-<span class="hljs-meta">$</span><span class="bash"> make stop</span>
-<span class="hljs-meta">
-#</span><span class="bash"> more actions find by `<span class="hljs-built_in">help</span>`</span>
-<span class="hljs-meta">$</span><span class="bash"> make <span class="hljs-built_in">help</span></span>
-Makefile rules:
-
-    help:             Show Makefile rules
-    deps:             Installation dependencies
-    utils:            Installation tools
-    lint:             Lint Lua source code
-    init:             Initialize the runtime environment
-    run:              Start the apisix server
-    stop:             Stop the apisix server
-    verify:           Verify the configuration of apisix server
-    clean:            Remove generated files
-    reload:           Reload the apisix server
-    install:          Install the apisix (only for luarocks)
-    test:             Run the test case
-    license-check:    Check Lua source code for Apache License
-</code></pre>
-<p>Environment variable can be used to configure APISIX. Please take a look at <code>conf/config.yaml</code> to
-see how to do it.</p>
-<h2><a class="anchor" aria-hidden="true" id="4-test"></a><a href="#4-test" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
-<ol>
-<li>Install perl's package manager <code>cpanminus</code> first</li>
-<li>Then install <code>test-nginx</code>'s dependencies via <code>cpanm</code>::<code>sudo cpanm --notest Test::Nginx IPC::Run &gt; build.log 2&gt;&amp;1 || (cat build.log &amp;&amp; exit 1)</code></li>
-<li>Clone source code:<code>git clone https://github.com/iresty/test-nginx.git</code>. Note that we should use our fork.</li>
-<li>Load the <code>test-nginx</code> library with perl's <code>prove</code> command and run the test cases in the <code>/t</code> directory:
-<ul>
-<li>Set PERL5LIB for perl module: <code>export PERL5LIB=.:$PERL5LIB</code></li>
-<li>Run the test cases: <code>make test</code></li>
-<li>To set the path of nginx to run the test cases: <code>TEST_NGINX_BINARY=/usr/local/bin/openresty prove -Itest-nginx/lib -r t</code></li>
-</ul></li>
-</ol>
-<h3><a class="anchor" aria-hidden="true" id="troubleshoot-testing"></a><a href="#troubleshoot-testing" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
-<p><strong>Set Nginx Path</strong></p>
-<ul>
-<li>If you run in to an issue <code>Error unknown directive &quot;lua_package_path&quot; in /API_ASPIX/apisix/t/servroot/conf/nginx.conf</code>
-make sure to set openresty as default nginx. And export the path as below.</li>
-</ul>
-<ul>
-<li>export PATH=/usr/local/openresty/nginx/sbin:$PATH
-<ul>
-<li>Linux default installation path:
-<ul>
-<li>export PATH=/usr/local/openresty/nginx/sbin:$PATH</li>
-</ul></li>
-<li>OSx default installation path via homebrew:
-<ul>
-<li>export PATH=/usr/local/opt/openresty/nginx/sbin:$PATH</li>
-</ul></li>
-</ul></li>
-</ul>
-<p><strong>Run Individual Test Cases</strong></p>
-<ul>
-<li>Use the following command to run test cases constrained to a file:
-<ul>
-<li>prove -Itest-nginx/lib -r t/plugin/openid-connect.t</li>
-</ul></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="5-update-admin-api-token-to-protect-apache-apisix"></a><a href="#5-update-admin-api-token-to-protect-apache-apisix" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4  [...]
-<p>Changes the <code>apisix.admin_key</code> in the file <code>conf/config.yaml</code> and restart the service.
-Here is an example:</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">apisix:</span>
-  <span class="hljs-comment"># ... ...</span>
-  <span class="hljs-string">admin_key</span>
-    <span class="hljs-bullet">-</span>
-      <span class="hljs-attr">name:</span> <span class="hljs-string">"admin"</span>
-      <span class="hljs-attr">key:</span> <span class="hljs-string">abcdefghabcdefgh</span>
-      <span class="hljs-attr">role:</span> <span class="hljs-string">admin</span>
-</code></pre>
-<p>When calling the Admin API, <code>key</code> can be used as a token.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes?api_key=abcdefghabcdefgh -i</span>
-HTTP/1.1 200 OK
-Date: Fri, 28 Feb 2020 07:48:04 GMT
-Content-Type: text/plain
-... ...
-{"node":{...},"action":"get"}
-<span class="hljs-meta">
-$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/routes?api_key=abcdefghabcdefgh-invalid -i</span>
-HTTP/1.1 401 Unauthorized
-Date: Fri, 28 Feb 2020 08:17:58 GMT
-Content-Type: text/html
-... ...
-{"node":{...},"action":"get"}
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#1-install-dependencies">1. Install dependencies</a></li><li><a href="#2-install-apache-apisix">2. Install Apache APISIX</a><ul class="toc-headings"><li><a href="#installation-via-source-release">Installation via source release</a></li><li><a href="#installation-via-rpm-package-centos-7">Installation via RPM package (CentOS 7)</a></li><li><a href="#instal [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/https.html b/apisix/https.html
deleted file mode 100644
index 0a8d8fe..0000000
--- a/apisix/https.html
+++ /dev/null
@@ -1,178 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/https · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/https · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" content="htt [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/https">Chinese</a></p>
-<h3><a class="anchor" aria-hidden="true" id="https"></a><a href="#https" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p><code>APISIX</code> supports to load multiple SSL certificates by TLS extension Server Name Indication (SNI).</p>
-<h3><a class="anchor" aria-hidden="true" id="single-sni"></a><a href="#single-sni" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>It is most common for an SSL certificate to contain only one domain. We can create an <code>ssl</code> object. Here is a simple case, creates a <code>ssl</code> object and <code>route</code> object.</p>
-<ul>
-<li><code>cert</code>: PEM-encoded public certificate of the SSL key pair.</li>
-<li><code>key</code>: PEM-encoded private key of the SSL key pair.</li>
-<li><code>snis</code>: Hostname(s) to associate with this certificate as SNIs. To set this attribute this certificate must have a valid private key associated with it.</li>
-</ul>
-<p>We will use the Python script below to simplify the example:</p>
-<pre><code class="hljs css language-python"><span class="hljs-comment">#!/usr/bin/env python</span>
-<span class="hljs-comment"># coding: utf-8</span>
-<span class="hljs-comment"># save this file as ssl.py</span>
-<span class="hljs-keyword">import</span> sys
-<span class="hljs-comment"># sudo pip install requests</span>
-<span class="hljs-keyword">import</span> requests
-
-<span class="hljs-keyword">if</span> len(sys.argv) &lt;= <span class="hljs-number">3</span>:
-    print(<span class="hljs-string">"bad argument"</span>)
-    sys.exit(<span class="hljs-number">1</span>)
-<span class="hljs-keyword">with</span> open(sys.argv[<span class="hljs-number">1</span>]) <span class="hljs-keyword">as</span> f:
-    cert = f.read()
-<span class="hljs-keyword">with</span> open(sys.argv[<span class="hljs-number">2</span>]) <span class="hljs-keyword">as</span> f:
-    key = f.read()
-sni = sys.argv[<span class="hljs-number">3</span>]
-api_key = <span class="hljs-string">"edd1c9f034335f136f87ad84b625c8f1"</span>
-resp = requests.put(<span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/ssl/1"</span>, json={
-    <span class="hljs-string">"cert"</span>: cert,
-    <span class="hljs-string">"key"</span>: key,
-    <span class="hljs-string">"snis"</span>: [sni],
-}, headers={
-    <span class="hljs-string">"X-API-KEY"</span>: api_key,
-})
-print(resp.status_code)
-print(resp.text)
-</code></pre>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> create SSL object</span>
-./ssl.py t.crt t.key test.com
-<span class="hljs-meta">
-#</span><span class="bash"> create Router object</span>
-curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
-{
-    "uri": "/hello",
-    "hosts": ["test.com"],
-    "methods": ["GET"],
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:1980": 1
-        }
-    }
-}'
-<span class="hljs-meta">
-#</span><span class="bash"> make a <span class="hljs-built_in">test</span></span>
-
-curl --resolve 'test.com:9443:127.0.0.1' https://test.com:9443/hello  -vvv
-* Added test.com:9443:127.0.0.1 to DNS cache
-* About to connect() to test.com port 9443 (#0)
-*   Trying 127.0.0.1...
-* Connected to test.com (127.0.0.1) port 9443 (#0)
-* Initializing NSS with certpath: sql:/etc/pki/nssdb
-* skipping SSL peer certificate verification
-* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
-* Server certificate:
-*   subject: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
-*   start date: Jun 24 22:18:05 2019 GMT
-*   expire date: May 31 22:18:05 2119 GMT
-*   common name: test.com
-*   issuer: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
-<span class="hljs-meta">&gt;</span><span class="bash"> GET /hello HTTP/1.1</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> User-Agent: curl/7.29.0</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> Host: test.com:9443</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> Accept: */*</span>
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="wildcard-sni"></a><a href="#wildcard-sni" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Sometimes, one SSL certificate may contain a wildcard domain like <code>*.test.com</code>,
-that means it can accept more than one domain, eg: <code>www.test.com</code> or <code>mail.test.com</code>.</p>
-<p>Here is an example, note that the value we pass as <code>sni</code> is <code>*.test.com</code>.</p>
-<pre><code class="hljs css language-shell">./ssl.py t.crt t.key '*.test.com'
-
-curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
-{
-    "uri": "/hello",
-    "hosts": ["*.test.com"],
-    "methods": ["GET"],
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:1980": 1
-        }
-    }
-}'
-<span class="hljs-meta">
-#</span><span class="bash"> make a <span class="hljs-built_in">test</span></span>
-
-curl --resolve 'www.test.com:9443:127.0.0.1' https://www.test.com:9443/hello  -vvv
-* Added test.com:9443:127.0.0.1 to DNS cache
-* About to connect() to test.com port 9443 (#0)
-*   Trying 127.0.0.1...
-* Connected to test.com (127.0.0.1) port 9443 (#0)
-* Initializing NSS with certpath: sql:/etc/pki/nssdb
-* skipping SSL peer certificate verification
-* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
-* Server certificate:
-*   subject: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
-*   start date: Jun 24 22:18:05 2019 GMT
-*   expire date: May 31 22:18:05 2119 GMT
-*   common name: test.com
-*   issuer: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
-<span class="hljs-meta">&gt;</span><span class="bash"> GET /hello HTTP/1.1</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> User-Agent: curl/7.29.0</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> Host: test.com:9443</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> Accept: */*</span>
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="multiple-domain"></a><a href="#multiple-domain" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<p>If your SSL certificate may contain more than one domain, like <code>www.test.com</code>
-and <code>mail.test.com</code>, then you can add them into the <code>snis</code> array. For example:</p>
-<pre><code class="hljs css language-json">{
-    <span class="hljs-attr">"snis"</span>: [<span class="hljs-string">"www.test.com"</span>, <span class="hljs-string">"mail.test.com"</span>]
-}
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="multiple-certificates-for-a-single-domain"></a><a href="#multiple-certificates-for-a-single-domain" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1  [...]
-<p>If you want to configure multiple certificate for a single domain, for
-instance, supporting both the
-<a href="https://en.wikipedia.org/wiki/Elliptic-curve_cryptography">ECC</a>
-and RSA key-exchange algorithm, then just configure the extra certificates (the
-first certificate and private key should be still put in <code>cert</code> and <code>key</code>) and
-private keys by <code>certs</code> and <code>keys</code>.</p>
-<ul>
-<li><code>certs</code>: PEM-encoded certificate array.</li>
-<li><code>keys</code>: PEM-encoded private key array.</li>
-</ul>
-<p><code>APISIX</code> will pair certificate and private key with the same indice as a SSL key
-pair. So the length of <code>certs</code> and <code>keys</code> must be same.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/security/">Security</a><a href="https://www.apache.org/foundation/sponsorship.html"> [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/https/index.html b/apisix/https/index.html
deleted file mode 100644
index 0a8d8fe..0000000
--- a/apisix/https/index.html
+++ /dev/null
@@ -1,178 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/https · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/https · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" content="htt [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/https">Chinese</a></p>
-<h3><a class="anchor" aria-hidden="true" id="https"></a><a href="#https" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p><code>APISIX</code> supports to load multiple SSL certificates by TLS extension Server Name Indication (SNI).</p>
-<h3><a class="anchor" aria-hidden="true" id="single-sni"></a><a href="#single-sni" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>It is most common for an SSL certificate to contain only one domain. We can create an <code>ssl</code> object. Here is a simple case, creates a <code>ssl</code> object and <code>route</code> object.</p>
-<ul>
-<li><code>cert</code>: PEM-encoded public certificate of the SSL key pair.</li>
-<li><code>key</code>: PEM-encoded private key of the SSL key pair.</li>
-<li><code>snis</code>: Hostname(s) to associate with this certificate as SNIs. To set this attribute this certificate must have a valid private key associated with it.</li>
-</ul>
-<p>We will use the Python script below to simplify the example:</p>
-<pre><code class="hljs css language-python"><span class="hljs-comment">#!/usr/bin/env python</span>
-<span class="hljs-comment"># coding: utf-8</span>
-<span class="hljs-comment"># save this file as ssl.py</span>
-<span class="hljs-keyword">import</span> sys
-<span class="hljs-comment"># sudo pip install requests</span>
-<span class="hljs-keyword">import</span> requests
-
-<span class="hljs-keyword">if</span> len(sys.argv) &lt;= <span class="hljs-number">3</span>:
-    print(<span class="hljs-string">"bad argument"</span>)
-    sys.exit(<span class="hljs-number">1</span>)
-<span class="hljs-keyword">with</span> open(sys.argv[<span class="hljs-number">1</span>]) <span class="hljs-keyword">as</span> f:
-    cert = f.read()
-<span class="hljs-keyword">with</span> open(sys.argv[<span class="hljs-number">2</span>]) <span class="hljs-keyword">as</span> f:
-    key = f.read()
-sni = sys.argv[<span class="hljs-number">3</span>]
-api_key = <span class="hljs-string">"edd1c9f034335f136f87ad84b625c8f1"</span>
-resp = requests.put(<span class="hljs-string">"http://127.0.0.1:9080/apisix/admin/ssl/1"</span>, json={
-    <span class="hljs-string">"cert"</span>: cert,
-    <span class="hljs-string">"key"</span>: key,
-    <span class="hljs-string">"snis"</span>: [sni],
-}, headers={
-    <span class="hljs-string">"X-API-KEY"</span>: api_key,
-})
-print(resp.status_code)
-print(resp.text)
-</code></pre>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> create SSL object</span>
-./ssl.py t.crt t.key test.com
-<span class="hljs-meta">
-#</span><span class="bash"> create Router object</span>
-curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
-{
-    "uri": "/hello",
-    "hosts": ["test.com"],
-    "methods": ["GET"],
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:1980": 1
-        }
-    }
-}'
-<span class="hljs-meta">
-#</span><span class="bash"> make a <span class="hljs-built_in">test</span></span>
-
-curl --resolve 'test.com:9443:127.0.0.1' https://test.com:9443/hello  -vvv
-* Added test.com:9443:127.0.0.1 to DNS cache
-* About to connect() to test.com port 9443 (#0)
-*   Trying 127.0.0.1...
-* Connected to test.com (127.0.0.1) port 9443 (#0)
-* Initializing NSS with certpath: sql:/etc/pki/nssdb
-* skipping SSL peer certificate verification
-* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
-* Server certificate:
-*   subject: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
-*   start date: Jun 24 22:18:05 2019 GMT
-*   expire date: May 31 22:18:05 2119 GMT
-*   common name: test.com
-*   issuer: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
-<span class="hljs-meta">&gt;</span><span class="bash"> GET /hello HTTP/1.1</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> User-Agent: curl/7.29.0</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> Host: test.com:9443</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> Accept: */*</span>
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="wildcard-sni"></a><a href="#wildcard-sni" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Sometimes, one SSL certificate may contain a wildcard domain like <code>*.test.com</code>,
-that means it can accept more than one domain, eg: <code>www.test.com</code> or <code>mail.test.com</code>.</p>
-<p>Here is an example, note that the value we pass as <code>sni</code> is <code>*.test.com</code>.</p>
-<pre><code class="hljs css language-shell">./ssl.py t.crt t.key '*.test.com'
-
-curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
-{
-    "uri": "/hello",
-    "hosts": ["*.test.com"],
-    "methods": ["GET"],
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:1980": 1
-        }
-    }
-}'
-<span class="hljs-meta">
-#</span><span class="bash"> make a <span class="hljs-built_in">test</span></span>
-
-curl --resolve 'www.test.com:9443:127.0.0.1' https://www.test.com:9443/hello  -vvv
-* Added test.com:9443:127.0.0.1 to DNS cache
-* About to connect() to test.com port 9443 (#0)
-*   Trying 127.0.0.1...
-* Connected to test.com (127.0.0.1) port 9443 (#0)
-* Initializing NSS with certpath: sql:/etc/pki/nssdb
-* skipping SSL peer certificate verification
-* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
-* Server certificate:
-*   subject: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
-*   start date: Jun 24 22:18:05 2019 GMT
-*   expire date: May 31 22:18:05 2119 GMT
-*   common name: test.com
-*   issuer: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
-<span class="hljs-meta">&gt;</span><span class="bash"> GET /hello HTTP/1.1</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> User-Agent: curl/7.29.0</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> Host: test.com:9443</span>
-<span class="hljs-meta">&gt;</span><span class="bash"> Accept: */*</span>
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="multiple-domain"></a><a href="#multiple-domain" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<p>If your SSL certificate may contain more than one domain, like <code>www.test.com</code>
-and <code>mail.test.com</code>, then you can add them into the <code>snis</code> array. For example:</p>
-<pre><code class="hljs css language-json">{
-    <span class="hljs-attr">"snis"</span>: [<span class="hljs-string">"www.test.com"</span>, <span class="hljs-string">"mail.test.com"</span>]
-}
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="multiple-certificates-for-a-single-domain"></a><a href="#multiple-certificates-for-a-single-domain" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1  [...]
-<p>If you want to configure multiple certificate for a single domain, for
-instance, supporting both the
-<a href="https://en.wikipedia.org/wiki/Elliptic-curve_cryptography">ECC</a>
-and RSA key-exchange algorithm, then just configure the extra certificates (the
-first certificate and private key should be still put in <code>cert</code> and <code>key</code>) and
-private keys by <code>certs</code> and <code>keys</code>.</p>
-<ul>
-<li><code>certs</code>: PEM-encoded certificate array.</li>
-<li><code>keys</code>: PEM-encoded private key array.</li>
-</ul>
-<p><code>APISIX</code> will pair certificate and private key with the same indice as a SSL key
-pair. So the length of <code>certs</code> and <code>keys</code> must be same.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/security/">Security</a><a href="https://www.apache.org/foundation/sponsorship.html"> [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/install-dependencies.html b/apisix/install-dependencies.html
deleted file mode 100644
index 65c041e..0000000
--- a/apisix/install-dependencies.html
+++ /dev/null
@@ -1,152 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/install-dependencies · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/install-dependencies · Apache APISIX™"/><meta property="og:type" content="website"/><meta  [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="install-dependencies"></a><a href="#install-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
-<ul>
-<li><a href="#install-dependencies">Install Dependencies</a></li>
-<li><a href="#note">Note</a></li>
-<li><a href="#centos-7">CentOS 7</a></li>
-<li><a href="#fedora-31--32">Fedora 31 &amp; 32</a></li>
-<li><a href="#ubuntu-1604--1804">Ubuntu 16.04 &amp; 18.04</a></li>
-<li><a href="#debian-9--10">Debian 9 &amp; 10</a></li>
-<li><a href="#mac-osx">Mac OSX</a></li>
-</ul>
-<h1><a class="anchor" aria-hidden="true" id="note"></a><a href="#note" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
-<ul>
-<li><p>Since v2.0 Apache APISIX would not support the v2 protocol storage to etcd anymore, and the minimum etcd version supported is v3.4.0. What's more, etcd v3 uses gRPC as the messaging protocol, while Apache APISIX uses HTTP(S) to communicate with etcd cluster, so be sure the <a href="https://etcd.io/docs/v3.4.0/dev-guide/api_grpc_gateway/">etcd gRPC gateway</a> is enabled.</p></li>
-<li><p>Now by default Apache APISIX uses HTTP protocol to talk with etcd cluster, which is insecure. Please configure certificate and corresponding private key for your etcd cluster, and use &quot;https&quot; scheme explicitly in the etcd endpoints list in your Apache APISIX configuration, if you want to keep the data secure and integral. See the etcd section in <code>conf/config-default.yaml</code> for more details.</p></li>
-<li><p>If you want use Tengine instead of OpenResty, please take a look at this installation step script <a href="../.travis/linux_tengine_runner.sh">Install Tengine at Ubuntu</a>.</p></li>
-</ul>
-<h1><a class="anchor" aria-hidden="true" id="centos-7"></a><a href="#centos-7" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> install epel, `luarocks` need it.</span>
-wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
-sudo rpm -ivh epel-release-latest-7.noarch.rpm
-<span class="hljs-meta">
-#</span><span class="bash"> install etcd</span>
-wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
-tar -xvf etcd-v3.4.13-linux-amd64.tar.gz &amp;&amp; \
-    cd etcd-v3.4.13-linux-amd64 &amp;&amp; \
-    sudo cp -a etcd etcdctl /usr/bin/
-<span class="hljs-meta">
-#</span><span class="bash"> add OpenResty <span class="hljs-built_in">source</span></span>
-sudo yum install yum-utils
-sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
-<span class="hljs-meta">
-#</span><span class="bash"> install OpenResty and some compilation tools</span>
-sudo yum install -y openresty curl git gcc luarocks lua-devel
-<span class="hljs-meta">
-#</span><span class="bash"> start etcd server</span>
-nohup etcd &amp;
-</code></pre>
-<h1><a class="anchor" aria-hidden="true" id="fedora-31--32"></a><a href="#fedora-31--32" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> add OpenResty <span class="hljs-built_in">source</span></span>
-sudo yum install yum-utils
-sudo yum-config-manager --add-repo https://openresty.org/package/fedora/openresty.repo
-<span class="hljs-meta">
-#</span><span class="bash"> install etcd</span>
-wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
-tar -xvf etcd-v3.4.13-linux-amd64.tar.gz &amp;&amp; \
-    cd etcd-v3.4.13-linux-amd64 &amp;&amp; \
-    sudo cp -a etcd etcdctl /usr/bin/
-<span class="hljs-meta">
-#</span><span class="bash"> install OpenResty and some compilation tools</span>
-sudo yum install -y openresty curl git gcc luarocks lua-devel
-<span class="hljs-meta">
-#</span><span class="bash"> start etcd server</span>
-nohup etcd &amp;
-</code></pre>
-<h1><a class="anchor" aria-hidden="true" id="ubuntu-1604--1804"></a><a href="#ubuntu-1604--1804" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> add OpenResty <span class="hljs-built_in">source</span></span>
-wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
-sudo apt-get update
-sudo apt-get -y install software-properties-common
-sudo add-apt-repository -y "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main"
-sudo apt-get update
-<span class="hljs-meta">
-#</span><span class="bash"> install etcd</span>
-wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
-tar -xvf etcd-v3.4.13-linux-amd64.tar.gz &amp;&amp; \
-    cd etcd-v3.4.13-linux-amd64 &amp;&amp; \
-    sudo cp -a etcd etcdctl /usr/bin/
-<span class="hljs-meta">
-#</span><span class="bash"> install OpenResty and some compilation tools</span>
-sudo apt-get install -y git openresty curl luarocks
-<span class="hljs-meta">
-#</span><span class="bash"> start etcd server</span>
-nohup etcd &amp;
-</code></pre>
-<h1><a class="anchor" aria-hidden="true" id="debian-9--10"></a><a href="#debian-9--10" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> optional</span>
-sed -i 's|^deb http://deb.debian.org/debian|deb http://mirrors.huaweicloud.com/debian|g' /etc/apt/sources.list
-sed -i 's|^deb http://security.debian.org/debian-security|deb http://mirrors.huaweicloud.com/debian-security|g' /etc/apt/sources.list
-apt update
-apt install wget gnupg -y
-<span class="hljs-meta">
-#</span><span class="bash"> add OpenResty <span class="hljs-built_in">source</span></span>
-wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
-sudo apt-get -y install software-properties-common
-sudo add-apt-repository -y "deb http://openresty.org/package/debian $(lsb_release -sc) openresty"
-sudo apt-get update
-<span class="hljs-meta">
-#</span><span class="bash"> install etcd</span>
-wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
-tar -xvf etcd-v3.4.13-linux-amd64.tar.gz &amp;&amp; \
-    cd etcd-v3.4.13-linux-amd64 &amp;&amp; \
-    sudo cp -a etcd etcdctl /usr/bin/
-<span class="hljs-meta">
-#</span><span class="bash"> install OpenResty and some compilation tools</span>
-sudo apt-get install -y git openresty curl luarocks make
-<span class="hljs-meta">
-#</span><span class="bash"> start etcd server</span>
-nohup etcd &amp;
-</code></pre>
-<h1><a class="anchor" aria-hidden="true" id="mac-osx"></a><a href="#mac-osx" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> install OpenResty, etcd and some compilation tools</span>
-brew install openresty/brew/openresty etcd luarocks curl git
-<span class="hljs-meta">
-#</span><span class="bash"> start etcd server</span>
-etcd &amp;
-<span class="hljs-meta">
-#</span><span class="bash"> <span class="hljs-built_in">enable</span> TLS <span class="hljs-keyword">for</span> etcd server</span>
-etcd --cert-file=/path/to/cert --key-file=/path/to/pkey --advertise-client-urls https://127.0.0.1:2379
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/security/">Security</a><a href="https://www.apache.org/foundation/sponsorship.html"> [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/install-dependencies/index.html b/apisix/install-dependencies/index.html
deleted file mode 100644
index 65c041e..0000000
--- a/apisix/install-dependencies/index.html
+++ /dev/null
@@ -1,152 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/install-dependencies · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/install-dependencies · Apache APISIX™"/><meta property="og:type" content="website"/><meta  [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<h1><a class="anchor" aria-hidden="true" id="install-dependencies"></a><a href="#install-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
-<ul>
-<li><a href="#install-dependencies">Install Dependencies</a></li>
-<li><a href="#note">Note</a></li>
-<li><a href="#centos-7">CentOS 7</a></li>
-<li><a href="#fedora-31--32">Fedora 31 &amp; 32</a></li>
-<li><a href="#ubuntu-1604--1804">Ubuntu 16.04 &amp; 18.04</a></li>
-<li><a href="#debian-9--10">Debian 9 &amp; 10</a></li>
-<li><a href="#mac-osx">Mac OSX</a></li>
-</ul>
-<h1><a class="anchor" aria-hidden="true" id="note"></a><a href="#note" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
-<ul>
-<li><p>Since v2.0 Apache APISIX would not support the v2 protocol storage to etcd anymore, and the minimum etcd version supported is v3.4.0. What's more, etcd v3 uses gRPC as the messaging protocol, while Apache APISIX uses HTTP(S) to communicate with etcd cluster, so be sure the <a href="https://etcd.io/docs/v3.4.0/dev-guide/api_grpc_gateway/">etcd gRPC gateway</a> is enabled.</p></li>
-<li><p>Now by default Apache APISIX uses HTTP protocol to talk with etcd cluster, which is insecure. Please configure certificate and corresponding private key for your etcd cluster, and use &quot;https&quot; scheme explicitly in the etcd endpoints list in your Apache APISIX configuration, if you want to keep the data secure and integral. See the etcd section in <code>conf/config-default.yaml</code> for more details.</p></li>
-<li><p>If you want use Tengine instead of OpenResty, please take a look at this installation step script <a href="../.travis/linux_tengine_runner.sh">Install Tengine at Ubuntu</a>.</p></li>
-</ul>
-<h1><a class="anchor" aria-hidden="true" id="centos-7"></a><a href="#centos-7" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> install epel, `luarocks` need it.</span>
-wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
-sudo rpm -ivh epel-release-latest-7.noarch.rpm
-<span class="hljs-meta">
-#</span><span class="bash"> install etcd</span>
-wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
-tar -xvf etcd-v3.4.13-linux-amd64.tar.gz &amp;&amp; \
-    cd etcd-v3.4.13-linux-amd64 &amp;&amp; \
-    sudo cp -a etcd etcdctl /usr/bin/
-<span class="hljs-meta">
-#</span><span class="bash"> add OpenResty <span class="hljs-built_in">source</span></span>
-sudo yum install yum-utils
-sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
-<span class="hljs-meta">
-#</span><span class="bash"> install OpenResty and some compilation tools</span>
-sudo yum install -y openresty curl git gcc luarocks lua-devel
-<span class="hljs-meta">
-#</span><span class="bash"> start etcd server</span>
-nohup etcd &amp;
-</code></pre>
-<h1><a class="anchor" aria-hidden="true" id="fedora-31--32"></a><a href="#fedora-31--32" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> add OpenResty <span class="hljs-built_in">source</span></span>
-sudo yum install yum-utils
-sudo yum-config-manager --add-repo https://openresty.org/package/fedora/openresty.repo
-<span class="hljs-meta">
-#</span><span class="bash"> install etcd</span>
-wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
-tar -xvf etcd-v3.4.13-linux-amd64.tar.gz &amp;&amp; \
-    cd etcd-v3.4.13-linux-amd64 &amp;&amp; \
-    sudo cp -a etcd etcdctl /usr/bin/
-<span class="hljs-meta">
-#</span><span class="bash"> install OpenResty and some compilation tools</span>
-sudo yum install -y openresty curl git gcc luarocks lua-devel
-<span class="hljs-meta">
-#</span><span class="bash"> start etcd server</span>
-nohup etcd &amp;
-</code></pre>
-<h1><a class="anchor" aria-hidden="true" id="ubuntu-1604--1804"></a><a href="#ubuntu-1604--1804" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> add OpenResty <span class="hljs-built_in">source</span></span>
-wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
-sudo apt-get update
-sudo apt-get -y install software-properties-common
-sudo add-apt-repository -y "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main"
-sudo apt-get update
-<span class="hljs-meta">
-#</span><span class="bash"> install etcd</span>
-wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
-tar -xvf etcd-v3.4.13-linux-amd64.tar.gz &amp;&amp; \
-    cd etcd-v3.4.13-linux-amd64 &amp;&amp; \
-    sudo cp -a etcd etcdctl /usr/bin/
-<span class="hljs-meta">
-#</span><span class="bash"> install OpenResty and some compilation tools</span>
-sudo apt-get install -y git openresty curl luarocks
-<span class="hljs-meta">
-#</span><span class="bash"> start etcd server</span>
-nohup etcd &amp;
-</code></pre>
-<h1><a class="anchor" aria-hidden="true" id="debian-9--10"></a><a href="#debian-9--10" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> optional</span>
-sed -i 's|^deb http://deb.debian.org/debian|deb http://mirrors.huaweicloud.com/debian|g' /etc/apt/sources.list
-sed -i 's|^deb http://security.debian.org/debian-security|deb http://mirrors.huaweicloud.com/debian-security|g' /etc/apt/sources.list
-apt update
-apt install wget gnupg -y
-<span class="hljs-meta">
-#</span><span class="bash"> add OpenResty <span class="hljs-built_in">source</span></span>
-wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -
-sudo apt-get -y install software-properties-common
-sudo add-apt-repository -y "deb http://openresty.org/package/debian $(lsb_release -sc) openresty"
-sudo apt-get update
-<span class="hljs-meta">
-#</span><span class="bash"> install etcd</span>
-wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
-tar -xvf etcd-v3.4.13-linux-amd64.tar.gz &amp;&amp; \
-    cd etcd-v3.4.13-linux-amd64 &amp;&amp; \
-    sudo cp -a etcd etcdctl /usr/bin/
-<span class="hljs-meta">
-#</span><span class="bash"> install OpenResty and some compilation tools</span>
-sudo apt-get install -y git openresty curl luarocks make
-<span class="hljs-meta">
-#</span><span class="bash"> start etcd server</span>
-nohup etcd &amp;
-</code></pre>
-<h1><a class="anchor" aria-hidden="true" id="mac-osx"></a><a href="#mac-osx" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<pre><code class="hljs css language-shell"><span class="hljs-meta">#</span><span class="bash"> install OpenResty, etcd and some compilation tools</span>
-brew install openresty/brew/openresty etcd luarocks curl git
-<span class="hljs-meta">
-#</span><span class="bash"> start etcd server</span>
-etcd &amp;
-<span class="hljs-meta">
-#</span><span class="bash"> <span class="hljs-built_in">enable</span> TLS <span class="hljs-keyword">for</span> etcd server</span>
-etcd --cert-file=/path/to/cert --key-file=/path/to/pkey --advertise-client-urls https://127.0.0.1:2379
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.apache.org/security/">Security</a><a href="https://www.apache.org/foundation/sponsorship.html"> [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/mtls.html b/apisix/mtls.html
deleted file mode 100644
index 7d96958..0000000
--- a/apisix/mtls.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/mtls · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/mtls · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" content="https [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/mtls">Chinese</a></p>
-<h2><a class="anchor" aria-hidden="true" id="mutual-tls-authentication"></a><a href="#mutual-tls-authentication" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
-<h3><a class="anchor" aria-hidden="true" id="why-use-it"></a><a href="#why-use-it" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Mutual TLS authentication provides a better way to prevent unauthorized access to APISIX.</p>
-<p>The clients will provide their certificates to the server and the server will check whether the cert is signed by the supplied CA and decide whether to serve the request.</p>
-<h3><a class="anchor" aria-hidden="true" id="how-to-enable"></a><a href="#how-to-enable" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<ol>
-<li><p>Generate self-signed key pairs, including ca, server, client key pairs.</p></li>
-<li><p>Modify configuration items in <code>conf/config.yaml</code>:</p></li>
-</ol>
-<pre><code class="hljs css language-yaml">  <span class="hljs-attr">port_admin:</span> <span class="hljs-number">9180</span>
-  <span class="hljs-attr">https_admin:</span> <span class="hljs-literal">true</span>
-
-  <span class="hljs-attr">mtls:</span>
-    <span class="hljs-attr">enable:</span> <span class="hljs-literal">true</span>               <span class="hljs-comment"># Enable or disable mTLS. Enable depends on `port_admin` and `https_admin`.</span>
-    <span class="hljs-attr">ca_cert:</span> <span class="hljs-string">"/data/certs/mtls_ca.crt"</span>                 <span class="hljs-comment"># Path of your self-signed ca cert.</span>
-    <span class="hljs-attr">server_key:</span> <span class="hljs-string">"/data/certs/mtls_server.key"</span>          <span class="hljs-comment"># Path of your self-signed server side cert.</span>
-    <span class="hljs-attr">server_cert:</span> <span class="hljs-string">"/data/certs/mtls_server.crt"</span>         <span class="hljs-comment"># Path of your self-signed server side key.</span>
-</code></pre>
-<ol start="3">
-<li>Run command:</li>
-</ol>
-<pre><code class="hljs css language-shell">apisix init
-apisix reload
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="how-client-calls"></a><a href="#how-client-calls" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>Please replace the following certificate paths and domain name with your real ones.</p>
-<ul>
-<li>Note: The same CA certificate as the server needs to be used *</li>
-</ul>
-<pre><code class="hljs css language-shell">curl --cacert /data/certs/mtls_ca.crt --key /data/certs/mtls_client.key --cert /data/certs/mtls_client.crt  https://admin.apisix.dev:9180/apisix/admin/routes -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#mutual-tls-authentication">Mutual TLS authentication</a><ul class="toc-headings"><li><a href="#why-use-it">Why use it</a></li><li><a href="#how-to-enable">How to enable</a></li><li><a href="#how-client-calls">How client calls</a></li></ul></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></ [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/mtls/index.html b/apisix/mtls/index.html
deleted file mode 100644
index 7d96958..0000000
--- a/apisix/mtls/index.html
+++ /dev/null
@@ -1,75 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/mtls · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/mtls · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" content="https [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/mtls">Chinese</a></p>
-<h2><a class="anchor" aria-hidden="true" id="mutual-tls-authentication"></a><a href="#mutual-tls-authentication" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c [...]
-<h3><a class="anchor" aria-hidden="true" id="why-use-it"></a><a href="#why-use-it" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Mutual TLS authentication provides a better way to prevent unauthorized access to APISIX.</p>
-<p>The clients will provide their certificates to the server and the server will check whether the cert is signed by the supplied CA and decide whether to serve the request.</p>
-<h3><a class="anchor" aria-hidden="true" id="how-to-enable"></a><a href="#how-to-enable" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<ol>
-<li><p>Generate self-signed key pairs, including ca, server, client key pairs.</p></li>
-<li><p>Modify configuration items in <code>conf/config.yaml</code>:</p></li>
-</ol>
-<pre><code class="hljs css language-yaml">  <span class="hljs-attr">port_admin:</span> <span class="hljs-number">9180</span>
-  <span class="hljs-attr">https_admin:</span> <span class="hljs-literal">true</span>
-
-  <span class="hljs-attr">mtls:</span>
-    <span class="hljs-attr">enable:</span> <span class="hljs-literal">true</span>               <span class="hljs-comment"># Enable or disable mTLS. Enable depends on `port_admin` and `https_admin`.</span>
-    <span class="hljs-attr">ca_cert:</span> <span class="hljs-string">"/data/certs/mtls_ca.crt"</span>                 <span class="hljs-comment"># Path of your self-signed ca cert.</span>
-    <span class="hljs-attr">server_key:</span> <span class="hljs-string">"/data/certs/mtls_server.key"</span>          <span class="hljs-comment"># Path of your self-signed server side cert.</span>
-    <span class="hljs-attr">server_cert:</span> <span class="hljs-string">"/data/certs/mtls_server.crt"</span>         <span class="hljs-comment"># Path of your self-signed server side key.</span>
-</code></pre>
-<ol start="3">
-<li>Run command:</li>
-</ol>
-<pre><code class="hljs css language-shell">apisix init
-apisix reload
-</code></pre>
-<h3><a class="anchor" aria-hidden="true" id="how-client-calls"></a><a href="#how-client-calls" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>Please replace the following certificate paths and domain name with your real ones.</p>
-<ul>
-<li>Note: The same CA certificate as the server needs to be used *</li>
-</ul>
-<pre><code class="hljs css language-shell">curl --cacert /data/certs/mtls_ca.crt --key /data/certs/mtls_client.key --cert /data/certs/mtls_client.crt  https://admin.apisix.dev:9180/apisix/admin/routes -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
-</code></pre>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#mutual-tls-authentication">Mutual TLS authentication</a><ul class="toc-headings"><li><a href="#why-use-it">Why use it</a></li><li><a href="#how-to-enable">How to enable</a></li><li><a href="#how-client-calls">How client calls</a></li></ul></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></ [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/plugin-develop.html b/apisix/plugin-develop.html
deleted file mode 100644
index ef4f6b5..0000000
--- a/apisix/plugin-develop.html
+++ /dev/null
@@ -1,305 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/plugin-develop · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/plugin-develop · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-[中文](/apisix/zh-cn/plugin-develop)
-<h1><a class="anchor" aria-hidden="true" id="table-of-contents"></a><a href="#table-of-contents" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<ul>
-<li><a href="#check-dependencies"><strong>check dependencies</strong></a></li>
-<li><a href="#name-and-config"><strong>name and config</strong></a></li>
-<li><a href="#schema-and-check"><strong>schema and check</strong></a></li>
-<li><a href="#choose-phase-to-run"><strong>choose phase to run</strong></a></li>
-<li><a href="#implement-the-logic"><strong>implement the logic</strong></a></li>
-<li><a href="#write-test-case"><strong>write test case</strong></a></li>
-<li><a href="#register-public-api"><strong>register public API</strong></a></li>
-<li><a href="#register-control-api"><strong>register control API</strong></a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="check-dependencies"></a><a href="#check-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>if you have dependencies on external libraries, check the dependent items. if your plugin needs to use shared memory, it
-needs to declare in <strong>bin/apisix</strong>, for example :</p>
-<pre><code class="hljs css language-nginx">    <span class="hljs-attribute">lua_shared_dict</span> plugin-limit-req     <span class="hljs-number">10m</span>;
-    <span class="hljs-attribute">lua_shared_dict</span> plugin-limit-count   <span class="hljs-number">10m</span>;
-    <span class="hljs-attribute">lua_shared_dict</span> prometheus-metrics   <span class="hljs-number">10m</span>;
-    <span class="hljs-attribute">lua_shared_dict</span> plugin-limit-conn    <span class="hljs-number">10m</span>;
-    <span class="hljs-attribute">lua_shared_dict</span> upstream-healthcheck <span class="hljs-number">10m</span>;
-    <span class="hljs-attribute">lua_shared_dict</span> worker-events        <span class="hljs-number">10m</span>;
-
-    <span class="hljs-comment"># for openid-connect plugin</span>
-    <span class="hljs-attribute">lua_shared_dict</span> discovery             <span class="hljs-number">1m</span>; <span class="hljs-comment"># cache for discovery metadata documents</span>
-    <span class="hljs-attribute">lua_shared_dict</span> jwks                  <span class="hljs-number">1m</span>; <span class="hljs-comment"># cache for JWKs</span>
-    <span class="hljs-attribute">lua_shared_dict</span> introspection        <span class="hljs-number">10m</span>; <span class="hljs-comment"># cache for JWT verification results</span>
-</code></pre>
-<p>The plugin itself provides the init method. It is convenient for plugins to perform some initialization after
-the plugin is loaded.</p>
-<p>Note : if the dependency of some plugin needs to be initialized when Nginx start, you may need to add logic to the initialization
-method &quot;http_init&quot; in the file <strong>apisix.lua</strong>, And you may need to add some processing on generated part of Nginx
-configuration file in <strong>bin/apisix</strong> file. but it is easy to have an impact on the overall situation according to the
-existing plugin mechanism, we do not recommend this unless you have a complete grasp of the code.</p>
-<h2><a class="anchor" aria-hidden="true" id="name-and-config"></a><a href="#name-and-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<p>Determine the name and priority of the plugin, and add to conf/config-default.yaml. For example, for the example-plugin plugin,
-you need to specify the plugin name in the code (the name is the unique identifier of the plugin and cannot be
-duplicate), you can see the code in file &quot;<strong>apisix/plugins/example-plugin.lua</strong>&quot; :</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> plugin_name = <span class="hljs-string">"example-plugin"</span>
-
-<span class="hljs-keyword">local</span> _M = {
-    version = <span class="hljs-number">0.1</span>,
-    priority = <span class="hljs-number">0</span>,
-    name = plugin_name,
-    schema = schema,
-    metadata_schema = metadata_schema,
-}
-</code></pre>
-<p>Note : The priority of the new plugin cannot be the same as the priority of any existing plugin. In addition, plugins with a high priority value will be executed first in a given phase (see the definition of <code>phase</code> in <a href="#choose-phase-to-run">choose-phase-to-run</a>). For example, the priority of example-plugin is 0 and the priority of ip-restriction is 3000. Therefore, the ip-restriction plugin will be executed first, then the example-plugin plugin.</p>
-<p>in the &quot;<strong>conf/config-default.yaml</strong>&quot; configuration file, the enabled plugins (all specified by plugin name) are listed.</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">plugins:</span>                          <span class="hljs-comment"># plugin list</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">limit-req</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">limit-count</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">limit-conn</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">key-auth</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">prometheus</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">node-status</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">jwt-auth</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">zipkin</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">ip-restriction</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">grpc-transcode</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">serverless-pre-function</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">serverless-post-function</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">openid-connect</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">proxy-rewrite</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">redirect</span>
-  <span class="hljs-string">...</span>
-</code></pre>
-<p>Note : the order of the plugins is not related to the order of execution.</p>
-<p>If your plugin has a new code directory of its own, you will need to modify the <code>Makefile</code> to create directory, such as:</p>
-<pre><code class="hljs"><span class="hljs-variable">$(</span>INSTALL) -d <span class="hljs-variable">$(</span>INST_LUADIR)/apisix/plugins/skywalking
-<span class="hljs-variable">$(</span>INSTALL) apisix/plugins/skywalking/*.lua <span class="hljs-variable">$(</span>INST_LUADIR)/apisix/plugins/skywalking/
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="schema-and-check"></a><a href="#schema-and-check" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>Write <a href="https://json-schema.org">Json Schema</a> descriptions and check functions. Similarly, take the example-plugin plugin as an example to see its
-configuration data :</p>
-<pre><code class="hljs css language-json">"example-plugin" : {
-    "i": 1,
-    "s": "s",
-    "t": [1]
-}
-</code></pre>
-<p>Let's look at its schema description :</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> schema = {
-    <span class="hljs-built_in">type</span> = <span class="hljs-string">"object"</span>,
-    properties = {
-        i = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"number"</span>, minimum = <span class="hljs-number">0</span>},
-        s = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"string"</span>},
-        t = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"array"</span>, minItems = <span class="hljs-number">1</span>},
-        ip = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"string"</span>},
-        port = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"integer"</span>},
-    },
-    required = {<span class="hljs-string">"i"</span>},
-}
-</code></pre>
-<p>The schema defines a non-negative number <code>i</code>, a string <code>s</code>, a non-empty array of <code>t</code>, and <code>ip</code> / <code>port</code>. Only <code>i</code> is required.</p>
-<p>At the same time, we need to implement the <strong>check_schema(conf)</strong> method to complete the specification verification.</p>
-<pre><code class="hljs css language-lua"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.check_schema</span><span class="hljs-params">(conf, schema_type)</span></span>
-    <span class="hljs-keyword">return</span> core.schema.check(schema, conf)
-<span class="hljs-keyword">end</span>
-</code></pre>
-<p>Note: the project has provided the public method &quot;<strong>core.schema.check</strong>&quot;, which can be used directly to complete JSON
-verification.</p>
-<p>In addition, if the plugin needs to use some metadata, we can define the plugin <code>metadata_schema</code>, and then we can dynamically manage these metadata through the <code>admin api</code>. Example:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> metadata_schema = {
-    <span class="hljs-built_in">type</span> = <span class="hljs-string">"object"</span>,
-    properties = {
-        ikey = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"number"</span>, minimum = <span class="hljs-number">0</span>},
-        skey = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"string"</span>},
-    },
-    required = {<span class="hljs-string">"ikey"</span>, <span class="hljs-string">"skey"</span>},
-    additionalProperties = <span class="hljs-literal">false</span>,
-}
-
-<span class="hljs-keyword">local</span> plugin_name = <span class="hljs-string">"example-plugin"</span>
-
-<span class="hljs-keyword">local</span> _M = {
-    version = <span class="hljs-number">0.1</span>,
-    priority = <span class="hljs-number">0</span>,        <span class="hljs-comment">-- <span class="hljs-doctag">TODO:</span> add a type field, may be a good idea</span>
-    name = plugin_name,
-    schema = schema,
-    metadata_schema = metadata_schema,
-}
-</code></pre>
-<p>You might have noticed the key-auth plugin has <code>type = 'auth'</code> in its definition.
-When we set the type of plugin to <code>auth</code>, it means that this plugin is an authentication plugin.</p>
-<p>An authentication plugin needs to choose a consumer after execution. For example, in key-auth plugin, it calls the <code>consumer.attach_consumer</code> to attach a consumer, which is chosen via the <code>apikey</code> header.</p>
-<p>To interact with the <code>consumer</code> resource, this type of plugin needs to provide a <code>consumer_schema</code> to check the <code>plugins</code> configuration in the <code>consumer</code>.</p>
-<p>Here is the consumer configuration for key-auth plugin:</p>
-<pre><code class="hljs css language-json">{
-    <span class="hljs-attr">"username"</span>: <span class="hljs-string">"Joe"</span>,
-    <span class="hljs-attr">"plugins"</span>: {
-        <span class="hljs-attr">"key-auth"</span>: {
-            <span class="hljs-attr">"key"</span>: <span class="hljs-string">"Joe's key"</span>
-        }
-    }
-}
-</code></pre>
-<p>It will be used when you try to create a <a href="https://github.com/apache/apisix/blob/master/doc/admin-api.md#consumer">Consumer</a></p>
-<p>To validate the configuration, the plugin uses a schema like this:</p>
-<pre><code class="hljs css language-json">local consumer_schema = {
-    type = "object",
-    additionalProperties = false,
-    properties = {
-        key = {type = "string"},
-    },
-    required = {"key"},
-}
-</code></pre>
-<p>Note the difference between key-auth's <strong>check_schema(conf)</strong> method to example-plugin's:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-comment">-- key-auth</span>
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.check_schema</span><span class="hljs-params">(conf, schema_type)</span></span>
-    <span class="hljs-keyword">if</span> schema_type == core.schema.TYPE_CONSUMER <span class="hljs-keyword">then</span>
-        <span class="hljs-keyword">return</span> core.schema.check(consumer_schema, conf)
-    <span class="hljs-keyword">else</span>
-        <span class="hljs-keyword">return</span> core.schema.check(schema, conf)
-    <span class="hljs-keyword">end</span>
-<span class="hljs-keyword">end</span>
-</code></pre>
-<pre><code class="hljs css language-lua"><span class="hljs-comment">-- example-plugin</span>
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.check_schema</span><span class="hljs-params">(conf, schema_type)</span></span>
-    <span class="hljs-keyword">return</span> core.schema.check(schema, conf)
-<span class="hljs-keyword">end</span>
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="choose-phase-to-run"></a><a href="#choose-phase-to-run" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Determine which phase to run, generally access or rewrite. If you don't know the <a href="https://openresty-reference.readthedocs.io/en/latest/Directives/">Openresty life cycle</a>, it's
-recommended to know it in advance. For example key-auth is an authentication plugin, thus the authentication should be completed
-before forwarding the request to any upstream service. Therefore, the plugin must be executed in the rewrite phases.
-In APISIX, only the authentication logic can be run in the rewrite phase. Other logic needs to run before proxy should be in access phase.</p>
-<p>The following code snippet shows how to implement any logic relevant to the plugin in the OpenResty log phase.</p>
-<pre><code class="hljs css language-lua"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.log</span><span class="hljs-params">(conf)</span></span>
-<span class="hljs-comment">-- Implement logic here</span>
-<span class="hljs-keyword">end</span>
-</code></pre>
-<p><strong>Note : we can't invoke <code>ngx.exit</code> or <code>core.respond.exit</code> in rewrite phase and access phase. if need to exit, just return the status and body, the plugin engine will make the exit happen with the returned status and body. <a href="https://github.com/apache/apisix/blob/35269581e21473e1a27b11cceca6f773cad0192a/apisix/plugins/limit-count.lua#L177">example</a></strong></p>
-<h2><a class="anchor" aria-hidden="true" id="implement-the-logic"></a><a href="#implement-the-logic" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Write the logic of the plugin in the corresponding phase.</p>
-<h2><a class="anchor" aria-hidden="true" id="write-test-case"></a><a href="#write-test-case" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<p>For functions, write and improve the test cases of various dimensions, do a comprehensive test for your plugin! The
-test cases of plugins are all in the &quot;<strong>t/plugin</strong>&quot; directory. You can go ahead to find out. APISIX uses
-<a href="https://github.com/openresty/test-nginx">****test-nginx****</a> as the test framework. A test case (.t file) is usually
-divided into prologue and data parts by _<em>data_</em>. Here we will briefly introduce the data part, that is, the part
-of the real test case. For example, the key-auth plugin:</p>
-<pre><code class="hljs css language-perl">=== TEST <span class="hljs-number">1</span>: sanity
---- config
-    location /t {
-        content_by_lua_block {
-            <span class="hljs-keyword">local</span> plugin = <span class="hljs-keyword">require</span>(<span class="hljs-string">"apisix.plugins.key-auth"</span>)
-            <span class="hljs-keyword">local</span> ok, err = plugin.check_schema({key = <span class="hljs-string">'test-key'</span>}, core.schema.TYPE_CONSUMER)
-            <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> ok then
-                ngx.say(err)
-            end
-
-            ngx.say(<span class="hljs-string">"done"</span>)
-        }
-    }
---- request
-GET /t
---- response_body
-done
---- no_error_log
-[error]
-</code></pre>
-<p>A test case consists of three parts :</p>
-<ul>
-<li><strong>Program code</strong> : configuration content of Nginx location</li>
-<li><strong>Input</strong> : http request information</li>
-<li><strong>Output check</strong> : status, header, body, error log check</li>
-</ul>
-<p>When we request <strong>/t</strong>, which config in the configuration file, the Nginx will call &quot;<strong>content_by_lua_block</strong>&quot; instruction to
-complete the Lua script, and finally return. The assertion of the use case is response_body return &quot;done&quot;,
-&quot;<strong>no_error_log</strong>&quot; means to check the &quot;<strong>error.log</strong>&quot; of Nginx. There must be no ERROR level record. The log files for the unit test
-are located in the following folder: 't/servroot/logs'.</p>
-<p>The above test case represents a simple scenario. Most scenarios will require multiple steps to validate. To do this, create multiple tests <code>=== TEST 1</code>, <code>=== TEST 2</code>, and so on. These tests will be executed sequentially, allowing you to break down scenarios into a sequence of atomic steps.</p>
-<p>Additionally, there are some convenience testing endpoints which can be found <a href="https://github.com/apache/apisix/blob/master/t/lib/server.lua#L36">here</a>. For example, see <a href="https://github.com/apache/apisix/blob/master/t/plugin/proxy-rewrite.lua">proxy-rewrite</a>. In test 42, the upstream <code>uri</code> is made to redirect <code>/test?new_uri=hello</code> to <code>/hello</code> (which always returns <code>hello world</code>). In test 43, the response body is confirm [...]
-<p>Refer the following <a href="/apisix/how-to-build#test">document</a> to setup the testing framework.</p>
-<h3><a class="anchor" aria-hidden="true" id="attach-the-test-nginx-execution-process"></a><a href="#attach-the-test-nginx-execution-process" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2  [...]
-<p>According to the path we configured in the makefile and some configuration items at the front of each <strong>.t</strong> file, the
-framework will assemble into a complete nginx.conf file. &quot;<strong>t/servroot</strong>&quot; is the working directory of Nginx and start the
-Nginx instance. according to the information provided by the test case, initiate the http request and check that the
-return items of HTTP include HTTP status, HTTP response header, HTTP response body and so on.</p>
-<h3><a class="anchor" aria-hidden="true" id="register-public-api"></a><a href="#register-public-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>A plugin can register API which exposes to the public. Take jwt-auth plugin as an example, this plugin registers <code>GET /apisix/plugin/jwt/sign</code> to allow client to sign its key:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">gen_token</span><span class="hljs-params">()</span></span>
-    ...
-<span class="hljs-keyword">end</span>
-
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.api</span><span class="hljs-params">()</span></span>
-    <span class="hljs-keyword">return</span> {
-        {
-            methods = {<span class="hljs-string">"GET"</span>},
-            uri = <span class="hljs-string">"/apisix/plugin/jwt/sign"</span>,
-            handler = gen_token,
-        }
-    }
-<span class="hljs-keyword">end</span>
-</code></pre>
-<p>Note that the public API is exposed to the public.
-You may need to use <a href="/apisix/plugin-interceptors">interceptors</a> to protect it.</p>
-<h3><a class="anchor" aria-hidden="true" id="register-control-api"></a><a href="#register-control-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
-<p>If you only want to expose the API to the localhost or intranet, you can expose it via <a href="/apisix/control-api">Control API</a>.</p>
-<p>Take a look at example-plugin plugin:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-params">()</span></span>
-    <span class="hljs-keyword">local</span> args = ngx.req.get_uri_args()
-    <span class="hljs-keyword">if</span> args[<span class="hljs-string">"json"</span>] <span class="hljs-keyword">then</span>
-        <span class="hljs-keyword">return</span> <span class="hljs-number">200</span>, {msg = <span class="hljs-string">"world"</span>}
-    <span class="hljs-keyword">else</span>
-        <span class="hljs-keyword">return</span> <span class="hljs-number">200</span>, <span class="hljs-string">"world\n"</span>
-    <span class="hljs-keyword">end</span>
-<span class="hljs-keyword">end</span>
-
-
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.control_api</span><span class="hljs-params">()</span></span>
-    <span class="hljs-keyword">return</span> {
-        {
-            methods = {<span class="hljs-string">"GET"</span>},
-            uris = {<span class="hljs-string">"/v1/plugin/example-plugin/hello"</span>},
-            handler = hello,
-        }
-    }
-<span class="hljs-keyword">end</span>
-</code></pre>
-<p>If you don't change the default control API configuration, the plugin will be expose <code>GET /v1/plugin/example-plugin/hello</code> which can only be accessed via <code>127.0.0.1</code>.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#check-dependencies">check dependencies</a></li><li><a href="#name-and-config">name and config</a></li><li><a href="#schema-and-check">schema and check</a></li><li><a href="#choose-phase-to-run">choose phase to run</a></li><li><a href="#implement-the-logic">implement the logic</a></li><li><a href="#write-test-case">write test case</a><ul class="toc-headin [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/plugin-develop/index.html b/apisix/plugin-develop/index.html
deleted file mode 100644
index ef4f6b5..0000000
--- a/apisix/plugin-develop/index.html
+++ /dev/null
@@ -1,305 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/plugin-develop · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/plugin-develop · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-[中文](/apisix/zh-cn/plugin-develop)
-<h1><a class="anchor" aria-hidden="true" id="table-of-contents"></a><a href="#table-of-contents" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<ul>
-<li><a href="#check-dependencies"><strong>check dependencies</strong></a></li>
-<li><a href="#name-and-config"><strong>name and config</strong></a></li>
-<li><a href="#schema-and-check"><strong>schema and check</strong></a></li>
-<li><a href="#choose-phase-to-run"><strong>choose phase to run</strong></a></li>
-<li><a href="#implement-the-logic"><strong>implement the logic</strong></a></li>
-<li><a href="#write-test-case"><strong>write test case</strong></a></li>
-<li><a href="#register-public-api"><strong>register public API</strong></a></li>
-<li><a href="#register-control-api"><strong>register control API</strong></a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="check-dependencies"></a><a href="#check-dependencies" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>if you have dependencies on external libraries, check the dependent items. if your plugin needs to use shared memory, it
-needs to declare in <strong>bin/apisix</strong>, for example :</p>
-<pre><code class="hljs css language-nginx">    <span class="hljs-attribute">lua_shared_dict</span> plugin-limit-req     <span class="hljs-number">10m</span>;
-    <span class="hljs-attribute">lua_shared_dict</span> plugin-limit-count   <span class="hljs-number">10m</span>;
-    <span class="hljs-attribute">lua_shared_dict</span> prometheus-metrics   <span class="hljs-number">10m</span>;
-    <span class="hljs-attribute">lua_shared_dict</span> plugin-limit-conn    <span class="hljs-number">10m</span>;
-    <span class="hljs-attribute">lua_shared_dict</span> upstream-healthcheck <span class="hljs-number">10m</span>;
-    <span class="hljs-attribute">lua_shared_dict</span> worker-events        <span class="hljs-number">10m</span>;
-
-    <span class="hljs-comment"># for openid-connect plugin</span>
-    <span class="hljs-attribute">lua_shared_dict</span> discovery             <span class="hljs-number">1m</span>; <span class="hljs-comment"># cache for discovery metadata documents</span>
-    <span class="hljs-attribute">lua_shared_dict</span> jwks                  <span class="hljs-number">1m</span>; <span class="hljs-comment"># cache for JWKs</span>
-    <span class="hljs-attribute">lua_shared_dict</span> introspection        <span class="hljs-number">10m</span>; <span class="hljs-comment"># cache for JWT verification results</span>
-</code></pre>
-<p>The plugin itself provides the init method. It is convenient for plugins to perform some initialization after
-the plugin is loaded.</p>
-<p>Note : if the dependency of some plugin needs to be initialized when Nginx start, you may need to add logic to the initialization
-method &quot;http_init&quot; in the file <strong>apisix.lua</strong>, And you may need to add some processing on generated part of Nginx
-configuration file in <strong>bin/apisix</strong> file. but it is easy to have an impact on the overall situation according to the
-existing plugin mechanism, we do not recommend this unless you have a complete grasp of the code.</p>
-<h2><a class="anchor" aria-hidden="true" id="name-and-config"></a><a href="#name-and-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<p>Determine the name and priority of the plugin, and add to conf/config-default.yaml. For example, for the example-plugin plugin,
-you need to specify the plugin name in the code (the name is the unique identifier of the plugin and cannot be
-duplicate), you can see the code in file &quot;<strong>apisix/plugins/example-plugin.lua</strong>&quot; :</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> plugin_name = <span class="hljs-string">"example-plugin"</span>
-
-<span class="hljs-keyword">local</span> _M = {
-    version = <span class="hljs-number">0.1</span>,
-    priority = <span class="hljs-number">0</span>,
-    name = plugin_name,
-    schema = schema,
-    metadata_schema = metadata_schema,
-}
-</code></pre>
-<p>Note : The priority of the new plugin cannot be the same as the priority of any existing plugin. In addition, plugins with a high priority value will be executed first in a given phase (see the definition of <code>phase</code> in <a href="#choose-phase-to-run">choose-phase-to-run</a>). For example, the priority of example-plugin is 0 and the priority of ip-restriction is 3000. Therefore, the ip-restriction plugin will be executed first, then the example-plugin plugin.</p>
-<p>in the &quot;<strong>conf/config-default.yaml</strong>&quot; configuration file, the enabled plugins (all specified by plugin name) are listed.</p>
-<pre><code class="hljs css language-yaml"><span class="hljs-attr">plugins:</span>                          <span class="hljs-comment"># plugin list</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">limit-req</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">limit-count</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">limit-conn</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">key-auth</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">prometheus</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">node-status</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">jwt-auth</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">zipkin</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">ip-restriction</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">grpc-transcode</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">serverless-pre-function</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">serverless-post-function</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">openid-connect</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">proxy-rewrite</span>
-  <span class="hljs-bullet">-</span> <span class="hljs-string">redirect</span>
-  <span class="hljs-string">...</span>
-</code></pre>
-<p>Note : the order of the plugins is not related to the order of execution.</p>
-<p>If your plugin has a new code directory of its own, you will need to modify the <code>Makefile</code> to create directory, such as:</p>
-<pre><code class="hljs"><span class="hljs-variable">$(</span>INSTALL) -d <span class="hljs-variable">$(</span>INST_LUADIR)/apisix/plugins/skywalking
-<span class="hljs-variable">$(</span>INSTALL) apisix/plugins/skywalking/*.lua <span class="hljs-variable">$(</span>INST_LUADIR)/apisix/plugins/skywalking/
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="schema-and-check"></a><a href="#schema-and-check" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>Write <a href="https://json-schema.org">Json Schema</a> descriptions and check functions. Similarly, take the example-plugin plugin as an example to see its
-configuration data :</p>
-<pre><code class="hljs css language-json">"example-plugin" : {
-    "i": 1,
-    "s": "s",
-    "t": [1]
-}
-</code></pre>
-<p>Let's look at its schema description :</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> schema = {
-    <span class="hljs-built_in">type</span> = <span class="hljs-string">"object"</span>,
-    properties = {
-        i = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"number"</span>, minimum = <span class="hljs-number">0</span>},
-        s = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"string"</span>},
-        t = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"array"</span>, minItems = <span class="hljs-number">1</span>},
-        ip = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"string"</span>},
-        port = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"integer"</span>},
-    },
-    required = {<span class="hljs-string">"i"</span>},
-}
-</code></pre>
-<p>The schema defines a non-negative number <code>i</code>, a string <code>s</code>, a non-empty array of <code>t</code>, and <code>ip</code> / <code>port</code>. Only <code>i</code> is required.</p>
-<p>At the same time, we need to implement the <strong>check_schema(conf)</strong> method to complete the specification verification.</p>
-<pre><code class="hljs css language-lua"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.check_schema</span><span class="hljs-params">(conf, schema_type)</span></span>
-    <span class="hljs-keyword">return</span> core.schema.check(schema, conf)
-<span class="hljs-keyword">end</span>
-</code></pre>
-<p>Note: the project has provided the public method &quot;<strong>core.schema.check</strong>&quot;, which can be used directly to complete JSON
-verification.</p>
-<p>In addition, if the plugin needs to use some metadata, we can define the plugin <code>metadata_schema</code>, and then we can dynamically manage these metadata through the <code>admin api</code>. Example:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> metadata_schema = {
-    <span class="hljs-built_in">type</span> = <span class="hljs-string">"object"</span>,
-    properties = {
-        ikey = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"number"</span>, minimum = <span class="hljs-number">0</span>},
-        skey = {<span class="hljs-built_in">type</span> = <span class="hljs-string">"string"</span>},
-    },
-    required = {<span class="hljs-string">"ikey"</span>, <span class="hljs-string">"skey"</span>},
-    additionalProperties = <span class="hljs-literal">false</span>,
-}
-
-<span class="hljs-keyword">local</span> plugin_name = <span class="hljs-string">"example-plugin"</span>
-
-<span class="hljs-keyword">local</span> _M = {
-    version = <span class="hljs-number">0.1</span>,
-    priority = <span class="hljs-number">0</span>,        <span class="hljs-comment">-- <span class="hljs-doctag">TODO:</span> add a type field, may be a good idea</span>
-    name = plugin_name,
-    schema = schema,
-    metadata_schema = metadata_schema,
-}
-</code></pre>
-<p>You might have noticed the key-auth plugin has <code>type = 'auth'</code> in its definition.
-When we set the type of plugin to <code>auth</code>, it means that this plugin is an authentication plugin.</p>
-<p>An authentication plugin needs to choose a consumer after execution. For example, in key-auth plugin, it calls the <code>consumer.attach_consumer</code> to attach a consumer, which is chosen via the <code>apikey</code> header.</p>
-<p>To interact with the <code>consumer</code> resource, this type of plugin needs to provide a <code>consumer_schema</code> to check the <code>plugins</code> configuration in the <code>consumer</code>.</p>
-<p>Here is the consumer configuration for key-auth plugin:</p>
-<pre><code class="hljs css language-json">{
-    <span class="hljs-attr">"username"</span>: <span class="hljs-string">"Joe"</span>,
-    <span class="hljs-attr">"plugins"</span>: {
-        <span class="hljs-attr">"key-auth"</span>: {
-            <span class="hljs-attr">"key"</span>: <span class="hljs-string">"Joe's key"</span>
-        }
-    }
-}
-</code></pre>
-<p>It will be used when you try to create a <a href="https://github.com/apache/apisix/blob/master/doc/admin-api.md#consumer">Consumer</a></p>
-<p>To validate the configuration, the plugin uses a schema like this:</p>
-<pre><code class="hljs css language-json">local consumer_schema = {
-    type = "object",
-    additionalProperties = false,
-    properties = {
-        key = {type = "string"},
-    },
-    required = {"key"},
-}
-</code></pre>
-<p>Note the difference between key-auth's <strong>check_schema(conf)</strong> method to example-plugin's:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-comment">-- key-auth</span>
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.check_schema</span><span class="hljs-params">(conf, schema_type)</span></span>
-    <span class="hljs-keyword">if</span> schema_type == core.schema.TYPE_CONSUMER <span class="hljs-keyword">then</span>
-        <span class="hljs-keyword">return</span> core.schema.check(consumer_schema, conf)
-    <span class="hljs-keyword">else</span>
-        <span class="hljs-keyword">return</span> core.schema.check(schema, conf)
-    <span class="hljs-keyword">end</span>
-<span class="hljs-keyword">end</span>
-</code></pre>
-<pre><code class="hljs css language-lua"><span class="hljs-comment">-- example-plugin</span>
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.check_schema</span><span class="hljs-params">(conf, schema_type)</span></span>
-    <span class="hljs-keyword">return</span> core.schema.check(schema, conf)
-<span class="hljs-keyword">end</span>
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="choose-phase-to-run"></a><a href="#choose-phase-to-run" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Determine which phase to run, generally access or rewrite. If you don't know the <a href="https://openresty-reference.readthedocs.io/en/latest/Directives/">Openresty life cycle</a>, it's
-recommended to know it in advance. For example key-auth is an authentication plugin, thus the authentication should be completed
-before forwarding the request to any upstream service. Therefore, the plugin must be executed in the rewrite phases.
-In APISIX, only the authentication logic can be run in the rewrite phase. Other logic needs to run before proxy should be in access phase.</p>
-<p>The following code snippet shows how to implement any logic relevant to the plugin in the OpenResty log phase.</p>
-<pre><code class="hljs css language-lua"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.log</span><span class="hljs-params">(conf)</span></span>
-<span class="hljs-comment">-- Implement logic here</span>
-<span class="hljs-keyword">end</span>
-</code></pre>
-<p><strong>Note : we can't invoke <code>ngx.exit</code> or <code>core.respond.exit</code> in rewrite phase and access phase. if need to exit, just return the status and body, the plugin engine will make the exit happen with the returned status and body. <a href="https://github.com/apache/apisix/blob/35269581e21473e1a27b11cceca6f773cad0192a/apisix/plugins/limit-count.lua#L177">example</a></strong></p>
-<h2><a class="anchor" aria-hidden="true" id="implement-the-logic"></a><a href="#implement-the-logic" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Write the logic of the plugin in the corresponding phase.</p>
-<h2><a class="anchor" aria-hidden="true" id="write-test-case"></a><a href="#write-test-case" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5  [...]
-<p>For functions, write and improve the test cases of various dimensions, do a comprehensive test for your plugin! The
-test cases of plugins are all in the &quot;<strong>t/plugin</strong>&quot; directory. You can go ahead to find out. APISIX uses
-<a href="https://github.com/openresty/test-nginx">****test-nginx****</a> as the test framework. A test case (.t file) is usually
-divided into prologue and data parts by _<em>data_</em>. Here we will briefly introduce the data part, that is, the part
-of the real test case. For example, the key-auth plugin:</p>
-<pre><code class="hljs css language-perl">=== TEST <span class="hljs-number">1</span>: sanity
---- config
-    location /t {
-        content_by_lua_block {
-            <span class="hljs-keyword">local</span> plugin = <span class="hljs-keyword">require</span>(<span class="hljs-string">"apisix.plugins.key-auth"</span>)
-            <span class="hljs-keyword">local</span> ok, err = plugin.check_schema({key = <span class="hljs-string">'test-key'</span>}, core.schema.TYPE_CONSUMER)
-            <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> ok then
-                ngx.say(err)
-            end
-
-            ngx.say(<span class="hljs-string">"done"</span>)
-        }
-    }
---- request
-GET /t
---- response_body
-done
---- no_error_log
-[error]
-</code></pre>
-<p>A test case consists of three parts :</p>
-<ul>
-<li><strong>Program code</strong> : configuration content of Nginx location</li>
-<li><strong>Input</strong> : http request information</li>
-<li><strong>Output check</strong> : status, header, body, error log check</li>
-</ul>
-<p>When we request <strong>/t</strong>, which config in the configuration file, the Nginx will call &quot;<strong>content_by_lua_block</strong>&quot; instruction to
-complete the Lua script, and finally return. The assertion of the use case is response_body return &quot;done&quot;,
-&quot;<strong>no_error_log</strong>&quot; means to check the &quot;<strong>error.log</strong>&quot; of Nginx. There must be no ERROR level record. The log files for the unit test
-are located in the following folder: 't/servroot/logs'.</p>
-<p>The above test case represents a simple scenario. Most scenarios will require multiple steps to validate. To do this, create multiple tests <code>=== TEST 1</code>, <code>=== TEST 2</code>, and so on. These tests will be executed sequentially, allowing you to break down scenarios into a sequence of atomic steps.</p>
-<p>Additionally, there are some convenience testing endpoints which can be found <a href="https://github.com/apache/apisix/blob/master/t/lib/server.lua#L36">here</a>. For example, see <a href="https://github.com/apache/apisix/blob/master/t/plugin/proxy-rewrite.lua">proxy-rewrite</a>. In test 42, the upstream <code>uri</code> is made to redirect <code>/test?new_uri=hello</code> to <code>/hello</code> (which always returns <code>hello world</code>). In test 43, the response body is confirm [...]
-<p>Refer the following <a href="/apisix/how-to-build#test">document</a> to setup the testing framework.</p>
-<h3><a class="anchor" aria-hidden="true" id="attach-the-test-nginx-execution-process"></a><a href="#attach-the-test-nginx-execution-process" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2  [...]
-<p>According to the path we configured in the makefile and some configuration items at the front of each <strong>.t</strong> file, the
-framework will assemble into a complete nginx.conf file. &quot;<strong>t/servroot</strong>&quot; is the working directory of Nginx and start the
-Nginx instance. according to the information provided by the test case, initiate the http request and check that the
-return items of HTTP include HTTP status, HTTP response header, HTTP response body and so on.</p>
-<h3><a class="anchor" aria-hidden="true" id="register-public-api"></a><a href="#register-public-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>A plugin can register API which exposes to the public. Take jwt-auth plugin as an example, this plugin registers <code>GET /apisix/plugin/jwt/sign</code> to allow client to sign its key:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">gen_token</span><span class="hljs-params">()</span></span>
-    ...
-<span class="hljs-keyword">end</span>
-
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.api</span><span class="hljs-params">()</span></span>
-    <span class="hljs-keyword">return</span> {
-        {
-            methods = {<span class="hljs-string">"GET"</span>},
-            uri = <span class="hljs-string">"/apisix/plugin/jwt/sign"</span>,
-            handler = gen_token,
-        }
-    }
-<span class="hljs-keyword">end</span>
-</code></pre>
-<p>Note that the public API is exposed to the public.
-You may need to use <a href="/apisix/plugin-interceptors">interceptors</a> to protect it.</p>
-<h3><a class="anchor" aria-hidden="true" id="register-control-api"></a><a href="#register-control-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
-<p>If you only want to expose the API to the localhost or intranet, you can expose it via <a href="/apisix/control-api">Control API</a>.</p>
-<p>Take a look at example-plugin plugin:</p>
-<pre><code class="hljs css language-lua"><span class="hljs-keyword">local</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">hello</span><span class="hljs-params">()</span></span>
-    <span class="hljs-keyword">local</span> args = ngx.req.get_uri_args()
-    <span class="hljs-keyword">if</span> args[<span class="hljs-string">"json"</span>] <span class="hljs-keyword">then</span>
-        <span class="hljs-keyword">return</span> <span class="hljs-number">200</span>, {msg = <span class="hljs-string">"world"</span>}
-    <span class="hljs-keyword">else</span>
-        <span class="hljs-keyword">return</span> <span class="hljs-number">200</span>, <span class="hljs-string">"world\n"</span>
-    <span class="hljs-keyword">end</span>
-<span class="hljs-keyword">end</span>
-
-
-<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_M.control_api</span><span class="hljs-params">()</span></span>
-    <span class="hljs-keyword">return</span> {
-        {
-            methods = {<span class="hljs-string">"GET"</span>},
-            uris = {<span class="hljs-string">"/v1/plugin/example-plugin/hello"</span>},
-            handler = hello,
-        }
-    }
-<span class="hljs-keyword">end</span>
-</code></pre>
-<p>If you don't change the default control API configuration, the plugin will be expose <code>GET /v1/plugin/example-plugin/hello</code> which can only be accessed via <code>127.0.0.1</code>.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#check-dependencies">check dependencies</a></li><li><a href="#name-and-config">name and config</a></li><li><a href="#schema-and-check">schema and check</a></li><li><a href="#choose-phase-to-run">choose phase to run</a></li><li><a href="#implement-the-logic">implement the logic</a></li><li><a href="#write-test-case">write test case</a><ul class="toc-headin [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/plugin-interceptors.html b/apisix/plugin-interceptors.html
deleted file mode 100644
index cd9d366..0000000
--- a/apisix/plugin-interceptors.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/plugin-interceptors · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/plugin-interceptors · Apache APISIX™"/><meta property="og:type" content="website"/><meta pr [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/plugin-interceptors">Chinese</a></p>
-<h2><a class="anchor" aria-hidden="true" id="plugin-interceptors"></a><a href="#plugin-interceptors" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Some plugins will register API to serve their purposes.</p>
-<p>Since these API are not added as regular <a href="/apisix/admin-api">Route</a>, we can't add
-plugins to protect them. To solve the problem, we add a new concept called 'interceptors'
-to run rules to protect them.</p>
-<p>Here is an example to limit the access of <code>/apisix/prometheus/metrics</code> (a route introduced via plugin prometheus)
-to clients in <code>10.0.0.0/24</code>:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/prometheus -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -i -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "interceptors": [
-        {
-            "name": "ip-restriction",
-            "conf": {
-                "whitelist": ["10.0.0.0/24"]
-            }
-        }
-    ]
-}'
-</code></pre>
-<p>You can see that the interceptors are configured like the plugins. The <code>name</code> is
-the name of plugin which you want to run and the <code>conf</code> is the configuration of the
-plugin.</p>
-<p>Currently we only support a subset of plugins which can be run as interceptors.</p>
-<p>Supported interceptors:</p>
-<ul>
-<li><a href="/apisix/plugins/ip-restriction">ip-restriction</a></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#plugin-interceptors">Plugin interceptors</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.ap [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/plugin-interceptors/index.html b/apisix/plugin-interceptors/index.html
deleted file mode 100644
index cd9d366..0000000
--- a/apisix/plugin-interceptors/index.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/plugin-interceptors · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/plugin-interceptors · Apache APISIX™"/><meta property="og:type" content="website"/><meta pr [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/plugin-interceptors">Chinese</a></p>
-<h2><a class="anchor" aria-hidden="true" id="plugin-interceptors"></a><a href="#plugin-interceptors" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Some plugins will register API to serve their purposes.</p>
-<p>Since these API are not added as regular <a href="/apisix/admin-api">Route</a>, we can't add
-plugins to protect them. To solve the problem, we add a new concept called 'interceptors'
-to run rules to protect them.</p>
-<p>Here is an example to limit the access of <code>/apisix/prometheus/metrics</code> (a route introduced via plugin prometheus)
-to clients in <code>10.0.0.0/24</code>:</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/prometheus -H <span class="hljs-string">'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'</span> -i -X PUT -d <span class="hljs-string">'</span></span>
-{
-    "interceptors": [
-        {
-            "name": "ip-restriction",
-            "conf": {
-                "whitelist": ["10.0.0.0/24"]
-            }
-        }
-    ]
-}'
-</code></pre>
-<p>You can see that the interceptors are configured like the plugins. The <code>name</code> is
-the name of plugin which you want to run and the <code>conf</code> is the configuration of the
-plugin.</p>
-<p>Currently we only support a subset of plugins which can be run as interceptors.</p>
-<p>Supported interceptors:</p>
-<ul>
-<li><a href="/apisix/plugins/ip-restriction">ip-restriction</a></li>
-</ul>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#plugin-interceptors">Plugin interceptors</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org/licenses/">License</a><a href="https://www.apache.org/events/">Events</a><a href="https://www.ap [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/plugins.html b/apisix/plugins.html
deleted file mode 100644
index 6cb0502..0000000
--- a/apisix/plugins.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/plugins · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/plugins · Apache APISIX™"/><meta property="og:type" content="website"/><meta property="og:url" content= [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<p><a href="/apisix/zh-cn/plugins">Chinese</a></p>
-<h2><a class="anchor" aria-hidden="true" id="hot-reload"></a><a href="#hot-reload" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>APISIX plugins are hot-loaded. No matter you add, delete or modify plugins, you don't need to restart the service.</p>
-<p>If your APISIX node has the Admin API turned on, just send an HTTP request through admin API:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/plugins/reload -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT
-</code></pre>
-<p>Note: if you disable a plugin which has been configured as part of your rule (in the <code>plugins</code> field of <code>route</code>, etc.),
-the its execution will be skipped.</p>
-<h3><a class="anchor" aria-hidden="true" id="hot-reload-in-stand-alone-mode"></a><a href="#hot-reload-in-stand-alone-mode" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 1 [...]
-<p>For stand-alone mode, see plugin related section in <a href="/apisix/stand-alone">stand alone mode</a>.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#hot-reload">Hot reload</a><ul class="toc-headings"><li><a href="#hot-reload-in-stand-alone-mode">Hot reload in stand-alone mode</a></li></ul></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="https://www.apache.org/">Foundation</a><a href="https://www.apache.org [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/plugins/api-breaker.html b/apisix/plugins/api-breaker.html
deleted file mode 100644
index a5538f7..0000000
--- a/apisix/plugins/api-breaker.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/plugins/api-breaker · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/plugins/api-breaker · Apache APISIX™"/><meta property="og:type" content="website"/><meta pr [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<ul>
-<li><a href="/apisix/zh-cn/plugins/api-breaker">中文</a></li>
-</ul>
-<h1><a class="anchor" aria-hidden="true" id="summary"></a><a href="#summary" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<ul>
-<li><a href="#name"><strong>Name</strong></a></li>
-<li><a href="#attributes"><strong>Attributes</strong></a></li>
-<li><a href="#how-to-enable"><strong>How To Enable</strong></a></li>
-<li><a href="#test-plugin"><strong>Test Plugin</strong></a></li>
-<li><a href="#disable-plugin"><strong>Disable Plugin</strong></a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="name"></a><a href="#name" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
-<p>The plugin implements API fuse functionality to help us protect our upstream business services.</p>
-<blockquote>
-<p>About the breaker timeout logic</p>
-</blockquote>
-<p>the code logic automatically <strong>triggers the unhealthy state</strong> incrementation of the number of operations.</p>
-<p>Whenever the upstream service returns a status code from the <code>unhealthy.http_statuses</code> configuration (e.g., 500), up to <code>unhealthy.failures</code> (e.g., three times) and considers the upstream service to be in an unhealthy state.</p>
-<p>The first time unhealthy status is triggered, <strong>breaken for 2 seconds</strong>.</p>
-<p>Then, the request is forwarded to the upstream service again after 2 seconds, and if the <code>unhealthy.http_statuses</code> status code is returned, and the count reaches <code>unhealthy.failures</code> again, <strong>broken for 4 seconds</strong>.</p>
-<p>and so on, 2, 4, 8, 16, 32, 64, ..., 256, 300. <code>300</code> is the maximum value of <code>max_breaker_sec</code>, allow users to specify.</p>
-<p>In an unhealthy state, when a request is forwarded to an upstream service and the status code in the <code>healthy.http_statuses</code> configuration is returned (e.g., 200) that <code>healthy.successes</code> is reached (e.g., three times), and the upstream service is considered healthy again.</p>
-<h2><a class="anchor" aria-hidden="true" id="attributes"></a><a href="#attributes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<table>
-<thead>
-<tr><th>Name</th><th>Type</th><th>Requirement</th><th>Default</th><th>Valid</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>break_response_code</td><td>integer</td><td>required</td><td></td><td>[200, ..., 600]</td><td>return error code when unhealthy</td></tr>
-<tr><td>max_breaker_sec</td><td>integer</td><td>optional</td><td>300</td><td>&gt;=60</td><td>Maximum breaker time(seconds)</td></tr>
-<tr><td>unhealthy.http_statuses</td><td>array[integer]</td><td>optional</td><td>{500}</td><td>[500, ..., 599]</td><td>Status codes when unhealthy</td></tr>
-<tr><td>unhealthy.failures</td><td>integer</td><td>optional</td><td>1</td><td>&gt;=1</td><td>Number of consecutive error requests that triggered an unhealthy state</td></tr>
-<tr><td>healthy.http_statuses</td><td>array[integer]</td><td>optional</td><td>{200, 206}</td><td>[200, ..., 499]</td><td>Status codes when healthy</td></tr>
-<tr><td>healthy.successes</td><td>integer</td><td>optional</td><td>1</td><td>&gt;=1</td><td>Number of consecutive normal requests that trigger health status</td></tr>
-</tbody>
-</table>
-<h2><a class="anchor" aria-hidden="true" id="how-to-enable"></a><a href="#how-to-enable" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>Here's an example, enable the <code>api-breaker</code> plugin on the specified route.</p>
-<p>Response 500 or 503 three times in a row to trigger a unhealthy. Response 200 once in a row to restore healthy.</p>
-<pre><code class="hljs css language-shell">curl "http://127.0.0.1:9080/apisix/admin/routes/1" -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "plugins": {
-        "api-breaker": {
-            "break_response_code": 502,
-            "unhealthy": {
-                "http_statuses": [500, 503],
-                "failures": 3
-            },
-            "healthy": {
-                "http_statuses": [200],
-                "successes": 1
-            }
-        }
-    },
-    "uri": "/hello",
-    "host": "127.0.0.1",
-}'
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="test-plugin"></a><a href="#test-plugin" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p>Then. Like the configuration above, if your upstream service returns 500. 3 times in a row. The client will receive a 502 (break_response_code) response.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl -i -X POST <span class="hljs-string">"http://127.0.0.1:9080/get"</span></span>
-HTTP/1.1 502 Bad Gateway
-Content-Type: application/octet-stream
-Connection: keep-alive
-Server: APISIX/1.5
-
-... ...
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="disable-plugin"></a><a href="#disable-plugin" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>When you want to disable the <code>api-breader</code> plugin, it is very simple, you can delete the corresponding json configuration in the plugin configuration, no need to restart the service, it will take effect immediately:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/hello",
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:1980": 1
-        }
-    }
-}'
-</code></pre>
-<p>The <code>api-breaker</code> plugin has been disabled now. It works for other plugins.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#name">Name</a></li><li><a href="#attributes">Attributes</a></li><li><a href="#how-to-enable">How To Enable</a></li><li><a href="#test-plugin">Test Plugin</a></li><li><a href="#disable-plugin">Disable Plugin</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="h [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/plugins/api-breaker/index.html b/apisix/plugins/api-breaker/index.html
deleted file mode 100644
index a5538f7..0000000
--- a/apisix/plugins/api-breaker/index.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/plugins/api-breaker · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/plugins/api-breaker · Apache APISIX™"/><meta property="og:type" content="website"/><meta pr [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<ul>
-<li><a href="/apisix/zh-cn/plugins/api-breaker">中文</a></li>
-</ul>
-<h1><a class="anchor" aria-hidden="true" id="summary"></a><a href="#summary" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<ul>
-<li><a href="#name"><strong>Name</strong></a></li>
-<li><a href="#attributes"><strong>Attributes</strong></a></li>
-<li><a href="#how-to-enable"><strong>How To Enable</strong></a></li>
-<li><a href="#test-plugin"><strong>Test Plugin</strong></a></li>
-<li><a href="#disable-plugin"><strong>Disable Plugin</strong></a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="name"></a><a href="#name" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
-<p>The plugin implements API fuse functionality to help us protect our upstream business services.</p>
-<blockquote>
-<p>About the breaker timeout logic</p>
-</blockquote>
-<p>the code logic automatically <strong>triggers the unhealthy state</strong> incrementation of the number of operations.</p>
-<p>Whenever the upstream service returns a status code from the <code>unhealthy.http_statuses</code> configuration (e.g., 500), up to <code>unhealthy.failures</code> (e.g., three times) and considers the upstream service to be in an unhealthy state.</p>
-<p>The first time unhealthy status is triggered, <strong>breaken for 2 seconds</strong>.</p>
-<p>Then, the request is forwarded to the upstream service again after 2 seconds, and if the <code>unhealthy.http_statuses</code> status code is returned, and the count reaches <code>unhealthy.failures</code> again, <strong>broken for 4 seconds</strong>.</p>
-<p>and so on, 2, 4, 8, 16, 32, 64, ..., 256, 300. <code>300</code> is the maximum value of <code>max_breaker_sec</code>, allow users to specify.</p>
-<p>In an unhealthy state, when a request is forwarded to an upstream service and the status code in the <code>healthy.http_statuses</code> configuration is returned (e.g., 200) that <code>healthy.successes</code> is reached (e.g., three times), and the upstream service is considered healthy again.</p>
-<h2><a class="anchor" aria-hidden="true" id="attributes"></a><a href="#attributes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<table>
-<thead>
-<tr><th>Name</th><th>Type</th><th>Requirement</th><th>Default</th><th>Valid</th><th>Description</th></tr>
-</thead>
-<tbody>
-<tr><td>break_response_code</td><td>integer</td><td>required</td><td></td><td>[200, ..., 600]</td><td>return error code when unhealthy</td></tr>
-<tr><td>max_breaker_sec</td><td>integer</td><td>optional</td><td>300</td><td>&gt;=60</td><td>Maximum breaker time(seconds)</td></tr>
-<tr><td>unhealthy.http_statuses</td><td>array[integer]</td><td>optional</td><td>{500}</td><td>[500, ..., 599]</td><td>Status codes when unhealthy</td></tr>
-<tr><td>unhealthy.failures</td><td>integer</td><td>optional</td><td>1</td><td>&gt;=1</td><td>Number of consecutive error requests that triggered an unhealthy state</td></tr>
-<tr><td>healthy.http_statuses</td><td>array[integer]</td><td>optional</td><td>{200, 206}</td><td>[200, ..., 499]</td><td>Status codes when healthy</td></tr>
-<tr><td>healthy.successes</td><td>integer</td><td>optional</td><td>1</td><td>&gt;=1</td><td>Number of consecutive normal requests that trigger health status</td></tr>
-</tbody>
-</table>
-<h2><a class="anchor" aria-hidden="true" id="how-to-enable"></a><a href="#how-to-enable" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>Here's an example, enable the <code>api-breaker</code> plugin on the specified route.</p>
-<p>Response 500 or 503 three times in a row to trigger a unhealthy. Response 200 once in a row to restore healthy.</p>
-<pre><code class="hljs css language-shell">curl "http://127.0.0.1:9080/apisix/admin/routes/1" -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "plugins": {
-        "api-breaker": {
-            "break_response_code": 502,
-            "unhealthy": {
-                "http_statuses": [500, 503],
-                "failures": 3
-            },
-            "healthy": {
-                "http_statuses": [200],
-                "successes": 1
-            }
-        }
-    },
-    "uri": "/hello",
-    "host": "127.0.0.1",
-}'
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="test-plugin"></a><a href="#test-plugin" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
-<p>Then. Like the configuration above, if your upstream service returns 500. 3 times in a row. The client will receive a 502 (break_response_code) response.</p>
-<pre><code class="hljs css language-shell"><span class="hljs-meta">$</span><span class="bash"> curl -i -X POST <span class="hljs-string">"http://127.0.0.1:9080/get"</span></span>
-HTTP/1.1 502 Bad Gateway
-Content-Type: application/octet-stream
-Connection: keep-alive
-Server: APISIX/1.5
-
-... ...
-</code></pre>
-<h2><a class="anchor" aria-hidden="true" id="disable-plugin"></a><a href="#disable-plugin" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>When you want to disable the <code>api-breader</code> plugin, it is very simple, you can delete the corresponding json configuration in the plugin configuration, no need to restart the service, it will take effect immediately:</p>
-<pre><code class="hljs css language-shell">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
-{
-    "uri": "/hello",
-    "upstream": {
-        "type": "roundrobin",
-        "nodes": {
-            "127.0.0.1:1980": 1
-        }
-    }
-}'
-</code></pre>
-<p>The <code>api-breaker</code> plugin has been disabled now. It works for other plugins.</p>
-</span></div></article></div><div class="docs-prevnext"></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#name">Name</a></li><li><a href="#attributes">Attributes</a></li><li><a href="#how-to-enable">How To Enable</a></li><li><a href="#test-plugin">Test Plugin</a></li><li><a href="#disable-plugin">Disable Plugin</a></li></ul></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"></a><div><h5>ASF</h5><a href="h [...]
-                document.addEventListener('keyup', function(e) {
-                  if (e.target !== document.body) {
-                    return;
-                  }
-                  // keyCode for '/' (slash)
-                  if (e.keyCode === 191) {
-                    const search = document.getElementById('search_input_react');
-                    search && search.focus();
-                  }
-                });
-              </script><script>
-              var search = docsearch({
-                appId: 'ZHVP417Y1Y',
-                apiKey: '79e72fedcf3719ba85c552f710ade8a3',
-                indexName: 'apache-apisix-website',
-                inputSelector: '#search_input_react'
-              });
-            </script></body></html>
\ No newline at end of file
diff --git a/apisix/plugins/authz-keycloak.html b/apisix/plugins/authz-keycloak.html
deleted file mode 100644
index 5f79c8f..0000000
--- a/apisix/plugins/authz-keycloak.html
+++ /dev/null
@@ -1,144 +0,0 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>apisix/plugins/authz-keycloak · Apache APISIX™</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="apisix/plugins/authz-keycloak · Apache APISIX™"/><meta property="og:type" content="website"/><m [...]
-        document.addEventListener('DOMContentLoaded', function() {
-          addBackToTop(
-            {"zIndex":100}
-          )
-        });
-        </script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/logo.png" alt="Apache APISIX™"/><h2 class="headerTitleWithLogo">Apache APISIX™</h2></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site n [...]
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
--->
-<ul>
-<li><a href="/apisix/zh-cn/plugins/authz-keycloak">中文</a></li>
-</ul>
-<h1><a class="anchor" aria-hidden="true" id="summary"></a><a href="#summary" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<ul>
-<li><a href="#name"><strong>Name</strong></a></li>
-<li><a href="#attributes"><strong>Attributes</strong></a></li>
-<li><a href="#how-to-enable"><strong>How To Enable</strong></a></li>
-<li><a href="#test-plugin"><strong>Test Plugin</strong></a></li>
-<li><a href="#disable-plugin"><strong>Disable Plugin</strong></a></li>
-<li><a href="#examples"><strong>Examples</strong></a></li>
-</ul>
-<h2><a class="anchor" aria-hidden="true" id="name"></a><a href="#name" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
-<p><code>authz-keycloak</code> is an authorization plugin to be used with the Keycloak Identity Server. Keycloak is an OAuth/OIDC and
-UMA compliant Identity Server. Although, its developed to working in conjunction with Keycloak it should work with any
-OAuth/OIDC and UMA compliant identity providers as well.</p>
... 44730 lines suppressed ...