flask_11:uWISG简介及配置介绍
1、回顾:
(2)flask_10:Nginx和uWSGI服务器之间是如何通信的?
python web 开发的线上流程图:
由上面的介绍可以看出,uwsgi 服务器的作用是,在接收到nginx转发的请求后,根据自身的 uwsgi 和 WSGI 协议,找到对应的 Django/Flask 框架,Django/Flask 框架下的应用进行逻辑处理后,将返回值发送到 uwsgi 服务器,然后 uwsgi 服务器再返回给 nginx,最后 nginx将返回值返回给浏览器进行渲染显示给用户。
2、uWISG简介:
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
3、WSGI / uwsgi / uWSGI 区分
- WSGI是一种通信协议。
- uwsgi同WSGI一样是一种通信协议。
- 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器
4、为什么有了uWSGI还需要nginx?
一种情况,本地有多个 web 服务,有 Python、php、java 编写的,都想监听 80 端口,这个时候就必须有一个负责转发的服务了。
如果本机确定只跑这一个服务,但是 uwsgi 和 gevent 对于静态资源处理的并不是很好,一是性能问题,二是各种 HTTP 请求缓存头,处理的也没有 Nginx 完善。
然后还有一些安全问题,Nginx 作为专业服务器,暴露在公网相对比较安全(虽然有著名的心血漏洞),uwsgi 和 gevent 的话,漏洞恐怕只比 Nginx 多而不是少。
再来就是支持的协议,uwsgi 和 gunicon 早期是不支持 https 的,只能提供 http 给浏览器访问。虽然现在这两者都支持了,但是以后的 spdy 和http2,恐怕也是 nginx 跟进更快一些。
还有一些运维优势,比如服务器被人 CC,这是一种非常常见的情况,nginx 可以比较方便的把一些 IP 加入黑名单,直接改配置文件就好了。要是 uwsgi 或者 gunicorn,恐怕还要修改自己应用的代码,把 IP 过滤写进去。
5、UWSGI常用参数介绍
chdir=/xxx/xxx # 指定项目目录 home=/xxx/xxx # 指定虚拟环境变量 wsgi-file=xxx # 指定加载WSGI文件 socket=xxx # 指定uwsgi的客户端将要连接的socket的路径(使用UNIX socket的情况)或者地址(使用网络地址的情况)。 callable=xxx # uWSGI加载的模块中哪个变量将被调用 master=true # 指定启动主进程 processes=4 # 设置工作进程的数量 threads=2 # 设置每个工作进程的线程数 vacuum=true # 当服务器退出时自动删除unix socket文件和pid文件 logfile-chmod=644 # 指定日志文件的权限 daemonize=%(chdir)/xxx.log # 进程在后台运行,并将日志打印到指定文件 pidfile=%(chdir)/xxx.pid # 在失去权限前,将主进程pid写到指定的文件 uid=xxx # uWSGI服务器运行时的用户id gid=xxx # uWSGI服务器运行时的用户组id procname-prefix-spaced=xxx # 指定工作进程名称的前缀
6、示例配置
[uwsgi] chdir=/home/git/www/cloudmonitor # 指定项目目录 home=/home/git/www/cloudmonitor/.env # 指定python虚拟环境 wsgi-file=manager.py # 指定加载的WSGI文件 callable=app # 指定uWSGI加载的模块中哪个变量将被调用 master=true # 启动主线程 processes=4 # 设置工作进程的数量 threads=2 # 设置每个工作进程的线程数 socket=127.0.0.1:8888 # 指定socket地址 vacuum=true # 当服务器退出时自动删除unix socket文件和pid文件 logfile-chmod=644 # 指定日志文件的权限 daemonize=%(chdir)/cloudmonitor.log # 进程在后台运行,并将日志打印到指定文件 pidfile=%(chdir)/cloudmonitor.pid # 在失去权限前,将主进程pid写到指定的文件 uid=git # uWSGI服务器运行时的用户id gid=git # uWSGI服务器运行时的用户组id procname-prefix-spaced=cloudmonitor # 指定工作进程名称的前缀
本文转载自:
(1) uWSGI常用参数介绍