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


212

我有一个通过端口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上运行,但是使主网站域以某种方式重定向?



3
问题的标题与问题不符。也许应该读为“如何不让其他东西在端口80上运行”。我很好奇如何更改正在运行的端口烧瓶,这是这个问题的要问,但从未提及过如何这样做
Elliot Woods

Answers:


76

因此,由于您已经apache2在端口80上运行,因此抛出了该错误消息。

如果这是为了开发,我将其保留在端口5000上。

如果用于生产:

不建议

  • apache2先停下来

不建议使用,因为它在文档中指出:

您可以在开发过程中使用内置服务器,但应该对生产应用程序使用完整的部署选项。(请勿在生产中使用内置的开发服务器。)

推荐的

  • 代理 HTTP通过apache2访问Flask。

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

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

编辑1-澄清@Djack

通过apache2到Flask的代理HTTP流量

当请求通过端口80(HTTP)或端口443(HTTPS)到达服务器时,类似Apache或Nginx的Web服务器将处理请求的连接并确定如何处理该请求。在我们的情况下,应该将收到的请求配置为通过WSGI协议传递给Flask并由Python代码处理。这是“动态”部分。

动态内容的反向代理

像上面那样配置Web服务器有一些好处;

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

确实,这是一个很好的答案!您能用简单的英语去神秘化您使用“ Proxy HTTP traffic to Flask through apache2”和“ reverse proxy for dynamic content”的技术术语吗?
约翰·斯特罗德

2
@Djack-更新的答案,但是它在问题范围内,因此请在线进行搜索以获取更多信息。
伊万

1
感谢您提供关键字。我一定会进行在线搜索。
John Strood

419

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

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

1
工作正常,仅在Windows环境中有效。当apache不在时.. :)
jOSe

1
它对我不起作用。应该是:flask run --host = 0.0.0.0
Harun-Ur-Rashid

1
我尝试在Ubuntu上使用PyCharm的@jOSe正常工作。
Bugs Buggy

@jOSe Apache不需要linux即可运行,您可以将其卸载或更改其端口。
nurettin

145

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

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

可以使用env vars运行此命令吗?我一直CMD flask run --host=0.0.0.0 --port=$PORT在Dockerfile中尝试(出于heroku的原因),并且不断收到关于需要整数作为端口的错误
Smokin Joe

这在我的本地(笔记本电脑)上运行良好,但是当我在AWS EC2实例上使用它时,它显示“ Permission Denied”。如果我在开头添加“ sudo”,则说“ flask”命令无法识别...
user3768495

1
@ user3768495也许未在root(sudo)用户中安装烧瓶
Harun-Ur-Rashid

2
嗨@ Harun-Ur-Rashid,可能是这种情况-我将其安装在虚拟环境中。我将检查如何解决。感谢您的回复。
user3768495

22

如果使用以下命令更改端口或主机:

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

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

python app.py

而不是使用:

flask run

10

如果要将应用程序放在相同的端口(即port = 5000)上,则只需在终端中运行以下命令:

fuser -k 5000/tcp

然后运行:

python app.py

如果要在指定端口上运行,例如,如果要在port = 80上运行,请在主文件中提及:

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

8

一种方便的方式是使用软件包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


8

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

在文件中app.py,使用:

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

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

sudo python3 app.py

6

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

  1. 杀死apache:您可能应该通过这样做/etc/init.d/apache2 stop,而不是简单地杀死它们。

  2. 如apache中的flask所述,在apache进程中部署flask应用程序。


5

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


3

您无需更改应用程序的端口号,只需配置www服务器(nginx或apache)即可将查询代理到flask端口。支付的减免费用uWSGI


3

设置端口,app.run(port=80,debug=True) 在开发时应将debug设置为true


2

最简单,最好的解决方案

将.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这是一个特殊的端口上运行它。他需要先停止其他事情。
Ahmedn1

1

在我的方案中,以下步骤非常有用:

  • 安装软件包:

    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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.