如何在生产上部署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中

使用 Django + Wusgi + Nginx 部署 Django相关推荐

  1. 解决django配合nginx部署后admin样式丢失

    解决django配合nginx部署后admin样式丢失 1.  在项目的settings.py文件里添加以下内容: STATIC_URL = '/static/' STATICFILES_DIRS = ...

  2. django+uwsgi+nginx部署

    最近线上部署运维工单系统,使用django+uwsgi+nginx部署,发现这篇文章,很详细,觉得不错,转载一下: 写了那么长时间的django,一直没跟nginx结合一下,访问的时候老是得加端口号, ...

  3. 用uwsgi和nginx 部署 django和vue打造的前后端分离项目

    用uwsgi和nginx 部署 django和vue打造的前后端分离项目 前言 由于现在没有彻底掌握nginx的使用,部署起来有点磕磕绊绊,为了防止以后再次需要部署的时候无法快速找到适合的资料,以此文 ...

  4. 【django云服务器部署】django+uwsgi+nginx 部署的完整流程

    本篇博客完整地记录了我从购买服务器到完成部署的全过程,需要的朋友可以参考一下我的流程,看这一篇文章就能成功部署项目啦. 写这个的本意是为备忘( 保姆级步骤),同时由于我在最开始部署项目时,没有找到一个 ...

  5. Centos django+uwsgi+nginx部署

    Centos django+uwsgi+nginx部署 安装Python CentOS 7 Linux发行版默认包含Python 2.但是,Python 2将于2020年1月1日停产.尽管一些遗留应用 ...

  6. Ubuntu下Django+uWSGI+nginx部署

    本文采用uwsgi+nginx来部署django 这种方式是将nginx作为服务端前端,将接受web所有的请求,统一管理,Nginx把所有的静态请求自己处理,然后把所有非静态请求通过uwsgi传递给D ...

  7. uwsgi+nginx部署django项目(有图原理的详细展示的)

    1. 概念解析(wsgi协议,uwsgi协议,uWSGI) 参考:https://www.cnblogs.com/wspblog/p/8575101.html 1.1 现实世界的web请求: 1.2  ...

  8. linux nginx django,如何在Linux下使用Nginx部署Django项目

    Django项目使用nginx + uwsgi进行部署,是比较常见的方式. 系统环境 这里列出自己的,就算不一样也不用太担心. Liunx系统版本:CentOS Linux release 7.8.2 ...

  9. Nginx 部署 Django

    sudo vim /etc/nginx/nginx.conf Django admin css 失效解决 修改 setting.py 中的 STATIC_ROOT 为你自己定义的 静态文件目录,例如: ...

最新文章

  1. linux 远程执行shell 获取返回值
  2. Database Vault注冊
  3. 企业级的开发组件02 - DevExpress DXperience Universal 2011.2.5 Final
  4. 基于stm32的蓝牙遥控智能小车_基于51用蓝牙控制小车(提高篇)
  5. java button 点击事件_android_button按钮onclick点击事件的几种写法
  6. Java实现mysql的读写分离
  7. 在校生如何做一个可以让简历有亮点的java项目?
  8. 对计算机病毒的防治也,对计算机病毒及防范对策研究.doc
  9. 移动定位业务之“Cell ID + RTT(小区识别+往返时间)”
  10. 点计算机无桌面图标,电脑桌面没有任何图标并且点鼠标右键没反应 - 卡饭网
  11. 调用微信内置浏览器实现微信打开的网页上的图片能点击打开的效果
  12. 基于stm32c8t6的两轮平衡小车 第二篇——原理图及CubeMx配置
  13. 中国丝光棉市场产销需求及未来前景趋势预测报告(2022-2027年)
  14. 一个很赞的ecshop微信商城系统!
  15. 验证身份证号码是否合法以及信息提取
  16. linux docker 中使用 System.Drawing.Common 异常 System.Drawing.Common 仅在 Windows 上受支持
  17. 打印身份证主要安装步骤
  18. 手机H5网站 支付宝、微信支付遇到的问题和注意事项
  19. 从零开始读懂Web3:一起走进新一代互联网世界
  20. 软件测试过程与方法_第4章 4.3单元JUnit的单元测试

热门文章

  1. 云数据中心选址PK:微软第一,IBM第二,谷歌最少
  2. 专访联想谢政维:功耗和价格是天蝎项目最大障碍!
  3. 高速行车12条技巧,每一条都关乎你的生命
  4. MPEG音视频编解码之MP3编解码概述
  5. springCloud - 第6篇 - 网关的实现:ZUUL
  6. 解决 :IDEA 修改代码后 Local Changes 中没有提示待提交文件,代码自动提交了
  7. Docker 下载 JDK 镜像(docker search 、docker pull)
  8. 解决:java.lang.NoSuchMethodException: gentle.entity.User.<init>()
  9. 分布式开放 消息系统 (RocketMQ) 的原理与实践
  10. PHP 安装xdebug