uWSGI+Nginx+Django安装和配置

阅读:571 2019-03-19 14:42:31 来源:新网

wsgi是为python语言定义的通用网关接口,它承担pythonweb框架(django、flask、web.py等)和web服务器(nginx、apache、lighttpd等)之间的中间层。

浏览器chrome、firefox、ie等|web服务器nginx、apache等|网关接口cgi、fastcgi、wsgi等|python(程序、web框架)django、flask、tornado等

python中自带的wsgiref就是一种wsgi接口的标准实现,但是,由于100%使用python实现等原因,导致wsgiref实在过于缓慢,只能用于测试和学习。生产环境中我们需要使用性能更高的服务器,目前常用的wsgi服务器有:uwsgi、gunicorn、twisted.web。

uwsgi是用c语言写的高性能wsgi服务器,安装uwsgi前我们需要安装python和c编译器(gcc)。推荐使用python包管理器pip安装uwsgi。

#安装最新稳定版pipinstalluwsgi#也可以安装长期支持版(lts版本)#pipinstallhttp://projects.unbit.it/downloads/uwsgi-lts.tar.gz

在ubuntu下可以使用apt-get来安装

apt-getinstalluwsgi

在fedora、redhat、centos下使用yum安装

yumgroupinstall"developmenttools"yuminstallpython

编译安装,从github下载uwsgi代码,cd到目录下

pythonuwsgiconfig.py--build2测试uwsgi是否安装成功

在终端中输入以下命令查看uwsgi的版本号,如果输出正常,说明uswgi已安装成功

$uwsgi--version2.0.11.1

我们可以编写一个简单的wsgi应用来测试uwsgi是否被安装成功,首先创建一个test.py文件:

#test.pydefapplication(env,start_response):start_response('200ok',[('content-type','text/html')])return[b"helloworld"]#python3#return["helloworld"]#python2

运行uwsgi:

uwsgi--http:8000--wsgi-filetest.py

参数中,http:8000表示使用http协议,端口号为8000,wigi-file则表示要运行的wsgi应用程序文件。uwsgi运行后打开浏览器,访问http://127.0.0.1:8000/,或者是相应服务器地址的8000端口,就可以看到helloworld页面了。

上面的例子中,我们用浏览器直接访问了uwsgi运行的python程序(只有一个入口函数的wsgi测试应用test.py),其访问结构如下所示。

浏览器<->uwsgi<->python

上述方式运行uwsgi服务的过程中,可以使用ctrl+c即可停止服务,在后续的章节中会讲到自动管理和部署。

nginx和django的安装不是本文的重点,故在此略去,只讨论配置部分。在这里,我们要实现的效果如下:

浏览器<->nginx<->uwsgi<->django(python)uwsgi_params配置文件

uwsgi使用的协议不完全是标准的wsgi协议,我们需要从github下载uwsgi_paraments配置文件,并将该文件拷贝到项目路径中(例如:/user/home/pengquanxin/projects/mysite1/)。

接下来,要配置nginx服务器和uwsgi互通,可以使用unix套接字方式和tcp端口方式。在nginx配置文件夹(/etc/naginx/site-enabled或/usr/local/etc/nginx/sites-enabled)中新建网站的配置文件mystie_nginx.conf,输入以下内容:

#mysite_nginx.conf#nginx需要连接的上游upstreamdjango{serverunix:///path/to/your/mysite/mysite.sock;#使用unix套接字#server127.0.0.1:8001;#使用tcp端口请注释上一行,并取消本行注释,这里的端口指的是跑uwsgi的端口}#nginx服务器配置server{#监听端口listen80;#域名server_name.example.com;#编码charsetutf-8;#最大上传大小client_max_body_size75m;#django的media路径location/media{alias/path/to/your/mysite/media;}#静态文件路径location/static{alias/path/to/your/mysite/static;}#将动态请求转发到uwsgi跑的django程序location/{uwsgi_passdjango;include/path/to/your/mysite/uwsgi_params;#从github上下载的uwsgi_params文件路径}}

