我如何让Flask在端口80上运行?

我有一个Flask服务器通过端口5000运行,它很好。我可以在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上运行,但有主网站域名以某种方式重定向?

645220 次浏览

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

如果这是为了开发,我只会让它保持在端口5000上。

如果是为了生产:

不推荐

  • 首先停止apache2;

不建议,因为它在文档中写道:

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

推荐

  • 代理HTTP流量通过apache2到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终止- web服务器将被优化为处理HTTPS请求,只需少量配置。不要在Python中“自己卷”,相比之下,这可能非常不安全。
  • 安全——向互联网开放端口需要仔细考虑安全问题。Flask的开发服务器不是为此而设计的,与为此目的而设计的web服务器相比,可能会有开放的bug或安全问题。请注意,配置糟糕的web服务器也可能是不安全的!
  • 静态文件处理-内置的Flask web服务器可以处理静态文件,但不建议这样做;Nginx/Apache在处理静态文件(如图像、CSS、Javascript文件)方面效率更高,并且只会传递“动态”请求(那些内容经常从数据库读取或内容更改的请求)来由Python代码处理。
  • +更多。这差不多是这个问题的范围了。如果你想了解更多信息,可以在这个领域做一些研究。

你不需要为你的应用程序更改端口号,只需配置你的www服务器(nginx或apache)代理查询flask端口。注意uWSGI

你的问题是,你有一个apache web服务器已经运行,已经使用端口80。所以,你可以:

  1. 杀死apache:你可能应该通过/etc/init.d/apache2 stop来完成,而不是简单地杀死它们。

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

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

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

对于外部可见的服务器,你不使用apache或其他web服务器,你只需要输入

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

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

使用以下方式修改端口或主机:

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

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

python app.py

而不是使用:

flask run

设置端口为app.run(port=80,debug=True) 当在dev

上时,应该将debug设置为true

如果你想让你的应用程序在相同的端口,即port=5000,那么在你的终端上运行这个命令:

fuser -k 5000/tcp

然后运行:

python app.py

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

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

最简单和最佳的解决方案

将.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。谢谢

一个方便的方法是使用包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

在我的场景中,以下步骤非常有效:

  • 安装包:

    pip install --upgrade pip
    pip install python-dotenv
    
  • Creating a hidden file in my app directory "flaskr/.flaskenv"

  • Adding the following content:

    FLASK_APP=flaskr
    FLASK_RUN_HOST=localhost
    FLASK_RUN_PORT=8000
    
  • Finally, run the flask command one more time:

    flask run
    
  • The version which I am working on is:

    pip freeze |grep -i flask
    Flask==1.1.1
    

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

在文件app.py中,使用:

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

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

sudo python3 app.py

您可以很容易地禁用端口80上运行的任何进程,然后运行此命令

flask run --host 0.0.0.0 --port 80

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

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

我解了2次,用了2个解

第一个解决方案,遵循以下步骤:

1打开CMD

2在cmd下运行ipconfig

3从cmd复制IPv4地址

4在下一步中使用IPv4作为本地主机:

app.run(debug=True, port=5000, host='localhost')

用IPv4地址替换localhost

5为你的前端,做同样的步骤4:

在'http://localhost:5000/auth'替换'localhost'与您的IPv4地址

注意:使用相同的端口{前端,后端}

6同时运行你的两个项目(后端和前端)


第二次,最后一个解决方案没有成功,我用这个解决了它:

  • 在移动端,我使用的URL: "http://10.0.2.2:8000"弗拉斯克那边也用了

app.run(debug=True, port=8000, host='localhost')