uwsgi+nginx+django,Python 使用uwsgi
什么是WSGI?WSGI,全称Web Server Gateway Interface,或Python Web Server Gateway Interface,是Web服务器和Web应用程序或为Python语言定义的框架之间的一个简单通用的接口。自从WSGI被开发以来,类似的接口已经出现在许多其他语言中。
WSGI的官方定义是Python Web服务器网关接口。从名字就可以看出来,这个东西是一个网关,也就是关口。网关的功能是协议之间的转换。
WSGI是Web服务器和Web应用程序或应用程序框架之间的底层接口,旨在促进可移植Web应用程序开发的共同点。WSGI是基于现有的CGI标准设计的。
很多框架都是WSGI server自带的,比如Flask、webpy、Django、CherryPy等等。当然表现不好。内置的web服务器更多的是出于测试目的。发布时,使用生产环境中的WSGI服务器或uwsgi配合nginx。
也就是说,WSGI就像一座桥,一边连接着web服务器,另一边连接着用户的应用。但是这座桥的功能很弱,有时候需要其他的桥来帮助它。WSGI的角色如图所示:
WSGI的角色有两个方面:服务器或网关方面和应用程序或应用程序框架方面。服务端调用应用端,提供环境信息和一个回调函数(提供给应用将消息头传递给服务端),接收Web内容作为返回值。
所谓WSGI中间件,是同时实现API的两面,所以可以在WSGI服务和WSGI应用之间进行中介:从WSGI服务器的角度来看,中间件扮演的是应用的角色,从应用的角度来看,中间件扮演的是服务器的角色。“中间件”组件可以执行以下功能:
重写环境变量后,请求消息根据目标URL被路由到不同的应用程序对象。允许多个应用程序或应用程序框架在一个进程中同时运行。通过在网络上转发请求和响应消息,实现负载平衡和远程处理。对内容进行后处理,比如应用XSLT样式表。WSGI的设计确实参考了Java servlet。
UWSGIuWSGI是一个Web服务器,实现了WSGI协议,uWSGI,http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
注意WSGI/uwsgi/uWSGI这三个概念的区别。
看过上一节的WSGI同学都很清楚,这是一个通信协议。Uwsgi是一种类似wsgi的通信协议。UWSGI是一个Web服务器,它实现了两个协议:uwsgi和UWSGI。Uwsgi协议是uWSGI服务器拥有的协议,用于定义要传输的信息类型。每个uwsgi包的前4个字节是对要传输的信息类型的描述,这与wsgi是两回事。
有了uWSGI为什么还要nginx?Nginx具有优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,可以达到良好的客户端响应。
接下来,我们将看看uWSGI的安装、配置和使用。
uWSGI的安装很简单:
安装Pipuwsgi现在让我们试着运行Django。让我们首先在virtualenv中创建一个Django项目:
[root @ nowa magic ~]# CD nowa magic _ venv
[root @ nowa magic nowa magic _ venv]# source bin/activate
(nowa magic _ venv)[root @ nowa magic nowa magic _ venv]# django-admin . py startprojectnowamagic _ pjvirtualenv路径和目录文件如下:
Django项目的路径和目录文件如下:
测试uwsgi以在您的服务器上编写test.py:
# test.py
定义应用程序(env,start_response):
start_response(200 OK ,[(Content-Type , text/html)])
返回 Hello World 我的test.py的路径是/root/nowa magic _ venv/nowa magic _ pj/test . py,执行以下命令:
[root @ nowa magic ~]# CD nowa magic _ venv
[root @ nowa magic nowa magic _ venv]# source bin/activate
(nowa magic _ venv)[root @ nowa magic nowa magic _ venv]# uws gi-http:8001-wsgi-file/root/nowa magic _ venv/nowa magic _ pj/test . py访问网页3358115.28.0.89: 8000。
测试你的姜戈项目前面我们用姜戈-行政。py立即开始项目创建了一个项目,现在我们用姜戈自带的网服务器看看我们的项目有没出问题。还是进入我们虚拟环境:
[root @ nowa magic ~]# CD nowa magic _ venv
[root @ nowa magic nowa magic _ venv]# source bin/activate
(nowa magic _ venv)[root @ nowa magic nowa magic _ venv]# python 2.7/root/nowa magic _ venv/nowa magic _ pj/manage。py runserver 0。0 .0 .0:8002执行这个命令报错:没有名为姜戈.核心.管理的模块,原因应该是装了多个版本的计算机编程语言导致的。命令指定文件路径就行,丑是丑些了
(nowa magic _ venv)[root @ nowa magic nowa magic _ venv]#/usr/local/bin/python 2.7/root/nowa magic _ venv/nowa magic _ pj/manage。py runserver 0。0 .0 .0:8002好的,启动姜戈自带的服务器了,我们再访问http://115.28.0.89:8002/,成功显示:
说明姜戈项目也没问题。
连接姜戈和方法最后一步了,我们要把方法与姜戈连接起来。
编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下。我的放在/root/nowa magic _ venv/nowa magic _ pj/下:
#!/usr/bin/env python
#编码:utf-8
导入操作系统
导入系统
# 将系统的编码设置为UTF8
重新加载(系统)
sys.setdefaultencoding(utf8 )
OS。环境。设置默认值( DJANGO _ SETTINGS _ MODULE , nowamagic_pj.settings )
从django.core.handlers.wsgi导入WSGIHandler
application=WSGIHandler()注意不要直接复制,有个地方要改:注意到语句os.environ.setdefault。比如我的项目为nowamagic_pj,则语句应该是OS。环境。设置默认值( DJANGO _ SETTINGS _ MODULE , nowamagic_pj.settings )
好吧,进入虚拟环境执行指令:
[root @ nowa magic ~]# CD nowa magic _ venv
[root @ nowa magic nowa magic _ venv]# source bin/activate
(nowa magic _ venv)[root @ nowa magic nowa magic _ venv]# uws gi-http:8000-chdir/root/nowa magic _ venv/nowa magic _ pj/-module django _ wsgi成功显示姜戈,成功了页面。
这样,你就可以在浏览器中访问你的姜戈程序了。所有的请求都是经过方法传递给姜戈程序的。
这里我们介绍了如何把方法与姜戈连接起来,在下一篇将继续介绍如何将方法与Nginx连接。
上一篇介绍了uWSGI来部署姜戈程序,但在在生产环境中单单只有uWSGI是不够的,Nginx是必不可少的工具。
先安装Nginx,可以参照前面的小节:使用每分钟转数安装Nginx。
Nginx配置在nginx.conf上加入/修改,我的计算机网络服务器配置如下(一切从简……):
服务器{
听80;
服务器名115.28.0.89;
#服务器名称本地主机;
access _ log/home/nowa magic/logs/access。日志;
error _ log/home/nowa magic/logs/error。日志;
# root/root/nowa magic _ venv/nowa magic _ pj;
位置/{
华盛顿大学SGI _ pass 127。0 .0 .1:8077;
#包含uwsgi _ params
包括/etc/nginx/uws gi _ params;
# uws gi _ pass 127。0 .0 .1:8077;
#uwsgi_param UWSGI_SCRIPT索引;
# uw SGI _ param uw SGI _ py home $ document _ root;
# uw SGI _ param uw SGI _ CHDIR $ document _ root;
}
访问_注销
}注意保证配置里写的目录/home/nowamagic/logs/和/home/nowamagic/logs/存在,接下来就没啥问题了,Nginx配置很简单。
uWSGI配置前面我们是直接使用命令行来启动uWSGI,在实际部署环境中,我们常用的是配置文件的方式,而非命令行的方式。
我的姜戈程序目录:/root/nowa magic _ venv/nowa magic _ pj/
这里让Nginx采用8077 端口与uWSGI通讯,请确保此端口没有被其它程序采用。
uWSGI支持多种配置文件格式,比如xml、ini、json等等都可以。
1.可扩展标记语言配置
请确定你在上一节中的django_wsgi.py文件已经存在了。新建一个可扩展置标语言文件:nowamagic_pj.xml,将它放在/root/nowa magic _ venv/nowa magic _ pj目录下
方法
插座127 .0 .0 .1:8077/插座
听80/听
主真/主
python路径/root/nowa magic _ venv/nowa magic _ pj/python路径
流程1/流程
日志日期真实/日志日期
daemonize/var/log/uws gi。日志/后台化
插件python/插件
/uwsgi然后执行命令:
uw SGI-x/root/nowa magic _ venv/nowa magic _ pj/nowa magic _ pj . XML
或者
/usr/local/bin/uws gi-x/root/nowa magic _ venv/nowa magic _ pj/nowa magic _ pj . xml加载指定的XML配置文件。使用命令行参数时,可以使用简化的命令“-x”。当然,也可以缩写成:
UWSGI-xml/etc/nowamagic.xml,即使命令行的最后一个参数以“.”结尾。xml”,这意味着XML文件将作为配置加载。
Uwsgi /etc/nowamagic.xml有时,由于各种环境问题,无法识别-x-XML命令。您可以使用以下ini配置方法:
2.ini配置
[uwsgi]
vhost=false
插件=python
插座=127.0.0.1:8077
主=真
启用-线程=真
工人=1
wsgi-file=/root/nowa magic _ venv/nowa magic _ pj/nowa magic _ pj/wsgi . py
virtualenv=/root/nowa magic _ venv
chdir=/root/nowa magic _ venv/nowa magic _ pj,然后执行命令:
uws gi-ini/root/nowa magic _ venv/nowa magic _ pj . ini uws gi就这样开始了。如果不出意外,你可以在线访问你的Python项目。
插曲我配置Nginx和uWSGI后,访问时显示502错误。查看uWSGI启动信息,发现了这个:ImportError:没有名为django.core.wsgi的模块。
然后,推断我的CentOS上的Python版本是2.4.3,然后进入virtualenv并执行:
大蟒
进口django
从django.core.wsgi导入get _ wsgi _ application没有报错,因为我的虚拟环境中的Python版本是2.7.5。推论是对的,但是虚拟环境中的Django会默认调用外部环境中的Python。解决方案:pip在虚拟环境中安装django。
好了,问题解决了,一切正常。
附上一些我在配置中用过的命令,这样就不用搜索了:
1.关闭uWSGI:
killall -9 uwsgi
killall -s HUP /var/www/uwsgi
杀死所有-s hup/usr/local/bin/uwsgi2。列出端口占用率:
netstat -lpnt
涉及
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。