uWSGI是一个web服务器,它实现了WSGI协议、uwsgi协议、HTTP等协议;(Tornado、Flask、Django)
相关概念:
- WSGI:全称是Web Server Gateway Interface,WSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。server和application的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有Bottle, Flask, Django。
- uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。
uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等
。
WSGI协议主要包括server和application两部分:
- WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;
- WSGI application接收由server转发的request,处理请求,并将处理结果返回给server。application中可以包括多个栈式的中间件(middlewares),这些中间件需要同时实现server与application,因此可以在WSGI服务器与WSGI应用之间起调节作用:对服务器来说,中间件扮演应用程序,对应用程序来说,中间件扮演服务器。
WSGI协议其实是定义了一种server与application解耦的规范,即可以有多个实现WSGI server的服务器,也可以有多个实现WSGI application的框架,那么就可以选择任意的server和application组合实现自己的web应用。
uwsgi 接收到请求之后将包进行处理,处理成 wsgi 可以接受的格式,并发给 wsgi,
wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将
返回值再次交给 wsgi,wsgi 将返回值进行打包,打包成 uwsgi 能够接收的格式,
uwsgi 接收 wsgi 发送的请求,并转发给 nginx,nginx 最终将返回值返回给浏览器。
把 HTTP 协议转化成 WSGI 协议,让 Python 可以直接使用,将 WSGI 协议转为HTTP协议并转发给 nginx,nginx 最终将返回值返回给浏览器
Nginx
Nginx是一个 轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用nginx网站用户有很多,例如:新浪、网易、 腾讯等。
nginx 和 uwsgi 的区别和作用:
- nginx 是对外的服务器,外部浏览器通过 url 访问 nginx, uwsgi 是对内的服务器,主要用来处理动态请求。
- nginx 接收到浏览器发送过来的 http 请求,将包进行解析,分析 url, a.如果是静态文件请求就直接访问用户给 nginx 配置的静态文件目录,直接返回用户请求的静态文件, b.如果不是静态文件,而是一个动态的请求,那么 nginx 就将请求转发给 uwsgi
什么要用uWsgi?
因为nginx不支持wsgi协议,及无法直接调用py开发的webApp
。
前端
S137005023-Mac:~ xyt$ ssh root@XXXXXXXX
root@XXXXXXXX's password:
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-96-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Last login: Sat Jan 22 11:09:09 2022 from 10.130.20.12
root@psh-ats-02:~# cd ../etc/nginx/conf.d
root@psh-ats-02:/etc/nginx/conf.d# ls
ATS_WEB_Dist_nginx.conf ATS_Web_Test_nginx.conf test.conf
ATS_WEB_Django_nginx.conf blog_nginx.conf Tornado_nginx.conf
ATS_WEB_Django_Test_nginx.conf Fixture_Check_nginx.conf xiaoqian_test.conf
ATS_Web_nginx.conf SSL
ATS_WEB_Test_Dist_nginx.conf SSL-OLD
root@psh-ats-02:/etc/nginx/conf.d# cat ATS_WEB_Dist_nginx.conf
server{
listen 80;
server_name 域名;
charset utf-8;
ssl on;
ssl_certificate /etc/nginx/conf.d/SSL/psh_cert.pem;
ssl_certificate_key /etc/nginx/conf.d/SSL/psh_key_with_pass.key.unsecure;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
location / {
root /data/django/ATS_Web_Vue/template/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
后端
root@psh-ats-02:/etc/nginx/conf.d# cat ATS_WEB_Django_nginx.conf
upstream VueTest {
server 127.0.0.1:83; # for a web port socket
}
server {
listen 81;
#listen 443;
server_name 域名;
charset utf-8;
ssl on;
ssl_certificate /etc/nginx/conf.d/SSL/psh_cert.pem;
ssl_certificate_key /etc/nginx/conf.d/SSL/psh_key_with_pass.key.unsecure;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/Ats_Web_Vue_access.log;
error_log /var/log/nginx/Ats_Web_Vue_error.log;
client_max_body_size 75M;
location / {
uwsgi_pass VueTest;
include /etc/nginx/uwsgi_params;
}
}
uwsgi.ini
uwsgi.ini uwsgi.log uwsgi.pid
root@psh-ats-02:/data/uwsgi_ini/Ats_Web_Vue# cat uwsgi.ini
[uwsgi]
socket=:83
#http= 127.0.0.1:8000
# the base directory (full path)
chdir = /data/django/ATS_Web_Vue/
# Django s wsgi file
module= PSH_ATS_WEB_VUE.wsgi
wsgi-file= /PSH_ATS_WEB_VUE/wsgi.py
# static
static-map = /static=%(chdir)/static
# master
master = true
# maximum number of worker processes
processes = 8
# clear environment on exit
vacuum = true
#监控python模块mtime来触发重载 (只在开发时使用)
py-autoreload=1
#在每个worker而不是master中加载应用
lazy-apps=true
#允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程
enable-threads = true
#设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽>略之前已经接收到的请求而直接结束)
reload-mercy = 8
#设置最大日志文件大小
log-maxsize = 5000000
daemonize = /data/uwsgi_ini/Ats_Web_Vue/uwsgi.log
pidfile = /data/uwsgi_ini/Ats_Web_Vue/uwsgi.pid
#daemonize = %(chdir)/config/uwsgi.log
#pidfile = %(chdir)/config/uwsgi.pid