如何让 Flask 运行在 80 端口?

340

我有一个运行在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端口上运行,但主要网站域重定向?


1
你可以使用 flask with apache - Syed Habib M
5
问题的标题与问题不符。也许应该改为“如何避免其他东西在端口80上运行”。我想知道如何更改Flask运行的端口,这就是这个问题所问的,但在这里没有提到如何做到这一点。 - Elliot Woods
对于那些在使用提供的答案时遇到困难的人,请查看这个相关答案,它使用了authbind - dmn
15个回答

574

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

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

3
对我来说不起作用。正确的应该是:flask run --host=0.0.0.0 - Harun-Ur-Rashid
2
@jOSe 我在Ubuntu上尝试使用PyCharm,运行得非常好。 - Bugs Buggy
@jOSe Linux运行时不需要Apache,你可以卸载它或更改它的端口。 - nurettin
1
需要注意的是,使用此方法时不再运行flask run,而是像@muca的答案中提到的那样运行python name_of_the_file.py - nck
@nck非常重要的提示。如果您想使用flask run,则需要将端口作为参数使用flask run -p 80flask run --port 80,如@Harun-Ur-Rashid所示的答案。 - MichaelHuelsen
这在任何Linux系统上都行不通,因为端口80需要root权限。 - undefined

257
对于外部可见的服务器,如果你不使用 Apache 或其他 Web 服务器,只需输入以下内容:
flask run --host=0.0.0.0 --port=80

这个命令能否使用环境变量运行?我一直在尝试在我的Dockerfile中使用CMD flask run --host=0.0.0.0 --port=$PORT(出于Heroku的原因),但是我一直收到有关需要整数端口的错误。 - Smokin Joe
这在我的本地(笔记本电脑)上运行良好,但当我在AWS EC2实例上使用时,它显示“权限被拒绝”。如果我在开头添加“sudo”,则会显示“未识别flask命令”... - user3768495
1
@user3768495 或许 Flask 没有在 root (sudo) 用户中安装。 - Harun-Ur-Rashid
2
嗨@Harun-Ur-Rashid,那很可能是这种情况-我将其安装在虚拟环境中。我会查看如何修复它。感谢您的回复。 - user3768495

101

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

如果这是为开发而做的,我建议将其保留在端口5000上。

如果用于生产,则:

不推荐

  • 首先停止apache2

正如文档中所述的那样,不推荐使用内置服务器:

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

推荐

  • 通过apache2代理HTTP流量到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终止 - 网络服务器将进行优化,以仅需少量配置即可处理HTTPS请求。不要在Python中“自己动手”,这可能与其他方案相比非常不安全。
  • 安全性 - 向互联网开放端口需要仔细考虑安全性。Flask的开发服务器并非为此而设计,与专门为此目的设计的网络服务器相比,可能存在漏洞或安全问题。请注意,配置不良的网络服务器也可能不安全!
  • 静态文件处理 - Flask内置的网络服务器可以处理静态文件,但不建议这样做;Nginx / Apache更有效地处理静态文件(例如图像、CSS、Javascript文件),并且只会将“动态”请求(那些内容通常从数据库读取或内容改变)传递给Python代码处理。
  • +更多。这已经超出了此问题的范围。如果您想获得更多信息,请研究此领域。

这确实是一个很好的答案!您能用简单易懂的英语解释一下您使用的高度技术性术语“通过apache2代理HTTP流量到Flask”和“动态内容的反向代理”吗? - John Strood
2
@Djack - 已更新答案,但它已经接近问题的范围,因此请在网上搜索更多信息。 - Ewan

45

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

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

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

python app.py

改用:

flask run

权限被拒绝。 - Gaurav Hazra
@GauravHazra 端口80是特权端口(以及所有小于1024的端口),这意味着你需要以超级用户身份运行它:sudo python app.py - calvin

40

一种方便的方法是使用包python-dotenv

它可以读取.flaskenv文件,您可以在其中存储Flask的环境变量。

  • pip install 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


32

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

在文件 app.py 内部,使用:

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

除非使用sudo运行,否则上述代码将会产生相同的权限错误:

sudo python3 app.py

23

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

flask run --host 0.0.0.0 --port 80

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

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

13

如果您希望应用程序位于同一端口(即端口=5000),则只需在终端中运行以下命令:

fuser -k 5000/tcp

然后运行:

python app.py

如果您想在指定的端口上运行,例如如果您想在端口80上运行,请在您的主文件中提到这一点:

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

13

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


12

在我的情况下,以下步骤非常有效:

  • 安装软件包:

  • 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
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接