Django项目部署一之Nginx+uWSGI+Django方法部署Django程序【适用于python2.x,在python3.x中的django2.1.1中不适用】

Django项目部署一之Nginx+uWSGI+Django方法部署Django程序

 

前言:

  python manage.py runserver 0.0.0.0:8000 此启动django项目方法只适用于测试环境,用于生产环境是远远不够的,当并发量一起来,估计很快就要挂掉了;因此,需要添加nginx做转发,基于nginx原本的可承受并发量,使用Nginx+uWSGI+Django架构足以大大提升曾整个项目的并发量

以下是并发测试demo:

(1)使用python manage.py runserver 0.0.0.0:8005 运行django项目

速度:每秒钟响应请求数:2343 pages/min,每秒钟传输数据量42476 bytes/sec.
返回数:2184次返回成功,159次返回失败

 

(2)使用Nginx+uWSGI+Django方法部署Django项目

速度:每秒钟响应请求数:18710 pages/min,每秒钟传输数据量352769 bytes/sec.
返回数:18709次返回成功,1次返回失败 

效果已经很明显了

 

1.安装python

2.安装django、uwsgi:pip install django         pip install uwsgi

3.测试uwsgi是否可用

#!/usr/bin/python  
def application(env,start_response):  
   start_response('200 OK',[('Content_Type','text/html')])  
   return "Congraduation!!! uWSGI Testing OK!!!

uwsgi --http  :9090 --wsgi-file test.py  在浏览器访问:127.0.0.1:9090

4.测试django项目是否正常:python manage.py runserver 0.0.0.0:8001  浏览器访问测试     关闭访问测试端口

5.编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下

#!/usr/bin/env python
# coding: utf-8

import os
import sys
import django
# 将系统的编码设置为UTF8 reload(sys) sys.setdefaultencoding('utf8') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings") #mysite根据自己项目名填写 django.setup() #必须加上这一句,否则会报错django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet,浏览器访问Internal Server Error 500错误 from django.core.handlers.wsgi import WSGIHandler application = WSGIHandler()

此时,可以测试是否正确:

uwsgi --http :8000 --chdir /data/django_project/auth_system --module django_wsgi

#/data/django_project/auth_system 为django项目路径

6.配置uwsgi配置文件:vim /data/django_project/auth_system/uwsgi.xml

<uwsgi>
  <socket>127.0.0.1:9090</socket>    #监听地址
  <listen>1024</listen>    #监听队列数
  <master>true</master>
  <processes>8</processes>    #默认开启进程数
  <pythonpath>/data/django_project/auth_system</pythonpath>  #此处为django项目的目录
  <module>django_wsgi</module>
  <profiler>true</profiler>
  <memory-report>true</memory-report>
  <enable-threads>true</enable-threads>
  <logdate>true</logdate>
  <limit-as>6048</limit-as>
  <daemonize>/data/django_project/auth_system/log/django.log</daemonize>    #设置日志文件路径
</uwsgi>

 

############################用于python3.x & django2.1.1##################################

[uwsgi]
# 项目目录
chdir=/home/boamp/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application
module=boamp.wsgi:application
# 指定sock的文件路径
socket=:4201
# 启用主进程
master=true
# 进程个数
workers=2
pidfile=/home/boamp/uwsgi.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/home/boamp/logs/uwsgi.log
启动命令:/usr/local/python35/bin/uwsgi --ini uwsgi.ini 不需要django_wsgi.py文件了

uwsgi 重启脚本:

reboot_uwsgi.sh

#!/bin/sh
MY_PATH=$(cd `dirname $0`; pwd)
cd $MY_PATH
DATE=`date +%F_%T`
PORT=$(sed -n '10p' uwsgi.ini | awk -F':' '{print $2}')
PID=(`lsof -i:$PORT | awk '/[0-9]/{print $2}'`)
LOG_DIR=$MY_PATH/logs
if [[ ! -e $LOG_DIR ]];then
    mkdir -p $LOG_DIR
fi
if [ -n "$PID" ];then
    for P in ${PID[@]};do
        kill -9 $P
    done
    sleep 1s
    /opt/python36/bin/uwsgi --ini $MY_PATH/uwsgi.ini
else
    /opt/python36/bin/uwsgi --ini $MY_PATH/uwsgi.ini
fi

uwsgi 关闭脚本:

stop_uwsgi.sh 


#!/bin/sh
MY_PATH=$(cd `dirname $0`; pwd)
cd $MY_PATH
DATE=`date +%F_%T`
PORT=$(sed -n '10p' uwsgi.ini | awk -F':' '{print $2}')
PID=(`lsof -i:$PORT | awk '/[0-9]/{print $2}'`)
LOG_DIR=$MY_PATH/logs
if [[ ! -e $LOG_DIR ]];then
    mkdir -p $LOG_DIR
fi

if [ -n "$PID" ];then
    for P in ${PID[@]};do
        kill -9 $P
    done
fi

############################用于python3.x & django2.1.1##################################

 

7.配置nginx配置文件

server {
        listen       8000;
        server_name  localhost;

        location / {
            include  uwsgi_params;
            uwsgi_pass  127.0.0.1:9090;
            access_log  off;
        }
        location ~ ^/static/ {    #配置静态文件
             root /data/django_project/auth_system;
             expires 24h;
             access_log off;
        }
}

8.重新加载nginx:/opt/nginx/sbin/nginx -s reload

9.启动uwsgi:uwsgi --xml uwsgi.xml

10.访问测试:127.0.0.1:8000

11.若遇到 Listen queue size is greater than the system max net.core.somaxconn (128)报错,请参考http://www.cnblogs.com/chenjw-note/p/6291802.html修改max net.core.somaxconn参数

 

posted @ 2017-09-11 12:59  chenjianwen  阅读(200)  评论(0编辑  收藏  举报