本地化部署的Django有很大的局限性,无法用于生产环境,比如无法抗住多并发,无法长时间的运行,容易造成网页无响应的问题。所以如何将Django部署到真正的生产环境中,让其能够真正的像正常的网页一样工作,是接下来需要讨论的问题。

  Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。现在主流的网页也是采用nginx的方式,比如百度,淘宝,京东,新浪等互联网巨头。而跟nginx进行交互的是uWSGI,uWSGI是一个Web服务器,支持WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。所以将Django部署到Nginx+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的主要特点如下

  1. 超快的性能
  2. 低内存占用(实测为apache2的mod_wsgi的一半左右)
  3. 多app管理
  4. 详尽的日志功能(便于分析分析app性能和瓶颈)
  5. 高度可定制(内存大小限制,服务一定次数后重启等)

uWSGI的安装使用:

  

# 稳定版
pip install uwsgi
# 最新开发板
pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

测试是否安装成功:

# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]

在命令行中输入

uwsgi --http :8000 --wsgi-file test.py

启动测试程序,--http为通信协议,8000为端口好 test.py为待测试文件

  

使用uWSGI启动Django,记住路径一定要在项目根目录下,module的名字也必须跟项目名字一样。

uwsgi --http :8000 --module mysite.wsgi

使用vim新建uwsgi.ini配置文件,内容为:

http = :9000
#socket端口
socket = 127.0.0.1:8001
# 项目根目录
chdir = basedir# Django's wsgi file文件目录即django中wsgi.py的位置
wsgi-file =# 最大进程数
processes = 4
#最大线程数
threads = 2 #监控进程
stats = 127.0.0.1:9191
# 清除环境变量
vacuum = true

最后可以通过使用 uwsgi uwsgi.ini 指令执行uwsgi

可以看到其实uwsgi已经能够实现网页响应的功能,但是不如Nginx稳定和主流,那么我们接下来看看Nginx的使用方法。

Nginx的安装:

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

在项目根目录下创建一个以nginx结尾的配置文件: vim project_name-nginx.conf ,然后输入相关内容:

# project_name_nginx.conf

# 将所有过来的请求转发到指定地址
upstream django {
server 127.0.0.1:8001; #创建网页访问端口
} # 配置主机
server {
# 监听端口
listen 8000;
# the domain name it will serve for
server_name .example.com;
charset utf-8; # 最大上传文件大小
client_max_body_size 75M; # 一般够用 location /media {
alias /path/to/your/mysite/media; # Django media 文件路径
} location /static {
alias /path/to/your/mysite/static; # Django 的static 文件路径
} # 将所有的非media请求发送到Djangp中
location / {
uwsgi_pass django;
include /path/to/your/mysite/uwsgi_params; # uwsgi_params 文件应在项目根目录中创建
}
}

完成后使用 sudo ln -s ~/项目根目录/mysite_nginx.conf /etc/nginx/sites-enabled/ 建立一个软连接,让nginx能够识别该配置

在djangp setting中末尾加一句程序: STATIC_ROOT = os.path.join(BASE_DIR, "static/") 然后再使用 python manage.py collectstatic 命令将所有的静态文件收集起来。复制到上述static对应的文件路径中

最后同时启动uwsgi(uwsgi uwsgi.ini)和nginx(/etc/init.d/nginx restart)就可以使python的Django顺利运行再Nginx上了,可实现高并发的请求功能,稳定性比Django高很多。

