使用 Django + Wusgi + Nginx 部署 Django

如何在生产上部署Django?

Django的部署可以有很多方式,采用 nginx+uwsgi 的方式是其中比较常见的一种方式。

uwsgi介绍

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

WSGI / uwsgi / uWSGI 这三个概念的区分

  1. WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
  2. uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
  3. 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
  4. uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

uwsgi性能非常高

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h5bytglv-1624451195016)(/img/python/1624450446-df75b58c1a0ed8efc087487dd7142768.png)]

uWSGI的主要特点如下

  1. 超快的性能
  2. 低内存占用(实测为apache2的mod_wsgi的一半左右)
  3. 多app管理(终于不用冥思苦想下个app用哪个端口比较好了-.-)
  4. 详尽的日志功能(可以用来分析app性能和瓶颈)
  5. 高度可定制(内存大小限制,服务一定次数后重启等)

总而言之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.

1、uWSGI安装使用

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
# 在浏览器内输入:http://127.0.0.1:8001,查看是否有"Hello World"输出,若没有输出,检查安装过程。

进入uwsgi安装目录,用uwsgi 启动django

/usr/local/bin/uwsgi --http :8000 --module mysite.wsgi

可以把参数写到配置文件里

# uwsgi8080.ini####################### 配置一 #####################
[uwsgi]
http = :9000
socket = 127.0.0.1:8001chdir = /home/alex/CrazyEye    # the base directory (full path)
wsgi-file = CrazyEye/wsgi.py   # your Django's wsgi fileprocesses = 4
threads = 2
stats = 127.0.0.1:9191      # monitor uwsgi status
vacuum = true               # clear environment on exit################## 配置二 ###################
# 非多站模式时 vhost = true 和 no-site = true 需要注释掉,否则后续 nginx 配置文件中设置的入口文件则不生效
[uwsgi]
socket = 127.0.0.1:9090
master = true         # 主进程
vhost = true          # 多站模式
no-site = true        # 多站模式时不设置入口模块和文件
workers = 2           # 子进程数
reload-mercy = 10     
vacuum = true         # 退出、重启时清理文件
max-requests = 1000   
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi9090.pid    # pid文件,用于下面的脚本启动、停止该进程
daemonize = /website/uwsgi9090.log################## 配置三 ###################
[uwsgi]
socket = 127.0.0.1:8080   #socket 为上线使用,http为直接作为服务器使用
http = 127.0.0.1:8000chdir=/home/ray/project  # 项目目录
module=project.wsgi
# 虚拟环境目录
# home = home/ray/MxOnline/mxonlineEnv
master = true         
processes=4
threads=2
# 下面的参数可选
# pidfile=uwsgi.pid    uwsgi.pid 和uwsgi.log会在启动uwsgi时自动生成在项目目录下。
# daemonize=uswgi.log
# max-requests=2000    
# chmod-socket=664
# vacuum=true

参数解析:

  • http : 协议类型和端口号
  • processes : 开启的进程数量
  • workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)
  • chdir : 指定运行目录(chdir to specified directory before apps loading)
  • wsgi-file : 载入wsgi-file(load .wsgi file)
  • stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)
  • threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)
  • master : 允许主进程存在(enable master process)
  • daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。
  • vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)

启动

/usr/local/bin/uwsgi crazye-uwsgi.ini

2、Nginx安装使用

安装

sudo apt-get install nginx
sudo /etc/init.d/nginx start

Nginx配置文件

# mysite_nginx.conf# 负载均衡
upstream django {# server unix:///path/to/your/mysite/mysite.sock; # for a file socketserver 127.0.0.1:8001; # for a web port socket (we'll use this first)
}# configuration of the server
server {listen      8000;           # 监听的端口server_name .example.com;   # 监听的域名,或者ipcharset     utf-8;# max upload sizeclient_max_body_size 75M;   # request请求body# Django medialocation /media  {alias /path/to/your/mysite/media;   # 项目的media路径}location /static {alias /path/to/your/mysite/static;  # 项目的static 路径}# 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 installedinclude  uwsgi_params;uwsgi_pass  127.0.0.1:9090;              # 必须和uwsgi中的设置一致# uwsgi_param UWSGI_SCRIPT demosite.wsgi;# 入口文件,即wsgi.py相对于项目根目录的位置,“.”相当于一层目录# uwsgi_param UWSGI_CHDIR /demosite;     # 项目根目录index  index.html index.htm;}
}

做个超链接

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_URL = 'static'
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static'),]

在项目目录下迁移静态文件

python manage.py collectstatic

此时启动Nginx 和Uwsgi,你的django项目就可以实现高并发啦!

3、参考

Django中settings.py中的五个设置参数的一些故事:

