Gevent/Flask 应用程序未在 Windows 2012 R2 上监听外部 IP

Gevent/Flask 应用程序未在 Windows 2012 R2 上监听外部 IP

Windows 2012R2 服务器唯一安装的功能是监听端口 80 的 IIS。

我有一个 GEvent/Flask 应用程序,它在 5000 上侦听入站 TCP 连接(并公开 REST API),但无法弄清楚为什么入站连接未路由到该应用程序。这是我检查过的内容:

  1. 应用程序已启动并监听端口 5000
  2. 入站端口规则配置为允许端口 5000 上的所有入站 TCP 流量。我或多或少排除了这个问题,因为配置与其他正确路由的端口相同,并且即使防火墙完全禁用,下面概述的步骤也会失败。
  3. DNS 已正确配置,远程访问工作正常,并且 IIS 服务器在 DNS 名称定位时响应端口 80 上的 Web 请求
  4. 与网络人员确认服务器前没有防火墙或过滤

以下来自 Internet Explorer 的测试证明了该问题:

  1. 服务器上运行 IE,连接到'http://localhost'。成功访问 IIS
  2. 服务器上运行 IE,连接到'http://localhost:5000'。成功访问应用程序
  3. IE 在服务器上运行,连接到'http://servername:5000'显示“无法显示页面”。失败
  4. IE 在远程机器上运行,连接到'http://servername'。成功访问 IIS。
  5. IE 在远程机器上运行,连接到'http://servername:5000'显示“无法显示页面。”失败。

我不知道下一步该检查什么,有什么建议可以阻止到端口 5000 的流量吗?

谢谢伊恩

答案1

要处理传入的 TCP/IP 流量,必须在 Windows 防火墙上打开 TCP/UDP 端口。但这只是第一步。之后,应用程序必须将自身挂接到该端口并设置绑定以处理传入数据包。

在您的特定情况下,HTTP 数据包http://servername:5000被拒绝,不是因为防火墙,而是因为您的应用程序没有在端口 5000 设置适当的绑定。请求有效http://localhost:5000,因此我们可以假设它的绑定实际上localhost:5000仅处于开启状态,因此只能处理本地主机流量。

要解决这个问题,您有几种选择,

  • 修改您的应用程序以绑定到*:5000(或+:5000),
  • 或者设置一个反向代理(如 nginx)来桥接外部流量localhost:5000(事实上,这就是为什么许多框架默认只接受本地主机流量,因为他们希望开发人员在前面设置一个反向代理)。

答案2

进一步回答 Lex Li 的问题,在这种特定情况下,GEvent 包被选为 Flask 应用程序的生产部署选项,与给出的 Flask 生产部署选项一致这里

选择此配置是为了避免成熟的 Web 服务器(例如 IIS 或反向代理)的复杂性。

Flask 文档给出了使用 GEvent 部署应用程序的以下示例:

from gevent.pywsgi import WSGIServer
from yourapplication import app

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

没有明确记录的问题是,尽管在生产部署部分下列出了该配置,但它仍然只绑定到本地主机。

对示例代码进行以下修改可使应用程序正确绑定到端口 5000 上的外部 IP 地址:

from gevent.pywsgi import WSGIServer
from yourapplication import app

http_server = WSGIServer(('0.0.0.0', 5000), app)
http_server.serve_forever()

相关内容