uWSGI相关
http://heipark.iteye.com/blog/1750970
What is WSGI ?
WSGI is the Web Server Gateway Interface. It is a specification for web servers and application servers to communicate with web applications (though it can also be used for more than that)
WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。
关于WSGI协议看这里:WSGI
what is uWSGI ?
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。
Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
WSGI vs uwsgi(小写) vs uWSGI ?
uwsgi同WSGI一样是一种通信协议,而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
关于uwsgi协议看这里:The uwsgi protocol
有了uWSGI为什么还需要nginx?
nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。
why uWSGI ?
how to use uWSGI ?
安装uWSIG
参考:
http://wsgi.readthedocs.org/en/latest/what.html
http://stackoverflow.com/questions/7739810/wsgi-vs-uwsgi-with-nginx
http://www.zhihu.com/question/21016845
重启 uwsgi 进程显然是为了让新代码生效, 如果你仅是在开发环境调试程序,直接使用django 的 manager.py runserver 可以自动重载修改的py文件, 生产环境也不会存在你在上面不停修改py文件而需要不停重载uwsgi的需求吧.
另外可以参考 uwsgi 的控制信号 Managing the uWSGI server
如果要重载 uwsgi 的程序, 只需要发送一个 SIGHUP 的信号给 uwsgi 的主进程即可.
uwsgi --reload uwsgi.pid
其中uwsgi.pid是进程的pid文件
uwsgi本身就是这样的机制,主要还是为了效率。它有一个reload的参数,可以指定某个文件,当文件发生变化时,会自动重启。你也可以考虑用这个。
====================================================================================
http://django-china.cn/topic/101/
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。
在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。
可见,uwsgi的作用就类似一个桥接器。起到桥梁的作用。
NOTE:不使用nginx,只使用uwsgi+django也是可以实现WEB服务的。uwsgi也可以直接处理WEB请求。
为了完成上述的方式部署,我将分成两篇文章来分别进行阐述。
-
第一步先解决uwsgi与django的桥接。解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器。
-
第二步解决uwsgi与Nginx的桥接。通过nginx与uwsgi的桥接,打通nginx与django的连通,从而比较完美的实现django的部署。
本文将分成五步来详细阐述uwsgi+django的部署方式。nginx+uwsgi+django的部署将在下一篇 文章中阐述。
本文大纲:
- 环境介绍
- 安装uwsgi
- 测试uwsgi
- 配置django
- 连接django和uwsgi,实现简单的WEB服务器。
环境介绍
- Ubuntu 12.04.1 LTS
- django 1.4.2
安装uwsgi
1.安装pip
可以参考这篇文章:http://www.jsxubar.info/install-pip.html
2.安装uwsgi
$ export LDFLAGS="-Xlinker --no-as-needed" $ pip install uwsgi
测试uwsgi
在你的机器上写一个test.py
# test.py def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return "Hello World"
然后执行shell命令:
uwsgi --http :8001 --wsgi-file test.py
访问网页:
看在网页上是否有Hello World
配置django
NOTE:
请保证你的django项目是正常使用的。可以使用
python manage.py runserver 0.0.0.0:8002
来测试一下你的django项目是否能正常跑起来。
请保证你的django程序已经关闭。
编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下。
注意: 编写文件时需要注意语句os.environ.setdefault。比如,如果你的项目为mysite,则你的语句应该是
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/usr/bin/env python # coding: utf-8 import os import sys # 将系统的编码设置为UTF8 reload(sys) sys.setdefaultencoding('utf8') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") from django.core.handlers.wsgi import WSGIHandler application = WSGIHandler() |
连接django和uwsgi,实现简单的WEB服务器。
我们假设你的Django项目的地址是/home/work/src/sites/testdjango1/testdjango/mysite,
然后,就可以执行以下命令:
uwsgi --http :8000 --chdir /home/work/src/sites/testdjango1/testdjango/mysite --module django_wsgi
这样,你就可以在浏览器中访问你的Django程序了。所有的请求都是经过uwsgi传递给Django程序的。
最后:
关于如何将uwsgi与Nginx连接,可以期待下篇文章 《五步教你实现使用Nginx+Uwsgi+Django方法部署Django程序(下)》
最后面,请大家要支持Django中国社区哦,单靠一两个人是不行的,一起推广一下,让Django社区更有力量哈!更有人气哈!
推广链接: http://django-china.cn/
参考、解释及其它
-
wsgi: WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。
关于WSGI协议看这里:WSGI
-
uWSGI: http://uwsgi-docs.readthedocs.org/en/latest/index.html uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
-
uwsgi: uwsgi同WSGI一样是一种通信协议,而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
关于uwsgi协议看这里:The uwsgi protocol
-
有了uWSGI为什么还需要nginx?
nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。
END
Last edited by Django中国社区 (2013-05-12 23:35)
http://django-china.cn/topic/124/
在上一篇文章《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》中,阐述了如何只使用uWSGI来部署Django程序。
当然,单单只有uWSGI是不够的,在实际的部署环境中,Nginx是必不可少的工具。
在本篇文章中,我将一直延用“N步法”的风格来阐述如何将uWSGI与Nginx做连接来部署Django程序。并在最后,会较为完整的阐述本社区的部署方法。
本文大纲:
- 环境介绍
- 配置uWSGI
- 配置Nginx
- Nginx+uWSGI+Django的实现方式
- 一些建议
环境介绍
- Ubuntu 12.04.1 LTS
- django 1.4.2
- nginx/1.2.6
- uWSGI 1.4.4
关于uWSGI的安装可参见上一篇文章 上一篇文章《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》
我们假定你已经安装好Nginx了。
配置uWSGI
在上一篇文章《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》中,我们是直接使用命令行来启动uWSGI,在实际部署环境中,我们常用的是配置文件的方式,而非命令行的方式。我的一般做法是用命令行来测试是否uWSGI安装成功,然后用配置文件来真正部署。
另外,为了实现Nginx与uWSGI的连接,两者之间将采用soket来通讯方式。
在本节中,我们将使用uWSGI配置文件的方式来改进uWSGI的启动方式。
假定你的程序目录是 /home/work/src/sites/testdjango1/testdjango/mysite
我们将要让Nginx采用8077端口与uWSGI通讯,请确保此端口没有被其它程序采用。
注意,请确定你在上一节《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》中的django_wsgi.py文件已经存在了。
新建一个XML文件:
djangochina_socket.xml,将它放在 /home/work/src/sites/testdjango1/testdjango/mysite 目录下:
<uwsgi> <socket>:8077</socket> <chdir>/home/work/src/sites/testdjango1/testdjango/mysite</chdir> <module>django_wsgi</module> <processes>4</processes> <!-- 进程数 --> <daemonize>uwsgi.log</daemonize> </uwsgi>
在上面的配置中,我们使用 uwsgi.log 来记录日志,开启4个进程来处理请求。
这样,我们就配置好uWSGI了。
配置Nginx
我们假设你将会把Nginx程序日志放到你的目录/home/work/var/test/logs/下,请确保该目录存在。
我们假设你的Django的static目录是/home/work/src/sites/testdjango1/testdjango/collectedstatic/ , media目录是/home/work/src/sites/testdjango1/testdjango/public/media/,请确保这些目录存在。
我们假设你的域名是 www.you.com (在调试时你可以设置成你的机器IP)
我们假设你的域名端口是 80(在调试时你可以设置一些特殊端口如 8070)
基于上面的假设,我们为conf/nginx.conf添加以下配置
server { listen 80; server_name www.you.com; access_log /home/work/var/test/logs/access.log; error_log /home/work/var/test/logs/error.log; #charset koi8-r; #access_log logs/host.access.log main; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8077; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location /static/ { alias /home/work/src/sites/testdjango1/testdjango/collectedstatic/; index index.html index.htm; } location /media/ { alias /home/work/src/sites/testdjango1/testdjango/public/media/; } }
在上面的设置后,可以让Nginx来处理静态文件(/static/ 和 /media/ )。非静态文件请求Nginx会发给 socket 8077,然后让uWSGI来进行处理。
Nginx+uWSGI+Django的实现方式
在完成上面配置后,需要按以下步骤来做:
-
重启Nginx服务器,以使Nginx的配置生效。
nginx -s reload
重启后检查Nginx日志是否有异常。
-
启动uWSGI服务器
cd /home/work/src/sites/testdjango1/testdjango/mysite uwsgi -x djangochina_socket.xml
检查日志 uwsgi.log 是否有异常发现。
-
访问服务
基于上面的假设你的域名是www.you.com
因此,我们访问 www.you.com,如果发现程序与 单独使用Django启动的程序一模一样时,就说明成功啦!
-
关闭服务的方法
将uWSGi进程杀死即可。
一些建议
-
uWSG配置文件的进程数,可以根据实际情况分配。不要开得太大,否则机器可能会内存耗用太高。一般来说,对于一个小社区来说,4个进程已经足够了。
-
一般情况下,可以编写一下 stop.sh 脚本 来关闭uWSGI。
最后
最后面,请大家要支持Django中国社区哦,单靠一两个人是不行的,一起推广一下,让Django社区更有力量哈!更有人气哈!
推广链接: http://django-china.cn/
END
=========================================================================
http://blog.chinaunix.net/uid-26638338-id-3552185.html
最近学习了python框架,并且利用框架做了个后台管理系统,经过综合的对比,最后决定让管理后台运行在nginx+uwsgi构架上。
性能方面,uWSGI既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据说该协议大约是fcgi协议的10倍那么快(暂时无法论证)。想深入了解uwsgi的同学可以访问官方wiki http://projects.unbit.it/uwsgi/wiki。
uwsgi的另一个强大之处在于可以支持很多种编程语言,包括python(最初支持的就是python)、lua、perl、ruby、Erlang、PHP、GO、JVM。并且可以同时支持多种框架。本文是以python的django框架为例,同时uwsgi还支持python的web.py、flask、web2py等框架。
以下开始部署安装:
1、安装并配置nginx
nginx安装暂时不介绍,可自行搜索下装法。新版nginx都已经默认支持uwsg。
打开nginx.conf,并加入一个主机配置
点击(此处)折叠或打开
- server {
- server_name www.mysite.com;
- location / {
- set $app mysite;
- include uwsgi_params;
- uwsgi_pass 127.0.0.1:3031;
- }
- }
2、安装并配置uwsgi
点击(此处)折叠或打开
- wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
点击(此处)折叠或打开
- tar zxvf uwsgi-latest.tar.gz
- cd uwsgi-1.9
- make
- cd ..
点击(此处)折叠或打开
- mv uwsgi-1.9 /usr/local/uwsgi
- cd /usr/local/uwsgi
- mkdir -p conf
- cd conf
- cat >server.ini <<EOF
- [uwsgi]
- socket = 127.0.0.1:3031 #建立的socket端口
- chdir = /home/server/mysite/ #django项目所在目录
- pythonpath = /usr/local/python2.7/ #python目录
- env = DJANGO_SETTING_MODULE=mysite.settings.py
- processes = 4
- threads = 2
- wsgi-file = /usr/local/uwsgi/conf/serverlist.py #另一个配置文件的位置
- EOF
- cat > server.py<<EOF
- #serverlist.py
- import sys
- import os
- from django.core.handlers.wsgi import WSGIHandler
- mysite_dir = '/home/server/mysite/'
- #sys.path.append(os.path.abspath(os.path.dirname(__file__)))
- sys.path.append(mysite_dir)
- os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
- application = WSGIHandler()
- EOF
3、启动uwsgi并访问网站
打开www.mysite.com (视自己网址而定)即可看到网站页面。
个人觉得php最方便的就是deployment了,只要把php文件丢到支持php的路径里面,然后访问那个路径就能使用了;无论给主机添加多少php应用,只要把目录改好就没你的事了,完全不用关心php-cgi运行得如何,deployment极为方便。
反观python,部属起来真是头痛,常见的部署方法有:
- fcgi:用spawn-fcgi或者框架自带的工具对各个project分别生成监听进程,然后和http服务互动
- wsgi:利用http服务的mod_wsgi模块来跑各个project
无论哪种都很麻烦,apache的mod_wsgi配置起来很麻烦,内存占用还大,如果要加上nginx作为静态页面的服务器那就更麻烦了;反正我的应用基本上到后来都是是各个project各自为战,且不说管理上的混乱,这样对负载也是不利的,空闲的project和繁忙的project同样需要占用内存,很容易出现站着茅坑不拉屎的现象。
如果有个啥东东能像php-cgi一样监听同一端口,进行统一管理和负载平衡,那真是能省下大量的部署功夫。偶然看到了uWSGI,才发现居然一直不知道有那么方便地统一部署工具。
uWSGI,既不用wsgi协议也不用fcgi协议,而是自创了一个uwsgi的协议,据说该协议大约是fcgi协议的10倍那么快,有个比较见下图
uWSGI的主要特点如下,其中一些功能让我感动得泪流满面
- 超快的性能
- 低内存占用(实测为apache2的mod_wsgi的一半左右)
- 多app管理(终于不用冥思苦想下个app用哪个端口比较好了-.-)
- 详尽的日志功能(可以用来分析app性能和瓶颈)
- 高度可定制(内存大小限制,服务一定次数后重启等)
总而言之uwgi是个部署用的好东东,正如uWSGI作者所吹嘘的:
If you are searching for a simple wsgi-only server, uWSGI is not for you, but if you are building a real (production-ready) app that need to be rock-solid, fast and easy to distribute/optimize for various load-average, you will pathetically and morbidly fall in love (we hope) with uWSGI.
正式开工
uwsgi的文档虽然蛮多也很详细,但是他们网站的排版真是让人无语,粗粗看上去根本不知道文档在哪里。其实是在这里:http://projects.unbit.it/uwsgi/wiki/Doc
0.安装uwsgi
ubuntu有uwsgi的ppa
add-apt-repository ppa:stevecrozz/ppa apt-get update apt-get install uwsgi
1. 用uwsgi代替mod_wsgi
nginx的整体配置说来话长,我也不再罗嗦了,假设已经明白nginx的基本配置,那么uwsgi就类似这么配置:
location / { include uwsgi_params uwsgi_pass 127.0.0.1:9090 }
这就是把所有url传给9090端口的uwsgi协议程序来互动。
再到project目录建立myapp.py,使得application调用框架的wsgi接口,比如web.py就是
...... app = web.application(urls, globals()) application = app.wsgifunc()
再比如django就是
....... from django.core.handlers.wsgi import WSGIHandler application = WSGIHandler()
然后运行uwsgi监听9090,其中-w后跟模块名,也就是刚才配置的myapp
uwsgi -s :9090 -w myapp
运行网站发现已经部署完成了。
2. uwsgi的参数
以上是单个project的最简单化部署,uwsgi还是有很多令人称赞的功能的,例如
并发4个线程
uwsgi -s :9090 -w myapp -p 4
主控制线程+4个线程
uwsgi -s :9090 -w myapp -M -p 4
执行超过30秒的client直接放弃
uwsgi -s :9090 -w myapp -M -p 4 -t 30
限制内存空间128M
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128
服务超过10000个req自动respawn
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000
后台运行等
uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log
更多用法见文档:http://projects.unbit.it/uwsgi/wiki/Doc
3.为uwsgi配置多个站点
为了让多个站点共享一个uwsgi服务,必须把uwsgi运行成虚拟站点:去掉“-w myapp”加上”-vhost”
uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log --vhost
然后必须配置virtualenv,virtualenv是python的一个很有用的虚拟环境工具,这样安装
apt-get install python-setuptools easy_install virtualenv
然后设置一个/多个app基准环境
virtualenv /var/www/myenv
应用环境,在此环境下安装的软件仅在此环境下有效
source /var/www/myenv/bin/activate pip install django pip install mako ...
最后配置nginx,注意每个站点必须单独占用一个server,同一server不同location定向到不同的应用不知为何总是失败,我猜也算是一个bug。
server { listen 80; server_name app1.mydomain.com; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; uwsgi_param UWSGI_PYHOME /var/www/myenv; uwsgi_param UWSGI_SCRIPT myapp1; uwsgi_param UWSGI_CHDIR /var/www/myappdir1; } } server { listen 80; server_name app2.mydomain.com; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; uwsgi_param UWSGI_PYHOME /var/www/myenv; uwsgi_param UWSGI_SCRIPT myapp2; uwsgi_param UWSGI_CHDIR /var/www/myappdir2; } }
如此这般,重启nginx服务,两个站点就可以共用一个uwsgi服务了。
4.实战应用
最初的设置完毕以后,再添加的应用,只需要在nginx里面进行少量修改,无需重启uwsgi,就能立刻部署完毕。uwsgi自带了基于django的监控uwsgi运行状态的工具,就拿它来部署好了:
server { listen 80; root /var/www/django1.23; index index.html index.htm; server_name uwsgiadmin.django.obmem.info; access_log /var/log/nginx/django.access.log; location /media/ { root /var/www/django1.23/adminmedia; rewrite ^/media/(.*)$ /$1 break; } location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; uwsgi_param UWSGI_PYHOME /var/www/django1.23/vtenv; uwsgi_param UWSGI_CHDIR /var/www/django1.23/uwsgiadmin; uwsgi_param UWSGI_SCRIPT uwsgiadmin_wsgi; } }
于是uwsgi的监控信息可以在http://uwsgiadmin.django.obmem.info 看到用户名密码都是admin。
再比如LBForum论坛程序的部署:根据安装说明安装完毕,再按部署说明修改完配置文件,然后只需修改nginx配置文件:
server { listen 80; root /var/www/django1.23; index index.html index.htm; server_name lbforum.django.obmem.info; access_log /var/log/nginx/django.access.log; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; uwsgi_param UWSGI_PYHOME /var/www/django1.23/vtenv; uwsgi_param UWSGI_CHDIR /var/www/django1.23/LBForum/sites/default; uwsgi_param UWSGI_SCRIPT lbforum_wsgi; } }
于是 http://lbforum.django.obmem.info 就是论坛程序了。
后记
虽然写出来寥寥几行,配置的时候我可吃尽了uwsgi的苦头,有些想当然的用法完全不能成立,-no-site参数一加上去其他都好使LBForum怎么都部署不了,一开始多站点公用uwsgi怎么都成功不了等等。
python世界很有趣,一直会发现好玩的东东,但是python世界也很折腾人,大部分东东都是dev版本,文档缺失,各种兼容问题……大约是因为在python中,有个idea到实现出来实在是太过高效的关系吧,唉,被折腾死了。
########################################################################################
http://www.cnblogs.com/QLeelulu/archive/2011/03/02/1969289.html
抛弃Fastcgi,用uwsgi来部署你的Django程序吧
在新浪微群一天一技术分享里面看到一篇有童鞋分享的一篇fcgi vs. gunicorn vs. uWSGI的文章,文章的测试附图很是让人兴奋:
于是自己在本地测试了一下,结果基本和上面的结果一致。
(以下为简单的ab测试结果: ab –c 100 –n 1000 http://127.0.0.1/ )
首先是 nginx + fcgi的结果(fcgi prefork 4 processors):
接着是nginx + uwsgi的结果(uwsgi 4 workers):
这个测试结果基本和我上次测试的node.js的结果差不多了。
怎样安装uwsgi和部署,这里就不多说了,直接贴两个链接:
http://www.westphahl.net/blog/2010/4/8/running-django-nginx-and-uwsgi/
uwsgi已经是nginx的内置模块了,所以nginx+uwsgi部署还是很方便的。
uwsgi可以通过命令行、xml文件、ini文件等方式来配置运行参数,配置起来也算简单。
忘了uwsgi的官方地址:http://projects.unbit.it/uwsgi/wiki
最后贴一下uwsgi官网的一个FAQ:
哈哈~~~HTTP协议真可怜。


出处:http://QLeelulu.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利

http://artori.us/easy-deploy-with-uwsgi/
快速使用uwsgi部署
之前尝试在阿里云部署一个bottle.py写的web服务,选择了unbuntu12.04,一穷二白的ubuntu上用uwsgi部署还挺简单的。这里简单记录一下。
先要改一改程序代码,声明一个application
1
|
|
然后安装uwsgi,demo.py就是修改过的bottle的代码。
这里我遇到了— unavailable modifier requested: 0 --
,要安装uwsgi-plugin-python,并且uwsgi启动时候添加--plugin python
一些uwsgi的操作看这里
1 2 |
|
安装nginx
1 2 3 4 5 6 7 |
|
最后配置nginx。默认安装路径在/usr/local/nginx/conf/nginx.conf
1 2 3 4 5 6 7 8 9 10 11 |
|
自此搞定
via:
- http://stackoverflow.com/questions/10748108/nginx-uwsgi-unavailable-modifier-requested-0
- http://lists.unbit.it/pipermail/uwsgi/2011-November/002923.html
- http://aaronsnow.tumblr.com/post/11560674160/nginx-uwsgi-bottle-py
- https://groups.google.com/forum/?fromgroups=#!topic/bottlepy/wRfgm4obLXk
- http://blog.felixc.at/2011/01/ubuntu-uwsgi-nginx-bottle-configuration/
- http://apt-blog.net/moinmoin-on-nginx-via-fastcgi-and-uwgi
- http://down.chinaz.com/server/201112/1467_1.htm
http://2goo.info/blog/panjj/Django/2013/05/16/549
Virtualenv+Django+uWSGI+Nginx部署方式备忘录
阅读量(1409) | 发表 于 2013-05-17 00:44:17
Nginx 0.86以后的版本内置了uWSGI模块,用它部署Django应用性能不错,而且很省内存,所以一年前尝试Virtualenv+Django+uWSGI+Nginx这种组合方式去部署2goO网站,因为那时只看到uWSGI的测试结果,很兴奋,什么材料都没有看,直接下载包安装到服务器上折腾了,一时不了解里面的机制原理,过程中竟然遇到了很大的挫折,相比fastCGI,个人感觉难了不少,所以就放下了,终于到了2012年的年底,趁着春节,有点时间,啃了一晚上,终于搞定了。以下作为笔记以备忘。
Virtualenv可以建立一个独立的Python虚拟环境,使Python环境不受另一个环境的干扰。我喜欢这种方式去部署Django应用,因为每个Djanog应用所引用到的第三方库是不完全相同的,隔开后,让环境免遭污染。
Django 1.3以后完全支持wsgi协议,新建的项目myproject文件夹里就有一个wsgi.py文件,我没有修改里面的东西,直接在虚拟环境里安装uWSGI,使用它和wsgi.py文件桥接即可。
安装步骤:
在虚拟环境里安装uWSGI: pip install uwsgi
Virtualenv的安装和建立环境参考之前写的:《Django环境搭建常用的工具及做法》 http://2goo.info/blog/panjj/Django/2011/06/05/521
完整步骤如下:
#先安装pip工具
apt-get install python-pip
#再安装virtualenv包
pip install -U virtualenv
#直接到/home/www-data/目录下建立一个twogoo的虚拟环境
cd /home/www-data/
virtualenv --no-site-packages --distribute twogoo
#进入建立好的twogoo环境 安装项目所需的python库,比如uWSGI PIL psycopg2 Django South等等
cd twogoo
source bin/activate
#在虚拟环境twogoo里安装uWSGI
pip install uwsgi
#安装其他库
pip install Django==1.4.5
pip install South
...
在虚拟环境里新建项目myproject:
django-admin.py startproject myproject
这时候,/home/www-data/twogoo/ 这个文件夹就是我建立的虚拟环境了,twogoo里面的结构如下:
twogoo
..lib
..local
..include
..myproject #我建立的项目
....myproject
......wsgi.py
......settings.py
......urls.py
...... ...
....static
....media
....templates
....manage.py
安装uwsgi后,需要简单的配置启动参数,这次使用ini文件配置,当然可以使用其他的文件格式,参考官方文档吧。
我在twogoo文件夹里建立一个配置文件 twogoo_uwsgi.ini,twogoo_uwsgi.sock
cd /home/www-data/twogoo/
touch twogoo_uwsgi.ini
touch twogoo_uwsgi.sock
这时twogoo里面的结构如下:
twogoo
..lib
..local
..include
..myproject #我建立的项目
....myproject
......wsgi.py
......settings.py
......urls.py
...... ...
....static
....media
....templates
....manage.py
..twogoo_uwsgi.ini #刚才建立的配置文件
..twogoo_uwsgi.sock #配置文件用到的sock文件
twogoo_uwsgi.ini 文件里的内容如下:
[uwsgi]
vhost = false #注意多个项目的时候不能true哦,否则多个项目都共用这个配置参数了,这个很折腾人
plugins = python
#socket = 127.0.0.1:9000 #这个注释掉了,我采用sock的方式,当然你可以使用端口方式,nginx配置的时候修改一下即可
socket = /home/www-data/twogoo/twogoo_uwsgi.sock #配置文件用到的sock文件
master = true
enable-threads = true
workers = 6 #进程数
wsgi-file = /home/www-data/twogoo/myproject/myproject/wsgi.py #这是项目wsgi.py文件的路径
virtualenv = /home/www-data/twogoo/ #twogoo虚拟环境的路径
chdir = /home/www-data/twogoo/myproject #twogoo下myproject项目的路径
配置文件已经好了,在twogoo_uwsgi.ini(/home/www-data/twogoo/)同级目录下可以启动uwsgi了:
nohup uwsgi --ini twogoo_uwsgi.ini&
好,ctrl+c
tail -f -n 1000 nohup.ou 可以看到uwsgi是否启动成功了。
剩下就是配置nginx,让nginx代理uwsgi进程:
我那时是通过apt-get安装nginx的,默认路径在/etc/nginx/下,配置步骤:
新建twogoo.conf文件,并配置参数
touch /etc/nginx/sites-enabled/twogoo.conf
nano /etc/nginx/sites-enabled/twogoo.conf
配置参数如下:
server {
listen 80;
server_name 2goo.info www.2goo.info;
access_log /home/www/twogoo/logs/access.log;
error_log /home/www/twogoo/logs/error.log;
root /home/www/twogoo/myproject;
index index.html index.htm;
charset utf-8;
location ~ ^/static/
{
root /home/www/twogoo/myproject/;
expires 24h;
access_log off;
}
location ~ ^/media/
{
root /home/www/twogoo/myproject/;
expires 24h;
access_log off;
}
location / {
uwsgi_pass unix:/home/www/twogoo/twogoo_uwsgi.sock;
# uwsgi_pass 127.0.0.1:9000;
include /etc/nginx/uwsgi_params;
proxy_http_version 1.1;
}
}
配置完成了,重启nginx:
/etc/init.d/nginx restart
(完)
标签: 无标签