首先咱们先来介绍一下这三个软件
Django(web框架)
Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。
uwsgi
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
- WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
- uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
- 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
- uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
Nginx(Web服务器or反向代理服务器 or负载均衡)
Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。
主角介绍完了,为什么要选取这样一套架构呢,首先我是基于django框架进行开发的web页面,为什么会需要uwsgi 和nginx呢,为了更好的理解请看图:
1、首先客户端请求服务资源,
2、nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
3、如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
4、如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi,
5、wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,
6、wsgi将返回值进行打包,转发给uWSGI,
7、uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
django项目
└── books
├── app01
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── __init__.py
│ │ └── __pycache__
│ │ ├── 0001_initial.cpython-36.pyc
│ │ ├── 0001_initial.cpython-37.pyc
│ │ ├── __init__.cpython-36.pyc
│ │ └── __init__.cpython-37.pyc
│ ├── models.py
│ ├── __pycache__
│ │ ├── admin.cpython-36.pyc
│ │ ├── admin.cpython-37.pyc
│ │ ├── apps.cpython-36.pyc
│ │ ├── apps.cpython-37.pyc
│ │ ├── __init__.cpython-36.pyc
│ │ ├── __init__.cpython-37.pyc
│ │ ├── models.cpython-36.pyc
│ │ ├── models.cpython-37.pyc
│ │ ├── views.cpython-36.pyc
│ │ └── views.cpython-37.pyc
│ ├── static
│ │ └── css
│ │ ├── addbooks.css
│ │ └── books.css
│ ├── tests.py
│ ├── views.py
│ └── views.py.bak
├── books
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ ├── __init__.cpython-37.pyc
│ │ ├── settings.cpython-36.pyc
│ │ ├── settings.cpython-37.pyc
│ │ ├── urls.cpython-36.pyc
│ │ ├── urls.cpython-37.pyc
│ │ ├── wsgi.cpython-36.pyc
│ │ └── wsgi.cpython-37.pyc
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── script
│ ├── uwsgi.ini
│ ├── uwsgi.log
│ ├── uwsgi.pid
│ └── uwsgi.sock
└── templates
├── addbooks.html
├── books.html
└── editbooks.html
首先在配置uwsgi之前,咱们应该测试一下咱们的django 项目是否运行正常。
运行项目
run manage.py runserver 0.0.0.0:80
uwsgi
接下来可以测试一下咱们的uwsgi
通过命令来使uwsgi连接django
uwsgi --http :8001 --chdir /project/books/ --wsgi-file books/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
参数说明:
--http 这个就和runserver一样指定IP 端口
--file 这个文件就里有一个反射,如果你在调用他的时候没有指定Web Server就使用默认的
-- static 做一个映射,指定静态文件
配置uwsgi配置文件
vim uwsgi.ini
[uwsgi] # 项目目录 chdir=/project/books #绑定端口号 socket= :8080 # 指定项目的application module=books.wsgi # 指定sock的文件路径 socket=/project/books/script/uwsgi.sock # 进程个数 workers=5 pidfile=/project/books/script/uwsgi.pid # 启动uwsgi的用户名和用户组 uid=root gid=root # 启用主进程 master=true # 序列化接受的内容,如果可能的话 thunder-lock=true # 启用线程 enable-threads=true # 设置自中断时间 harakiri=30 # 设置缓冲 post-buffering=4096 # 设置日志目录 daemonize=/project/books/script/uwsgi.log
这个.ini 文件可以放在任何地方,启动的时候直接 uwsgi --ini **.ini 就可以了
Nginx
修改nginx配置文件
vim /etc/nginx/nginx.conf
配置文件具体内容
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 80 ; charset UTF-8; server_name 127.0.0.1; # root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8080; uwsgi_read_timeout 30; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
接下来启动nginx,整个架构就完成啦。