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实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
python pytest进阶之conftest.py详解
Jun 27 Python
关于Python解包知识点总结
May 05 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 Python
python 用opencv实现霍夫线变换
Nov 27 Python
opencv python 对指针仪表读数识别的两种方式
Jan 14 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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
PHP无敌近乎加密方式!
2010/07/17 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
探讨:php中在foreach中使用foreach ($arr as &$value) 这种类型的解释
2013/06/24 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
详解基于Koa2开发微信二维码扫码支付相关流程
2018/05/16 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
用Python写的图片蜘蛛人代码
2012/08/27 Python
Python中的默认参数详解
2015/06/24 Python
详解Django框架中的视图级缓存
2015/07/23 Python
使用Python写个小监控
2016/01/27 Python
python dict 相同key 合并value的实例
2019/01/21 Python
python基础梳理(一)(推荐)
2019/04/06 Python
Django中的cookie和session
2019/08/27 Python
Django调用百度AI接口实现人脸注册登录代码实例
2020/04/23 Python
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
美国电视购物:QVC
2017/02/06 全球购物
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
房地产管理毕业生自荐信
2013/11/04 职场文书
2014县政府领导班子对照检查材料思想汇报
2014/09/25 职场文书
公司经营目标责任书
2015/01/29 职场文书
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis
postgresql中如何执行sql文件
2023/05/08 PostgreSQL