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编程实现删除VC临时文件及Debug目录的方法
Mar 22 Python
ubuntu安装mysql pycharm sublime
Feb 20 Python
Python生成器定义与简单用法实例分析
Apr 30 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
Django 路由系统URLconf的使用
Oct 11 Python
python导入坐标点的具体操作
May 10 Python
详解Python3之数据指纹MD5校验与对比
Jun 11 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
Sep 06 Python
tensorflow 查看梯度方式
Feb 04 Python
解决django中form表单设置action后无法回到原页面的问题
Mar 13 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
深入了解Python 方法之类方法 & 静态方法
Aug 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脚本的10个技巧(3)
2006/10/09 PHP
PHP 批量删除 sql语句
2009/06/05 PHP
PHP HTML代码串 截取实现代码
2009/06/29 PHP
最新的php 文件上传模型,支持多文件上传
2009/08/13 PHP
php继承的一个应用
2011/09/06 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
php检查是否是ajax请求的方法
2015/04/16 PHP
详细解读PHP中接口的应用
2015/08/12 PHP
php微信公众号开发之关键词回复
2018/10/20 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
js判断变量是否空值的代码
2008/10/26 Javascript
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
WEB开发之注册页面验证码倒计时代码的实现
2016/12/15 Javascript
如何学JavaScript?前辈的经验之谈
2016/12/28 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
gearman的安装启动及python API使用实例
2014/07/08 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
Python3获取拉勾网招聘信息的方法实例
2019/04/03 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
体育教师个人的自我评价
2014/02/16 职场文书
2014和解协议书范文
2014/09/15 职场文书
公务员年度考核评语
2014/12/31 职场文书
创先争优活动个人总结
2015/03/04 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript
python垃圾回收机制原理分析
2022/04/13 Python