| <!doctype html> |
| <html class="docs-version-3.14" lang="zh" dir="ltr"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width,initial-scale=1"> |
| <meta name="ahrefs-site-verification" content="c2f7370ecf46173f4fb25f114e74c97e0a2976d4f02f61c9b00a9d7d34e34698"> |
| <meta name="generator" content="Docusaurus v2.0.0-beta.6"> |
| <link rel="search" type="application/opensearchdescription+xml" title="Apache APISIX® -- Cloud-Native API Gateway and AI Gateway" href="/zh/opensearch.xml"> |
| <script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Apache APISIX","url":"https://apisix.apache.org"}</script> |
| <script src="https://widget.kapa.ai/kapa-widget.bundle.js" data-website-id="24b59d9a-682e-4c3d-9e83-bf2ee85cdc19" data-project-name="APISIX" data-project-color="#E8442E" data-project-logo="https://static.apiseven.com/202202/apache-apisix.png" data-modal-disclaimer="This is a custom LLM for APISIX with access to all developer documentation, GitHub issues and discussions." data-modal-example-questions="How to set up canary release in APISIX?,How to develop a custom APISIX plugin?,How to use custom NGINX configuration in APISIX?,How to configure mTLS between clients and APISIX?,How to only allow a specific APISIX consumer to access special services or routes?" async></script><title data-react-helmet="true">常见问题 | Apache APISIX® -- Cloud-Native API Gateway and AI Gateway</title><meta data-react-helmet="true" property="og:image" content="https://static.apiseven.com/202202/apache-apisix.png"><meta data-react-helmet="true" name="twitter:image" content="https://static.apiseven.com/202202/apache-apisix.png"><meta data-react-helmet="true" property="og:url" content="https://apisix.apache.org/zh/docs/apisix/FAQ/"><meta data-react-helmet="true" name="docsearch:language" content="zh"><meta data-react-helmet="true" name="docsearch:version" content="3.14"><meta data-react-helmet="true" name="docsearch:docusaurus_tag" content="docs-docs-apisix-3.14"><meta data-react-helmet="true" name="robots" content="index,follow"><meta data-react-helmet="true" name="twitter:card" content="summary"><meta data-react-helmet="true" property="og:title" content="常见问题 | Apache APISIX® -- Cloud-Native API Gateway and AI Gateway"><meta data-react-helmet="true" name="description" content="本文列举了使用 Apache APISIX 时常见问题解决方法。"><meta data-react-helmet="true" property="og:description" content="本文列举了使用 Apache APISIX 时常见问题解决方法。"><meta data-react-helmet="true" name="keywords" content="Apache APISIX,API 网关,常见问题,FAQ"><link data-react-helmet="true" rel="shortcut icon" href="https://static.apiseven.com/202202/favicon.png"><link data-react-helmet="true" rel="canonical" href="https://apisix.apache.org/zh/docs/apisix/FAQ/"><link data-react-helmet="true" rel="alternate" href="https://apisix.apache.org/docs/apisix/FAQ/" hreflang="en"><link data-react-helmet="true" rel="alternate" href="https://apisix.apache.org/zh/docs/apisix/FAQ/" hreflang="zh"><link data-react-helmet="true" rel="alternate" href="https://apisix.apache.org/docs/apisix/FAQ/" hreflang="x-default"><link data-react-helmet="true" rel="preconnect" href="https://38VC84A2WJ-dsn.algolia.net" crossorigin="anonymous"><link rel="preload" href="https://static.apiseven.com/202202/MaisonNeue-Medium.otf" as="font" type="font/otf" crossorigin> |
| <link rel="preload" href="https://static.apiseven.com/202202/MaisonNeue-Bold.otf" as="font" type="font/otf" crossorigin> |
| <link rel="preload" href="https://static.apiseven.com/202202/MaisonNeue-Light.otf" as="font" type="font/otf" crossorigin> |
| <link rel="preload" href="https://static.apiseven.com/202202/MaisonNeue-Demi.otf" as="font" type="font/otf" crossorigin> |
| <link rel="preload" href="https://static.apiseven.com/202202/MaisonNeue-ExtraBold.otf" as="font" type="font/otf" crossorigin> |
| <link rel="preload" href="https://apisix-website-static.apiseven.com/zh/assets/js/runtime~main.64ba63d5.js" as="script"> |
| <link rel="preload" href="https://apisix-website-static.apiseven.com/zh/assets/js/main.21198ee1.js" as="script"> |
| <link rel="stylesheet" href="https://apisix-website-static.apiseven.com/zh/assets/css/styles.8de0825e.css"> |
| |
| <script>var _paq=window._paq=window._paq||[];_paq.push(["disableCookies"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),function(){var a="https://analytics.apache.org/";_paq.push(["setTrackerUrl",a+"matomo.php"]),_paq.push(["setSiteId","17"]);var e=document,p=e.createElement("script"),t=e.getElementsByTagName("script")[0];p.async=!0,p.src=a+"matomo.js",t.parentNode.insertBefore(p,t)}()</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")}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus"> |
| <div><a href="#" class="skipToContent_OuoZ">Skip to main content</a></div><div class="announcementBar_axC9" style="background-color:#e8433e;color:white" role="banner"><div class="announcementBarPlaceholder_xYHE"></div><div class="announcementBarContent_6uhP">🤔 Introducing APISIX AI Gateway – Built for LLMs and AI workloads. <a target="_blank" rel="noopener noreferrer" href="/ai-gateway/"> Learn More</a></div><button type="button" class="clean-btn close announcementBarClose_A3A1" aria-label="Close"><svg viewBox="0 0 24 24" width="14" height="14" fill="currentColor"><path d="M24 20.188l-8.315-8.209 8.2-8.282-3.697-3.697-8.212 8.318-8.31-8.203-3.666 3.666 8.321 8.24-8.206 8.313 3.666 3.666 8.237-8.318 8.285 8.203z"></path></svg></button></div><nav class="navbar navbar--fixed-top navbarHideable_RReh"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Navigation bar toggle" class="navbar__toggle clean-btn" type="button" tabindex="0"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a target="_parent" class="navbar__brand" href="/zh/"><img src="/zh/img/logo2.svg" alt="Apache APISIX®" class="themedImage_TMUO themedImage--light_4Vu1 navbar__logo"><img src="/zh/img/logo2.svg" alt="Apache APISIX®" class="themedImage_TMUO themedImage--dark_uzRr navbar__logo"><b class="navbar__title">Apache APISIX®</b></a></div><div class="navbar__items navbar__items--right"><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a aria-current="page" class="navbar__link" target="_parent" href="/zh/docs/">文档</a><ul class="dropdown__menu"><li><a class="dropdown__link" target="_parent" href="/zh/docs/apisix/getting-started/">Apache APISIX®️</a></li><li><a class="dropdown__link" target="_parent" href="/zh/docs/apisix/next/dashboard/">Apache APISIX®️ Dashboard</a></li><li><a class="dropdown__link" target="_parent" href="/zh/docs/ingress-controller/overview/">Apache APISIX®️ Ingress Controller</a></li><li><a class="dropdown__link" target="_parent" href="/zh/docs/helm-chart/apisix/">Apache APISIX®️ Helm Charts</a></li><li><a class="dropdown__link" target="_parent" href="/zh/docs/docker/build/">Apache APISIX®️ Docker</a></li><li><a class="dropdown__link" target="_parent" href="/zh/docs/java-plugin-runner/development/">Apache APISIX®️ Java Plugin Runner</a></li><li><a class="dropdown__link" target="_parent" href="/zh/docs/go-plugin-runner/getting-started/">Apache APISIX®️ Go Plugin Runner</a></li><li><a class="dropdown__link" target="_parent" href="/zh/docs/python-plugin-runner/getting-started/">Apache APISIX®️ Python Plugin Runner</a></li><li><a class="dropdown__link" target="_parent" href="/zh/docs/general/join/">General</a></li></ul></div><a class="navbar__item navbar__link" target="_parent" href="/zh/blog/">博客</a><a class="navbar__item navbar__link" target="_parent" href="/zh/blog/tags/case-studies/">用户案例</a><a class="navbar__item navbar__link" target="_parent" href="/zh/downloads/">下载</a><a class="navbar__item navbar__link" target="_parent" href="/zh/help/">帮助</a><a class="navbar__item navbar__link" target="_parent" href="/zh/team/">团队</a><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a class="navbar__link">相关资源</a><ul class="dropdown__menu"><li><a class="dropdown__link" target="_parent" href="/zh/showcase/">使用案例</a></li><li><a class="dropdown__link" target="_parent" href="/zh/docs/general/code-samples/">Code Samples</a></li><li><a class="dropdown__link" target="_parent" href="/zh/plugins/">插件市场</a></li><li><a class="dropdown__link" target="_parent" href="/zh/docs/general/join/">加入社区</a></li><li><a class="dropdown__link" target="_parent" href="/zh/docs/general/events/">社区活动</a></li><li><a href="https://github.com/apache/apisix/milestones" target="_parent" rel="noopener noreferrer" class="dropdown__link">Roadmap</a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href="#" class="navbar__link"><span><svg viewBox="0 0 20 20" width="20" height="20" aria-hidden="true" class="iconLanguage_zID8"><path fill="currentColor" d="M19.753 10.909c-.624-1.707-2.366-2.726-4.661-2.726-.09 0-.176.002-.262.006l-.016-2.063 3.525-.607c.115-.019.133-.119.109-.231-.023-.111-.167-.883-.188-.976-.027-.131-.102-.127-.207-.109-.104.018-3.25.461-3.25.461l-.013-2.078c-.001-.125-.069-.158-.194-.156l-1.025.016c-.105.002-.164.049-.162.148l.033 2.307s-3.061.527-3.144.543c-.084.014-.17.053-.151.143.019.09.19 1.094.208 1.172.018.08.072.129.188.107l2.924-.504.035 2.018c-1.077.281-1.801.824-2.256 1.303-.768.807-1.207 1.887-1.207 2.963 0 1.586.971 2.529 2.328 2.695 3.162.387 5.119-3.06 5.769-4.715 1.097 1.506.256 4.354-2.094 5.98-.043.029-.098.129-.033.207l.619.756c.08.096.206.059.256.023 2.51-1.73 3.661-4.515 2.869-6.683zm-7.386 3.188c-.966-.121-.944-.914-.944-1.453 0-.773.327-1.58.876-2.156a3.21 3.21 0 011.229-.799l.082 4.277a2.773 2.773 0 01-1.243.131zm2.427-.553l.046-4.109c.084-.004.166-.01.252-.01.773 0 1.494.145 1.885.361.391.217-1.023 2.713-2.183 3.758zm-8.95-7.668a.196.196 0 00-.196-.145h-1.95a.194.194 0 00-.194.144L.008 16.916c-.017.051-.011.076.062.076h1.733c.075 0 .099-.023.114-.072l1.008-3.318h3.496l1.008 3.318c.016.049.039.072.113.072h1.734c.072 0 .078-.025.062-.076-.014-.05-3.083-9.741-3.494-11.04zm-2.618 6.318l1.447-5.25 1.447 5.25H3.226z"></path></svg><span>简体中文</span></span></a><ul class="dropdown__menu"><li><a href="/docs/apisix/FAQ/" target="_self" rel="noopener noreferrer" class="dropdown__link" style="text-transform:capitalize">English</a></li><li><a href="/zh/docs/apisix/FAQ/" target="_self" rel="noopener noreferrer" class="dropdown__link dropdown__link--active" style="text-transform:capitalize">简体中文</a></li></ul></div><div class="react-toggle toggle_2i4l react-toggle--disabled"><div class="react-toggle-track" role="button" tabindex="-1"><div class="react-toggle-track-check"><span class="toggle_iYfV">🌜</span></div><div class="react-toggle-track-x"><span class="toggle_iYfV">🌞</span></div><div class="react-toggle-thumb"></div></div><input type="checkbox" class="react-toggle-screenreader-only" aria-label="Switch between dark and light mode"></div><div class="searchBox_fBfG"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div class="main-wrapper docs-wrapper docs-doc-page"><div class="docPage_GMj9"><button class="clean-btn backToTopButton_i9tI" type="button"><svg viewBox="0 0 24 24" width="28"><path d="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z" fill="currentColor"></path></svg></button><aside class="docSidebarContainer_k0Pq"><div class="sidebar_LIo8 sidebarWithHideableNavbar_CMI-"><a target="_parent" tabindex="-1" class="sidebarLogo_P87M" href="/zh/"><img src="/zh/img/logo2.svg" alt="Apache APISIX®" class="themedImage_TMUO themedImage--light_4Vu1"><img src="/zh/img/logo2.svg" alt="Apache APISIX®" class="themedImage_TMUO themedImage--dark_uzRr"><b>Apache APISIX®</b></a><div class="sidebarVersionSwitch_0QIZ">Version:<div class="navbar__item dropdown dropdown--hoverable"><a class="navbar__link" href="/zh/docs/apisix/getting-started/README/">3.14</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/zh/docs/apisix/next/FAQ/"><div>Next</div></a></li><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/zh/docs/apisix/FAQ/"><div>3.14<div class="badge_6FVu Latest_oyqS">Latest</div></div></a></li><li><a class="dropdown__link" href="/zh/docs/apisix/3.13/FAQ/"><div>3.13</div></a></li><li><a class="dropdown__link" href="/zh/docs/apisix/3.12/FAQ/"><div>3.12</div></a></li><li><a class="dropdown__link" href="/zh/docs/apisix/3.11/FAQ/"><div>3.11</div></a></li><li><a class="dropdown__link" href="/zh/docs/apisix/3.10/FAQ/"><div>3.10</div></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/3.9/getting-started/readme/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>3.9<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/3.8/getting-started/readme/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>3.8<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/3.7/getting-started/readme/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>3.7<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/3.6/getting-started/readme/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>3.6<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/3.5/getting-started/readme/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>3.5<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/3.4/getting-started/readme/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>3.4<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/3.3/getting-started/readme/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>3.3<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/3.2/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>3.2<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/3.1/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>3.1<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/3.0/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>3.0<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.15/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.15<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.14/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.14<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.13/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.13<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.12/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.12<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.11/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.11<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.10/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.10<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.9/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.9<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.8/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.8<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.7/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.7<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.6/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.6<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.5/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.5<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li><a href="https://apache-apisix.netlify.app/docs/apisix/2.4/getting-started/" target="_blank" rel="noopener noreferrer" class="dropdown__link"><span>2.4<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li></ul></div></div><nav class="menu thin-scrollbar menu_oAhv menuWithAnnouncementBar_IVfW"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Getting Started</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" href="/zh/docs/apisix/installation-guide/">APISIX 安装指南</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" href="/zh/docs/apisix/architecture-design/apisix/">软件架构</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Tutorials</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Terminology</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Plugins</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">API</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" href="/zh/docs/apisix/dashboard/">Apache APISIX Dashboard</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Development</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" href="/zh/docs/apisix/deployment-modes/">Deployment modes</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link menu__link--active" aria-current="page" href="/zh/docs/apisix/FAQ/">常见问题</a></li><li class="theme-doc-sidebar-item-category menu__list-item menu__list-item--collapsed"><a class="menu__link menu__link--sublist" href="#">Others</a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a href="https://github.com/apache/apisix/blob/master/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="menu__link"><span>CHANGELOG<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_wgqa"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></span></a></li><li class="theme-doc-sidebar-item-link menu__list-item"><a class="menu__link" href="/zh/docs/apisix/upgrade-guide-from-2.15.x-to-3.0.0/">升级指南</a></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_EBxv"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_AF9Q"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></aside><main class="docMainContainer_Q970"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_zHA2"><div class="docItemContainer_oiyr"><article><span class="theme-doc-version-badge badge badge--secondary">Version: 3.14</span><div class="tocCollapsible_aw-L theme-doc-toc-mobile tocMobile_Tx6Y"><button type="button" class="clean-btn tocCollapsibleButton_zr6a">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>常见问题</h1></header><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="为什么需要一个新的-api-网关不是已经有其他的开源网关了吗"></a>为什么需要一个新的 API 网关?不是已经有其他的开源网关了吗?<a class="hash-link" href="#为什么需要一个新的-api-网关不是已经有其他的开源网关了吗" title="Direct link to heading">#</a></h2><p>随着企业向云本地微服务的发展,企业对高性能、灵活、安全、可扩展的 API 网关的需求越来越大。</p><p>APISIX 在这些指标表现上优于其它 API 网关,同时具有平台无关性和完全动态的特性,如支持多种协议、细粒度路由和多语言支持。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="apisix-和其他的-api-网关有什么不同之处"></a>APISIX 和其他的 API 网关有什么不同之处?<a class="hash-link" href="#apisix-和其他的-api-网关有什么不同之处" title="Direct link to heading">#</a></h2><p>Apache APISIX 在以下方面有所不同:</p><p>— 它使用 etcd 来保存和同步配置,而不是使用如 PostgreSQL 或 MySQL 这类的关系数据库。etcd 中的实时事件通知系统比这些替代方案更容易扩展。这允许 APISIX 实时同步配置,使代码简洁,并避免单点故障。</p><ul><li>完全动态</li><li>支持<a href="/zh/docs/apisix/terminology/plugin/#%E7%83%AD%E5%8A%A0%E8%BD%BD">热加载插件</a>。</li></ul><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="apisix-所展现出的性能如何"></a>APISIX 所展现出的性能如何?<a class="hash-link" href="#apisix-所展现出的性能如何" title="Direct link to heading">#</a></h2><p>与其它 API 网关相比,Apache APISIX 提供了更好的性能,其单核 QPS 高达 18,000,平均延迟仅为 0.2 ms。</p><p>如果您想获取性能基准测试的具体结果,请查看 <a href="/zh/docs/apisix/benchmark/">benchmark</a>。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="apache-apisix-支持哪些平台"></a>Apache APISIX 支持哪些平台?<a class="hash-link" href="#apache-apisix-支持哪些平台" title="Direct link to heading">#</a></h2><p>Apache APISIX 是一个开源的云原生 API 网关,它支持在裸金属服务器上运行,也支持在 Kubernetes 上使用,甚至也可以运行在 Apple Silicon ARM 芯片上。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="如何理解apache-apisix-是全动态的"></a>如何理解“Apache APISIX 是全动态的”?<a class="hash-link" href="#如何理解apache-apisix-是全动态的" title="Direct link to heading">#</a></h2><p>Apache APISIX 是全动态的 API 网关,意味着当你在更改一个配置后,只需要重新加载配置文件就可以使其生效。</p><p>APISIX 可以动态处理以下行为:</p><ul><li>重新加载插件</li><li>代理重写</li><li>对请求进⾏镜像复制</li><li>对请求进⾏修改</li><li>健康状态的检查</li><li>动态控制指向不同上游服务的流量⽐</li></ul><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="apisix-是否有控制台界面"></a>APISIX 是否有控制台界面?<a class="hash-link" href="#apisix-是否有控制台界面" title="Direct link to heading">#</a></h2><p>APISIX 内置功能强大的 Dashboard <a href="https://github.com/apache/apisix-dashboard" rel="noopener noreferrer">APISIX Dashboard</a>。你可以通过 <a href="https://github.com/apache/apisix-dashboard" rel="noopener noreferrer">APISIX Dashboard</a> 用户操作界面来管理 APISIX 配置。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="我可以为-apache-apisix-开发适合自身业务的插件吗"></a>我可以为 Apache APISIX 开发适合自身业务的插件吗?<a class="hash-link" href="#我可以为-apache-apisix-开发适合自身业务的插件吗" title="Direct link to heading">#</a></h2><p>当然可以,APISIX 提供了灵活的自定义插件,方便开发者和企业编写自己的逻辑。</p><p>如果你想开发符合自身业务逻辑的插件,请参考:<a href="/zh/docs/apisix/plugin-develop/">如何开发插件</a>。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="为什么-apache-apisix-选择-etcd-作为配置中心"></a>为什么 Apache APISIX 选择 etcd 作为配置中心?<a class="hash-link" href="#为什么-apache-apisix-选择-etcd-作为配置中心" title="Direct link to heading">#</a></h2><p>对于配置中心,配置存储只是最基本功能,APISIX 还需要下面几个特性:</p><ol><li>集群中的分布式部署</li><li>通过比较来监视业务</li><li>多版本并发控制</li><li>变化通知</li><li>高性能和最小的读/写延迟</li></ol><p>etcd 提供了这些特性,并且使它比 PostgreSQL 和 MySQL 等其他数据库更理想。</p><p>如果你想了解更多关于 etcd 与其他替代方案的比较,请参考<a href="https://etcd.io/docs/latest/learning/why/#comparison-chart" target="_blank" rel="noopener noreferrer">对比图表</a>。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="使用-luarocks-安装-apache-apisix-依赖项时为什么会导致超时安装缓慢或安装失败"></a>使用 LuaRocks 安装 Apache APISIX 依赖项时,为什么会导致超时、安装缓慢或安装失败?<a class="hash-link" href="#使用-luarocks-安装-apache-apisix-依赖项时为什么会导致超时安装缓慢或安装失败" title="Direct link to heading">#</a></h2><p>可能是因为使用的 LuaRocks 服务器延迟过高。</p><p>为了解决这个问题,你可以使用 https_proxy 或者使用 <code>--server</code> 参数指定一个更快的 LuaRocks 服务器。</p><p>你可以运行如下命令来查看可用的服务器(需要 LuaRocks 3.0+):</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token plain">luarocks config rocks_servers</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>中国大陆用户可以使用 <code>luarocks.cn</code> 作为 LuaRocks 的服务器。</p><p>以下命令可以帮助你更快速的安装依赖:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 bash"><pre tabindex="0" class="prism-code language-bash codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">make</span><span class="token plain"> deps </span><span class="token assign-left variable" style="color:#36acaa">ENV_LUAROCKS_SERVER</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">https://luarocks.cn</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>如果通过上述操作仍然无法解决问题,可以尝试使用 <code>--verbose</code> 或 <code>-v</code> 参数获取详细的日志来诊断问题。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="如何构建-apisix-runtime-环境"></a>如何构建 APISIX-Runtime 环境?<a class="hash-link" href="#如何构建-apisix-runtime-环境" title="Direct link to heading">#</a></h2><p>有些功能需要引入额外的 NGINX 模块,这就要求 APISIX 需要运行在 APISIX-Runtime 上。如果你需要这些功能,你可以参考 <a href="https://github.com/api7/apisix-build-tools" rel="noopener noreferrer">api7/apisix-build-tools</a> 中的代码,构建自己的 APISIX-Runtime 环境。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="我该如何使用-apache-apisix-进行灰度发布"></a>我该如何使用 Apache APISIX 进行灰度发布?<a class="hash-link" href="#我该如何使用-apache-apisix-进行灰度发布" title="Direct link to heading">#</a></h2><p>举个例子,比如:<code>foo.com/product/index.html?id=204&page=2</code>,并考虑您需要根据查询字符串中的 <code>id</code> 在此条件下进行灰度发布:</p><ol><li>Group A:<code>id <= 1000</code></li><li>Group B:<code>id > 1000</code></li></ol><p>在 Apache APISIX 中有两种不同的方法来实现这一点:</p><ol><li>创建一个<a href="/zh/docs/apisix/terminology/route/">Route</a>并配置 <code>vars</code> 字段:</li></ol><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</h5></div><div class="admonition-content"><p>您可以这样从 <code>config.yaml</code> 中获取 <code>admin_key</code> 并存入环境变量:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 bash"><pre tabindex="0" class="prism-code language-bash codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token assign-left variable" style="color:#36acaa">admin_key</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable" style="color:#36acaa">yq </span><span class="token variable string" style="color:#e3116c">'.deployment.admin.admin_key[0].key'</span><span class="token variable" style="color:#36acaa"> conf/config.yaml </span><span class="token variable operator" style="color:#393A34">|</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable function" style="color:#d73a49">sed</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable string" style="color:#e3116c">'s/"//g'</span><span class="token variable" style="color:#36acaa">)</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div></div></div><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> -i http://127.0.0.1:9180/apisix/admin/routes/1 -H </span><span class="token string" style="color:#e3116c">"X-API-KEY: </span><span class="token string variable" style="color:#36acaa">$admin_key</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> -X PUT -d </span><span class="token string" style="color:#e3116c">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "/index.html",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "vars": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> ["arg_id", "<=", "1000"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "plugins": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "redirect": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "/test?group_id=1"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> -i http://127.0.0.1:9180/apisix/admin/routes/2 -H </span><span class="token string" style="color:#e3116c">"X-API-KEY: </span><span class="token string variable" style="color:#36acaa">$admin_key</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> -X PUT -d </span><span class="token string" style="color:#e3116c">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "/index.html",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "vars": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> ["arg_id", ">", "1000"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "plugins": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "redirect": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "/test?group_id=2"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>更多 <code>lua-resty-radixtree</code> 匹配操作,请参考:<a href="https://github.com/api7/lua-resty-radixtree#operator-list" target="_blank" rel="noopener noreferrer">lua-resty-radixtree</a>。</p><p>2、通过 <a href="/zh/docs/apisix/plugins/traffic-split/">traffic-split</a> 插件来实现。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="我如何通过-apache-apisix-实现从-http-自动跳转到-https"></a>我如何通过 Apache APISIX 实现从 HTTP 自动跳转到 HTTPS?<a class="hash-link" href="#我如何通过-apache-apisix-实现从-http-自动跳转到-https" title="Direct link to heading">#</a></h2><p>比如,将 <code>http://foo.com</code> 重定向到 <code>https://foo.com</code>。</p><p>Apache APISIX 提供了几种不同的方法来实现:</p><ol><li>在 <a href="/zh/docs/apisix/plugins/redirect/">redirect</a> 插件中将 <code>http_to_https</code> 设置为 <code>true</code>:</li></ol><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://127.0.0.1:9180/apisix/admin/routes/1 -H </span><span class="token string" style="color:#e3116c">"X-API-KEY: </span><span class="token string variable" style="color:#36acaa">$admin_key</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> -X PUT -d </span><span class="token string" style="color:#e3116c">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "/hello",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "host": "foo.com",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "plugins": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "redirect": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "http_to_https": true</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><ol start="2"><li>结合高级路由规则 <code>vars</code> 和 <code>redirect</code> 插件一起使用:</li></ol><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> -i http://127.0.0.1:9180/apisix/admin/routes/1 -H </span><span class="token string" style="color:#e3116c">"X-API-KEY: </span><span class="token string variable" style="color:#36acaa">$admin_key</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> -X PUT -d </span><span class="token string" style="color:#e3116c">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "/hello",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "host": "foo.com",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "vars": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> [</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "scheme",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "==",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "http"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> ]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "plugins": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "redirect": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "https://$host$request_uri",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "ret_code": 301</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><ol start="3"><li>使用 <code>serverless</code> 插件:</li></ol><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> -i http://127.0.0.1:9180/apisix/admin/routes/1 -H </span><span class="token string" style="color:#e3116c">"X-API-KEY: </span><span class="token string variable" style="color:#36acaa">$admin_key</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> -X PUT -d </span><span class="token string" style="color:#e3116c">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "/hello",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "plugins": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "serverless-pre-function": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "phase": "rewrite",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "functions": ["return function() if ngx.var.scheme == \"http\" and ngx.var.host == \"foo.com\" then ngx.header[\"Location\"] = \"https://foo.com\" .. ngx.var.request_uri; ngx.exit(ngx.HTTP_MOVED_PERMANENTLY); end; end"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>然后测试下是否生效:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> -i -H </span><span class="token string" style="color:#e3116c">'Host: foo.com'</span><span class="token plain"> http://127.0.0.1:9080/hello</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>响应信息应该是:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 bash"><pre tabindex="0" class="prism-code language-bash codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token plain">HTTP/1.1 </span><span class="token number" style="color:#36acaa">301</span><span class="token plain"> Moved Permanently</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Date: Mon, </span><span class="token number" style="color:#36acaa">18</span><span class="token plain"> May </span><span class="token number" style="color:#36acaa">2020</span><span class="token plain"> 02:56:04 GMT</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Content-Type: text/html</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Content-Length: </span><span class="token number" style="color:#36acaa">166</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Connection: keep-alive</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Location: https://foo.com/hello</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Server: APISIX web server</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">html</span><span class="token operator" style="color:#393A34">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">head</span><span class="token operator" style="color:#393A34">></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">title</span><span class="token operator" style="color:#393A34">></span><span class="token number" style="color:#36acaa">301</span><span class="token plain"> Moved Permanently</span><span class="token operator" style="color:#393A34"><</span><span class="token plain">/title</span><span class="token operator" style="color:#393A34">></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">/head</span><span class="token operator" style="color:#393A34">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">body</span><span class="token operator" style="color:#393A34">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">center</span><span class="token operator" style="color:#393A34">></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">h</span><span class="token operator file-descriptor important" style="color:#393A34">1</span><span class="token operator" style="color:#393A34">></span><span class="token number" style="color:#36acaa">301</span><span class="token plain"> Moved Permanently</span><span class="token operator" style="color:#393A34"><</span><span class="token plain">/h</span><span class="token operator file-descriptor important" style="color:#393A34">1</span><span class="token operator" style="color:#393A34">></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">/center</span><span class="token operator" style="color:#393A34">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">hr</span><span class="token operator" style="color:#393A34">></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">center</span><span class="token operator" style="color:#393A34">></span><span class="token plain">openresty</span><span class="token operator" style="color:#393A34"><</span><span class="token plain">/center</span><span class="token operator" style="color:#393A34">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">/body</span><span class="token operator" style="color:#393A34">></span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34"><</span><span class="token plain">/html</span><span class="token operator" style="color:#393A34">></span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="我应该如何更改-apache-apisix-的日志等级"></a>我应该如何更改 Apache APISIX 的日志等级?<a class="hash-link" href="#我应该如何更改-apache-apisix-的日志等级" title="Direct link to heading">#</a></h2><p>Apache APISIX 默认的日志等级为 <code>warn</code>,你需要将日志等级调整为 <code>info</code> 来查看 <code>core.log.info</code> 的打印结果。</p><p>你需要将 <code>./conf/config.yaml</code> 中的 <code>nginx_config</code> 配置参数 <code>error_log_level: "warn"</code> 修改为 <code>error_log_level: "info"</code>,然后重新加载 Apache APISIX 使其生效。</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 yaml"><pre tabindex="0" class="prism-code language-yaml codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">nginx_config</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">error_log_level</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"info"</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="我应该如何重新加载-apache-apisix-的自定义插件"></a>我应该如何重新加载 Apache APISIX 的自定义插件?<a class="hash-link" href="#我应该如何重新加载-apache-apisix-的自定义插件" title="Direct link to heading">#</a></h2><p>所有的 Apache APISIX 的插件都支持热加载的方式。</p><p>如果你想了解更多关于热加载的内容,请参考<a href="/zh/docs/apisix/terminology/plugin/#%E7%83%AD%E5%8A%A0%E8%BD%BD">热加载</a>。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="在处理-http-或-https-请求时我该如何配置-apache-apisix-来监听多个端口"></a>在处理 HTTP 或 HTTPS 请求时,我该如何配置 Apache APISIX 来监听多个端口?<a class="hash-link" href="#在处理-http-或-https-请求时我该如何配置-apache-apisix-来监听多个端口" title="Direct link to heading">#</a></h2><p>默认情况下,APISIX 在处理 HTTP 请求时只监听 9080 端口。</p><p>要配置 Apache APISIX 监听多个端口,你可以:</p><ol><li><p>修改 <code>conf/config.yaml</code> 中 HTTP 端口监听的参数 <code>node_listen</code>,示例:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 bash"><pre tabindex="0" class="prism-code language-bash codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token plain">apisix:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> node_listen:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> - </span><span class="token number" style="color:#36acaa">9080</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> - </span><span class="token number" style="color:#36acaa">9081</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> - </span><span class="token number" style="color:#36acaa">9082</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>处理 HTTPS 请求也类似,修改 <code>conf/config.yaml</code> 中 HTTPS 端口监听的参数 <code>ssl.listen</code>,示例:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 bash"><pre tabindex="0" class="prism-code language-bash codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token plain">apisix:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ssl:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> enable: </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> listen:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> - port: </span><span class="token number" style="color:#36acaa">9443</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> - port: </span><span class="token number" style="color:#36acaa">9444</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> - port: </span><span class="token number" style="color:#36acaa">9445</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div></li><li><p>重启或者重新加载 APISIX。</p></li></ol><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="启用-ssl-证书后为什么无法通过-https--ip-访问对应的路由"></a>启用 SSL 证书后,为什么无法通过 HTTPS + IP 访问对应的路由?<a class="hash-link" href="#启用-ssl-证书后为什么无法通过-https--ip-访问对应的路由" title="Direct link to heading">#</a></h2><p>如果直接使用 HTTPS + IP 地址访问服务器,服务器将会使用 IP 地址与绑定的 SNI 进行比对,由于 SSL 证书是和域名进行绑定的,无法在 SNI 中找到对应的资源,因此证书就会校验失败,进而导致用户无法通过 HTTPS + IP 访问网关。</p><p>此时你可以通过在配置文件中设置 <code>fallback_sni</code> 参数,并配置域名,实现该功能。当用户使用 HTTPS + IP 访问网关时,SNI 为空时,则 fallback 到默认 SNI,从而实现 HTTPS + IP 访问网关。</p><div class="codeBlockContainer_EiTO"><div style="color:#393A34;background-color:#f6f8fa" class="codeBlockTitle_PQMO">./conf/config.yaml</div><div class="codeBlockContent_X2I6 yaml"><pre tabindex="0" class="prism-code language-yaml codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token plain">apisix</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ssl:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fallback_sni</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"${your sni}"</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="apisix-如何利用-etcd-如何实现毫秒级别的配置同步"></a>APISIX 如何利用 etcd 如何实现毫秒级别的配置同步?<a class="hash-link" href="#apisix-如何利用-etcd-如何实现毫秒级别的配置同步" title="Direct link to heading">#</a></h2><p>Apache APISIX 使用 etcd 作为它的配置中心。etcd 提供以下订阅功能(比如:<a href="https://github.com/api7/lua-resty-etcd/blob/master/api_v3.md#watch" target="_blank" rel="noopener noreferrer">watch</a>、<a href="https://github.com/api7/lua-resty-etcd/blob/master/api_v3.md#watchdir" target="_blank" rel="noopener noreferrer">watchdir</a>)。它可以监视对特定关键字或目录的更改。</p><p>APISIX 主要使用 <a href="https://github.com/api7/lua-resty-etcd/blob/master/api_v3.md#watchdir" target="_blank" rel="noopener noreferrer">etcd.watchdir</a> 监视目录内容变更:</p><ul><li><p>如果监听目录没有数据更新:则该调用会被阻塞,直到超时或其他错误返回。</p></li><li><p>如果监听目录有数据更新:etcd 将立刻返回订阅(毫秒级)到的新数据,APISIX 将它更新到内存缓存。</p></li></ul><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="我应该如何自定义-apisix-实例-id"></a>我应该如何自定义 APISIX 实例 id?<a class="hash-link" href="#我应该如何自定义-apisix-实例-id" title="Direct link to heading">#</a></h2><p>默认情况下,APISIX 从 <code>conf/apisix.uid</code> 中读取实例 id。如果找不到,且没有配置 id,APISIX 会生成一个 <code>uuid</code> 作为实例 id。</p><p>要指定一个有意义的 id 来绑定 Apache APISIX 到你的内部系统,请在你的 <code>./conf/config.yaml</code> 中设置 id:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 yaml"><pre tabindex="0" class="prism-code language-yaml codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apisix</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"your-id"</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="为什么-errorlog-中会出现-failed-to-fetch-data-from-etcd-failed-to-read-etcd-dir-etcd-key-xxxxxx-的错误"></a>为什么 <code>error.log</code> 中会出现 "failed to fetch data from etcd, failed to read etcd dir, etcd key: xxxxxx" 的错误?<a class="hash-link" href="#为什么-errorlog-中会出现-failed-to-fetch-data-from-etcd-failed-to-read-etcd-dir-etcd-key-xxxxxx-的错误" title="Direct link to heading">#</a></h2><p>请按照以下步骤进行故障排除:</p><ol><li>确保 Apache APISIX 和集群中的 etcd 部署之间没有任何网络问题。</li><li>如果网络正常,请检查是否为 etcd 启用了<a href="https://etcd.io/docs/v3.4.0/dev-guide/api_grpc_gateway/" target="_blank" rel="noopener noreferrer">gRPC gateway</a>。默认状态取决于你是使用命令行还是配置文件来启动 etcd 服务器。</li></ol><ul><li>如果使用命令行选项,默认启用 gRPC 网关。可以手动启用,如下所示:</li></ul><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token plain">etcd --enable-grpc-gateway --data-dir</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/path/to/data</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p><strong>注意</strong>:当运行 <code>etcd --help</code> 时,这个参数不会显示。</p><ul><li><p>如果使用配置文件,默认关闭 gRPC 网关。你可以手动启用,如下所示:</p><p>在 <code>etcd.json</code> 配置:</p></li></ul><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 json"><pre tabindex="0" class="prism-code language-json codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">"enable-grpc-gateway"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token property" style="color:#36acaa">"data-dir"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/path/to/data"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p> 在 <code>etcd.conf.yml</code> 配置</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 yml"><pre tabindex="0" class="prism-code language-yml codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">enable-grpc-gateway</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p><strong>注意</strong>:事实上这种差别已经在 etcd 的 master 分支中消除,但并没有向后兼容到已经发布的版本中,所以在部署 etcd 集群时,依然需要小心。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="我应该如何创建高可用的-apache-apisix-集群"></a>我应该如何创建高可用的 Apache APISIX 集群?<a class="hash-link" href="#我应该如何创建高可用的-apache-apisix-集群" title="Direct link to heading">#</a></h2><p>Apache APISIX 可以通过在其前面添加一个负载均衡器来实现高可用性,因为 APISIX 的数据面是无状态的,并且可以在需要时进行扩展。</p><p>Apache APISIX 的控制平面是依赖于 <code>etcd cluster</code> 的高可用实现的,它只依赖于 etcd 集群。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="为什么使用源码安装-apache-apisix-时执行-make-deps-命令会失败"></a>为什么使用源码安装 Apache APISIX 时,执行 <code>make deps</code> 命令会失败?<a class="hash-link" href="#为什么使用源码安装-apache-apisix-时执行-make-deps-命令会失败" title="Direct link to heading">#</a></h2><p>当使用源代码安装 Apache APISIX 时,执行 <code>make deps</code> 命令可能会出现如下错误:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">make</span><span class="token plain"> deps</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Error: Failed installing dependency: https://luarocks.org/luasec-0.9-1.src.rock - Could not </span><span class="token function" style="color:#d73a49">find</span><span class="token plain"> header </span><span class="token function" style="color:#d73a49">file</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> OPENSSL</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> No </span><span class="token function" style="color:#d73a49">file</span><span class="token plain"> openssl/ssl.h </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> /usr/local/include</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">You may have to </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> OPENSSL </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> your system and/or pass OPENSSL_DIR or OPENSSL_INCDIR to the luarocks command.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Example: luarocks </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> luasec </span><span class="token assign-left variable" style="color:#36acaa">OPENSSL_DIR</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">/usr/local</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">make: *** </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">deps</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> Error </span><span class="token number" style="color:#36acaa">1</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>这是由于缺少 OpenResty openssl 开发工具包。要安装它,请参考<a href="/zh/docs/apisix/install-dependencies/">installation dependencies</a>。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="如何使用正则表达式-regex-匹配-route-中的-uri"></a>如何使用正则表达式 (regex) 匹配 Route 中的 <code>uri</code>?<a class="hash-link" href="#如何使用正则表达式-regex-匹配-route-中的-uri" title="Direct link to heading">#</a></h2><p>你可以在 Route 中使用 <code>vars</code> 字段来匹配正则表达式:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> -i http://127.0.0.1:9180/apisix/admin/routes/1 -H </span><span class="token string" style="color:#e3116c">"X-API-KEY: </span><span class="token string variable" style="color:#36acaa">$admin_key</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> -X PUT -d </span><span class="token string" style="color:#e3116c">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "/*",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "vars": [</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> ["uri", "~~", "^/[a-z]+$"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "upstream": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "type": "roundrobin",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "nodes": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "127.0.0.1:1980": 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>测试请求:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># uri 匹配成功</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://127.0.0.1:9080/hello -i</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HTTP/1.1 </span><span class="token number" style="color:#36acaa">200</span><span class="token plain"> OK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># uri 匹配失败</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://127.0.0.1:9080/12ab -i</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HTTP/1.1 </span><span class="token number" style="color:#36acaa">404</span><span class="token plain"> Not Found</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">.</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>如果你想了解 <code>vars</code> 字段的更多信息,请参考 <a href="https://github.com/api7/lua-resty-expr" target="_blank" rel="noopener noreferrer">lua-resty-expr</a>。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="upstream-节点是否支持配置-fqdn-地址"></a>Upstream 节点是否支持配置 <a href="https://en.wikipedia.org/wiki/Fully_qualified_domain_name" target="_blank" rel="noopener noreferrer">FQDN</a> 地址?<a class="hash-link" href="#upstream-节点是否支持配置-fqdn-地址" title="Direct link to heading">#</a></h2><p>这是支持的,下面是一个 <code>FQDN</code> 为 <code>httpbin.default.svc.cluster.local</code>(一个 Kubernetes Service)的示例:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://127.0.0.1:9180/apisix/admin/routes/1 -H </span><span class="token string" style="color:#e3116c">"X-API-KEY: </span><span class="token string variable" style="color:#36acaa">$admin_key</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> -X PUT -d </span><span class="token string" style="color:#e3116c">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "/ip",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "upstream": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "type": "roundrobin",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "nodes": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "httpbin.default.svc.cluster.local": 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>使用如下命令测试路由:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://127.0.0.1:9080/ip -i</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="admin-api-的-x-api-key-指的是什么是否可以修改"></a>Admin API 的 <code>X-API-KEY</code> 指的是什么?是否可以修改?<a class="hash-link" href="#admin-api-的-x-api-key-指的是什么是否可以修改" title="Direct link to heading">#</a></h2><p>Admin API 的 <code>X-API-KEY</code> 指的是 <code>./conf/config.yaml</code> 文件中的 <code>deployment.admin.admin_key.key</code>,默认值是 <code>edd1c9f034335f136f87ad84b625c8f1</code>。它是 Admin API 的访问 token。</p><p>默认情况下,它被设置为 <code>edd1c9f034335f136f87ad84b625c8f1</code>,也可以通过修改 <code>./conf/conf/config</code> 中的参数来修改,如下示例:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 yaml"><pre tabindex="0" class="prism-code language-yaml codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">deployment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">admin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> admin_key</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"admin"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> newkey</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> admin</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>然后访问 Admin API:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> -i http://127.0.0.1:9180/apisix/admin/routes/1 -H </span><span class="token string" style="color:#e3116c">'X-API-KEY: newkey'</span><span class="token plain"> -X PUT -d </span><span class="token string" style="color:#e3116c">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uris":[ "/*" ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "name":"admin-token-test",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "upstream":{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "nodes":[</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "host":"127.0.0.1",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "port":1980,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "weight":1</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "type":"roundrobin"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HTTP/1.1 </span><span class="token number" style="color:#36acaa">200</span><span class="token plain"> OK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">..</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p><strong>注意</strong>:通过使用默认令牌,可能会面临安全风险。在将其部署到生产环境时,需要对其进行更新。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="如何允许所有-ip-访问-apache-apisix-的-admin-api"></a>如何允许所有 IP 访问 Apache APISIX 的 Admin API?<a class="hash-link" href="#如何允许所有-ip-访问-apache-apisix-的-admin-api" title="Direct link to heading">#</a></h2><p>Apache APISIX 默认只允许 <code>127.0.0.0/24</code> 的 IP 段范围访问 <code>Admin API</code>,</p><p>如果你想允许所有的 IP 访问,只需在 <code>./conf/config.yaml</code> 配置文件中添加如下的配置,然后重启或重新加载 APISIX 就可以让所有 IP 访问 <code>Admin API</code>。</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 yaml"><pre tabindex="0" class="prism-code language-yaml codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">deployment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">admin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">allow_admin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> 0.0.0.0/0</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p><strong>注意</strong>:你可以在非生产环境中使用此方法,以允许所有客户端从任何地方访问 Apache APISIX 实例,但是在生产环境中该设置并不安全。在生产环境中,请仅授权特定的 IP 地址或地址范围访问 Apache APISIX 实例。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="如何基于-acmesh-自动更新-apisix-ssl-证书"></a>如何基于 acme.sh 自动更新 APISIX SSL 证书?<a class="hash-link" href="#如何基于-acmesh-自动更新-apisix-ssl-证书" title="Direct link to heading">#</a></h2><p>你可以运行以下命令来实现这一点:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 bash"><pre tabindex="0" class="prism-code language-bash codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> --output /root/.acme.sh/renew-hook-update-apisix.sh --silent https://gist.githubusercontent.com/anjia0532/9ebf8011322f43e3f5037bc2af3aeaa6/raw/65b359a4eed0ae990f9188c2afa22bacd8471652/renew-hook-update-apisix.sh</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 bash"><pre tabindex="0" class="prism-code language-bash codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> +x /root/.acme.sh/renew-hook-update-apisix.sh</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 bash"><pre tabindex="0" class="prism-code language-bash codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token plain">acme.sh --issue --staging -d demo.domain --renew-hook </span><span class="token string" style="color:#e3116c">"/root/.acme.sh/renew-hook-update-apisix.sh -h http://apisix-admin:port -p /root/.acme.sh/demo.domain/demo.domain.cer -k /root/.acme.sh/demo.domain/demo.domain.key -a xxxxxxxxxxxxx"</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 bash"><pre tabindex="0" class="prism-code language-bash codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token plain">acme.sh --renew --domain demo.domain</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>详细步骤,请参考 <a href="https://juejin.cn/post/6965778290619449351" target="_blank" rel="noopener noreferrer">APISIX 基于 acme.sh 自动更新 HTTPS 证书</a>。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="在-apache-apisix-中我如何在转发到上游之前从路径中删除一个前缀"></a>在 Apache APISIX 中,我如何在转发到上游之前从路径中删除一个前缀?<a class="hash-link" href="#在-apache-apisix-中我如何在转发到上游之前从路径中删除一个前缀" title="Direct link to heading">#</a></h2><p>在转发至上游之前移除请求路径中的前缀,比如说从 <code>/foo/get</code> 改成 <code>/get</code>,可以通过 <code>[proxy-rewrite](/zh/docs/apisix/plugins/proxy-rewrite)</code> 插件来实现:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> -i http://127.0.0.1:9180/apisix/admin/routes/1 -H </span><span class="token string" style="color:#e3116c">"X-API-KEY: </span><span class="token string variable" style="color:#36acaa">$admin_key</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> -X PUT -d </span><span class="token string" style="color:#e3116c">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "/foo/*",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "plugins": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "proxy-rewrite": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "regex_uri": ["^/foo/(.*)","/$1"]</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> },</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "upstream": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "type": "roundrobin",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "nodes": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "httpbin.org:80": 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>测试这个配置:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://127.0.0.1:9080/foo/get -i</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">HTTP/1.1 </span><span class="token number" style="color:#36acaa">200</span><span class="token plain"> OK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token string" style="color:#e3116c">"url"</span><span class="token builtin class-name">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://127.0.0.1/get"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="我应该如何解决-unable-to-get-local-issuer-certificate-这个错误"></a>我应该如何解决 <code>unable to get local issuer certificate</code> 这个错误?<a class="hash-link" href="#我应该如何解决-unable-to-get-local-issuer-certificate-这个错误" title="Direct link to heading">#</a></h2><p>你可以手动设置证书的路径,将其添加到 <code>./conf/config.yaml</code> 文件中,具体操作如下所示:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 yaml"><pre tabindex="0" class="prism-code language-yaml codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apisix</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ssl</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ssl_trusted_certificate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /path/to/certs/ca</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">certificates.crt</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p><strong>注意:</strong>当你尝试使用 cosocket 连接任何 TLS 服务时,如果 APISIX 不信任对端 TLS 服务证书,都需要配置 <code>apisix.ssl.ssl_trusted_certificate</code>。</p><p>例如:如果在 APISIX 中使用 Nacos 作为服务发现时,Nacos 开启了 TLS 协议,即 Nacos 配置的 <code>host</code> 是 <code>https://</code> 开头,就需要配置 <code>apisix.ssl.ssl_trusted_certificate</code>,并且使用和 Nacos 相同的 CA 证书。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="我应该如何解决-module-restyworkerevents-not-found-这个错误"></a>我应该如何解决 <code>module 'resty.worker.events' not found</code> 这个错误?<a class="hash-link" href="#我应该如何解决-module-restyworkerevents-not-found-这个错误" title="Direct link to heading">#</a></h2><p>引起这个错误的原因是在 <code>/root</code> 目录下安装了 APISIX。因为 worker 进程的用户是 nobody,无权访问 <code>/root</code> 目录下的文件。</p><p>解决办法是改变 APISIX 的安装目录,推荐安装在 <code>/usr/local</code> 目录下。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="在-apache-apisix-中plugin-metadata-和-plugin-configs-有什么区别"></a>在 Apache APISIX 中,<code>plugin-metadata</code> 和 <code>plugin-configs</code> 有什么区别?<a class="hash-link" href="#在-apache-apisix-中plugin-metadata-和-plugin-configs-有什么区别" title="Direct link to heading">#</a></h2><p>两者之间的差异如下:</p><table><thead><tr><th><code>plugin-metadata</code></th><th><code>plugin-config</code></th></tr></thead><tbody><tr><td>当更改该 Plugin 属性后,需要应用到配置该插件的所有路由上时使用。</td><td>当你需要复用一组通用的插件配置时使用,可以把 Plugin 配置提取到一个 <code>plugin-config</code> 并绑定到不同的路由。</td></tr><tr><td>对绑定到 Plugin 的配置实例的所有实体生效。</td><td>对绑定到 <code>plugin-config</code> 的路由生效。</td></tr><tr><td>对绑定到 Plugin 的配置实例的所有实体生效。</td><td>对绑定到 <code>plugin-config</code> 的路由生效。</td></tr></tbody></table><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="部署了-apache-apisix-之后如何检测-apisix-数据平面的存活情况如何探活"></a>部署了 Apache APISIX 之后,如何检测 APISIX 数据平面的存活情况(如何探活)?<a class="hash-link" href="#部署了-apache-apisix-之后如何检测-apisix-数据平面的存活情况如何探活" title="Direct link to heading">#</a></h2><p>可以创建一个名为 <code>health-info</code> 的路由,并开启 <a href="https://apisix.apache.org/zh/docs/apisix/plugins/fault-injection/" rel="noopener noreferrer">fault-injection</a> 插件(其中 YOUR-TOKEN 是用户自己的 token;127.0.0.1 是控制平面的 IP 地址,可以自行修改):</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://127.0.0.1:9180/apisix/admin/routes/health-info </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-H </span><span class="token string" style="color:#e3116c">'X-API-KEY: YOUR-TOKEN'</span><span class="token plain"> -X PUT -d </span><span class="token string" style="color:#e3116c">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "plugins": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "fault-injection": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "abort": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "http_status": 200,</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "body": "fine"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> },</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri": "/status"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>验证方式:</p><p>访问 Apache APISIX 数据平面的 <code>/status</code> 来探测 APISIX,如果 response code 是 200 就代表 APISIX 存活。</p><div class="admonition admonition-note alert alert--secondary"><div class="admonition-heading"><h5><span class="admonition-icon"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="16" viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</h5></div><div class="admonition-content"><p>这个方式只是探测 APISIX 数据平面是否存活,并不代表 APISIX 的路由和其他功能是正常的,这些需要更多路由级别的探测。</p></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="apisix-与-etcd-相关的延迟较高的问题有哪些如何修复"></a>APISIX 与 <a href="https://etcd.io/" target="_blank" rel="noopener noreferrer">etcd</a> 相关的延迟较高的问题有哪些,如何修复?<a class="hash-link" href="#apisix-与-etcd-相关的延迟较高的问题有哪些如何修复" title="Direct link to heading">#</a></h2><p>etcd 作为 APISIX 的数据存储组件,它的稳定性关乎 APISIX 的稳定性。在实际场景中,如果 APISIX 使用证书通过 HTTPS 的方式连接 etcd,可能会出现以下 2 种数据查询或写入延迟较高的问题:</p><ol><li>通过接口操作 APISIX Admin API 进行数据的查询或写入,延迟较高。</li><li>在监控系统中,Prometheus 抓取 APISIX 数据面 Metrics 接口超时。</li></ol><p>这些延迟问题,严重影响了 APISIX 的服务稳定性,而之所以会出现这类问题,主要是因为 etcd 对外提供了 2 种操作方式:HTTP(HTTPS)、gRPC。而 APISIX 默认是基于 HTTP(HTTPS)协议来操作 etcd 的。</p><p>在这个场景中,etcd 存在一个关于 HTTP/2 的 BUG:如果通过 HTTPS 操作 etcd(HTTP 不受影响),HTTP/2 的连接数上限为 Golang 默认的 <code>250</code> 个。</p><p>所以,当 APISIX 数据面节点数较多时,一旦所有 APISIX 节点与 etcd 连接数超过这个上限,则 APISIX 的接口响应会非常的慢。</p><p>Golang 中,默认的 HTTP/2 上限为 <code>250</code>,代码如下:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 go"><pre tabindex="0" class="prism-code language-go codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">package</span><span class="token plain"> http2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> prefaceTimeout </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Second</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> firstSettingsTimeout </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Second </span><span class="token comment" style="color:#999988;font-style:italic">// should be in-flight with preface anyway</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> handlerChunkWriteSize </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> </span><span class="token operator" style="color:#393A34"><<</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> defaultMaxStreams </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">250</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// TODO: make this 100 as the GFE seems to?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> maxQueuedControlFrames </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>目前,etcd 官方主要维护了 <code>3.4</code> 和 <code>3.5</code> 这两个主要版本。在 <code>3.4</code> 系列中,近期发布的 <code>3.4.20</code> 版本已修复了这个问题。至于 <code>3.5</code> 版本,其实,官方很早之前就在筹备发布 <code>3.5.5</code> 版本了,但截止目前(2022.09.13)仍尚未发布。所以,如果你使用的是 etcd 的版本小于 <code>3.5.5</code>,可以参考以下几种方式解决这个问题:</p><ol><li>将 APISIX 与 etcd 的通讯方式由 HTTPS 改为 HTTP。</li><li>将 etcd 版本回退到 <code>3.4.20</code>。</li><li>将 etcd 源码克隆下来,直接编译 <code>release-3.5</code> 分支(此分支已修复,只是尚未发布新版本而已)。</li></ol><p>重新编译 etcd 的方式如下:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> checkout release-3.5</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">make</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">GOOS</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">linux </span><span class="token assign-left variable" style="color:#36acaa">GOARCH</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">amd64</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>编译的二进制在 <code>bin</code> 目录下,将其替换掉你服务器环境的 etcd 二进制后,然后重启 etcd 即可。</p><p>更多信息,请参考:</p><ul><li><a href="https://github.com/etcd-io/etcd/issues/14185" target="_blank" rel="noopener noreferrer">when etcd node have many http long polling connections, it may cause etcd to respond slowly to http requests.</a></li><li><a href="https://github.com/apache/apisix/issues/7078" rel="noopener noreferrer">bug: when apisix starts for a while, its communication with etcd starts to time out</a></li><li><a href="https://github.com/apache/apisix/issues/7353" rel="noopener noreferrer">the prometheus metrics API is tool slow</a></li><li><a href="https://github.com/etcd-io/etcd/pull/14169" target="_blank" rel="noopener noreferrer">Support configuring <code>MaxConcurrentStreams</code> for http2</a></li></ul><p>另外一种解决办法是改用实验性的基于 gRPC 的配置同步。需要在配置文件 <code>conf/config.yaml</code> 中设置 <code>use_grpc: true</code>:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 yaml"><pre tabindex="0" class="prism-code language-yaml codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">etcd</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">use_grpc</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://127.0.0.1:2379"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">prefix</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/apisix"</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="为什么-file-logger-记录日志会出现乱码"></a>为什么 file-logger 记录日志会出现乱码?<a class="hash-link" href="#为什么-file-logger-记录日志会出现乱码" title="Direct link to heading">#</a></h2><p>如果你使用的是 <code>file-logger</code> 插件,但是在日志文件中出现了乱码,那么可能是因为上游服务的响应体被进行了压缩。你可以将请求头带上不接收压缩响应参数(<code>gzip;q=0,deflate,sdch</code>)以解决这个问题,你可以使用 <a href="https://apisix.apache.org/docs/apisix/plugins/proxy-rewrite/" rel="noopener noreferrer">proxy-rewirte</a> 插件将请求头中的 <code>accept-encoding</code> 设置为不接收压缩响应:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 shell"><pre tabindex="0" class="prism-code language-shell codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> http://127.0.0.1:9180/apisix/admin/routes/1 </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">-H </span><span class="token string" style="color:#e3116c">'X-API-KEY: YOUR-TOKEN'</span><span class="token plain"> -X PUT -d </span><span class="token string" style="color:#e3116c">'</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "methods":[</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "GET"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> ],</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "uri":"/test/index.html",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "plugins":{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "proxy-rewrite":{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "headers":{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "set":{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "accept-encoding":"gzip;q=0,deflate,sdch"</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> },</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "upstream":{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "type":"roundrobin",</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "nodes":{</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> "127.0.0.1:80":1</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c"> }</span><br></span><span class="token-line" style="color:#393A34"><span class="token string" style="color:#e3116c">}'</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="apisix-如何配置带认证的-etcd"></a>APISIX 如何配置带认证的 ETCD?<a class="hash-link" href="#apisix-如何配置带认证的-etcd" title="Direct link to heading">#</a></h2><p>假设您有一个启用身份验证的 ETCD 集群。要访问该集群,需要在 <code>conf/config.yaml</code> 中为 Apache APISIX 配置正确的用户名和密码:</p><div class="codeBlockContainer_EiTO"><div class="codeBlockContent_X2I6 yaml"><pre tabindex="0" class="prism-code language-yaml codeBlock_UxnK thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_W6UD"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">deployment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">etcd</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">host</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://127.0.0.1:2379"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">user</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> etcd_user </span><span class="token comment" style="color:#999988;font-style:italic"># username for etcd</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> etcd_password </span><span class="token comment" style="color:#999988;font-style:italic"># password for etcd</span><br></span></code></pre><button type="button" aria-label="Copy code to clipboard" class="copyButton_V-PD clean-btn">Copy</button></div></div><p>关于 ETCD 的其他配置,比如过期时间、重试次数等等,你可以参考 <code>conf/config.yaml.example</code> 文件中的 <code>etcd</code> 部分。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="ssls-对象与-upstream-对象中的-tlsclient_cert-以及-configyaml-中的-ssl_trusted_certificate-区别是什么"></a>SSLs 对象与 <code>upstream</code> 对象中的 <code>tls.client_cert</code> 以及 <code>config.yaml</code> 中的 <code>ssl_trusted_certificate</code> 区别是什么?<a class="hash-link" href="#ssls-对象与-upstream-对象中的-tlsclient_cert-以及-configyaml-中的-ssl_trusted_certificate-区别是什么" title="Direct link to heading">#</a></h2><p>Admin API 中 <code>/apisix/admin/ssls</code> 用于管理 SSL 对象,如果 APISIX 需要接收来自外网的 HTTPS 请求,那就需要用到存放在这里的证书完成握手。SSL 对象中支持配置多个证书,不同域名的证书 APISIX 将使用 Server Name Indication (SNI) 进行区分。</p><p>Upstream 对象中的 <code>tls.client_cert</code>、<code>tls.client_key</code> 与 <code>tls.client_cert_id</code> 用于存放客户端的证书,适用于需要与上游进行 <a href="https://apisix.apache.org/zh/docs/apisix/tutorials/client-to-apisix-mtls/" rel="noopener noreferrer">mTLS 通信</a>的情况。</p><p><code>config.yaml</code> 中的 <code>ssl_trusted_certificate</code> 用于配置一个受信任的根证书。它仅用于在 APISIX 内部访问某些具有自签名证书的服务时,避免提示拒绝对方的 SSL 证书。注意:它不用于信任 APISIX 上游的证书,因为 APISIX 不会验证上游证书的合法性。因此,即使上游使用了无效的 TLS 证书,APISIX 仍然可以与其通信,而无需配置根证书。</p><h2><a aria-hidden="true" tabindex="-1" class="anchor anchor__h2 anchorWithHideOnScrollNavbar_3ly5" id="如果在使用-apisix-过程中遇到问题我可以在哪里寻求更多帮助"></a>如果在使用 APISIX 过程中遇到问题,我可以在哪里寻求更多帮助?<a class="hash-link" href="#如果在使用-apisix-过程中遇到问题我可以在哪里寻求更多帮助" title="Direct link to heading">#</a></h2><ul><li><a target="_blank" href="/zh/docs/general/join/#%E5%8A%A0%E5%85%A5-slack-%E9%A2%91%E9%81%93">Apache APISIX Slack Channel</a>:加入后请选择 channel-apisix 频道,即可通过此频道进行 APISIX 相关问题的提问。</li><li><a target="_blank" href="/zh/docs/general/join/#%E8%AE%A2%E9%98%85%E9%82%AE%E4%BB%B6%E5%88%97%E8%A1%A8">邮件列表</a>:任何问题或对项目提议都可以通过社区邮件进行讨论。</li><li><a href="https://github.com/apache/apisix/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc" rel="noopener noreferrer">GitHub Issues</a> 与 <a href="https://github.com/apache/apisix/discussions" rel="noopener noreferrer">GitHub Discussions</a>:也可直接在 GitHub 中进行相关 issue 创建进行问题的表述。</li></ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="/zh/edit#https://github.com/apache/apisix/edit/release/3.14/docs/zh/latest/FAQ.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_mS5F" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_mt2f"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages navigation"><div class="pagination-nav__item"><a class="pagination-nav__link" href="/zh/docs/apisix/deployment-modes/"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">« Deployment modes</div></a></div><div class="pagination-nav__item pagination-nav__item--next"><a class="pagination-nav__link" href="/zh/docs/apisix/discovery/"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">集成服务发现注册中心 »</div></a></div></nav></div></div><div class="col col--3"><div class="tableOfContents_vrFS thin-scrollbar"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#为什么需要一个新的-api-网关不是已经有其他的开源网关了吗" class="table-of-contents__link">为什么需要一个新的 API 网关?不是已经有其他的开源网关了吗?</a></li><li><a href="#apisix-和其他的-api-网关有什么不同之处" class="table-of-contents__link">APISIX 和其他的 API 网关有什么不同之处?</a></li><li><a href="#apisix-所展现出的性能如何" class="table-of-contents__link">APISIX 所展现出的性能如何?</a></li><li><a href="#apache-apisix-支持哪些平台" class="table-of-contents__link">Apache APISIX 支持哪些平台?</a></li><li><a href="#如何理解apache-apisix-是全动态的" class="table-of-contents__link">如何理解“Apache APISIX 是全动态的”?</a></li><li><a href="#apisix-是否有控制台界面" class="table-of-contents__link">APISIX 是否有控制台界面?</a></li><li><a href="#我可以为-apache-apisix-开发适合自身业务的插件吗" class="table-of-contents__link">我可以为 Apache APISIX 开发适合自身业务的插件吗?</a></li><li><a href="#为什么-apache-apisix-选择-etcd-作为配置中心" class="table-of-contents__link">为什么 Apache APISIX 选择 etcd 作为配置中心?</a></li><li><a href="#使用-luarocks-安装-apache-apisix-依赖项时为什么会导致超时安装缓慢或安装失败" class="table-of-contents__link">使用 LuaRocks 安装 Apache APISIX 依赖项时,为什么会导致超时、安装缓慢或安装失败?</a></li><li><a href="#如何构建-apisix-runtime-环境" class="table-of-contents__link">如何构建 APISIX-Runtime 环境?</a></li><li><a href="#我该如何使用-apache-apisix-进行灰度发布" class="table-of-contents__link">我该如何使用 Apache APISIX 进行灰度发布?</a></li><li><a href="#我如何通过-apache-apisix-实现从-http-自动跳转到-https" class="table-of-contents__link">我如何通过 Apache APISIX 实现从 HTTP 自动跳转到 HTTPS?</a></li><li><a href="#我应该如何更改-apache-apisix-的日志等级" class="table-of-contents__link">我应该如何更改 Apache APISIX 的日志等级?</a></li><li><a href="#我应该如何重新加载-apache-apisix-的自定义插件" class="table-of-contents__link">我应该如何重新加载 Apache APISIX 的自定义插件?</a></li><li><a href="#在处理-http-或-https-请求时我该如何配置-apache-apisix-来监听多个端口" class="table-of-contents__link">在处理 HTTP 或 HTTPS 请求时,我该如何配置 Apache APISIX 来监听多个端口?</a></li><li><a href="#启用-ssl-证书后为什么无法通过-https--ip-访问对应的路由" class="table-of-contents__link">启用 SSL 证书后,为什么无法通过 HTTPS + IP 访问对应的路由?</a></li><li><a href="#apisix-如何利用-etcd-如何实现毫秒级别的配置同步" class="table-of-contents__link">APISIX 如何利用 etcd 如何实现毫秒级别的配置同步?</a></li><li><a href="#我应该如何自定义-apisix-实例-id" class="table-of-contents__link">我应该如何自定义 APISIX 实例 id?</a></li><li><a href="#为什么-errorlog-中会出现-failed-to-fetch-data-from-etcd-failed-to-read-etcd-dir-etcd-key-xxxxxx-的错误" class="table-of-contents__link">为什么 <code>error.log</code> 中会出现 "failed to fetch data from etcd, failed to read etcd dir, etcd key: xxxxxx" 的错误?</a></li><li><a href="#我应该如何创建高可用的-apache-apisix-集群" class="table-of-contents__link">我应该如何创建高可用的 Apache APISIX 集群?</a></li><li><a href="#为什么使用源码安装-apache-apisix-时执行-make-deps-命令会失败" class="table-of-contents__link">为什么使用源码安装 Apache APISIX 时,执行 <code>make deps</code> 命令会失败?</a></li><li><a href="#如何使用正则表达式-regex-匹配-route-中的-uri" class="table-of-contents__link">如何使用正则表达式 (regex) 匹配 Route 中的 <code>uri</code>?</a></li><li><a href="#upstream-节点是否支持配置-fqdn-地址" class="table-of-contents__link">Upstream 节点是否支持配置 FQDN 地址?</a></li><li><a href="#admin-api-的-x-api-key-指的是什么是否可以修改" class="table-of-contents__link">Admin API 的 <code>X-API-KEY</code> 指的是什么?是否可以修改?</a></li><li><a href="#如何允许所有-ip-访问-apache-apisix-的-admin-api" class="table-of-contents__link">如何允许所有 IP 访问 Apache APISIX 的 Admin API?</a></li><li><a href="#如何基于-acmesh-自动更新-apisix-ssl-证书" class="table-of-contents__link">如何基于 acme.sh 自动更新 APISIX SSL 证书?</a></li><li><a href="#在-apache-apisix-中我如何在转发到上游之前从路径中删除一个前缀" class="table-of-contents__link">在 Apache APISIX 中,我如何在转发到上游之前从路径中删除一个前缀?</a></li><li><a href="#我应该如何解决-unable-to-get-local-issuer-certificate-这个错误" class="table-of-contents__link">我应该如何解决 <code>unable to get local issuer certificate</code> 这个错误?</a></li><li><a href="#我应该如何解决-module-restyworkerevents-not-found-这个错误" class="table-of-contents__link">我应该如何解决 <code>module 'resty.worker.events' not found</code> 这个错误?</a></li><li><a href="#在-apache-apisix-中plugin-metadata-和-plugin-configs-有什么区别" class="table-of-contents__link">在 Apache APISIX 中,<code>plugin-metadata</code> 和 <code>plugin-configs</code> 有什么区别?</a></li><li><a href="#部署了-apache-apisix-之后如何检测-apisix-数据平面的存活情况如何探活" class="table-of-contents__link">部署了 Apache APISIX 之后,如何检测 APISIX 数据平面的存活情况(如何探活)?</a></li><li><a href="#apisix-与-etcd-相关的延迟较高的问题有哪些如何修复" class="table-of-contents__link">APISIX 与 etcd 相关的延迟较高的问题有哪些,如何修复?</a></li><li><a href="#为什么-file-logger-记录日志会出现乱码" class="table-of-contents__link">为什么 file-logger 记录日志会出现乱码?</a></li><li><a href="#apisix-如何配置带认证的-etcd" class="table-of-contents__link">APISIX 如何配置带认证的 ETCD?</a></li><li><a href="#ssls-对象与-upstream-对象中的-tlsclient_cert-以及-configyaml-中的-ssl_trusted_certificate-区别是什么" class="table-of-contents__link">SSLs 对象与 <code>upstream</code> 对象中的 <code>tls.client_cert</code> 以及 <code>config.yaml</code> 中的 <code>ssl_trusted_certificate</code> 区别是什么?</a></li><li><a href="#如果在使用-apisix-过程中遇到问题我可以在哪里寻求更多帮助" class="table-of-contents__link">如果在使用 APISIX 过程中遇到问题,我可以在哪里寻求更多帮助?</a></li></ul></div></div></div></div></main></div></div><footer class="container_MP5Z"><div class="linksRow_iwpv"><div class="linksCol_a1ec"><div>ASF</div><ul><li class="footer__item"><a href="https://www.apache.org/" target="_blank" rel="noopener noreferrer"><span></span><span>Foundation</span></a></li><li class="footer__item"><a href="https://www.apache.org/licenses/" target="_blank" rel="noopener noreferrer"><span></span><span>License</span></a></li><li class="footer__item"><a href="https://www.apache.org/events/" target="_blank" rel="noopener noreferrer"><span></span><span>Events</span></a></li><li class="footer__item"><a href="https://www.apache.org/security/" target="_blank" rel="noopener noreferrer"><span></span><span>Security</span></a></li><li class="footer__item"><a href="https://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noopener noreferrer"><span></span><span>Sponsorship</span></a></li><li class="footer__item"><a href="https://www.apache.org/foundation/thanks.html" target="_blank" rel="noopener noreferrer"><span></span><span>Thanks</span></a></li></ul></div><div class="linksCol_a1ec"><div>Community</div><ul><li class="footer__item"><a href="https://github.com/apache/apisix/issues" target="_blank" rel="noopener noreferrer"><span></span><span>GitHub</span></a></li><li class="footer__item"><a href="/zh/docs/general/join/"><span></span><span>Slack</span></a></li><li class="footer__item"><a href="https://twitter.com/ApacheAPISIX" target="_blank" rel="noopener noreferrer"><span></span><span>Twitter</span></a></li><li class="footer__item"><a href="https://www.youtube.com/channel/UCgPD18cMhOg5rmPVnQhAC8g" target="_blank" rel="noopener noreferrer"><span></span><span>YouTube</span></a></li></ul></div><div class="linksCol_a1ec"><div>More</div><ul><li class="footer__item"><a target="_parent" href="/zh/blog/"><span></span><span>Blog</span></a></li><li class="footer__item"><a target="_parent" href="/zh/showcase/"><span></span><span>Showcase</span></a></li><li class="footer__item"><a target="_parent" href="/zh/plugins/"><span></span><span>Plugin Hub</span></a></li><li class="footer__item"><a href="https://github.com/apache/apisix/milestones" target="_parent" rel="noopener noreferrer"><span></span><span>Roadmap</span></a></li></ul></div></div><div class="copyright_ZfFh"><a href="https://www.apache.org/" target="_blank" rel="noopener noreferrer"><span style="display:inline-block;width:231.25px;height:40px"></span></a><div>Copyright © 2019-2025 The Apache Software Foundation. Apache APISIX, APISIX®, Apache, the Apache feather logo, and the Apache APISIX project logo are either registered trademarks or trademarks of the Apache Software Foundation.</div></div></footer></div> |
| <script src="https://apisix-website-static.apiseven.com/zh/assets/js/runtime~main.64ba63d5.js"></script> |
| <script src="https://apisix-website-static.apiseven.com/zh/assets/js/main.21198ee1.js"></script> |
| </body> |
| </html> |