{"id":18657,"date":"2024-11-19T20:42:09","date_gmt":"2024-11-19T12:42:09","guid":{"rendered":"https:\/\/fwq.ai\/blog\/?p=18657"},"modified":"2024-11-19T20:42:09","modified_gmt":"2024-11-19T12:42:09","slug":"haproxy%e7%9a%84%e5%ae%89%e8%a3%85%e4%b8%8e%e5%90%af%e5%8a%a8","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/18657\/","title":{"rendered":"Haproxy\u7684\u5b89\u88c5\u4e0e\u542f\u52a8"},"content":{"rendered":"<p>haproxy\u7684\u5b98\u65b9\u5730\u5740\uff1ahttp:\/\/www.haproxy.org<\/p>\n<p>HAproxy\u7684\u5b98\u65b9\u5b66\u4e60\u6587\u6863\uff1ahttp:\/\/cbonte.github.io\/haproxy-dconv\/1.7\/intro.html<\/p>\n<p>&nbsp;<\/p>\n<p>\u4e0b\u8f7d\uff1ahttp:\/\/www.haproxy.org\/download\/1.7\/src\/haproxy-1.7.2.tar.gz<\/p>\n<pre># tar xzf haproxy-1.7.2.tar.gz\r\n# cd haproxy-1.7.2\r\n# make PREFIX=\/usr\/local\/haproxy\/ TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1\r\n# make install PREFIX=\/usr\/local\/haproxy\/<\/pre>\n<p>\u5b89\u88c5\u53ef\u53c2\u8003\uff1ahttps:\/\/github.com\/haproxy\/haproxy-1.5<strong><br \/>\n<\/strong><\/p>\n<p><strong>Tips 1\uff1a\u4e3a\u4ec0\u4e48\u76ee\u5f55\u4e2d\u6ca1\u6709configure\uff1f\u5148\u6765\u719f\u6089\u4e0b\u4e00\u822c\u8f6f\u4ef6\u7684\u5b89\u88c5\u8fc7\u7a0b<\/strong><\/p>\n<ol>\n<li>\u4f7f\u7528configure\u914d\u7f6e\u8f6f\u4ef6\uff08\u4f8b\u5982\uff1aprefix=\/usr\/local\/xxx\uff09\uff0c\u4f1a\u751f\u6210 Makefile<\/li>\n<li>make\uff0c\u5f00\u59cb\u7f16\u8bd1\uff0c\u628a\u6e90\u4ee3\u7801\u7f16\u8bd1\u6210\u53ef\u6267\u884c\u4e8c\u8fdb\u5236\u4ee3\u7801<\/li>\n<li>make install\uff0c\u628a\u53ef\u6267\u884c\u7a0b\u5e8f\u79fb\u52a8\u5230\u6307\u5b9a\u4f4d\u7f6e\uff0c\u6743\u9650\u8d4b\u503c\u7b49\u64cd\u4f5c<\/li>\n<\/ol>\n<p>\u800c\u5728HAproxy\u4e2d\u5df2\u7ecf\u5b58\u5728\u914d\u7f6e\u597d\u7684 Makefile \u6587\u4ef6\uff0c\u6240\u4ee5\u76f4\u63a5\u6267\u884c make \u547d\u4ee4\u5373\u53ef\u3002<\/p>\n<p><strong>Tips 2\uff1a\u4e3a\u4ec0\u4e48\u5728make \u548c make install \u4e2d\uff0c\u53ef\u4ee5\u9700\u8981\u6307\u5b9aPREFIX \u3001TARGET\u5462\uff1f<\/strong><\/p>\n<p>\u4ece 1 \u4e2d\u7684\u5b89\u88c5\u8fc7\u7a0b\u53ef\u4ee5\u770b\u51fa\u6765\uff0c\u5b89\u88c5\u7684\u91cd\u8981\u8fc7\u7a0b\u662fmake \u7f16\u8bd1\uff0c\u53ea\u8981\u6709Makefile \u6587\u4ef6\uff0c\u5c31\u53ef\u4ee5\u6267\u884cmake\uff0c\u800cMakefile \u5176\u5b9e\u662f\u4e00\u4e2a shell \u811a\u672c\uff0c\u4eceHAproxy\u7684Makefile\u7684shell\u811a\u672c\u4e2d\uff0c\u53ef\u4ee5\u770b\u5230\u662f\u5141\u8bb8\u4f20\u5165prefix\u548cTarget\u53c2\u6570\u7684\uff0c\u6253\u5f00Makefile\u7684\u811a\u672c\uff0c\u4e5f\u53ef\u4ee5\u770b\u5230\u9ed8\u8ba4\u7684PREFIX=\/usr\/local \uff0c\u800c\u6b64\u5904\u6307\u5b9a\u4e3a\/usr\/local\/haproxy\/\u3002\u81f3\u4e8eTARGET\u53c2\u6570\uff0c\u5728Makefile\u7684\u6587\u4ef6\u4e2d\uff0c\u4e5f\u53ef\u4ee5\u770b\u5230\uff0c\u7c7b\u4f3c\u4e8e<\/p>\n<pre>ifeq ($(TARGET),generic)\r\n\u00a0 # generic system target has nothing specific\r\n\u00a0 USE_POLL\u00a0\u00a0 = implicit\r\n\u00a0 USE_TPROXY = implicit\r\nelse\r\nifeq ($(TARGET),haiku)\r\n\u00a0 # For Haiku\r\n\u00a0 TARGET_LDFLAGS = -lnetwork\r\n\u00a0 USE_POLL = implicit\r\n\u00a0 USE_TPROXY = implicit\r\nelse\r\nifeq ($(TARGET),linux22)\r\n\u00a0 # This is for Linux 2.2\r\n\u00a0 USE_GETSOCKNAME = implicit\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_TPROXY\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_LIBCRYPT\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_DL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\nelse\r\nifeq ($(TARGET),linux24)\r\n\u00a0 # This is for standard Linux 2.4 with netfilter but without epoll()\r\n\u00a0 USE_GETSOCKNAME = implicit\r\n\u00a0 USE_NETFILTER\u00a0\u00a0 = implicit\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_TPROXY\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_LIBCRYPT\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_DL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\nelse\r\nifeq ($(TARGET),linux24e)\r\n\u00a0 # This is for enhanced Linux 2.4 with netfilter and epoll() patch &gt; 0.21\r\n\u00a0 USE_GETSOCKNAME = implicit\r\n\u00a0 USE_NETFILTER\u00a0\u00a0 = implicit\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_EPOLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_MY_EPOLL\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_TPROXY\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_LIBCRYPT\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_DL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\nelse\r\nifeq ($(TARGET),linux26)\r\n\u00a0 # This is for standard Linux 2.6 with netfilter and standard epoll()\r\n\u00a0 USE_GETSOCKNAME = implicit\r\n\u00a0 USE_NETFILTER\u00a0\u00a0 = implicit\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_EPOLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_TPROXY\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_LIBCRYPT\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_FUTEX\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 EXTRA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 += haproxy-systemd-wrapper\r\n\u00a0 USE_DL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\nelse\r\nifeq ($(TARGET),linux2628)\r\n\u00a0 # This is for standard Linux &gt;= 2.6.28 with netfilter, epoll, tproxy and splice\r\n\u00a0 USE_GETSOCKNAME = implicit\r\n\u00a0 USE_NETFILTER\u00a0\u00a0 = implicit\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_EPOLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_TPROXY\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_LIBCRYPT\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_LINUX_SPLICE= implicit\r\n\u00a0 USE_LINUX_TPROXY= implicit\r\n\u00a0 USE_ACCEPT4\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_FUTEX\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_CPU_AFFINITY= implicit\r\n\u00a0 ASSUME_SPLICE_WORKS= implicit\r\n\u00a0 EXTRA\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 += haproxy-systemd-wrapper\r\n\u00a0 USE_DL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\nelse\r\nifeq ($(TARGET),solaris)\r\n\u00a0 # This is for Solaris 8\r\n\u00a0 # We also enable getaddrinfo() which works since solaris 8.\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 TARGET_CFLAGS\u00a0 = -fomit-frame-pointer -DFD_SETSIZE=65536 -D_REENTRANT\r\n\u00a0 TARGET_LDFLAGS = -lnsl -lsocket\r\n\u00a0 USE_TPROXY\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_LIBCRYPT\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_CRYPT_H\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_GETADDRINFO = implicit\r\nelse\r\nifeq ($(TARGET),freebsd)\r\n\u00a0 # This is for FreeBSD\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_KQUEUE\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_TPROXY\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_LIBCRYPT\u00a0\u00a0 = implicit\r\nelse\r\nifeq ($(TARGET),osx)\r\n\u00a0 # This is for Mac OS\/X\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_KQUEUE\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_TPROXY\u00a0\u00a0\u00a0\u00a0 = implicit\r\nelse\r\nifeq ($(TARGET),openbsd)\r\n\u00a0 # This is for OpenBSD &gt;= 5.7\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_KQUEUE\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_TPROXY\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_ACCEPT4\u00a0\u00a0\u00a0 = implicit\r\nelse\r\nifeq ($(TARGET),netbsd)\r\n\u00a0 # This is for NetBSD\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_KQUEUE\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_TPROXY\u00a0\u00a0\u00a0\u00a0 = implicit\r\nelse\r\nifeq ($(TARGET),aix51)\r\n\u00a0 # This is for AIX 5.1\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_LIBCRYPT\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 TARGET_CFLAGS\u00a0\u00a0 = -Dss_family=__ss_family\r\n\u00a0 DEBUG_CFLAGS\u00a0\u00a0\u00a0 =\r\nelse\r\nifeq ($(TARGET),aix52)\r\n\u00a0 # This is for AIX 5.2 and later\r\n\u00a0 USE_POLL\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 USE_LIBCRYPT\u00a0\u00a0\u00a0 = implicit\r\n\u00a0 TARGET_CFLAGS\u00a0\u00a0 = -D_MSGQSUPPORT\r\n\u00a0 DEBUG_CFLAGS\u00a0\u00a0\u00a0 =\r\nelse\r\nifeq ($(TARGET),cygwin)\r\nUSE_POLL\u00a0\u00a0 = implicit\r\n\u00a0 USE_TPROXY = implicit\r\n\u00a0 TARGET_CFLAGS\u00a0 = $(if $(filter 1.5.%, $(shell uname -r)), \r\n-DUSE_IPV6 -DAF_INET6=23 -DINET6_ADDRSTRLEN=46, )\r\nendif # cygwin\r\nendif # aix52\r\nendif # aix51\r\nendif # netbsd\r\nendif # openbsd\r\nendif # osx\r\nendif # freebsd\r\nendif # solaris\r\nendif # linux2628\r\nendif # linux26\r\nendif # linux24e\r\nendif # linux24\r\nendif # linux22\r\nendif # haiku\r\nendif # generic<\/pre>\n<p>\u4ece\u4ee5\u4e0a\u7684\u4ee3\u7801\u4e2d\uff0c\u53ef\u4ee5\u770b\u5230\uff0c\u6839\u636e\u7cfb\u7edf\u7684\u5185\u6838\u4e0d\u540c\uff0c\u914d\u7f6e\u4f1a\u4e0d\u4e00\u6837\uff0c\u7f16\u8bd1\u4f1a\u4e0d\u4e00\u6837\u3002\u8fd9\u91cc\u9644\u4e0a\u4e00\u4e2a\u67e5\u770bLinux\u7248\u672c\u7684\u6587\u7ae0\uff1a[centos7]\u67e5\u770b\u7cfb\u7edf\u7248\u672c\u3001CPU\u7684\u65b9\u6cd5<\/p>\n<h1>\u542f\u52a8haproxy<\/h1>\n<pre># \/usr\/local\/haproxy\/sbin\/haproxy -f \/usr\/local\/haproxy\/conf\/haproxy.cfg<\/pre>\n<h1>\u91cd\u542fhaproxy<\/h1>\n<pre># \/usr\/local\/haproxy\/sbin\/haproxy -f \/usr\/local\/haproxy\/conf\/haproxy.cfg \r\n-st `cat \/run\/haproxy.pid`<\/pre>\n<h1>\u505c\u6b62haproxy<\/h1>\n<pre># kill all haproxy<\/pre>\n<h1 class=\"p1\"><span class=\"s1\"><b>\u5236\u4f5c haproxy\u542f\u52a8\/\u5173\u95ed\/\u91cd\u542fSHELL\u811a\u672c<\/b><\/span><\/h1>\n<p>\u590d\u5236\u00a0\/haproxy-1.7.2\/examples\/haproxy.init \u5230\/etc\/init.d\/haproxy\uff0c\u5e76\u76f8\u5e94\u7684\u66f4\u6539<\/p>\n<pre class=\"p1\"><span class=\"s1\">vim \/etc\/init.d\/haproxy\r\n<\/span>\uff03\u66f4\u6539BIN\u548cCFG\u7684\u8def\u5f84\r\n\r\n#BIN=\/usr\/sbin\/$BASENAME\r\n<span class=\"s2\">BIN<\/span><span class=\"s1\">=\/usr\/<\/span><span class=\"s3\">local<\/span><span class=\"s1\">\/bin\/haproxy\r\n\r\n<\/span>#CFG=\/etc\/$BASENAME\/$BASENAME.cfg\r\n<span class=\"s2\">CFG<\/span><span class=\"s1\">=\/usr\/<\/span><span class=\"s3\">local<\/span><span class=\"s1\">\/haproxy\/conf\/haproxy.cfg<\/span><\/pre>\n<p class=\"p1\"><span class=\"s1\">\u9519\u8bef\uff1ahaproxy: \u7b2c 26 \u884c:[: =: \u671f\u5f85\u4e00\u5143\u8868\u8fbe\u5f0f<br \/>\n<\/span><\/p>\n<pre class=\"p1\">[ ${NETWORKING} = \"no\" ] &amp;&amp; exit 0\r\n<span class=\"s2\">[<\/span> <span class=\"s2\">\"<\/span><span class=\"s4\">$NETWORKING<\/span><span class=\"s2\">\"<\/span> <span class=\"s2\">=<\/span> <span class=\"s5\">\"no\"<\/span> <span class=\"s2\">]<\/span><span class=\"s3\"> &amp;&amp; <\/span><span class=\"s2\">exit<\/span> <span class=\"s5\">0<\/span><\/pre>\n<p class=\"p1\">\u8fd9\u6837\u5c31\u53ef\u4ee5\u4f7f\u7528\uff1a<\/p>\n<pre class=\"p1\">service start haporxy\r\nservice stop haproxy\r\nservice restart haproxy\r\nservice reload haproxy<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>haproxy\u7684\u5b98\u65b9\u5730\u5740\uff1ahttp:\/\/www.haproxy.org HAproxy\u7684\u5b98\u65b9\u5b66\u4e60\u6587\u6863\uff1ahttp:\/\/cbonte.github.io\/haproxy-dconv\/1.7\/intro.html &nbsp; \u4e0b\u8f7d\uff1ahttp:\/\/www.haproxy.org\/download\/1.7\/src\/haproxy-1.7.2.tar.gz # tar xzf haproxy-1.7.2.tar.gz # cd haproxy-1.7.2 # make PREFIX=\/usr\/local\/haproxy\/ TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 # make install PREFIX=\/usr\/local\/haproxy\/ \u5b89\u88c5\u53ef\u53c2\u8003\uff1ahttps:\/\/github.com\/haproxy\/haproxy-1.5 Tips 1\uff1a\u4e3a\u4ec0\u4e48\u76ee\u5f55\u4e2d\u6ca1\u6709configure\uff1f\u5148\u6765\u719f\u6089\u4e0b\u4e00\u822c\u8f6f\u4ef6\u7684\u5b89\u88c5\u8fc7\u7a0b \u4f7f\u7528configure\u914d\u7f6e\u8f6f\u4ef6\uff08\u4f8b\u5982\uff1aprefix=\/usr\/local\/xxx\uff09\uff0c\u4f1a\u751f\u6210 Makefile make\uff0c\u5f00\u59cb\u7f16\u8bd1\uff0c\u628a\u6e90\u4ee3\u7801\u7f16\u8bd1\u6210\u53ef\u6267\u884c\u4e8c\u8fdb\u5236\u4ee3\u7801 make install\uff0c\u628a\u53ef\u6267\u884c\u7a0b\u5e8f\u79fb\u52a8\u5230\u6307\u5b9a\u4f4d\u7f6e\uff0c\u6743\u9650\u8d4b\u503c\u7b49\u64cd\u4f5c \u800c\u5728HAproxy\u4e2d\u5df2\u7ecf\u5b58\u5728\u914d\u7f6e\u597d\u7684 Makefile \u6587\u4ef6\uff0c\u6240\u4ee5\u76f4\u63a5\u6267\u884c make \u547d\u4ee4\u5373\u53ef\u3002 Tips 2\uff1a\u4e3a\u4ec0\u4e48\u5728make \u548c make install \u4e2d\uff0c\u53ef\u4ee5\u9700\u8981\u6307\u5b9aPREFIX \u3001TARGET\u5462\uff1f \u4ece 1 \u4e2d\u7684\u5b89\u88c5\u8fc7\u7a0b\u53ef\u4ee5\u770b\u51fa\u6765\uff0c\u5b89\u88c5\u7684\u91cd\u8981\u8fc7\u7a0b\u662fmake \u7f16\u8bd1\uff0c\u53ea\u8981\u6709Makefile \u6587\u4ef6\uff0c\u5c31\u53ef\u4ee5\u6267\u884cmake\uff0c\u800cMakefile \u5176\u5b9e\u662f\u4e00\u4e2a shell \u811a\u672c\uff0c\u4eceHAproxy\u7684Makefile\u7684shell\u811a\u672c\u4e2d\uff0c\u53ef\u4ee5\u770b\u5230\u662f\u5141\u8bb8\u4f20\u5165prefix\u548cTarget\u53c2\u6570\u7684\uff0c\u6253\u5f00Makefile\u7684\u811a\u672c\uff0c\u4e5f\u53ef\u4ee5\u770b\u5230\u9ed8\u8ba4\u7684PREFIX=\/usr\/local \uff0c\u800c\u6b64\u5904\u6307\u5b9a\u4e3a\/usr\/local\/haproxy\/\u3002\u81f3\u4e8eTARGET\u53c2\u6570\uff0c\u5728Makefile\u7684\u6587\u4ef6\u4e2d\uff0c\u4e5f\u53ef\u4ee5\u770b\u5230\uff0c\u7c7b\u4f3c\u4e8e ifeq ($(TARGET),generic) \u00a0 # [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-18657","post","type-post","status-publish","format-standard","hentry","category-os"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/18657","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=18657"}],"version-history":[{"count":1,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/18657\/revisions"}],"predecessor-version":[{"id":18658,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/18657\/revisions\/18658"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=18657"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=18657"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=18657"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}