后端uwsgi

一、简介

WSGI 、uWSGI 和 uwsgi 是三个相关的概念:
WSGI和uwsgi是一种通信协议。。
而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

WSGI,全称 Web Server Gateway Interface(Web服务器网关接口)。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种协议规范。从名字可看出来,是一个Gateway,也就是网关。网关的作用就是在协议之间进行转换。

也就是说,WSGI就像是一座桥梁,一边连着web服务器,另一边连着用户的应用。但是呢,这个桥的功能很弱,有时候还需要别的桥来帮忙才能进行处理。WSGI 的作用如图所示:
image.png

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。在此常用于在uWSGI服务器与其他网络服务器的数据通信。

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。

为什么有了uWSGI为什么还需要nginx?因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。

WSGI没有官方的实现, 因为WSGI更像一个协议,只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行。
uWSGI实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器。
uWSGI 是一个全功能的 HTTP 服务器,他要做的就是把 HTTP 协议转化成语言支持的网络协议。比如把 HTTP 协议转化成 WSGI 协议,让 Python 可以直接使用。 uwsgi 是一种 uWSGI 的内部协议,使用二进制方式和其他应用程序进行通信。

他们的工作流程是这样的:
基于django框架完成web项目的开发,然后进行部署。nginx 是对外的服务接口,外部浏览器通过url访问nginx。nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件,如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uWSGI, uWSGI接收到请求之后将包进行处理,处理成WSGI可以接受的格式,并发给WSGI,WSGI根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给WSGI, WSGI将返回值进行打包,打包成uWSGI能够接收的格式,uWSGI接收WSGI发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。
在这里插入图片描述

WSGI协议主要包括server和application两部分:

  • WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;

  • WSGI application接收由server转发的request,处理请求,并将处理结果返回给server。application中可以包括多个栈式的中间件(middlewares),这些中间件需要同时实现server与application,因此可以在WSGI服务器与WSGI应用之间起调节作用。

WSGI协议其实是定义了一种server与application解耦的规范,Application端的实现一般是由Python的各种框架来实现的,比如Django,Flask,Tornado, web.py等,一般开发者不需要关心WSGI的实现,框架会会提供接口让开发者获取HTTP请求的内容以及发送HTTP响应;

Server端的实现会比较复杂一点,这个主要是因为软件架构的原因。一般常用的Web服务器,如Apache和nginx,都不会内置WSGI的支持,而是通过扩展来完成。Nginx上一般是用proxy的方式,用nginx的协议将请求封装好,发送给应用服务器,比如uWSGI,应用服务器会实现WSGI的服务端、进程管理以及对application的调用。以提升可移植 Web 应用开发的共同点。

例如: uWSGI和Gunicorn都是实现了WSGI server协议的服务器,Django,Flask是实现了WSGI application协议的web框架,可以根据项目实际情况搭配使用。

  • wsgi server (比如uWSGI)实现wsgi协议规范的服务器我们叫做wsgi服务器,也就是uWSGI服务器
  • wsgi application(比如django )实现wsgi协议的应用,我们叫做wsgi应用,比如Django,Falsk。

客户端----------> 反向代理服务器------------------------->web服务器---------------------------------------->web应用
在这里插入图片描述

在这里插入图片描述

uWSGI的主要特点是:

  • 超快的性能
  • 低内存占用
  • 多app管理
  • 详尽的日志功能(可以用来分析app的性能和瓶颈)
  • 高度可定制(内存大小限制,服务一定次数后重启等)

为什么有了uWSGI为什么还需要nginx?因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。
补充知识点:配置Nginx反向代理时,如何区分对静态资源请求和动态资源请求对分发;
1、 Nginx 可以作为一个HTTP服务器进行网站的发布处理,还可以作为反向代理进行负载均衡的实现。
2、 使用反向代理 代理 Web服务器,默认通过lun询的方法对HTTP请求进行分发,来优化网站的负载。
3、 实现负载的方法还有很多:

  • 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
  • ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定的ip地址的客户端会访问同一个后端服务器,也会一定程度上解决了集群部署环境下Session共享的问题。
  • fair: 智能态度算法,动态的根据后端服务器的请求处理到响应到时间进行均衡。
  • url_hash: 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

CloudStudio
nginx:vnfm\version\CloudStudio_VNFM_LCM\vnfm-lcm\vnfm-lcm-server\nginx.conf
uwsgi:vro\src\python\conf\uwsgi\uwsgi-socket.ini vro是内部组件,无nginx

