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 相关文章推荐
使用go和python递归删除.ds store文件的方法
Jan 22 Python
python轻松实现代码编码格式转换
Mar 26 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
May 23 Python
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 Python
python笔记_将循环内容在一行输出的方法
Aug 08 Python
Python如何计算语句执行时间
Nov 22 Python
python实现图片上添加图片
Nov 26 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
Python3 实现爬取网站下所有URL方式
Jan 16 Python
Python基于类路径字符串获取静态属性
Mar 12 Python
python 深度学习中的4种激活函数
Sep 18 Python
python游戏开发Pygame框架
Apr 22 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
php好代码风格的阶段性总结
2016/06/25 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
2018/05/23 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
Textarea输入字数限制实例(兼容iOS&安卓)
2017/07/06 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
vue之debounce属性被移除及处理详解
2019/11/13 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
Python中用format函数格式化字符串的用法
2015/04/08 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
Python request操作步骤及代码实例
2020/04/13 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
让IE支持CSS3的不完全兼容方案
2014/09/19 HTML / CSS
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
怎样创建、运行java程序
2014/08/01 面试题
人事助理自荐信
2014/02/02 职场文书
法制宣传日活动总结
2014/04/29 职场文书
党员组织生活会发言材料
2014/10/17 职场文书
颐和园导游词400字
2015/01/30 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server
Win11开始菜单添加休眠选项
2022/04/19 数码科技