我有一个使用bokeh的 flask 应用程序它在 Docker 容器中运行,当我在本地计算机上使用它时它可以工作。
但是,当我将其部署到 GCP 实例时,即使我可以访问服务器,我也有一些 AjaxDataSource() 对象无法连接。
一些细节
- 所有机器、本地和 gcp 虚拟机都运行 Ubuntu 18.04
flask应用程序是这样启动的,
app.run(host="0.0.0.0", port=6600, debug=False)
Ajax 路由如下所示,
http://127.0.0.1:6600/land/tmidemo/data_rate?name=ResultBaseKeysV1
GCP 防火墙规则如下:
Name Type Targets Filters Protocols / ports Action Priority Network tmiserver-egress Egress Apply to all IP ranges: 0.0.0.0/0 tcp:6600 udp:6600 Allow 1000 default tmiserver-ingress Ingress Apply to all IP ranges: 0.0.0.0/0 tcp:6600 udp:6600 Allow 1000 default
docker容器是这样运行的,
docker run --net tminet --hostname=TEST -p 6600:6600 -v $(pwd):/app/public --name myserver --rm myserver
我没有使用 Bokeh 服务器。 AjaxDataSource() 调用指向 Flask 应用程序,而不是另一个( Bokeh )服务器
有很多有效的方法,
- 能够使用 GCP 外部 IP 地址并访问服务器
- 从一个网页到另一个网页可以正常工作,因此 Flask 路由可以正常工作
不工作的是使用 127.0.0.1
的 Ajax() 调用,尽管当我在本地计算机上运行容器时这确实有效。
我在检查窗口中看到的错误是ERR_CONNECTION_REFUSED
GCP 实例 hosts.conf
确实包含一行 127.0.0.1 localhost
我在 GCP VM 实例上尝试(来自 here ),结果相同,
iptables -A INPUT -i docker0 -j ACCEPT
我还尝试(从 here )将 Docker 运行网络更改为 --net="host"
,结果是相同的。
我还尝试将 --add-host localhost:127.0.0.1
添加到 Docker 运行命令中,结果相同。
我认为问题在于配置 GCP 以了解如何将请求路由到 127.0.0.1
,但我不知道在哪里检查、配置它,超出了我已经完成的操作。
最佳答案
我无法具体解决我遇到的问题,但我尝试了一种不同的方法来获取 AjaxDataSource()
的 URL,并且它有效,我认为有更好的方法...
我使用 Flask url_for()
函数创建一个指向 AjaxDataSource()
所需的路由的链接,并且这有效。生成的链接看起来像这样,
/land/tmidemo/data_rate/ResultBaseKeysV1
即,没有http://127.0.0.1
,这似乎在所有情况下都有效,包括我的开发环境和GCP。
我想我很久以前就尝试过这个,但没有成功,因为我到处都使用“flask”URL,但出于某种原因,我认为我需要“http://127.0.0.1”来处理 Ajax 内容。现在可以使用了......继续前进!
关于python - GCP 实例为 Ajax 127.0.0.1 路由返回 ERR_CONNECTION_REFUSED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55311175/