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程序语言快速上手教程
Jul 18 Python
python2.7无法使用pip的解决方法(安装easy_install)
Apr 03 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
Python一个简单的通信程序(客户端 服务器)
Mar 06 Python
详解Python odoo中嵌入html简单的分页功能
May 29 Python
python+numpy按行求一个二维数组的最大值方法
Jul 09 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
深入浅析Python科学计算库Scipy及安装步骤
Oct 12 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
numpy:找到指定元素的索引示例
Nov 26 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 Python
Python 实现集合Set的示例
Dec 21 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
拼音码表的生成
2006/10/09 PHP
php分页示例分享
2014/04/30 PHP
yii的CURD操作实例详解
2014/12/04 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
Javascript中的delete介绍
2012/09/02 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
如何重置vue打印变量的显示方式
2017/12/06 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
web.py在模板中输出美元符号的方法
2014/08/26 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
基于Python的PIL库学习详解
2019/05/10 Python
Python配置文件处理的方法教程
2019/08/29 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
应届生法律求职信
2013/10/22 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
酒店营销策划方案
2014/02/07 职场文书
《长相思》听课反思
2014/04/10 职场文书
学校运动会简讯
2015/07/20 职场文书
2015年小学重阳节活动总结
2015/07/29 职场文书
学校运动会开幕词
2016/03/03 职场文书
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android