Windows 2012R2 服务器唯一安装的功能是监听端口 80 的 IIS。
我有一个 GEvent/Flask 应用程序,它在 5000 上侦听入站 TCP 连接(并公开 REST API),但无法弄清楚为什么入站连接未路由到该应用程序。这是我检查过的内容:
- 应用程序已启动并监听端口 5000
- 入站端口规则配置为允许端口 5000 上的所有入站 TCP 流量。我或多或少排除了这个问题,因为配置与其他正确路由的端口相同,并且即使防火墙完全禁用,下面概述的步骤也会失败。
- DNS 已正确配置,远程访问工作正常,并且 IIS 服务器在 DNS 名称定位时响应端口 80 上的 Web 请求
- 与网络人员确认服务器前没有防火墙或过滤
以下来自 Internet Explorer 的测试证明了该问题:
- 服务器上运行 IE,连接到
'http://localhost'
。成功访问 IIS - 服务器上运行 IE,连接到
'http://localhost:5000'
。成功访问应用程序 - IE 在服务器上运行,连接到
'http://servername:5000'
显示“无法显示页面”。失败 - IE 在远程机器上运行,连接到
'http://servername'
。成功访问 IIS。 - 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()