问题:如何使Flask在端口80上运行?
我有一个通过端口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上运行,但是使主网站域以某种方式重定向?
回答 0
因此,由于您已经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代码处理。
- +更多。这接近于该问题的范围。如果您想了解更多信息,请对该领域进行一些研究。
回答 1
1-停止使用端口80的其他应用程序。2-使用端口80运行应用程序:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
回答 2
对于外部可见的服务器,您不使用apache或其他Web服务器,只需键入
flask run --host=0.0.0.0 --port=80
回答 3
如果使用以下命令更改端口或主机:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
使用以下代码启动服务器(我的flask的主入口是app.py):
python app.py
而不是使用:
flask run
回答 4
如果要将应用程序放在相同的端口(即port = 5000)上,则只需在终端中运行以下命令:
fuser -k 5000/tcp
然后运行:
python app.py
如果要在指定端口上运行,例如,如果要在port = 80上运行,请在主文件中提及:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
回答 5
一种方便的方式是使用软件包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.1
,FLASK_RUN_PORT
默认为5000
。
回答 6
这是在Ubuntu-18上对我有用的唯一解决方案。
在文件中app.py
,使用:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
除非sudo
用于运行它,否则上面的代码将给出相同的权限错误:
sudo python3 app.py
回答 7
您的问题是,已经有一个正在使用端口80的apache网络服务器正在运行。因此,您可以:
杀死apache:您可能应该通过这样做
/etc/init.d/apache2 stop
,而不是简单地杀死它们。如apache中的flask所述,在apache进程中部署flask应用程序。
回答 8
我必须FLASK_RUN_PORT
在我的环境中将其设置为指定的端口号。下次启动应用程序时,Flask将使用您选择的端口号加载该环境变量。
回答 9
您无需更改应用程序的端口号,只需配置www服务器(nginx或apache)即可将查询代理到flask端口。支付的减免费用uWSGI
。
回答 10
设置端口,app.run(port=80,debug=True)
在开发时应将debug设置为true
回答 11
最简单,最好的解决方案
将.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。谢谢
回答 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