Python中uwsgi部署Django项目时,使用--http和--socket参数的区别是什么?
以前一直是用 --socket 来部署的,感觉不管用–http 还是-- socket,最后都要包一层 nginx 在外面,就是比较好奇,两种方式在执行效率上哪个会高一些
Python中uwsgi部署Django项目时,使用–http和–socket参数的区别是什么?
文档有写
--http 和 --socket 参数的区别在于通信方式和部署架构。
–http:让uWSGI直接启动一个HTTP服务器,处理HTTP请求。适合简单部署,不需要额外的Web服务器(如Nginx)。
uwsgi --http :8000 --module myproject.wsgi
–socket:让uWSGI通过Unix socket或TCP socket与前置Web服务器(如Nginx)通信。这是生产环境的推荐方式,Nginx处理静态文件和负载均衡,uWSGI专注动态请求。
uwsgi --socket /tmp/myproject.sock --module myproject.wsgi
简单说,--http是独立HTTP服务,--socket是配合反向代理用的。生产环境建议用socket配Nginx。
http 的话,nginx 和 uwsgi 中间走的是 http 协议,文本
socket 的话,nginx 和 uwsgi 中间走的是 wsgi 协议,二进制
感觉 wsgi 协议效率会更高一点
通信协议不一样,就这,http 的多了包校验之类的
连接方式其实有三种
unix Socket,这个性能效率最高,直接内存交换,但必须应用和 NGX 同在一台服务器上
TCP Socket, 二进制包传递
HTTP, 是基于 TCP 上面的一层文本协议
感谢,其实问这个问题是因为现在想用 docker 来部署,想把 docker+uwsgi 放一个容器,然后 nginx 单独一个容器,似乎这样部署就只能用 http 了
在文档里面看到一句
Using Unix sockets instead of ports
So far we have used a TCP port socket, because it ’ s simpler, but in fact it ’ s better to use Unix sockets than ports - there ’ s less overhead.
docker 部署的话,容器里面如果没有 nginx,静态文件怎么搞啊。
生产环境百分之九十九是 unix Socket 的方式,ngnix 是做反向代理用的,因为 uwsgi 不具备路由、过滤等方向代理功能,但论执行效率,可以做性能测试,如果是 http 协议的话,性能是没有 unix Socket 方式好的
用 docker 来部署一般用 TCP socket,如果容器用主机网络模式,用个不冲突的端口号就可以了。
静态文件可以挂载出来的吧

