有时,爱情能穿越宏大的沧桑抵达幸福,却穿越不了宁静的琐细。

基于LNMP+uWSGI部署Django应用

技术文档 11524浏览 0评论
文章目录[隐藏]

之前在apache上基于mod_wsgi模式安装过Django应用,后来转到LNMP环境,再加上近期uWSGI的流行,本文将基于LNMP+uWSGI重新部署Django应用。

注:1、本文仅实现单站点部署方式,多站点虚拟主机可以通过virtualenv实现。
2、本文的环境是基于LNMP,运行于CentOS,已经安装了Nginx、PHP、MySQL、Memcached。并且操作系统自带了Python 2.6.3版本,可以升级到目前的最新版
3、目前的Django最新版是1.4.2,仅支持Python 2.5--2.7的版本,在3.x版本上面会出错。

基于上述环境,通过uWSGI方式部署Django应用的步骤如下:

一、安装平台

1、安装MySql-python

1
2
3
4
5
6
7
8
#cd /usr/local/src
#wget http://downloads.sourceforge.net/project/mysql-python/mysql-python/1.2.3/MySQL-python-1.2.3.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmysql-python%2Ffiles%2Fmysql-python%2F1.2.3%2F&ts=1353841475&use_mirror=nchc
#tar xzvf MySQL-python-1.2.3.tar.gz
#cd MySQL-python-1.2.3
#vi site.cfg
mysql_config =/usr/local/mysql/bin/mysql_config
#python setup.py build
#python setup.py install

测试:
# python
>>> import MySQLdb
>>>
没有任何输出,安装成功!
如果出现了安装或者使用错误,请参照:http://mysql-python.sourceforge.net/FAQ.html

2、安装setuptools

1
2
3
#cd /usr/local/src
#wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg#md5=fe1f997bc722265116870bc7919059ea
#sh setuptools-0.6c11-py2.7.egg

3、安装pip
pip是一个可以替代 easy_install的安装和管理 python 软件包的工具,具体可以安装的 python 包可以在这里查看 Python Package Index
安装pip之前要确保安装了 setuptools或者distribute

1
2
3
4
5
#cd /usr/local/src
#wget http://pypi.python.org/packages/source/p/pip/pip-1.2.tar.gz
#tar xzvf pip-1.2.tar.gz
#cd pip-1.2
#python setup.py install # 可能需要root权限

pip应用
(1)安装包
# pip install simplejson

(2)更新包
# pip install --upgrade simplejson

(3)移除包
# pip uninstall simplejson

4、安装uWSGI

1
2
3
4
5
6
#cd /usr/local/src
#wget http://projects.unbit.it/downloads/uwsgi-1.4.2.tar.gz
#tar -zxvf uwsgi-1.4.2.tar.gz
#cd uwsgi-1.4.2
#make
#cp uwsgi /usr/bin

5、安装Django

1
2
3
4
5
#cd /usr/local/src
wget https://www.djangoproject.com/download/1.4.2/tarball/
tar -zxvf Django-1.4.2.tar.gz
cd Django-1.4.2
python setup.py install

创建django项目
项目位置:/home/django/xzhu
创建项目方法:

1
2
#cd /home/django
#django-admin.py startproject xzhu

二、平台配置

1、Nginx相关配置

1
2
3
#mkdir /usr/local/nginx/conf/django
#cd /usr/local/nginx/conf/django
#vi django_uwsgi.conf

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# Django project  
server {  
        listen  80;  
        server_name xzhu.loosky.net;  
 
        location / {  
            include     uwsgi_params;  
            uwsgi_pass   127.0.0.1:9000;
            uwsgi_param UWSGI_CHDIR  /home/django/xzhu;
    	    uwsgi_param UWSGI_SCRIPT django_wsgi;  
            access_log  off;  
        }  
}

编辑完成后在nginx.conf追加子配置文件django_uwsgi.conf

1
2
#cd ..
#vi nginx.conf

内容如下:

1
2
3
4
http{  
........  
include django/*.conf;  
}

2、UWSGI配置

1
2
3
4
5
#mkdir -p /home/uwsgi;
#cd /home/uwsgi
#mkdir -p /home/django/logs
#echo "" > /home/django/logs/django.log
#vi uwsgi.xml

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<uwsgi>  
  <socket>127.0.0.1:9000</socket>  
  <listen>200</listen>  
  <master>true</master>  
  <pidfile>/usr/local/nginx/uwsgi.pid</pidfile>  
  <processes>8</processes>  
  <pythonpath>/home/django/xzhu</pythonpath>  
  <pythonpath>/home/django/</pythonpath>  
  <module>django_wsgi</module>  
  <profiler>true</profiler>  
  <memory -report>true</memory>  
  <enable -threads>true</enable>  
  <logdate>true</logdate>  
  <limit -as>6048</limit>  
  <daemonize>/home/django/logs/django.log</daemonize>  
</uwsgi>

3、创建django应用模块

1
2
#cd /home/django/xzhu
#vi django_wsgi.py

内容如下:

1
2
3
4
import os  
os.environ['DJANGO_SETTINGS_MODULE'] = 'xzhu.settings'  
import django.core.handlers.wsgi  
application = django.core.handlers.wsgi.WSGIHandler()

4、启动服务

1
2
#/usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
#/usr/local/nginx/sbin/nginx -s  reload  #重启nginx服务

5、查看进程

1
# ps -ef|grep uwsgi|grep -v grep

内容如下:

root 2429 1 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2431 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2432 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2433 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2434 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2435 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2436 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2437 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml
root 2438 2429 0 10:10 ? 00:00:00 /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml

6、监听端口

1
# netstat -an|grep 9000

tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN

7、访问测试:
输入“http://服务器IP/”,出现如下界面则表示成功。

三、uWSGI/Django应用服务自启动
1、uWSGI启动脚本

1
2
#cd /home/uwsgi/
#vi uwsgiserver

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash  
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
 
# Check if user is root
if [ $(id -u) != "0" ]; then
    printf "Error: You must be root to run this script!\n"
    exit 1
fi
 
if [ "$1" = "start" ]; then
  psid=`ps aux|grep "uwsgi"|grep -v "grep"|wc -l`  
  if [ $psid -gt 2 ];then  
    echo "uwsgi is running!"  
    exit 0  
  else  
    /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml  
    /usr/local/nginx/sbin/nginx -s reload
  fi  
  echo "Start uwsgi service [OK]"  
elif [ "$1" = "stop" ];then  
  killall -9 uwsgi  
  echo "Stop uwsgi service [OK]"  
elif [ "$1" = "restart" ];then  
  killall -9 uwsgi  
  /usr/sbin/uwsgi -x /home/uwsgi/uwsgi.xml  
  /usr/local/nginx/sbin/nginx -s reload
  echo "Restart uwsgi service [OK]"  
else  
  echo "Usages: uwsgiserver [start|stop|restart]"  
fi

则可以通过脚本 /home/uwsgi/uwsgiserver start|stop|restart来 启动|停止|重启 uWSGI服务。

2、开机自启动uWSGI服务
在/etc/rc.d/rc.local中加入:

1
/home/uwsgi/uwsgiserver start

参考:

转载请注明:自由的风 » 基于LNMP+uWSGI部署Django应用

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. uwsgi  的配置部分有点问题,xml的格式节点缺失,监听200,应该是20
    参考:http://www.cnblogs.com/txwsqk/archive/2011/03/15/1984792.html
    对照着来才成功。

    jasonal2013-04-15 22:23 回复