ChatGPT解决这个技术问题 Extra ChatGPT

如何让 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 上运行,但主网站域以某种方式重定向?

您可以使用它flask with apache
问题的标题与问题不符。也许它应该读作“如何不让其他东西在端口 80 上运行”。我很好奇如何更改正在运行的端口烧瓶,这是这个问题所要求的,但从未提及如何在这里
对于任何在所提供的答案中难以到达任何地方的人,请查看使用 authbindthis related answer

A
Amir Mofakhar

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

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

它不适合我。它应该是:烧瓶运行 --host=0.0.0.0
@jOSe 我尝试在 Ubuntu 上使用 PyCharm,效果很好。
linux 运行不需要@jOSe Apache,您可以卸载它,或者更改它的端口。
请务必注意,使用它您不再运行 flask run,而是运行 python name_of_the_file.py,如@muca 的回答中所述
P
Paul Rooney

对于不使用 apache 或其他 Web 服务器的外部可见服务器,您只需键入

flask run --host=0.0.0.0 --port=80

这个命令可以使用环境变量运行吗?我一直在我的 Dockerfile 中尝试 CMD flask run --host=0.0.0.0 --port=$PORT(出于 heroku 的原因),并且我不断收到关于我的端口需要整数的错误
这在我的本地(笔记本电脑)上运行良好,但是当我在我的 AWS EC2 实例上使用它时,它显示“Permission Denied”。如果我在开头添加“sudo”,它会说“flask”命令无法识别......
@user3768495 也许烧瓶没有安装在 root (sudo) 用户中
嗨@Harun-Ur-Rashid,可能就是这种情况 - 我将它安装在虚拟环境中。我会看看如何修复它。感谢您的回复。
E
Ewan

所以它会抛出该错误消息,因为您有 apache2 在端口 80 上运行。

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

如果它用于生产:

不建议

先停止apache2;

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

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

推荐的

通过 apache2 代理 HTTP 流量到 Flask。

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

Here's a link 查看有关使用 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 代码处理的“动态”请求(通常从数据库读取内容或内容更改的请求)。

+更多。这接近于这个问题的范围。如果您想了解更多信息,请对该领域进行一些研究。


这确实是一个很好的答案!你能用简单的英语来揭开你使用“Proxy HTTP traffic to Flask through apache2”和“reverse proxy for dynamic content”的高度技术术语的神秘面纱吗?
@Djack - 更新了答案,但它与问题的范围接壤,因此请在线搜索以获取更多信息。
m
muca

如果您使用以下内容更改端口或主机:

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

使用以下代码启动服务器(我的flask主入口是app.py):

python app.py

而不是使用:

flask run

j
jorop

一个方便的方法是使用包 python-dotenv:它读出一个 .flaskenv 文件,您可以在其中存储烧瓶的环境变量。

点安装 python-dotenv

在应用程序的根目录中创建一个文件 .flaskenv

在您指定的文件中:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80

之后,您只需使用 flask run 运行您的应用程序,并可以在该端口访问您的应用程序。

请注意,FLASK_RUN_HOST 默认为 127.0.0.1FLASK_RUN_PORT 默认为 5000


I
Ibrahim

这是在 Ubuntu-18 上对我有用的唯一解决方案。

在文件 app.py 中,使用:

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

上面的代码将给出相同的权限错误,除非使用 sudo 运行它:

sudo python3 app.py

d
dejanualex

您可以轻松禁用在端口 80 上运行的任何进程,然后运行此命令

flask run --host 0.0.0.0 --port 80

或者如果你更喜欢在 .py 文件中运行它

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

P
Pika Supports Ukraine

如果您希望您的应用程序在同一端口上,即 port=5000,那么只需在您的终端中运行以下命令:

fuser -k 5000/tcp

然后运行:

python app.py

如果你想在指定的端口上运行,例如如果你想在 port=80 上运行,在你的主文件中只需要提到这个:

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

C
Cathal Cronin

我必须在我的环境中将 FLASK_RUN_PORT 设置为指定的端口号。下次启动应用程序时,Flask 将使用您选择的端口号加载该环境变量。


K
Kevin

在我的场景中,以下步骤就像一个魅力:

安装包: pip install --upgrade pip pip install python-dotenv

在我的应用程序目录“flaskr/.flaskenv”中创建一个隐藏文件

添加如下内容: FLASK_APP=flaskr FLASK_RUN_HOST=localhost FLASK_RUN_PORT=8000

最后,再运行一次flask命令:flask run

我正在研究的版本是: pip freeze |grep -i flask Flask==1.1.1


s
sebastian

您的问题是,您已经运行了一个 apache 网络服务器,该服务器已经在使用端口 80。因此,您可以:

杀死 apache:您可能应该通过 /etc/init.d/apache2 stop 来执行此操作,而不是简单地杀死它们。正如 apache 中的 flask 所描述的那样,在您的 apache 进程中部署您的烧瓶应用程序。


g
greg

您无需更改应用程序的端口号,只需配置您的 www 服务器(nginx 或 apache)以将查询代理到烧瓶端口。请注意 uWSGI


v
valentine

使用 app.run(port=80,debug=True) 设置端口,您应该在开发时将调试设置为 true


T
Talha Junaid

最简单和最好的解决方案

将 .py 文件保存在文件夹中。这种情况下我的文件夹名称是 test。在命令提示符下运行以下

c:\test> set FLASK_APP=application.py
c:\test> set FLASK_RUN_PORT=8000
c:\test> flask run

----------------- 以下将被退回----------------

 * Serving Flask app "application.py"
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
127.0.0.1 - - [23/Aug/2019 09:40:04] "[37mGET / HTTP/1.1[0m" 200 -
127.0.0.1 - - [23/Aug/2019 09:40:04] "[33mGET /favicon.ico HTTP/1.1[0m" 404 -

现在在您的浏览器上输入:http://127.0.0.1:8000。谢谢


他需要在 80 上运行它,这是一个特殊的端口。他需要先停止其他事情。