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编写简单的定时器的方法
May 02 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
django文档学习之applications使用详解
Jan 29 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
python整合ffmpeg实现视频文件的批量转换
May 31 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
python with (as)语句实例详解
Feb 04 Python
python模拟实现分发扑克牌
Apr 22 Python
Jupyter打开图形界面并画出正弦函数图像实例
Apr 24 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 Python
python闭包与引用以及需要注意的陷阱
Sep 18 Python
pytorch查看网络参数显存占用量等操作
May 12 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
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
php实现URL加密解密的方法
2016/11/17 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
javascript实现简易计算器
2017/02/01 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
学习python类方法与对象方法
2016/03/15 Python
Python中的字符串查找操作方法总结
2016/06/27 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
使用Pycharm分段执行代码
2020/04/15 Python
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
2016幼儿教师自荐信范文
2016/01/28 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
CSS3实现的侧滑菜单
2021/04/27 HTML / CSS
整理Python中常用的conda命令操作
2021/06/15 Python