二、配置uwsgi

在我们通过Django创建web项目时,在子目录web下已经帮我们生成的 wsgi.py文件,
所以,我们只需要再创建web_uwsgi.ini配置文件即可
当然,uwsgi支持多种类型的配置文件,如xml,ini等

uwsgi配置由多个部分组成:
1、基本配置:包括uwsgi服务器地址、端口和工作方式等。 htto/socker/protocol
2、应用配置:定义要加载的应用文件和WSGI入口。 module/chdir
3、进程配置:定义uwsgi进程数、线程数、并发数等。 workers/threads/master/harakiri/max_requests/vacuum
4、性能调优:调整缓冲区大小、文件描述符等参数以优化性能。 buffer-size/limit-as/log-date/log-format/disable-logging

  • 进程调优:增加进程数可以提高并发请求的处理速度,但也会增加内存开销。线程数也可以根据实际情况进行调整。
  • 缓冲区调优:适当增加缓冲区大小可以减少I/O操作,提高读写效率。
  • 文件描述符调优:通过调整文件描述符数量可以提高服务器并发处理性能。

vnfm\src\python\nfvpub\config\uwsgi-socket.ini文件:

# 配置服务器的监听ip和端口,让uWSGI作为nginx的支持服务器的话,设置socket就行;
# 如果要让uWSGI作为单独的web-server,用http
#http = 0.0.0.0:8004
socket = 192.168.106.112:8000
 
master = True                    # 开启master, 将会多开一个管理进程, 管理其他服务进程
harakiri=60                      # 当一个请求花费的时间超过这个时间,那么这个请求都会被丢弃。
chdir = /home/x/20180523_nginx/  # 配置项目目录(此处设置为项目的根目录)

processes = 8  # 服务器开启的进程数量,一般为2

pidfile = /home/x/20180523_nginx/script/uwsgi.pid   # 进程pid文件, 通过该文件可以控制uwsgi的重启和停止
daemonize = /home/x/20180523_nginx/script/log_uwsgi.log  # 以后台守护进程运行,并将log日志存于temp文件夹。

buffer-size=65536   # uWsgi默认的buffersize为4096,如果请求数据超过这个量会报错。这里设置为64k
listen=128  # 监听队伍最大长度,默认128

memory-report=true                   #开启内存使用情况报告
stats=%(chdir)/uwsgi/uwsgi.status    # status文件,可以查看uwsgi的运行状态

max-requests=5000        # 为每个工作进程设置请求数的上限。当处理的请求总数超过这个量,进程回收重启。
#wsgi-file = o1_app/wsgi.py  # 配置入口模块 (django的入口函数的模块,即setting同级目录下的wsgi.py)
module = o1_app.wsgi     # wsgi文件位置
threads = 4              # 服务器进程开启的线程数量
vacuum = true            # 退出的时候清空环境变量# 退出uwsgi是否清理中间文件,包含pid、sock和status文件
#py-autoreload = 1       #修改python代码时,自动重启uwsgi服务

# 以下uwsgi与nginx通信手段3选一即可
 
# 选项1, 使用unix socket与nginx通信,仅限于uwsgi和nginx在同一主机上情形.如果你的nginx与uwsgi在同一台服务器上,优先使用本地机器的unix socket进行通信,这样速度更快。
# Nginx配置中uwsgi_pass应指向同一socket文件
socket=/run/uwsgi/%(project).sock
 
 
# 选项2,使用TCP socket与nginx通信
# Nginx配置中uwsgi_pass应指向uWSGI服务器IP和端口
socket=0.0.0.0:8000 或则 socket=:8000
 
 
# 选项3,使用http协议与nginx通信
# Nginx配置中proxy_pass应指向uWSGI服务器一IP和端口
http=0.0.0.0:8000

通过uwsgi命令读取myweb_uwsgi.ini文件启动项目

uwsgi --ini uwsgi.ini    # \vnfm\src\python\nfvpub\config\restart_uwsgi.sh

三、uWSGI常用命令

$ uwsgi --ini uwsgi.ini   # 启动uWSGI服务器

$ sudo service uwsgi restart  # 重启uWSGI服务器

$ ps aux | grep uwsgi   # 查看所有uWSGI进程

$ sudo pkill -f uwsgi -9   # 停止所有uWSGI进程

$ uwsgi --reload *.pid  # 重启uwsgi服务

$ uwsgi --stop *.pid  # 停止uwsgi服务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值