我有一个通过端口 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 上运行,但主网站域以某种方式重定向?
authbind
的 this related answer。
1- 停止使用端口 80 的其他应用程序。 2- 使用端口 80 运行应用程序:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
对于不使用 apache 或其他 Web 服务器的外部可见服务器,您只需键入
flask run --host=0.0.0.0 --port=80
CMD flask run --host=0.0.0.0 --port=$PORT
(出于 heroku 的原因),并且我不断收到关于我的端口需要整数的错误
所以它会抛出该错误消息,因为您有 apache2
在端口 80 上运行。
如果这是为了开发,我会把它留在端口 5000 上。
如果它用于生产:
不建议
先停止apache2;
不推荐,因为它在文档中说明:
您可以在开发期间使用内置服务器,但您应该为生产应用程序使用完整的部署选项。 (不要在生产中使用内置的开发服务器。)
推荐的
通过 apache2 代理 HTTP 流量到 Flask。
这样,apache2
可以处理您的所有静态文件(它非常擅长 - 比 Flask 中内置的调试服务器要好得多)并充当动态内容的反向代理,将这些请求传递给 Flask。
Here's a link 查看有关使用 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 代码处理的“动态”请求(通常从数据库读取内容或内容更改的请求)。
+更多。这接近于这个问题的范围。如果您想了解更多信息,请对该领域进行一些研究。
Proxy HTTP traffic to Flask through apache2
”和“reverse proxy for dynamic content
”的高度技术术语的神秘面纱吗?
如果您使用以下内容更改端口或主机:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
使用以下代码启动服务器(我的flask主入口是app.py):
python app.py
而不是使用:
flask run
一个方便的方法是使用包 python-dotenv
:它读出一个 .flaskenv
文件,您可以在其中存储烧瓶的环境变量。
点安装 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
。
这是在 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)
如果您希望您的应用程序在同一端口上,即 port=5000,那么只需在您的终端中运行以下命令:
fuser -k 5000/tcp
然后运行:
python app.py
如果你想在指定的端口上运行,例如如果你想在 port=80 上运行,在你的主文件中只需要提到这个:
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
我必须在我的环境中将 FLASK_RUN_PORT
设置为指定的端口号。下次启动应用程序时,Flask 将使用您选择的端口号加载该环境变量。
在我的场景中,以下步骤就像一个魅力:
安装包: 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
您的问题是,您已经运行了一个 apache 网络服务器,该服务器已经在使用端口 80。因此,您可以:
杀死 apache:您可能应该通过 /etc/init.d/apache2 stop 来执行此操作,而不是简单地杀死它们。正如 apache 中的 flask 所描述的那样,在您的 apache 进程中部署您的烧瓶应用程序。
您无需更改应用程序的端口号,只需配置您的 www 服务器(nginx 或 apache)以将查询代理到烧瓶端口。请注意 uWSGI
。
使用 app.run(port=80,debug=True)
设置端口,您应该在开发时将调试设置为 true
最简单和最好的解决方案
将 .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。谢谢
flask run
,而是运行python name_of_the_file.py
,如@muca 的回答中所述