问题描述
- kong启动后,在虚拟机上访问localhost:8001可以访问,但是外部机器通过[虚拟机IP:8001]无法访问
- 通过docker方式安装的kong,在启动之后就不存在这个问题,外部主机通过IP端口可以轻松访问
问题排查分析
ubuntu虚拟机下情况
刚安装的kong,默认监听的地址是127.0.0.1:8001,127.0.0.1:8443,可以通过查看/usr/local/kong/nginx-kong.conf来查看,如图所示:
也可以通过查看虚拟机端口的监听状况来看,如图所示:
docker容器版本下情况
启动docker容器版本的kong,进入kong的容器内部,查看容器的端口监听状况,如图所示:
也可以通过查看虚拟机端口的监听状况来看,如图所示:
问题分析
问题的根本原因就是因为nginx监听的端口,kong默认将admin的管理端口只允许服务器本机访问,不允许给外部机器访问,这样很安全,但是一方面就会不方便。
仔细分析docker版本的kong启动命令:
docker run -d --name kong \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-p 8000:8000 \
-p 8443:8443 \
-p 8001:8001 \
-p 8444:8444 \
kong
就会发现容器在启动的时候设置了一个环境变量KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl
,可以参照官网说明
解决方案
修改kong的配置,让kong启动后的8001端口不再是只监听127.0.0.1下的8001端口
直接修改kong的配置文件无法生效,除非修改kong的源码
export KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl
# vim /apps/kong/kong.conf
添加以下内容
admin_listen = 0.0.0.0:8001, 0.0.0.0:8444 ssl
# 保存退出,重启kong
kong start -c /apps/kong/kong.conf
这个时候查看服务器的端口监听状态已经改变了,监听端口状态:
也可以以debug方式的启动,直接查看启动的输出日志,如图所示:
kong start -c /apps/kong/kong.conf --vv