如何让 Flask 在端口 80 上运行?
- 2025-03-12 08:55:00
- admin 原创
- 15
问题描述:
我有一个通过端口 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 上运行,但以某种方式重定向主网站域名?
解决方案 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:
因此,它会抛出该错误消息,因为您apache2
在端口 80 上运行。
如果这是为了开发,我会将其保留在端口 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 服务器相比,它可能存在漏洞或安全问题。请注意,配置不当的 Web 服务器也可能不安全!
静态文件处理 - 内置 Flask Web 服务器可以处理静态文件,但是不建议这样做;Nginx/Apache 在处理静态文件(如图像、CSS、Javascript 文件)方面效率更高,并且只会传递“动态”请求(通常从数据库读取内容或内容发生变化的请求)给 Python 代码处理。
+更多。这超出了这个问题的范围。如果你想了解更多信息,请对这个领域进行一些研究。
解决方案 4:
如果使用以下命令更改端口或主机:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
使用如下代码启动服务器(我的flask主入口是app.py):
python app.py
而不是使用:
flask run
解决方案 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 上运行的任何进程,然后运行此命令
flask run --host 0.0.0.0 --port 80
或者如果你更喜欢在 .py 文件中运行它
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
解决方案 8:
如果您希望您的应用程序在同一端口上,即 port=5000,那么只需在您的终端运行以下命令:
fuser -k 5000/tcp
然后运行:
python app.py
如果您想在指定端口上运行,例如如果您想在端口 = 80 上运行,则在主文件中只需提及以下内容:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
解决方案 9:
我必须FLASK_RUN_PORT
在我的环境中设置指定的端口号。下次启动应用程序时,Flask 将使用您选择的端口号加载该环境变量。
解决方案 10:
在我的场景中,以下步骤非常有效:
安装软件包:
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
解决方案 11:
您的问题是,您有一个已在运行的 apache 网络服务器,并且该服务器已在使用端口 80。因此,您可以:
杀死 Apache:您可能应该通过来执行此操作
/etc/init.d/apache2 stop
,而不是简单地杀死它们。在你的 apache 进程中部署你的 flask 应用程序,正如apache 中的 flask 所描述的。
解决方案 12:
您不需要更改应用程序的端口号,只需配置您的 www 服务器(nginx 或 apache)以将查询代理到 flask 端口即可。请注意uWSGI
。
解决方案 13:
设置端口app.run(port=80,debug=True)
时,应在 dev 上将 debug 设置为 true
解决方案 14:
最简单、最好的解决方案
将 .py 文件保存到文件夹中。本例中我的文件夹名称为 test。在命令提示符中运行以下命令
c: est> set FLASK_APP=application.py
c: est> set FLASK_RUN_PORT=8000
c: est> 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。谢谢
解决方案 15:
我解决了2次,并用2个解决方案解决了
第一个解决方法,步骤如下:
1 打开cmd
2ipconfig
在cmd下运行
3 从 cmd 复制 IPv4 地址
4 在下一步中使用您的 IPv4 作为本地主机:
app.run(debug=True, port=5000, host='localhost')
将“localhost”替换为您的 IPv4 地址
5 对于您的前端,执行与步骤 4 相同的操作,例如:
在 'http://localhost:5000/auth' 中将 'localhost' 替换为您的 IPv4 地址
注意:{前端和后端} 使用相同的端口
6 同时运行两个项目(后端和前端)
第二次,最后一个解决方案不起作用,我用这个解决了:
在移动端我使用了该 URL:“http://10.0.2.2:8000”,在 Flask 端使用了
app.run(debug=True, port=8000, host='localhost')