1、MEDIA_ROOT与MEDIA_URL
事实上MEDIA_ROOT和MEDIA_URL代表的是用户上传后的文件一般保存的地方。我的理解是,可变文件的文件夹。
与这两个参数有联系的,是在Django的FileField和ImageField这样的Model类中,有upload_to参数可选。
当upload_to设置相关的地址后,如:upload_to="username";
文件上传后将自动保存到 os.path.join(MEDIA_ROOT, upload_to)。
而MEDIA_URL,,则代表用户通过URL来访问这个本地地址的URL。
如本机http://127.0.0.1/, MEDIA_URL设置为"/site_media/",
那么通过 http://127.0.0.1/site_media/*** 就可以访问相关的上传图片或者其他资源。2、STATIC_ROOT与STATIC_URL
STATIC_ROOT和STATIC_URL则是网站中,用于网站显示的静态图片、CSS、JS等文件的保存地址。
我的理解是,运行中不会再变文件的文件夹(即不会删除或者新增)2.1 STATIC_URL同MEDIA_URL类似;STATIC_URL为"/static/"时候,通过http://127.0.0.1/static/***就可以访问相关的静态文件了。2.2 STATIC_ROOT是一个比较特殊的文件夹。
这是区别Django的开发模式和部署模式下最大的地方了。
通常我们在开发模式下,可以在我们所在的project下建立相应的app, 然后每个app下都建立相应的static文件夹。
在开发模式下(Debug=True),Django将为我们自动查找这些静态文件(每个app)并在网页上显示出来。
然而,在部署模式下,Django认为这些工作交由web服务器来运行会更有效率。
因此,在部署时,我们需要运行一下python manage.py collectstatic 这个命令。
这个命令将会把每个app里的static目录下的文件copy到STATIC_ROOT这个文件夹下,
这时候如果在部署模式下(Debug=False),网页中相关的,如: http://127.0.0.1/static/*** 的访问,
将不会访问Django下各个App中的static,而是STATIC_ROOT中所指定的文件夹。3、Debug=False后,为何无法访问图片和js等文件了?
其实这个问题,是在于web服务器没有对STATIC_ROOT以及MEDIA_ROOT这两个文件夹进行映射所导致的。
以apache为例,假定:
STATIC_ROOT="/home/user/static/"
STATIC_URL="/static/"
MEDIA_ROOT="/home/user/media/"
MEDIA_URL="/media/"那么可以在apache的配置文件中,增加以下:
<Location "/static/">
Order deny,allow
Allow from all
Satisfy Any
</Location>
Alias /static/ "/home/user/static"
<Location "/media/">
Order deny,allow
Allow from all
Satisfy Any
</Location>
Alias /media/ "/home/user/media/"4、STATICFILES_DIRS:
和TEMPLATE_DIRS的含义差不多,就是除了各个app的static目录以外还需要管理的静态文件,
添加到这里的文件会在collectstatic时 copy到STATIC_ROOT中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络学习网址

网络之路博客 http://ccieh3c.com/ 转载于:https://www.cnblogs.com/changha0/p/8179801.html

路由到另外一个页面_Nextjs使用解读一(项目搭建与路由系统)

文章说明&#xff1a;1. 之前想搭建个人博客&#xff0c;由于学习的是react技术栈&#xff0c;所以就到处搜罗资料学了nextjs&#xff0c;配合koa就把博客搭起来了。该系列文章基于我的学习笔记&#xff0c;重新整理了一遍&#xff0c;如果有错误之处&#xff0c;还请指正。2. …

微信获取token -1000

最终翻看微信开发api找到需要去配置IP白名单。只需要配置访问来源IP即可。 转载于:https://www.cnblogs.com/yangjinqiang/p/8184663.html

产品技术和管理

为啥纯粹为消费者传递体验的活动可以价格不菲&#xff0c;几为暴利&#xff1f;——谈客户体验作为客户价值提升之源 不论产品还是服务&#xff0c;如果能够为消费者传递有益的体验&#xff0c;其价值就可以在一般的产品服务之上得以体现&#xff1b;附加了体验的产品&#xff…

Linux 修改系统编码

linux服务器的字符集设置可能影响到网站页面出现 “&#xff1f;&#xff1f;&#xff1f;” 等问号乱码&#xff0c;还有可能导致文件中的汉字部分出现乱码。有两个原因 服务器没有安装 zh_CN.UTF-8 字符集&#xff0c;导致不支持中文&#xff01;服务器虽然装了 zh_CN.UTF-8…

jquery ztree 设置勾选_047 JAVA-jQuery

jQuery操作元素属性的值表单:<body><input type"button" name"" id"but1" value"测试获得属性值" /><hr />账号&#xff1a;<input type"text" name"sxtzh" id"zhanghao" value&q…