你也可以把这个配置文件放在项目路径中,然后建立一个链接到nginx配置文件夹:

sudoln-s~/path/to/your/mysite/mysite_nginx.conf/etc/nginx/sites-enabled/部署静态文件

在部署服务器之前,需要先将django的静态文件部署到静态文件夹中,首先,编辑django网站的settings.py文件

static_root=os.path.join(base_dir,"static/")

然后,运行以下命令

pythonmanage.pycollectstatic4启动服务

在启动nginx之前,我们需要先启动uwsgi,进入项目目录然后输入以下命令,在这里我们使用unix套接字方式:

#注:django1.6前的版本需要手动添加wsgi.pyuwsgi--socketmysite.sock

如果nginx和uwsgi跑在同一台服务器上,使用unix套接字就可以了,unix套接字方式性能要高很多,但不能跨机器访问。当nginx和uwsgi不在一台服务器上时,就需要使用tcp端口方式(别忘了更改nginx配置文件,取消相应注释):

uwsgi--socket:8001--modulemysite.wsgi--chmod-socket=664

接下来,启动nginx服务器,就可以访问django站点了。

到这里,我们已经把nginx+uwsgi+django跑起来了,但uwsgi的参数比较多的时候,每次都要输入非常麻烦,这时,我们可以在django项目目录下建立一个mysite.uwsgi.ini

[uwsgi]#项目根目录路径(fullpath)chdir=/path/to/your/project#django的wsgi文件module=mysite.wsgi#virtualenv目录(fullpath)home=/path/to/virtualenvmaster=true#最大工作进程数(cpu密集型建议设为cpu核心数,io密集型建议设为cpu核心数的两倍)processes=16#unix套接字文件路径socket=/path/to/your/project/mysite.sock#socket文件权限#chmod-socket=664#退出时清空环境vacuum=true

然后,直接根据配置文件运行uwsgi即可:

uwsgi--inimysite.uwsgi.ini6管理uwsgiemperor模式

uwsgi的epreror模式可以用来管理机器上部署的uwsgi服务,在这种模式下,会有一个特殊的进程(皇帝)对其它部署的服务(诸侯)进行监视。我们将所有配置文件(ini或xml文件,如上一节中的mysite.uwsgi.ini)统一放到一个文件夹(如:/etc/uwsgi/vassals)中,然后启动emperor模式:

uwsgi--emperor/etc/uwsgi/vassals

这样,就会自动读取文件夹中的配置文件,并自动监控这些uwsgi服务:-检测文件夹中有新的配置文件时,会启动新的uwsgi服务实例-检测到一个配置文件发生改变,会自动重启该服务-检测到一个配置文件被移除,则自动停止该服务-如果一个服务死了(诸侯),皇帝进程会重启该服务-如果监控进程(皇帝)死了,所有服务(诸侯)都会停止

配合eperor模式,在centos、fedora、archlinux中,我们可以用systemd来管理uwsgi,首先,创建一个systemdservice文件(/etc/systemd/system/emperor.uwsgi.service)

[unit]description=uwsgiemperorafter=syslog.target[service]execstart=/root/uwsgi/uwsgi--emperor/etc/uwsgi/vassalsrestart=alwayskillsignal=sigquittype=notifystandarderror=syslognotifyaccess=all[install]wantedby=multi-user.target

这样我们就可以用systemd来管理uwsgi服务了。启动服务:

$systemctlstartemperor.uwsgi.service

查询服务运行状态:

$systemctlstatusemperor.uwsgi.service

停止服务

systemctlstopemperor.uwsgi.service

linux系统中,还有一种通用的方法,就是在init.d或rc.d中加入启动脚本,这种方式不够智能,而且网上资料很多,在这里暂不讨论。

关于参数的具体使用,可以阅读官方文档http://uwsgi-docs.readthedocs.org/en/latest/options.html,在这里列出一些常用的参数:

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服