Virtualenv+Django+uWSGI+Nginx部署方式备忘录

阅读量(3346)  |  发表 于 2013-05-16 16: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.out 可以看到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

(完)

标签: 无标签

评论 (5)  •  发表博客  • 

分享到:

5 条评论

user

游客 sitin 说:
2013-11-28 07:52:32

纠正一下应为,tail -f -n 1000 nohup.out
Starting nginx: [emerg]: open() "/etc/nginx/uwsgi_params" failed (2: No such file or directory) in /etc/nginx/conf.d/default.conf:11
configuration file /etc/nginx/nginx.conf test failed

用apt-get 安装的nginx,重启的时候出错。不知博主上面记录的就是整个部署的过程吗?

user

游客 2goO 说:
2013-11-29 02:20:41

apt-get 安装的nginx启动出错是因为nginx版本低于0.86,该版本之前没有uWSGI模块。建议编译安装nginx比较新的版本!

user

游客 2goO 说:
2013-11-29 02:24:01

nginx -V 看看版本信息!本文是我部署的时候做的笔记,2goO就是通过这种方式跑。

user

游客 sitin 说:
2013-11-29 03:53:14

博主不知道方便加下gtalk不,还是有些问题。谢谢

user

游客 2goO 说:
2013-12-03 07:31:13

qq: 46790855

我要 评论