Opencv undefined reference to `cv::imread() Ubuntu编译

Ubuntu下编译一个C文件&#xff0c;C源程序中使用了opencv&#xff0c;opencv的安装没有问题&#xff0c;但是在编译的过程中出现如下错误&#xff1a; undefined reference to cv::imread(std::string const&, int)undefined reference to cv::noArray()undefined referen…

深度学习目标检测之 YOLO v1

这是继 RCNN&#xff0c;fast-RCNN 和 faster-RCNN 之后&#xff0c;rbg&#xff08;RossGirshick&#xff09;针对DL目标检测速度问题提出的另外一种框架。YOLO V1 增强版本GPU中能跑45fps&#xff0c;简化版本155fps。 论文名&#xff1a; 《You Only Look Once&#xff1a;…

编程珠玑番外篇

1.Plan 9 的八卦 在 Windows 下喜欢用 FTP 的同学抱怨 Linux 下面没有如 LeapFTP 那样的方便的工具. 在苹果下面用惯了 Cyberduck 的同学可能也会抱怨 Linux 下面使用 FTP 和 SFTP 是一件麻烦的事情. 其实一点都不麻烦, 因为在 LINUX 系统上压根就不需要用 FTP. 为什么呢? 因…

BT下载原理分析

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 BitTorrent协议。 BT全名为BitTorrent,是一个p2p软件,你在下载download的同时&#xff0c;也在为其他用户提供上传upload&#xff0c;因为大家是“互相帮助”&#xff0c;所以不会随着用户数的增加而…

表格列求和_excel表格制作,Excel表格的基本操作,包含制作一个表格10方面的知识...

创建表格&#xff0c;插入与删除一行一列或多行多行&#xff0c;一次移动一行一列或多行多列&#xff0c;拆分与合并单元格&#xff0c;单元格内换行&#xff0c;表格求和与求平均值是Excel表格的基本操作&#xff1b;除此之外&#xff0c;Excel表格的基本操作还包括调整行高列…

深度学习之 FPN (Feature Pyramid Networks)

论文题目&#xff1a;Feature Pyramid Networks for Object Detection论文链接&#xff1a;https://arxiv.org/abs/1612.03144论文代码&#xff1a;Caffe版本 https://github.com/unsky/FPN 《Feature Pyramid Networks for Object Detection》这篇论文主要解决的问题是目标检…

ISLR—第二章 Statistical Learning

Statistical Learning Y 和X的关系why estimate f 用来预测 预测的时候可以将f^当成一个black box来用&#xff0c;目的主要是预测对应x时候的y而不关系它们之间的关系。用来推断 推断的时候&#xff0c;f^不能是一个black box&#xff0c;因为我们想知道predictor和response之…

提高编程思想

虚函数和抽象函数有什么区别 虚函数是有代码的并明确允许子类去覆盖&#xff0c;但子类也可不覆盖,就是说可以直接用&#xff0c;不用重写 抽象函数是没有代码&#xff0c;子类继承后一定要重写 ****************************************************************** 在一…

python特效代码_网页爱心特效弱爆了,我让你点击网页显示所有python模块!

点击网页特效上周写了一篇文章快速搭建个人博客的教程文章&#xff1a;其中说到了一个点击网页出现爱心特效的插件 click_heart.js ,当然大家可能也见过其他博客上面&#xff0c;有点击网页出现类似 富强、民主、文明、和谐等等&#xff0c;关于代码在这里不多赘述&#xff0c;…

Python 包管理之 poetry

poetry是一个Python虚拟环境和依赖管理的工具。poetry和pipenv类似&#xff0c;另外还提供了打包和发布的功能。 官方文档&#xff1a;python-poetry.org/docs/ python项目部署&#xff1a;poetry管理本地环境,上线用docker poetry 安装 poetry提供多种安装方式&#xff0c…

Windows数据库编程接口简介

数据库是计算机中一种专门管理数据资源的系统&#xff0c;目前几乎所有软件都需要与数据库打交道&#xff08;包括操作系统&#xff0c;比如Windows上的注册表其实也是一种数据库&#xff09;&#xff0c;有些软件更是以数据库为核心因此掌握数据库系统的使用方法以及数据库系统…

映客都是互刷礼物吗_映客互刷礼物有什么用_映客守护有什么用

一起直播、互刷礼物、改ID发性感照,赵本山女375x332 - 122KB - PNG一起直播、互刷礼物、改ID发性感照,赵本山女600x893 - 247KB - JPEG一起直播、互刷礼物、改ID发性感照,赵本山女600x448 - 151KB - JPEG土豪互刷礼物吓坏男主播 即兴表演铁头功撞墙560x688 - 57KB - JPEG一起直…

Python 之打包工具 setup.py

1. 为什么需要对项目分发打包&#xff1f; 平常我们习惯了使用 pip 来安装一些第三方模块&#xff0c;这个安装过程之所以简单&#xff0c;是因为模块开发者为我们默默地为我们做了所有繁杂的工作&#xff0c;而这个过程就是 打包。 打包&#xff0c;就是将你的源代码进一步封…

周进度----06

周学习进度06 周学习进度06 第16周 所花时间&#xff1a; 60min60min100min100min100min100min90min60min60min 代码量&#xff08;行&#xff09; 500-800 博客量&#xff08;篇&#xff09; 4 了解到的知识 css样式表的一些知识 项目流程的初步了解 一周的学习心得…