Total Pageviews

Friday, 6 October 2017

基于nginx+uWSGI部署Django

之前在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的版本(https://docs.djangoproject.com/en/1.4/intro/install/),在3.x版本上面会出错。


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

一、安装平台

1、安装MySql-python

#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
 
#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(http://pypi.python.org/pypi)

安装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/”,出现it worked界面则表示成功。

三、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

相关帖子:http://briteming.blogspot.com/2017/10/pythondjango.html
---------------------------------------------------------

用Uwsgi部署Django

我用的是CentOS7Python3.5所以如下:
yum install -y nginx
yum install -y mariadb mariadb-devel mariadb-server
pip3 install uwsgi

编写uwsginginx, mysql配置

按照官方文档的说法如下配置保存在项目根目录下的uwsgi.ini其中%d的含义为“包含配置文件的目录的绝对路径”(结尾是/)%n是“不带扩展名的文件名”
[uwsgi]
socket = %d%n/django.sock
chmod-socket = 666
processes = %k
pidfile = %d%n/master.pid
touch-logreopen = %dsplitlog.py
daemonize = %d%n/run.log
chdir = /website/proxy/
wsgi-file = proxy/wsgi.py
virtualenv = venv
# clear environment on exit
# like pid or unix socket
vacuum = true
然后在/etc/nginx/conf.d/proxy.conf中这样写
server {
    listen 80 default_server;
    server_name example.com;

    client_max_body_size 200M;

    location / {
        include uwsgi_params;
        uwsgi_pass unix://app/django.sock;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-Port $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static/ {
        alias /app/static/;
    }

    location /media/ {
        alias /app/media/;
    }
}
uwsgi_pass的值和uwsgi.ini配置中socket的值必须一致

配置mysql

/etc/my.cnf加入以下代码以配置默认编码为UTF8
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
接下来三条命令
# start mariadb
sudo systemctl start mariadb
# Harden MySQL Server
sudo mysql_secure_installation
sudo systemctl enable mariadb

nginx开机自启动

使用vi /etc/init.d/nginx写入如下代码
#!/bin/bash
# chkconfig: - 85 15
nginx=/usr/sbin/nginx
conf=/etc/nginx/nginx.conf

case $1 in
    start)
        echo -n "Starting Nginx"
        $nginx -c $conf
        echo " done"
    ;;

    stop)
        echo -n "Stopping Nginx"
        $nginx -s stop
        echo " done"
    ;;

    test)
        $nginx -t -c $conf
    ;;

    reload)
        echo -n "Reloading Nginx"
        $nginx -s reload
        echo " done"
    ;;

    restart)
        $0 stop
        $0 start
    ;;

    show)
        ps -aux|grep nginx
    ;;

    *)
        echo -n "Usage: $0 {start|restart|reload|stop|test|show}"
    ;;

esac
然后使用三条命令
sudo chmod +x /etc/init.d/nginx
sudo chkconfig --add nginx
sudo chkconfig nginx on

uwsgi开机自启动

同理使用vi /etc/init.d/uwsgi写入
#!/bin/bash
# chkconfig: - 85 15
conf=配置文件路径
pid=pidfile路径
case $1 in
    start)
        cd $path
        uwsgi $conf
    ;;

    stop)
        uwsgi --stop $pid
    ;;

    show)
        ps -ef|grep uwsgi
    ;;

    reload)
        uwsgi --reload $pid
    ;;

    *)
        echo -n "Usage: $0 {start|restart|stop|show}"
    ;;

esac
然后使用三条命令
sudo chmod +x /etc/init.d/uwsgi
sudo chkconfig --add uwsgi
sudo chkconfig uwsgi on
最后使用命令sudo service uwsgi startsudo service nginx start开启网站

多站点配置方法

配置文件写法同上写好多个配置文件放在一个文件夹下以官方文档推荐的emperor模式运行即可例如我将多个配置文件放在site.d
那么启动它们只需要执行uwsgi --emperor /website/site.d --daemonize /website/site.d/emperor.log即可
然后在Nginx里添加对应的站点配置即可
对于多个类似配置文件建议使用uwsgi自带的变量来编写这样既能减少维护成本又方便快捷变量的中文文档在此 magicvars

No comments:

Post a Comment