一 scgi、wsgi、uwsgi
(1)scgi --> 了解
SCGI是一种'与语言无关'的连接'web服务器'和'web应用程序'的方法
(2)wsgi --> 协议
wsgi: 一种'实现python解析'的通用'接口标准/协议',实现了'python web程序'与'web 服务器'之间交互的通用性 --> 'Web 服务器 网关接口'
备注: WSGI是'Web应用程序'的'Python专用接口'标准
好处: 有了这个东西,'web.py'或者'django'等等的'python web开发框架'就可以轻松地'部署'在'不同的web server'上了,基本'不需要'做任何'特殊配置'
Python Web框架 --> 'Django'、'Flask' -->实现了'wsgiI'这个协议
(3)uwsgi --> 协议
uwsgi: 同WSGI一样是一种'通信协议',uwsgi协议是一个'uWSGI服务器自有的协议',它用于定义传输信息的类型(type of information)
特点: 每一个uwsgi packet'前4byte'为传输信息'类型描述',它与WSGI相比是'两样东西'
uWSGI :一种'python web server'或称为Server/Gateway
uwsgi'类似flup',是一种'python web server',uWSGI是'实现'了'uwsgi和WSGI两种协议'的Web服务器,'负责响应'python 的web请求。
备注: 因为'不管'是apache还是'nginx',它们自己都'没有解析动态语言'的功能,而是'分派给'其他模块来做
比如: apache就可以说'内置了php模块',让人感觉好像apache就支持php一样。
uwsgi实现了'wsgi协议'、'uwsgi'、'http'等协议, Nginx中'HttpUwsgiModule'的作用是与uWSGI服务器进行交换
++++++++++++++'架构图如下'++++++++++++++
client ↔ 'Nginx' ↔ 'uWSGI' ↔ 'Python app'
uwsgi和wsgi的区别
(4)uWSGI --> web应用服务器
特点: u是'小写'、WSGI是'大写'
uWSGI 是一个快速的、'纯C语言开发的'、自维护的、对开发者友好的 'WSGI 服务器',旨在提供专业的 'Python web应用发布和开发'
备注: 可使用 C/C++/Objective-C 来'为 uWSGI 编写插件'
而uWSGI 是一个'全功能的 HTTP 服务器',他要做的就是把 'HTTP' 协议'转化成'语言支持的'网络协议'
比如: 把 HTTP 协议转化成 WSGI 协议,让 'Python' 可以'直接使用'。uwsgi 是一种 uWSGI 的'内部协议',使用二进制方式和其他应用程序进行通信
(5)uWSGI扮演的角色
++++++++++'uWSGI扮演了解释服务这样的角色'++++++++++
1)uWSGI先'开几个子进程',然后把你'python程序运行(载入内存)',
2)然后由'C写的部分负责与nginx通信'(通过unix socket或者tcp)
3)uwSGI将接收到的请求'调度到'某个'运行着的python程序里'(以wsgi规范),然后'经过web框架'跑到你的程序
4)再'按wsgi规范回传给uwsgi',再'返回nginx'
备注: uwsgi 服务器还是'独立的套件', 而他'与nginx的通信'用的是'略为修改'的wsgi协议"uwsgi"
说明: 如果是 python 用, 'uwsgi 服务器'甚至可以'直接用pip安装'
(6)wsgi、uwsgi、uWSGI
++++++++++'wsgi' / 'uwsgi' / 'uWSGI' 这'三个概念'的区分
1)wsgi是一种'通信协议'
2)uwsgi也是一种'通信协议'
3)而'uWSGI'是实现了'uwsgi和WSGI'两种协议的'Web服务器'
注意: 不要把uwsgi协议和uWSGI服务器'混淆'
思考:'为什么'有了uWSGI为什么'还需要nginx'
因为nginx具备优秀的'静态内容'处理能力,然后'将python动态内容'转发给'uWSGI服务器',这样可以达到很好的客户端响应。
区分wsgi、uWSGI、uwsgi、php-fpm、CGI、FastCGI的概念
二 Python部署Web开发程序的方法
三 nginx配置python
(1)nginx的uwsgi参数
(2)nginx + uwsgi部署python应用
uwsgi官方文档
① 安装uWSGI服务器 -->方式一
++++++++++++'作用机理'++++++++++++
在nginx和python应用之间加一层'支持wsgi协议'的web服务器
静态文件: 由'nginx'自身进行处理
动态文件: 丢'给WSGI服务器',然后WSGI服务器再丢给'web框架'处理。
备注: 最理想的'支持wsgi协议'的web服务器就是'uWSGI'
yum install uwsgi uwsgi-plugin-python uwsgi-devel python-devel -y
备注: 如果你想'安装所有'的uwsgi插件,则可以'安装uwsgi-plugin-all'软件包
查看版本: uwsgi --version --> '2.0.18'
② 安装uWSGI服务器 -->方式二
python程序员'喜欢的'方式
++++++'安装python2系列的pip'++++++
yum -y install python-pip
pip install --upgrade pip --> '更新pip版本(必须)'
yum -y install python-devel libevent-devel libjpeg-devel --> '必须安装依赖包,否则报错'
pip install wheel uwsgi --> '安装uwsgi'
+++++++++'如果是python3.6+'+++++++++
yum -y install python3-pip
pip3 install --upgrade pip3
yum -y install python3-devel libevent-devel libjpeg-devel
pip3 install wheel uwsgi
+++++++++++++++非必需: pip安装uwsgi'状态检测模块'+++++++++++++++
yum -y install ncurses-devel
pip install setuptools -U --> 将 'distutils 升级'到最新版即可
pip install uwsgitop --> '检测uwsgi运行状态' -->类似 'Linux top 命令' 来查看'监控'数据
③ 比较两种安装方式的差异性
++++++++'(1)uwsgi所对应的python版本'++++++++
备注1: 如果是'pip'安装'uwsgi'可以'通过' uwsgi --python-version查看'对应的python版本'
备注2: 如果是'yum'安装'uwsgi'默认与'OS'python'版本一致'
++++++++'(2)yum安装方式参数不能识别'++++++++
yum -y install python-devel libevent-devel libjpeg-devel --> '非必须'
具体做法: 在上面那些'未识别选项前'加上 '--plugin python' 来告诉 uWSGI 我在'使用 python 插件',后面那些选项你 '用python 插件去解析'
后续: 把'pip安装的uwsgi'参考yum生成的'systemd'进行管理
Ubuntn其它方式安装uwsgi
② uwsgi.ini配置文件
uwsgi配置说明
1) ini配置为 'key = value' 形式
2) 在ini配置文件里,'#号为注释'
3) 布尔值为 true 和 false
4) 在命令行里 uwsgi myconf.ini '等价于' uwsgi --ini myconf.ini
uwsgi.ini常用配置参数详解
uwsgi ini配置文件参数详解
思考: 'socket'、'http-socket'区别?
+++++++++++++++'通俗场景':+++++++++++++++
1)'socket'对应nginx中'uwsgi_pass'配置 --> 'uwsgi协议'进行数据交换 --> '推荐方式'
2)'http-socket'对应nginx中'proxy_pass'配置 --> 'http协议'进行数据交换
③ 启动uWSGI服务
centos yum uwsgi安装报错解决
systemctl 'enable' uwsgi.service
systemctl 'start' uwsgi.service
④ 继续做一些准备工作
thunder-lock参数含义
使用uwsgi emperor模式配置多个站点
确保: uwsgi '和' app.py 属于同一个'目录下' --> 由于'相对路径'的原因
application = app.wsgifunc()' 必不可少',它作为 wsgi 或 uwsgi '操作的handler',uwsgi '不会'运行 '__main__' 中的代码
备注: 参数含义的'解读'
⑤ nginx中的配置 uwsgi_pass
ngx_http_uwsgi_module模块
include uwsgi_params; 'uwsgi参数'
uwsgi_pass 127.0.0.1:8008; 通过'uwsgi转发请求',前面配置'uwsgi.ini'的socket端口'保持一致
uwsgi_read_timeout 15; 设置'请求超时时间'
报错1
'原因': uwsgi.ini中配置为'http-socket',实际应该配置为'socket'
报错2:
官方demo的bug
原因1: 本身'app.py'有问题 --> '==' 和 两个下划线'__'
原因2: web模块'没有导入'
原因3: python版本和'python框架版本'不适配
说明: 安装python的模块'web'实际就是安装'web.py',如果不指定版本默认'安装最新'的版本
web.py是适用于'Python的Web框架',功能强大而又简单
'0.51版本'同时支持'Python 2.7'和'Python> = 3.5'
'0.60版本'不支持Python 2.7,'只支持Python 3.5+'
'主流'三个版本: 0.40, 0.51, 0.60
++++++++++++'解决web安装'++++++++++++
pip install web.py==0.51 --> '适合当前python2.7的版本'
'最终解决': 'wsgi-file' 路径的问题
我的理解: 'wsgi-file'是相对于'chdir'的目录的,而'chdir'默认目录'不是'/etc,所以'导致报错'
参考博客
最终的'效果'
nginx+python+fastcgi环境配置(flup版本)
(4)工作原理
(5)配置Flask和Django -->后续核心掌握
django ini 配置
使用 uwsgi 启动 django 服务
(5)最佳实践
1)在生产环境中'使用Django'或'Flask'提供的'简易web服务器'性能'太差',一般只用于调试
2)最佳实践: 在nginx和python应用'之间'加一层'支持WSGI协议的web服务器'
(1) '静态'文件由nginx进行处理
(2) '动态'文件丢给WSGI服务器,然后WSGI服务器再'丢给web框架处理'
3)最'理想'的'支持WSGI协议'的web服务器就是'uWSGI'
工作原理
python的动静分离