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与C互相调用的方法详解
Jul 14 Python
Python实现破解猜数游戏算法示例
Sep 25 Python
Python3一行代码实现图片文字识别的示例
Jan 15 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
python 以16进制打印输出的方法
Jul 09 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
Jan 22 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
Python numpy.zero() 初始化矩阵实例
Nov 27 Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 Python
详解python with 上下文管理器
Sep 02 Python
Python HTMLTestRunner如何下载生成报告
Sep 04 Python
Python3中最常用的5种线程锁实例总结
Jul 07 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/10/09 PHP
PHP获取表单textarea数据中的换行问题
2010/09/10 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
PHP根据图片色界在不同位置加水印的方法
2015/07/01 PHP
PHP图片加水印实现方法
2016/05/06 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
javascript jQuery插件练习
2008/12/24 Javascript
JavaScript 学习初步 入门教程
2010/03/25 Javascript
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
js showModalDialog参数的使用详解
2014/01/07 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
2019/11/13 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
python爬虫scrapy基本使用超详细教程
2021/02/20 Python
yy婚礼主持词
2014/03/14 职场文书
本科应届生自荐信
2014/06/29 职场文书
神农溪导游词
2015/02/11 职场文书
mysql部分操作
2021/04/05 MySQL
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js
python中24小时制转换为12小时制的方法
2021/06/18 Python
7个关于Python的经典基础案例
2021/11/07 Python