我有一个通过端口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 :(得分: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服务器有一些优点;
答案 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。因此,您可以:
杀死apache:您应该通过/etc/init.d/apache2 stop
执行此操作,而不是简单地将其删除。
在您的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.1
,FLASK_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