本文我来讲解如何使用 APISIX 来代理 PostgreSQL 数据库服务。
初试
最开始我以为很简单,我采用了直接在 APISIX DashBoard 上配置了一条路由,配置好后,连接发现无法成功连接,提示连接失败。
经过仔细的思考,发现 PostgreSQL 是使用 TCP 协议的数据库,不能通过简单的 route 进行配置,必须使用 stream-proxy 进行代理,接下来我们来看看怎么样来进行配置。
stream-proxy
TCP 是许多流行应用程序和服务的协议,例如 LDAP、MySQL 和 RTMP。UDP(用户数据报协议)是许多流行的非事务性应用程序的协议,例如 DNS、系统日志和 RADIUS。
APISIX 可以动态负载平衡 TCP/UDP 代理。在 Nginx 的世界里,我们把 TCP/UDP proxy 称为 stream proxy,APISIX 就遵循了这个说法。
启用 stream-proxy
要开启 APISIX 流代理需要在 APISIX 配置中开启, APISIX 默认是关闭的。
apisix:
stream_proxy: # TCP/UDP proxy
tcp: # TCP proxy address list
- 9100
- "127.0.0.1:9101"
udp: # UDP proxy address list
- 9200
- "127.0.0.1:9211"
如果apisix.enable_admin为 true,则 HTTP 和流代理都启用了上述配置。
如果您已将 设置enable_admin为 false,并且需要同时启用 HTTP 和流代理,请将 设置only为 false:
apisix:
enable_admin: false
stream_proxy: # TCP/UDP proxy
only: false
tcp: # TCP proxy address list
- 9100
我修改后的配置如下:
apisix:
node_listen: 9080 # APISIX listening port
enable_ipv6: false
port_admin: 9180 # use a separate port
stream_proxy: # TCP/UDP proxy
only: false
tcp: # TCP proxy address list
- 9100
- "127.0.0.1:9101"
配置了流代理相关的配置,我们也要配置流代理请求日志,APISIX 也是默认关闭的,需要我们自己开启,具体如下:
nginx_config: # config for render the template to generate nginx.conf
stream:
enable_access_log: true # enable access log or not, default false
access_log: logs/access_stream.log
access_log_format: "$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $session_time"
# create your custom log format by visiting http://nginx.org/en/docs/varindex.html
access_log_format_escape: default # allows setting json or default characters escaping in variables
lua_shared_dict:
etcd-cluster-health-check-stream: 10m
lrucache-lock-stream: 10m
plugin-limit-conn-stream: 10m
配置路由
开启了流代理后,接下来需要配置路由,由于 DashBoard 没有提供流代理的配置,我们只能通过接口来创建流路由,来看看我的配置吧:
curl http://127.0.0.1:9180/apisix/admin/stream_routes/1 -H 'X-API-KEY: xx' -X PUT -d '
{
"server_port": 9100,
"upstream": {
"nodes": {
"xxx:5432": 1
},
"type": "roundrobin"
},
"plugins": {
"ip-restriction": {
"whitelist": [
"127.0.0.1",
"xx",
"192.168.1.117"
]
}
}
}'
在这个配置里,我通过 9100 端口将数据库代理出去,并添加了 ip-restriction 白名单,只允许特定 ip进行访问。
小结
在本文中,我简单介绍了如何使用 APISIX 来代理数据库 TCP 服务的过程,并添加了白名单来限制 IP 访问,通过 APISIX stream_proxy 我们能很轻松的代理 TCP/UDP 服务。