Python Django的生产部署方式
本地化部署的Django有很大的局限性,无法用于生产环境,比如无法抗住多并发,无法长时间的运行,容易造成网页无响应的问题。所以如何将Django部署到真正的生产环境中,让其能够真正的像正常的网页一样工作,是接下来需要讨论的问题。
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。现在主流的网页也是采用nginx的方式,比如百度,淘宝,京东,新浪等互联网巨头。而跟nginx进行交互的是uWSGI,uWSGI是一个Web服务器,支持WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。所以将Django部署到Nginx+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的主要特点如下
- 超快的性能
- 低内存占用(实测为apache2的mod_wsgi的一半左右)
- 多app管理
- 详尽的日志功能(便于分析分析app性能和瓶颈)
- 高度可定制(内存大小限制,服务一定次数后重启等)
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的生产部署方式的更多相关文章
- 从零开始部署Django生产环境(适用:《跟老齐学Python Django实战》)
<跟老齐学Python Django实战>作为市面上少有的Django通俗实战书籍,给了我学习Django很大的帮助.作为一名新入门的菜鸟,全书我重复练习了至少三遍,每次都有新的收获. 前 ...
- [原]Python Web部署方式总结
不要让服务器裸奔 学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服 ...
- [转]Python Web部署方式总结
学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服务器支持不足,在了 ...
- Python Web部署方式全汇总
学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服务器支持不足. 在 ...
- 将 Django 应用程序部署到生产服务器
原文出自: http://www.ibm.com/developerworks/cn/opensource/os-django/ 比较有启发性质的一篇文章,会避免很多弯路 Django 是一个基于 P ...
- 干货分享:Python Web 部署方式大全
不要让服务器裸奔 学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服 ...
- Python环境搭建、python项目以docker镜像方式部署到Linux
Python环境搭建.python项目以docker镜像方式部署到Linux 本文的项目是用Python写的,记录了生成docker镜像,然后整个项目在Linux跑起来的过程: 原文链接:https: ...
- python Django教程 之 安装、基本命令、视图与网站
python Django教程 之 安装.基本命令.视图与网站 一.简介 Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 w ...
- Django + Gunicorn + Nginx 部署之路
前言 最近,我已经成功将我的个人网站从 Flask 迁移到 Django 了,最早接触 Django 的时候大概是在 4 年前,我记得那个时候 Django 中的路由配置使用 正则 来进行的,但是我有 ...
随机推荐
- 谈谈语音通信中的各种tone
今天谈的这个主题(tone)存在于我们的日常打电话过程中.先举两个场景:1,你拿起固话话筒准备打电话,按电话号码前先从话筒里听到"嗡"的连续音,这叫dial tone(拨号音,表示 ...
- Web API 之承载宿主IIS,SelfHost,OwinSelfHost
Asp.Net WebAPI这个大家应该都不陌生,在我的理解范围中就是数据提供和交换的一个方式,相比与WCF,WS而言,更加的简单轻量,但是在部署web Api的时候,一般往往需要与a ...
- Date 类 02
Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date ...
- python中__name__=='__main__'的作用
学习python语法的过程中碰到了__name__=='__main__',这里做个笔记. 作用 这段代码的作用就是让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行. 测试 先 ...
- HDU - 4545 字符串处理
思路:对于每个字符,如果它能被替换一定要优先替换,其次再进行删除.遵循这个策略即可. 证明: 对于这题的第一个测试数据: abba addba 1 d b 当匹配到'b' 和 'd'时应该优先替换而 ...
- UVA-714 二分
把可能的进行二分判断,判断的时候尽量向右取,一直取到不能去为止,这样才有可能成功分割. 判断是否可以把up作为最大值的代码: bool judge(LL up){ if(up < Big) re ...
- WC2016自测
挑战NPC 原题链接 爆搜20分,贪心10分,网络流30分 //挑战NPC #include <cstdio> #include <cstring> #include < ...
- 坑人的toLocaleDateString和简单地跳坑方式
最近在做一个一个医学大数据的项目的时候,独立设计.构思.制作了完成了一个生命历程图的功能.既然设计到时间,那就免不了对Date对象进行一系列的操作,也就免不了对日期对象进行一系列的格式化.走的路多了, ...
- Centos定时启动和清除任务
因为需要定时并发执行任务,所以查到了crontab这个工具,介绍一下其用法: SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=roo ...
- 【其他】3dmax撤销Ctrl+z不能用的解决办法
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/3dmax_ctrlz.html 如果你经常去网上下载各种模型参考学习的话,出现这个问题的概率会非常高.因为出现这个 ...