uWSGI

予早 2025-02-21 01:08:24
Categories: Tags:

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框架写的程序)通信协议。

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;
}