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
...
这时候,/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
(完)
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
(完)