Python Django的生产部署方式的更多相关文章

  1. 从零开始部署Django生产环境(适用:《跟老齐学Python Django实战》)

    <跟老齐学Python Django实战>作为市面上少有的Django通俗实战书籍,给了我学习Django很大的帮助.作为一名新入门的菜鸟,全书我重复练习了至少三遍,每次都有新的收获. 前 ...

  2. [原]Python Web部署方式总结

    不要让服务器裸奔 学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服 ...

  3. [转]Python Web部署方式总结

    学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服务器支持不足,在了 ...

  4. Python Web部署方式全汇总

    学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服务器支持不足. 在 ...

  5. 将 Django 应用程序部署到生产服务器

    原文出自: http://www.ibm.com/developerworks/cn/opensource/os-django/ 比较有启发性质的一篇文章,会避免很多弯路 Django 是一个基于 P ...

  6. 干货分享:Python Web 部署方式大全

    不要让服务器裸奔 学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服 ...

  7. Python环境搭建、python项目以docker镜像方式部署到Linux

    Python环境搭建.python项目以docker镜像方式部署到Linux 本文的项目是用Python写的,记录了生成docker镜像,然后整个项目在Linux跑起来的过程: 原文链接:https: ...

  8. python Django教程 之 安装、基本命令、视图与网站

    python  Django教程  之 安装.基本命令.视图与网站 一.简介 Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 w ...

  9. Django + Gunicorn + Nginx 部署之路

    前言 最近,我已经成功将我的个人网站从 Flask 迁移到 Django 了,最早接触 Django 的时候大概是在 4 年前,我记得那个时候 Django 中的路由配置使用 正则 来进行的,但是我有 ...

随机推荐

  1. [Ccodeforces 736C] Ostap and Tree - 树形DP

    给定一个n个点的树,把其中一些点涂成黑色,使得对于每个点,其最近的黑点的距离不超过K. 树形DP. 设置状态f[i][j]: 当j <= K时: 合法状态,表示i的子树中到根的最近黑点距离为j的 ...

  2. 在gitlab上面创建私有库

    一.创建私有库1.使用xcode建立新的工程,选择Cocoa Touch Static Library,取名为podTest   WechatIMG1172.jpeg 2.创建一个类PodTest,给 ...

  3. Linux常见目录及其作用

    在Linux操作系统中,所有文件和目录都被组织成一个以根节点开始的倒置的树状结构.如下图 系统一般以 / 来表示根目录.在根目录之下的可以是目录也可以是文件,而每一个目录中又可以包含子目录文件.如此反 ...

  4. 如何通过 ZAZ-020 电容指纹模块采集指纹信息?

    #ifndef _PROTOCOL_H_ #define _PROTOCOL_H_ ///////////////////错误返回码//////////////////// #define PS_OK ...

  5. 启动Activity的形式

    问:为什么service里面startActivity抛异常,activity不会? No1: 启动activity有两种形式: 1)直接调用Context类的startActivity方法:这种方式 ...

  6. 科学计算工具-Numpy初探

    Numpy基础数据结构 Numpy数组是一个多维数组,称为ndarray.其由两部分组成: 实际的数据 描述这些数据的原数据 导入该库: import numpy as np 多维数组ndarray ...

  7. keepalived双机热备nginx

    nginx目前是我最常用的反向代理服务,线上环境为了能更好的应对突发情况,一般会使用keepalived双机热备nginx或者使用docker跑nginx集群,keepalived是比较传统的方式,虽 ...

  8. 使用TensorFlow的卷积神经网络识别自己的单个手写数字,填坑总结

    折腾了几天,爬了大大小小若干的坑,特记录如下.代码在最后面. 环境: Python3.6.4 + TensorFlow 1.5.1 + Win7 64位 + I5 3570 CPU 方法: 先用MNI ...

  9. 【重磅】PRO基础版免费,是时候和ExtJS说再见了!

    三石的新年礼物 9 年了,FineUI(开源版)终于迎来了她的继任者 - FineUIPro(基础版),并且完全免费!   FineUIPro(基础版)作为三石奉献给社区的一个礼物,绝对让你心动: 拥 ...

  10. H3C三层交换机配置IP

    1.直接在物理端口上设置IP地址. int f1/0/1 port link-mode route #链路模式采用路由 ip add 192.168.10.1 24 ospf network0type ...