如何让 Flask 在端口 80 上运行?

新手上路,请多包涵

我有一个通过端口 5000 运行的 Flask 服务器,这很好。我可以在 http://example.com:5000 访问它

但是可以在 http://example.com 上简单地访问它吗?我假设这意味着我必须将端口从 5000 更改为 80。但是当我在 Flask 上尝试时,我在运行它时收到此错误消息。

 Traceback (most recent call last):
  File "xxxxxx.py", line 31, in <module>
app.run(host="0.0.0.0", port=int("80"), debug=True)
   File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 772, in run
run_simple(host, port, self, **options)
  File "/usr/local/lib/python2.6/dist-packages/werkzeug/serving.py", line 706, in run_simple
    test_socket.bind((hostname, port))
  File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use

运行 lsof -i :80 返回

COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
apache2   467     root    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2  4413 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14346 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14570 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14571 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)
apache2 14573 www-data    3u  IPv4 92108840      0t0  TCP *:www (LISTEN)

我需要先杀死这些进程吗?那安全吗?还是有另一种方法可以让 Flask 在端口 5000 上运行,但主网站域以某种方式重定向?

原文由 quantumtremor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

所以它抛出了那个错误消息,因为你有 apache2 在端口 80 上运行。

如果这是为了开发,我会把它留在端口 5000 上。

如果它用于生产:

不建议

  • 先停止 apache2

不推荐,因为它在文档中说明:

您可以在开发期间使用内置服务器,但您应该为生产应用程序使用完整的部署选项。 (不要在生产中使用内置的开发服务器。)

推荐的

  • 代理 HTTP 流量通过 apache2 到 Flask。

这样, apache2 可以处理所有静态文件(它非常擅长 - 比 Flask 内置的调试服务器要好得多)并充当动态内容的反向代理,将这些请求传递给 Flask。

这是有关使用 Apache + mod_wsgi 设置 Flask 的官方文档的链接

编辑 1 - 澄清@Djack

通过 apache2 代理 HTTP 流量到 Flask

当请求通过端口 80 ( HTTP ) 或端口 443 ( HTTPS ) 到达服务器时,像 Apache 或 Nginx 这样的 Web 服务器会处理请求的连接并确定要做什么用它。在我们的例子中,接收到的请求应该被配置为通过 WSGI 协议传递给 Flask 并由 Python 代码处理。这是“动态”部分。

动态内容的反向代理

像上面这样配置 Web 服务器有几个优点;

  • SSL 终止 - Web 服务器将经过优化,只需少量配置即可处理 HTTPS 请求。不要在 Python 中“自己动手”,相比之下这可能非常不安全。
  • 安全性——打开一个互联网端口需要仔细考虑安全性。 Flask 的开发服务器不是为此而设计的,与为此目的设计的 Web 服务器相比,它可能存在开放的错误或安全问题。请注意,配置不当的 Web 服务器也可能不安全!
  • 静态文件处理 - 内置 Flask Web 服务器可以处理静态文件,但不推荐这样做; Nginx/Apache 在处理静态文件(如图像、CSS、Javascript 文件)方面效率更高,并且只会传递由 Python 代码处理的“动态”请求(通常从数据库中读取内容或内容更改的请求)。
  • +更多。这接近于这个问题的范围。如果您想了解更多信息,请对该领域进行一些研究。

原文由 Ewan 发布,翻译遵循 CC BY-SA 3.0 许可协议

1- 停止使用端口 80 的其他应用程序。2- 使用端口 80 运行应用程序:

 if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)

原文由 Amir Mofakhar 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题