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参数
一些事情一直在干,说不定以后就结果了呢
本文来自博客园,作者:chenjianwen,转载请注明原文链接:https://www.cnblogs.com/chenjw-note/articles/7504461.html