Nginx(二十一)nginx配置python

一    scgi、wsgi、uwsgi

(1)scgi --> 了解

SCGI是一种'与语言无关'的连接'web服务器'和'web应用程序'的方法

Nginx(二十一)nginx配置python_第1张图片

 (2)wsgi --> 协议

​wsgi: 一种'实现python解析'的通用'接口标准/协议',实现了'python web程序'与'web 服务器'之间交互的通用性 --> 'Web 服务器 网关接口'

备注: WSGI是'Web应用程序'的'Python专用接口'标准

好处: 有了这个东西,'web.py'或者'django'等等的'python web开发框架'就可以轻松地'部署'在'不同的web server'上了,基本'不需要'做任何'特殊配置'

Python Web框架 --> 'Django'、'Flask' -->实现了'wsgiI'这个协议

Nginx(二十一)nginx配置python_第2张图片

(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'

 Nginx(二十一)nginx配置python_第3张图片

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(二十一)nginx配置python_第4张图片

三    nginx配置python

(1)nginx的uwsgi参数

Nginx(二十一)nginx配置python_第5张图片

(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

Nginx(二十一)nginx配置python_第6张图片

+++++++++++++++非必需: pip安装uwsgi'状态检测模块'+++++++++++++++

yum -y install ncurses-devel

pip install setuptools -U --> 将 'distutils 升级'到最新版即可

pip install uwsgitop      --> '检测uwsgi运行状态' -->类似 'Linux top 命令' 来查看'监控'数据

Nginx(二十一)nginx配置python_第7张图片

Nginx(二十一)nginx配置python_第8张图片

③  比较两种安装方式的差异性

++++++++'(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配置文件参数详解

Nginx(二十一)nginx配置python_第9张图片

​思考: 'socket'、'http-socket'区别?

+++++++++++++++'通俗场景':+++++++++++++++

1)'socket'对应nginx中'uwsgi_pass'配置       --> 'uwsgi协议'进行数据交换  --> '推荐方式'

2)'http-socket'对应nginx中'proxy_pass'配置  --> 'http协议'进行数据交换

Nginx(二十一)nginx配置python_第10张图片

③  启动uWSGI服务

centos yum uwsgi安装报错解决

systemctl 'enable' uwsgi.service

systemctl 'start' uwsgi.service

Nginx(二十一)nginx配置python_第11张图片

④   继续做一些准备工作

Nginx(二十一)nginx配置python_第12张图片

thunder-lock参数含义 

使用uwsgi emperor模式配置多个站点

确保: uwsgi '和' app.py 属于同一个'目录下'  --> 由于'相对路径'的原因
​
application = app.wsgifunc()' 必不可少',它作为 wsgi 或 uwsgi '操作的handler',uwsgi '不会'运行 '__main__' 中的代码

Nginx(二十一)nginx配置python_第13张图片

备注: 参数含义的'解读'

Nginx(二十一)nginx配置python_第14张图片

⑤  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;         设置'请求超时时间'

Nginx(二十一)nginx配置python_第15张图片

报错1

'原因': uwsgi.ini中配置为'http-socket',实际应该配置为'socket'

Nginx(二十一)nginx配置python_第16张图片

报错2

官方demo的bug

原因1:  本身'app.py'有问题 --> '==' 和 两个下划线'__'

原因2:  web模块'没有导入'

原因3:  python版本和'python框架版本'不适配

Nginx(二十一)nginx配置python_第17张图片

Nginx(二十一)nginx配置python_第18张图片

Nginx(二十一)nginx配置python_第19张图片

说明: 安装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的版本'

Nginx(二十一)nginx配置python_第20张图片

'最终解决': 'wsgi-file' 路径的问题

我的理解: 'wsgi-file'是相对于'chdir'的目录的,而'chdir'默认目录'不是'/etc,所以'导致报错'

参考博客

最终的'效果'

nginx+python+fastcgi环境配置(flup版本)

(4)工作原理

Nginx(二十一)nginx配置python_第21张图片

(5)配置Flask和Django -->后续核心掌握

 django  ini 配置

使用 uwsgi 启动 django 服务

Nginx(二十一)nginx配置python_第22张图片

(5)最佳实践

1)在生产环境中'使用Django'或'Flask'提供的'简易web服务器'性能'太差',一般只用于调试

2)最佳实践: 在nginx和python应用'之间'加一层'支持WSGI协议的web服务器'

  (1) '静态'文件由nginx进行处理

  (2) '动态'文件丢给WSGI服务器,然后WSGI服务器再'丢给web框架处理'

3)最'理想'的'支持WSGI协议'的web服务器就是'uWSGI'

工作原理

python的动静分离

你可能感兴趣的:(nginx,nginx,python,运维)