我有一台通过端口5000运行的Flask服务器,这没问题.我可以拨打http://example.com:5000访问它.

但是,有没有可能只在http://example.com的时候访问它呢?我想这意味着我必须将端口从5000更改为80.但当我在Flask上try 时,我运行它时会收到这个错误消息.

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上运行,但让主网站域以某种方式重定向?

推荐答案

所以它会抛出错误消息,因为端口80上有apache2个正在运行.

如果这是为了发展,我会把它留在5000号港口.

如果是为了生产:

Not Recommended

  • 先停apache2

如文档中所述,不建议执行以下操作:

您可以在开发过程中使用内置服务器,但应该为生产应用程序使用完整部署选项.(不要在生产中使用内置开发服务器.)

Recommended

  • 代理HTTP通过apache2到Flask的流量.

这样,apache2就可以处理所有的静电文件(它非常擅长这一点--比Flask内置的调试服务器好得多),并充当动态内容的反向代理,将这些请求传递给Flask.

Here's a link到有关使用Apache+mod_wsgi设置Flask的官方文档.

Edit 1 - Clarification for @Djack

通过apache2向Flask发送代理HTTP流量

当请求到达端口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代码处理.
  • +更多.这接近于这个问题的范围.如果你想了解更多信息,可以在这方面做一些研究.

Python相关问答推荐

Pandas或pyspark跨越列创建

如何在WTForm中使用back_plumates参考brand_id?

Pandas read_jsonfuture 警告:解析字符串时,to_datetime与单位的行为已被反对

使用Python Great Expectations和python-oracledb

KNN分类器中的GridSearchCV

inspect_asm不给出输出

pyautogui.locateOnScreen在Linux上的工作方式有所不同

opencv Python稳定的图标识别

Python中使用时区感知日期时间对象进行时间算术的Incredit

即使在可见的情况下也不相互作用

使用新的类型语法正确注释ParamSecdecorator (3.12)

为什么我的Python代码在if-else声明中的行之前执行if-else声明中的行?

如果值不存在,列表理解返回列表

Python库:可选地支持numpy类型,而不依赖于numpy

如何获取TFIDF Transformer中的值?

Stacked bar chart from billrame

不允许访问非IPM文件夹

Python Pandas获取层次路径直到顶层管理

如何在TensorFlow中分类多个类

使用特定值作为引用替换数据框行上的值