Django,Nginx和uWSGI关系简介

一、简介

1. Nginx简介

Nginx 是一个高性能的HTTP和反向代理服务器(关于正向代理和方向代理,可参考博客:https://www.cnblogs.com/Anker/p/6056540.html),也是一个IMAP/POP3/SMTP服务器。在高连接并发的情况下,Nginx是Apache服务器不错的替代品。 
Nginx 一般监听服务器的80或者443端口(listen 80 就代表监听80端口),因为一般直接访问网站都是通过这两个端口,一台服务器可以绑定多个域名,根据不同的域名,Nginx会去找不同的地方去访问。

Nginx和Apache一般都作为Web服务器。至于Tomcat,是一个Web应用容器,一般用于执行后台代码。一般来说,使用Nginx或者Apache处理客户端到服务器的请求,然后将请求交给Tomcat处理,Tomcat处理后返回数据给Nginx,最后Nginx将客户端请求的数据发给客户端。

2. Django简介

Django是一个开放源代码的Web应用框架,由Python写成。Django不是一个服务器,只是一个Web的应用框架。采用了MTV的框架模式,即模型M,模板T和视图V。

3. uWSGI简介

WSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。用于连接Web服务器和Web应用框架。

  1. wsgi:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。 利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;
  2. uwsgi:同WSGI一样是一种通信协议。uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。
  3. uWSGI :一种python web server或称为Server/Gateway 。uWSGI类似tornadoweb或者flup,是一种python web server,uWSGI是实现了uwsgi和WSGI两种协议的Web服务器,负责响应python 的web请求。

1,简单介绍

WSGI(Web Server Gateway Interface),定义了web服务器(nginx、apache、iis等)和 web应用(或者将web框架,flask、django等)之间的接口规范。也就是说,只要 web服务器和 web应用都遵守WSGI协议,那么 web服务器和 web应用就可以随意的组合。

uwsgi.jpg

uwsgi的启动可以把参数加载命令行中,也可以是配置文件 .ini, .xml, .yaml 配置文件中,个人用的比较多得是 .ini 文件。
通过uwsgi --help可以查看得到:

-x|--xmlconfig                         load config from xml file
-x|--xml                               load config from xml file
--ini                                  load config from ini file
-y|--yaml                              load config from yaml file
-y|--yml                               load config from yaml file

2,安装部署

  • 一键安装
pip install uwsgitop
  • 源码安装
# 可以去pypi,搜索uwsgi下载:
https://pypi.python.org/pypi/uWSGI/ 
# 安装命令如下:
tar xvzf uwsgi-2.0.9.tar.gz
cd uwsgi-2.0.9
make
  • 目录规划
(.env) zhangshuaipeng@orange:~/web/flask/mysite$ tree .
.
├── hello.py
├── hello.pyc
├── uwsgi
│   ├── uwsgi.log                  # 日志文件,通过该文件查看uwsgi的日志
│   ├── uwsgi.pid                  # pid文件,通过该文件可以控制uwsgi的重启和停止
│   ├── uwsgi.sock                 # socket文件,配置nginx时候使用
│   └── uwsgi.status               # status文件,可以查看uwsgi的运行状态
└── uwsgi.ini
  • 配置使用
(.env) zhangshuaipeng@orange:~/web/flask/mysite$ vi uwsgi.ini 

[uwsgi]
chdir=/home/zhangshuaipeng/web/flask/mysite/
home=/home/zhangshuaipeng/web/flask/mysite/.env
module=hello                                 # python文件的名称
callable=app
master=true
processes=2                                  # worker进程个数
chmod-socket=666
logfile-chmod=644
uid=zhangshuaipeng_web
gid=zhangshuaipeng_web
procname-prefix-spaced=mysite                # uwsgi的进程名称前缀
py-autoreload=1                              # py文件修改,自动加载
#http=0.0.0.0:8080                           # 监听端口,测试时候使用

vacuum=true                                  # 退出uwsgi是否清理中间文件,包含pid、sock和status文件
socket=%(chdir)/uwsgi/uwsgi.sock             # socket文件,配置nginx时候使用
stats=%(chdir)/uwsgi/uwsgi.status            # status文件,可以查看uwsgi的运行状态
pidfile=%(chdir)/uwsgi/uwsgi.pid             # pid文件,通过该文件可以控制uwsgi的重启和停止
daemonize=%(chdir)/uwsgi/uwsgi.log           # 日志文件,通过该文件查看uwsgi的日志
  • 常用命令
uwsgi --ini uwsgi.ini             # 启动
uwsgi --reload uwsgi.pid          # 重启
uwsgi --stop uwsgi.pid            # 关闭

3,服务监控

  • 读取uwsgi实时状态
uwsgi --connect-and-read uwsgi/uwsgi.status

读取的结果是个json串,包括每个总的状态,每个work是状态,响应时间等,非常全面,也有一些开源的监控可以使用

  • 实时动态查看状态 - uwsgitop
    这里有个uwsgi官方制作的实用工具 uwsgitop, 下面看下效果。
# pip install uwsgitop
# uwsgitop uwsgi/uwsgi.status
uwsgi-2.0.9 - Mon Sep 14 11:20:44 2015 - req: 0 - RPS: 0 - lq: 0 - tx: 0
node: lzz-rmbp - cwd: /Users/liuzhizhi/erya/portal - uid: 501 - gid: 20 - masterpid: 12748
 WID    %       PID     REQ     RPS     EXC     SIG     STATUS  AVG     RSS     VSZ     TX      RunT
 1      0.0     12749   0       0       0       0       idle    0ms     0       0       0       0
 2      0.0     12750   0       0       0       0       idle    0ms     0       0       0       0
 3      0.0     12751   0       0       0       0       idle    0ms     0       0       0       0
 4      0.0     12752   0       0       0       0       idle    0ms     0       0       0       0
 5      0.0     12753   0       0       0       0       idle    0ms     0       0       0       0
 6      0.0     12754   0       0       0       0       idle    0ms     0       0       0       0
 7      0.0     12755   0       0       0       0       idle    0ms     0       0       0       0
 8      0.0     12756   0       0       0       0       idle    0ms     0       0       0       0
 

4,参考资料

二、工作原理

1. 如何工作

那么问题来了,这三者在一起的工作原理是什么? 
1. 一般来说,客户端发起的http/https请求首先到达了我们的Web服务器(在这里我们使用Nginx作为我们的服务器)。 
2. Web服务器收到请求后,对请求进行解析处理(一般来说如果是静态请求,直接返回静态页面(纯HTML页面)),然后将请求发送给uWSGI。 
3. uWSGI对来自Nginx的请求进行处理,将处理后的结果发送给Web应用框架(在这里我们使用Django)。 
4. Web应用框架收到请求之后,Web应用对请求进行处理(例如,Django通过某个函数进行处理),将结果返回给uWSGI。 
5. uWSGI收到Web应用框架的处理结果后,对该结果进行处理打包,发送给Web服务器。 
6. Web服务器将收到的结果返回给客户端。 
这三者之间信息的传递涉及到数据格式以及协议的转换。

2. 项目开发

那么为什么我们之前在使用Django开发项目的过程中, 直接使用python manage.py runserver 来运行服务器,也没有用到其他两个,就可以直接通过浏览器来访问?那是因为Django自带了wsgiref模块,可以作为wsgi服务器,可以对我们的http请求进行处理,但是性能不好,只能测试的时候用。到了真正部署的时候就要用到uWSGI服务器(Nginx也不是必须的,只是为了性能和安全方面的考虑,也是为了更好地处理静态资源)。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值