flask + uwsgi不要nginx,应该怎么写配置文件?

如果你在Google或者百度或者某些技术社区上面搜索 uwsgi+Flask,你会发现大量的文章,是教你如何使用 uwsgi+flask+Nginx搭建网站。如下图所示:

知其所以然:flask + uwsgi不要nginx,应该怎么写配置文件?_套接字_02

怪现状

而且这些文章,全部都像是约定俗成一样,一定会首先用命令行启动uwsgi,测试uwsgi与Flask运行是否正常,然后写uwsgi的配置文件。然后使用 Unix套接字沟通uwsgi与Nginx。所以uwsgi的配置文件里面一定会写成类似于下面这样:

  1. socket = /xxx/yyy/zzz.sock

Nginx的配置一定有类似于下面这一段:

  1. location / {
  2. include uwsgi_params;
  3. uwsgi_pass unix:///xxx/yyy/zzz.sock;
  4. }

他们为什么要这样写?因为他们看的别的博客上就是这样写的!他们知其然,但是不知其所以然。

有什么问题?

这种写法本身没有问题,甚至Flask的官方文档里面也是这样写的,如下图所示:

知其所以然:flask + uwsgi不要nginx,应该怎么写配置文件?_套接字_03

但是他们这样写,有一个基本前提——就是Flask程序、uwsgi、Nginx三个东西运行在同一个服务器上。如果用Docker,那么这三个东西甚至需要运行到一个容器里面。

如果是一个小网站,服务器资源足够,那么这样写没有问题,Unix套接字安全性高,速度也快。

那么如果你同一个服务器上有三个Docker容器,每一个容器都有一个不同的网站,是不是每个容器里面都需要安装一个Nginx?

对于大一些的网站,Nginx需要做负载均衡,如果把Nginx和网站放在同一台服务器上,无论是Nginx拖垮了服务器,还是网站拖垮了服务器,都会导致很严重的问题。

能不能实现,一个服务器上直接安装Nginx,然后服务器上的三个网站分别在三个Docker容器里面,每个容器里面只有Flask和uwsgi,没有Nginx?

如果你的网站大一些,你在A服务器安装Nginx,在B、C、D、E、F服务器上不安装Nginx,只安装uwsgi + Flask,又怎么做?

所以进入我们今天的主题, 安装uwsgi+Flask(或者Django),但是不安装Nginx(DeployFlaskwithuwsgi but withoutNginx)

不使用Unix套接字的uwsgi

Unix套接字,本质上是一个文件(Unix/Linux哲学:一切皆文件),Nginx和uwsgi通过这个文件来进行通信。所以需要Nginx与uwsgi放在同一个机器上。

但实际上,uwsgi本身就是一个服务器,A服务器上的Nginx与B服务器上的uwsgi之间是可以通过http进行通信的。

要让uwsgi使用http进行通信,我们可以修改uwsgi的配置文件xxx.ini:

  1. [uwsgi]
  2. module = wsgi:app
  3. master = true
  4. process = 5
  5. threads = 100
  6. gevent = 100
  7. async = 100
  8. http-socket = 0.0.0.0:5001
  9. virtualenv = /Users/kingname/.local/share/virtualenvs/ActiveScoreApi-Ax_h-Y5w

其他参数的意义不是本文的重点,我们要关心的是 http-socket=0.0.0.0:5001。它的作用把网站部署在本机的5001端口,并允许外网通过http访问。

写了这个配置文件以后,通过以下命令来启动uwsgi:

  1. uwsgi --ini xxx.ini

然后你使用 IP:5001就可以访问你的网站了。此时,如果你有Nginx,那么只需要在Nginx上设置反向代理,把80端口的请求代理到5001端口即可。

同理,把uwsgi和网站放在Docker镜像里面,容器开放5001端口。宿主机或者其他机器上的Nginx直接通过IP:端口 就可以访问容器里面的uwsgi,不再需要设置Unix套接字了。

另外,如果你阅读过uwsgi的官方文档,你还会发现,除了 http-socket=0.0.0.0:5001外,你也可以把它改成 http=0.0.0.0:5001。那么这两种写法是否一样呢?

在官方文档里面特别区分了它们的使用场景:

The http and http-socket options are entirely different beasts. The first one spawns an additional process forwarding requests to a series of workers (think about it as a form of shield, at the same level of apache or nginx), while the second one sets workers to natively speak the http protocol. TL/DR: if you plan to expose uWSGI directly to the public, use --http, if you want to proxy it behind a webserver speaking http with backends, use --http-socket.

简言之,如果你直接把uwsgi作为服务器,uwsgi启动以后,直接就把IP:端口拿给别人访问,那么你就可以使用 http;如果你的uwsgi前面还挡了一个Nginx,那么你就使用 `http-socket

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Flask是一个基于Python的轻量级Web框架,它提供了简单易用的工具来构建Web应用程序。Flask具有灵活的设计,可以根据需求进行扩展和定制。它支持RESTful风格的API开发,并且具有良好的可扩展性,适用于开发小型到中型的Web应用。 uWSGI是一个Web服务器和应用服务器,它可以将Web应用程序从框架中分离出来,并通过WSGI协议与框架进行通信。它支持高并发和负载均衡,并且具有内置的缓存机制和性能监控。uWSGIFlask配合使用可以提高Web应用程序的性能和稳定性。 Nginx是一个高性能的开源HTTP服务器和反向代理服务器。它可以处理大量并发连接,并能有效地分发请求到后端服务器。Nginx的反向代理功能可以将请求转发给uWSGI服务器,然后由uWSGI服务器处理Flask应用程序的逻辑。 使用FlaskuWSGINginx的组合可以实现一个高性能的Web应用程序架构。首先,Flask用于开发Web应用程序的逻辑和路由。然后,uWSGI作为应用程序服务器,将Flask应用程序加载到内存中,并以WSGI协议与Nginx进行通信。最后,Nginx作为前端服务器,通过负载均衡和反向代理将请求分发到uWSGI服务器。 这种架构可以提供高并发、可扩展和稳定的Web应用程序。Flask提供了优雅的开发方式,uWSGI处理应用程序的逻辑和性能优化,而Nginx作为前端服务器提供高性能的负载均衡和反向代理。整个架构可以根据需求进行灵活的配置和扩展,以满足不同规模的Web应用程序的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚坏叔叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值