镇楼
https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/index.html
个人理解
uwsgi是类似nginx或者apache这类容器与python交互的东西。
WSGI 是一个 Python 协议,定义了应用程序(我们写的软件)如何与 Web 服务器(如 Nginx)通信,WSGI 只是一个接口
WSGI是一种通信协议。
uwsgi同WSGI一样是一种通信协议。
而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
从某种角度来看,uwsgi是一种没有nginx优秀的容器。(不知道说法是否准确)
https://lufficc.com/blog/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu
安装
1 | pip install uwsgi |
例子
现在将实现一个简单的小例子,顺便进行发散式的扩充,因为正在学习docker,所以在docker的环境下进行。
docker环境
Dockerfile
1 | FROM python:3 |
在 $PWD/python 下创建一个简单的 app.py
1 | from flask import Flask |
启动docker
1 | docker run -p 5000:5000 -v $PWD/python:/data -it uwsgi |
通过uwsgi启动flask
1 | uwsgi --http 0.0.0.0:5000 -w app:app |
-w app:app
等价于--wsgi-file app.py --callable app
指定 哪个文件下的哪个变量用来执行。--http
原本情况下,uwsgi是处理WSGI协议,所以需要指定 是http
来处理。
如果是用--socket
情况下,是建立起一个通信的socket,可以用来和nginx
通信。此时,通过protocol
来指定http
协议。
https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/HTTP.html
http-socket
选项将会让uWSGI和原生HTTP通信。如果你的web服务器不支持 uwsgi protocol ,但是可以与上游HTTP代理通信,或者如果你正在用诸如Webfaction或者Heroku这样的服务来托管你的应用,那么你可以使用 http-socket 。如果你计划只通过uWSGI开放你的应用,那么用 http 选项来代替,因为路由器/代理/负载均衡器将会保护你。
与nginx的通信
有两种方式:
- 用 ip+端口 方式来指定 socket,ip可能有问题,这里还不了解
--socket 0.0.0.0:5000
- 用 文件方式 指定socket
socket = /home/yy/code/project/py/n.sock
此时需要nginx中使用不同的方法来配置对应socket。
下图中的 ip可能有问题,这里还不了解。
例子2
1 | FROM python:3 |
例子3
这个例子用于介绍 uwsgi的配置文件 如何写
1 | [uwsgi] |
当然也可如此
1 | [uwsgi] |
执行命令:
1 | uwsgi uwsgi.ini |
所以新的Dockerfile为:
1 | FROM python:3 |
然后
1 | docker build -t uwsgi3 . |
然后
1 | docker run -p 5000:5000 uwsgi |