Django+Uwsgi+Nginx如何实现生产环境部署


Posted in Python onJuly 31, 2020

如何在生产上部署Django?

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

uwsgi介绍

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

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

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

uwsgi性能非常高

Django+Uwsgi+Nginx如何实现生产环境部署

uWSGI的主要特点如下

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

总而言之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错误处理详解
Sep 28 Python
10种检测Python程序运行时间、CPU和内存占用的方法
Apr 01 Python
Python工程师面试必备25条知识点
Jan 17 Python
Django实现全文检索的方法(支持中文)
May 14 Python
python 查找文件名包含指定字符串的方法
Jun 05 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
Python实现多线程的两种方式分析
Aug 29 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
Feb 26 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
Oct 21 Python
python中count函数知识点浅析
Dec 17 Python
Python 如何测试文件是否存在
Jul 31 #Python
Python高并发解决方案实现过程详解
Jul 31 #Python
Python如何执行精确的浮点数运算
Jul 31 #Python
Python使用shutil模块实现文件拷贝
Jul 31 #Python
Python基于pyjnius库实现访问java类
Jul 31 #Python
Python如何将字符串转换为日期
Jul 31 #Python
Python在字符串中处理html和xml的方法
Jul 31 #Python
You might like
PHP 常见郁闷问题答解
2006/11/25 PHP
国外比较好的几个的Php开源建站平台小结
2010/04/22 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
ThinkPHP5&5.1框架关联模型分页操作示例
2019/08/03 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
使用原生js+canvas实现模拟心电图的实例
2017/09/20 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
AngularJS 事件发布机制
2018/08/28 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
教你使用python画一朵花送女朋友
2018/03/29 Python
django的ORM操作 增加和查询
2019/07/26 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
专题组织生活会方案
2014/06/15 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
退税申请报告怎么写
2015/05/18 职场文书
纪律委员竞选稿
2015/11/19 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS