如何让Flask在80端口运行?

时间:2013-11-26 09:22:47

标签: python networking flask port

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

15 个答案:

答案 0 :(得分:332)

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

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

答案 1 :(得分:95)

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

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

答案 2 :(得分:57)

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

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

如果是生产:

不推荐

  • 先停止apache2;

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

  

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

<强>推荐

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

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

Here's a link到关于使用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代码处理。
  • +更多。这与这个问题的范围接近。如果您想了解更多信息,请对此领域进行一些研究。

答案 3 :(得分:19)

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

在文件app.py中,使用:

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

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

sudo python3 app.py

答案 4 :(得分:12)

如果您使用以下方法更改端口或主机:

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

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

python app.py

代替使用:

flask run

答案 5 :(得分:6)

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

  1. 杀死apache:您应该通过/etc/init.d/apache2 stop执行此操作,而不是简单地将其删除。

  2. 在您的apache过程中部署您的烧瓶应用,如flask in apache所述。

答案 6 :(得分:6)

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

flask run --host 0.0.0.0 --port 80

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

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

答案 7 :(得分:5)

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

fuser -k 5000/tcp

然后运行:

python app.py

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

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

答案 8 :(得分:4)

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

  • 安装软件包:

    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
    

答案 9 :(得分:3)

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

答案 10 :(得分:3)

使用getElemenetById设置端口 在开发人员时应该将debug设置为true

答案 11 :(得分:3)

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

答案 12 :(得分:2)

我必须在环境中将FLASK_RUN_PORT设置为指定的端口号。当我启动应用程序时,它拾取了我想要的端口。

答案 13 :(得分: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。谢谢

答案 14 :(得分:0)

我无法在80上启动我的应用程序,它只能在5000上启动。我看不到Apache在运行吗?我还能检查什么?我们想在80上运行,因此可以使用不指定端口的url。

.else