如何让Flask在80端口运行?

qua*_*mor 176 python port networking flask

我有一个通过端口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
Run Code Online (Sandbox Code Playgroud)

运行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)
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Ami*_*har 375

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

if __name__ == '__main__':
      app.run(host='0.0.0.0', port=80)
Run Code Online (Sandbox Code Playgroud)

  • 它不适合我。应该是:flask run --host=0.0.0.0 (3认同)
  • @jOSe 我尝试在 Ubuntu 上使用 PyCharm,效果很好。 (2认同)

Har*_*hid 120

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

flask run --host=0.0.0.0 --port=80
Run Code Online (Sandbox Code Playgroud)

  • 嗨@Harun-Ur-Rashid,可能是这种情况 - 我将它安装在虚拟环境中。我会看看如何修复它。感谢您的回复。 (2认同)

Ewa*_*wan 61

因此,它会抛出该错误消息,因为您已apache2在端口80上运行.

如果这是用于开发,我会将其保留在端口5000上.

如果它是用于生产:

不建议

  • apache2先停下来;

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

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

推荐的

  • 代理HTTP流量通过apache2Flask.

这样,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中"滚动你自己",相比之下,这可能是非常不安全的.
  • 安全性 - 打开互联网端口需要仔细考虑安全性.Flask的开发服务器不是为此而设计的,与为此目的而设计的Web服务器相比,可能存在开放性错误或安全问题.请注意,配置错误的Web服务器也可能不安全!
  • 静态文件处理 - 内置Flask Web服务器可以处理静态文件,但不建议这样做; Nginx/Apache在处理静态文件(如图像,CSS,Javascript文件)方面效率更高,并且只会传递"动态"请求(通常从数据库中读取内容或内容更改的请求)以由Python代码处理.
  • +更多.这与这个问题的范围接近.如果您想了解更多信息,请对此领域进行一些研究.

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

Ibr*_*him 27

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

在文件中app.py,使用:

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)
Run Code Online (Sandbox Code Playgroud)

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

sudo python3 app.py
Run Code Online (Sandbox Code Playgroud)


小智 24

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

  • pip install python-dotenv
  • .flaskenv在您的应用程序的根目录中创建一个文件

在您指定的文件中:

FLASK_APP=application.py
FLASK_RUN_HOST=localhost
FLASK_RUN_PORT=80
Run Code Online (Sandbox Code Playgroud)

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

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


小智 16

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

if __name__ == '__main__':
  app.run(host='0.0.0.0', port=80)
Run Code Online (Sandbox Code Playgroud)

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

python app.py
Run Code Online (Sandbox Code Playgroud)

而不是使用:

flask run
Run Code Online (Sandbox Code Playgroud)


小智 10

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

flask run --host 0.0.0.0 --port 80
Run Code Online (Sandbox Code Playgroud)

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

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)
Run Code Online (Sandbox Code Playgroud)


小智 8

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

fuser -k 5000/tcp
Run Code Online (Sandbox Code Playgroud)

然后运行:

python app.py
Run Code Online (Sandbox Code Playgroud)

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

if __name__ == '__main__':  
    app.run(host='0.0.0.0', port=80)
Run Code Online (Sandbox Code Playgroud)


Man*_*azo 8

On my scenario the following steps worked like a charm:


gre*_*reg 7

您不需要更改应用程序的端口号,只需配置您的 www 服务器(nginx 或 apache)来代理对 Flask 端口的查询。关注uWSGI.


seb*_*ian 6

您的问题是,您已经运行了已经在使用端口80的apache webserver.因此,您可以:

  1. 杀死阿帕奇:你应该这样做/etc/init.d/apache2 stop,而不是简单地杀死他们.

  2. 在apache过程中部署烧瓶应用程序,如apache中的烧瓶所述.


Cat*_*nin 5

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


val*_*ine 5

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