WSGI
WSGI,Web Server Gateway Interface,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的通用接口规范。
WSGI是服务器棵应用程序间的桥梁。
通常,服务器实现WSGI、Web框架实现WSGI,然后开发者使用框架编写应用程序,则编写出来的程序可以运行在任意遵循WSGI的服务器上,反过来说,遵循WSGI的服务器上可以运行任何基于遵循WSGI的框架编写的程序。
很多框架都内嵌了一个遵循的WSGI的服务器,例如Flask、DJango,内嵌服务器不适用于生产环境,生产环境应当使用专业服务器。
ASGI
Asynchronous Server Gateway Interface,异步服务器网关接口
ASGI 是 WSGI 的扩展,ASGI兼容WSGI,旨在补充提供支持异步的 Python web 服务器、框架和应用程序之间的标准接口
uWSGI
uWSGI 是一个遵循 WSGI 的 Web 服务器。uWSGI 中实现了uwsgi、http等信息传输协议,其中uwsgi(注意全是小写)协议是uWSGI服务器自有协议
是一种描述web服务器(如nginx,uWSGI等服务器)如何与web应用程序(如用Django、Flask框架写的程序)通信协议。
- uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,用于与nginx等代理服务器通信,它与WSGI相比是两样东西。
- uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
https://blog.csdn.net/weixin_45455015/article/details/100113330
总结
WSGI和ASGI是Web服务器网关接口,WSGI是同步服务器标准,ASGI是同步或异步服务器标准,ASGI兼容WSGI
uWSGI 是遵循WSGI的Web服务器。
uwsgi 是 uWSGI 中的一种通信协议。
相关命令
# 启动
uwsgi --ini xxx.ini
# 重启
uwsgi --reload /tmp/gezi_wsgi.pid
# 停止
uwsgi --stop
# 使用 uWSGI 启动该一个Django项目
uwsgi --http 0.0.0.0:8888 --wsgi-file project/wsgi.py
python manage.py runserver 0.0.0.0:5002
uWSGI 配置文件样例
[uwsgi]
env = LANG=en_US.UTF-8
env = LC_ALL=en_US.UTF-8
env = LC_LANG=en_US.UTF-8
virtualenv = /home/ubuntu/virtualenv/tianfu3k
http-socket = 0.0.0.0:5001
socket = 0.0.0.0:5002
stats = /tmp/gbm_stat.socket
wsgi = wsgi
# 主进程
master = true
enable-threads = true
# uWsgi默认的buffersize为4096,如果请求数据超过这个量会报错。这里设置为64k
buffer-size=65536
# 进程文件
pidfile = /tmp/gbm.pid
log-x-forwarded-for = true
# Ubuntu系统下默认用户名
uid = ubuntu
# Ubuntu系统下默认用户组
gid = ubuntu
#
master-as-root = true
max-fd = 50000
processes = 4
threads = 5
logger = socket:127.0.0.1:5003
# 以后台守护进程运行,并将log日志存于temp文件夹
daemonize = /dev/null
wsgi-disable-file-wrapper = true
lazy-apps = true
project = mysite1 # 项目名
# 服务停止时,自动移除unix socket和pid文件
;vacuum=True
# 为每个工作进程设置请求数的上限。当处理的请求总数超过这个量,进程回收重启。
;max-requests=5000
# 当一个请求花费的时间超过这个时间,那么这个请求都会被丢弃。
harakiri = 60
#当一个请求被harakiri杀掉会输出一条日志
# harakiri 参数是设置一个请求的超时时间(秒),如果一个请求超过了这个时间的 2倍 ,则这个请求被丢弃。 即如果设置 harakiri=30 ,则60秒后请求被丢弃。
harakiri-verbose = true
;为了解决Web 服务器与应用程序之间的交互问题,就出现了Web 服务器与应用程序之间交互的规范。最早出现的是CGI,后来又出现了改进 CGI 性能的FasgCGI,
;Java 专用的 Servlet 规范。在Python领域,最知名的就是WSGI规范了。
uWSGI与Nginx通信
注意:uWSGI和Nginx之间有3种通信方式, unix socket,TCP socket和http。Nginx的配置必须与uwsgi配置保持一致。
# 选项1, 使用unix socket与nginx通信
# 仅限于uwsgi和nginx在同一主机上情形
# 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
如果你的nginx与uwsgi在同一台服务器上,优先使用本地机器的unix socket进行通信,这样速度更快。此时nginx的配置文件如下所示:
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/run/uwsgi/project.sock;
}
如果nginx与uwsgi不在同一台服务器上,两者使用TCP socket通信时,nginx可使用如下配置:
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass uWSGI_SERVER_IP:8000;
}
如果nginx与uwsgi不在同一台服务器上,两者使用http协议进行通信,nginx配置应修改如下:
location / {
# 注意:proxy_pass后面http必不可少哦!
proxy_pass http://uWSGI_SERVER_IP:8000;
}