Django + Uwsgi + Nginx 实现生产环境部署的方法


Posted in Python onJune 20, 2018

如何在生产上部署Django?

Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。

uwsgi介绍

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
1.WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
2.uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
3.而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
4.uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

uwsgi性能非常高

Django + Uwsgi + Nginx 实现生产环境部署的方法

uWSGI的主要特点如下
1.超快的性能
2.低内存占用(实测为apache2的mod_wsgi的一半左右)
3.多app管理(终于不用冥思苦想下个app用哪个端口比较好了-.-)
4.详尽的日志功能(可以用来分析app性能和瓶颈)
5.高度可定制(内存大小限制,服务一定次数后重启等)

总而言之uwgi是个部署用的好东东,正如uWSGI作者所吹嘘的:

If you are searching for a simple wsgi-only server, uWSGI is not for you, but if you are building a real (production-ready) app that need to be rock-solid, fast and easy to distribute/optimize for various load-average, you will pathetically and morbidly fall in love (we hope) with uWSGI.

Uwsgi 安装使用

# Install the latest stable release:

pip install uwsgi

# ... or if you want to install the latest LTS (long term support) release,

pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

基本测试

Create a file called test.py:

# test.py

def application(env, start_response):

  start_response('200 OK', [('Content-Type','text/html')])

  return [b"Hello World"] # python3

  #return ["Hello World"] # python2

运行

uwsgi --http :8000 --wsgi-file test.py

用uwsgi 启动django

uwsgi --http :8000 --module mysite.wsgi

可以把参数写到配置文件里

alex@alex-ubuntu:~/uwsgi-test$ more crazye-uwsgi.ini 

[uwsgi]

http = :9000

#the local unix socket file than commnuincate to Nginx

socket = 127.0.0.1:8001

# the base directory (full path)

chdir = /home/alex/CrazyEye 

# Django's wsgi file

wsgi-file = CrazyEye/wsgi.py

# maximum number of worker processes

processes = 4

#thread numbers startched in each worker process

threads = 2

#monitor uwsgi status 

stats = 127.0.0.1:9191

# clear environment on exit

vacuum     = true

启动

/usr/local/bin/uwsgi crazye-uwsgi.ini

Nginx安装使用

sudo apt-get install nginx

sudo /etc/init.d/nginx start  # start nginx

为你的项目生成Nginx配置文件

You will need the uwsgi_params file, which is available in the nginx directory of the uWSGI distribution, or from https://github.com/nginx/nginx/blob/master/conf/uwsgi_params

Copy it into your project directory. In a moment we will tell nginx to refer to it.

Now create a file called mysite_nginx.conf, and put this in it:

# mysite_nginx.conf
# the upstream component nginx needs to connect to
upstream django {
  # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
  server 127.0.0.1:8001; # for a web port socket (we'll use this first)

}
# configuration of the server

server {

  # the port your site will be served on

  listen   8000;

  # the domain name it will serve for

  server_name .example.com; # substitute your machine's IP address or FQDN

  charset   utf-8; 

  # max upload size
  client_max_body_size 75M;  # adjust to taste

  # Django media
  location /media {

    alias /path/to/your/mysite/media; # your Django project's media files - amend as required

  } 

  location /static {

    alias /path/to/your/mysite/static; # your Django project's static files - amend as required

  }

  # Finally, send all non-media requests to the Django server.

  location / {
    uwsgi_pass django;
    include   /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed

  }
}

This conf file tells nginx to serve up media and static files from the filesystem, as well as handle requests that require Django's intervention. For a large deployment it is considered good practice to let one server handle static/media files, and another handle Django applications, but for now, this will do just fine.

Symlink to this file from /etc/nginx/sites-enabled so nginx can see it:

sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/

Deploying static files

Before running nginx, you have to collect all Django static files in the static folder. First of all you have to edit mysite/settings.py adding:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

and then run

python manage.py collectstatic

此时启动Nginx 和Uwsgi,你的django项目就可以实现高并发啦!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的加密模块md5、sha、crypt使用实例
Sep 28 Python
python实现带错误处理功能的远程文件读取方法
Apr 29 Python
Python函数式编程指南(三):迭代器详解
Jun 24 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
PyTorch中反卷积的用法详解
Dec 30 Python
python如何获取apk的packagename和activity
Jan 10 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
Feb 04 Python
Django Session和Cookie分别实现记住用户登录状态操作
Jul 02 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 Python
Python加密与解密模块hashlib与hmac
Jun 05 Python
python实现电脑自动关机
Jun 20 #Python
python3将视频流保存为本地视频文件
Jun 20 #Python
Python操作MySQL数据库的方法
Jun 20 #Python
python实现抖音视频批量下载
Jun 20 #Python
Python 类的特殊成员解析
Jun 20 #Python
python实现音乐下载的统计
Jun 20 #Python
django2用iframe标签完成网页内嵌播放b站视频功能
Jun 20 #Python
You might like
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
JavaScript 基础问答三
2008/12/03 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
用于deeplink的js方法(判断手机是否安装app)
2014/04/02 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
JS仿Base.js实现的继承示例
2017/04/07 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Python 转义字符详细介绍
2017/03/21 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
python贪吃蛇游戏代码
2020/04/18 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
python定时任务 sched模块用法实例
2019/11/04 Python
html5中为audio标签增加停止按钮动作实现方法
2013/01/04 HTML / CSS
Speedo速比涛中国官方网站:全球领先泳装运动品牌
2018/04/24 全球购物
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
英国办公家具网站:Furniture At Work
2019/10/07 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
Lucene推荐的分页方式是什么?
2015/12/07 面试题
优秀员工年终发言演讲稿
2014/01/01 职场文书
见习期自我鉴定
2014/01/31 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
职业规划实施方案
2014/06/10 职场文书
期末个人总结范文
2015/02/13 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
初一数学教学反思
2016/02/17 职场文书