五步教你实现使用Nginx+uWSGI+Django方法部署Django程序
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。

在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。
可见,uwsgi的作用就类似一个桥接器。起到桥梁的作用。
NOTE:不使用nginx,只使用uwsgi+django也是可以实现WEB服务的。uwsgi也可以直接处理WEB请求。
为了完成上述的方式部署,我将分成两篇文章来分别进行阐述。
第一步先解决uwsgi与django的桥接。解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器。
第二步解决uwsgi与Nginx的桥接。通过nginx与uwsgi的桥接,打通nginx与django的连通,从而比较完美的实现django的部署。
本文将分成五步来详细阐述uwsgi+django的部署方式。nginx+uwsgi+django的部署将在下一篇 文章中阐述。
本文大纲:
- 环境介绍
- 安装uwsgi
- 测试uwsgi
- 配置django
- 连接django和uwsgi,实现简单的WEB服务器。
环境介绍
- Ubuntu 12.04.1 LTS
- django 1.4.2
安装uwsgi
1.安装pip
可以参考这篇文章:http://www.jsxubar.info/install-pip.html
2.安装uwsgi
$ export LDFLAGS="-Xlinker --no-as-needed"
$ pip install uwsgi
测试uwsgi
在你的机器上写一个test.py
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"
然后执行shell命令:
uwsgi --http :8001 --wsgi-file test.py
访问网页:
看在网页上是否有Hello World
配置django
NOTE:
请保证你的django项目是正常使用的。可以使用
python manage.py runserver 0.0.0.0:8002
来测试一下你的django项目是否能正常跑起来。
请保证你的django程序已经关闭。
编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下。
注意: 编写文件时需要注意语句os.environ.setdefault。比如,如果你的项目为mysite,则你的语句应该是
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
1 |
#!/usr/bin/env python |
连接django和uwsgi,实现简单的WEB服务器。
我们假设你的Django项目的地址是/home/work/src/sites/testdjango1/testdjango/mysite,
然后,就可以执行以下命令:
uwsgi --http :8000 --chdir /home/work/src/sites/testdjango1/testdjango/mysite --module django_wsgi
这样,你就可以在浏览器中访问你的Django程序了。所有的请求都是经过uwsgi传递给Django程序的。
最后:
关于如何将uwsgi与Nginx连接,可以期待下篇文章 《五步教你实现使用Nginx+Uwsgi+Django方法部署Django程序(下)》
最后面,请大家要支持Django中国社区哦,单靠一两个人是不行的,一起推广一下,让Django社区更有力量哈!更有人气哈!
推广链接: http://django-china.cn/
参考、解释及其它
wsgi: WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。
关于WSGI协议看这里:WSGI
uWSGI: http://uwsgi-docs.readthedocs.org/en/latest/index.html uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
uwsgi: uwsgi同WSGI一样是一种通信协议,而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
关于uwsgi协议看这里:The uwsgi protocol
有了uWSGI为什么还需要nginx?
nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。
END
当然,单单只有uWSGI是不够的,在实际的部署环境中,Nginx是必不可少的工具。
在本篇文章中,我将一直延用“N步法”的风格来阐述如何将uWSGI与Nginx做连接来部署Django程序。并在最后,会较为完整的阐述本社区的部署方法。
本文大纲:
- 环境介绍
- 配置uWSGI
- 配置Nginx
- Nginx+uWSGI+Django的实现方式
- 一些建议
环境介绍
- Ubuntu 12.04.1 LTS
- django 1.4.2
- nginx/1.2.6
- uWSGI 1.4.4
关于uWSGI的安装可参见上一篇文章 上一篇文章《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》
我们假定你已经安装好Nginx了。
配置uWSGI
在上一篇文章《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》中,我们是直接使用命令行来启动uWSGI,在实际部署环境中,我们常用的是配置文件的方式,而非命令行的方式。我的一般做法是用命令行来测试是否uWSGI安装成功,然后用配置文件来真正部署。
另外,为了实现Nginx与uWSGI的连接,两者之间将采用soket来通讯方式。
在本节中,我们将使用uWSGI配置文件的方式来改进uWSGI的启动方式。
假定你的程序目录是 /home/work/src/sites/testdjango1/testdjango/mysite
我们将要让Nginx采用8077端口与uWSGI通讯,请确保此端口没有被其它程序采用。
注意,请确定你在上一节《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》中的django_wsgi.py文件已经存在了。
新建一个XML文件:
djangochina_socket.xml,将它放在 /home/work/src/sites/testdjango1/testdjango/mysite 目录下:
<uwsgi>
<socket>:8077</socket>
<chdir>/home/work/src/sites/testdjango1/testdjango/mysite</chdir>
<module>django_wsgi</module>
<processes>4</processes> <!-- 进程数 -->
<daemonize>uwsgi.log</daemonize>
</uwsgi>
在上面的配置中,我们使用 uwsgi.log 来记录日志,开启4个进程来处理请求。
这样,我们就配置好uWSGI了。
配置Nginx
我们假设你将会把Nginx程序日志放到你的目录/home/work/var/test/logs/下,请确保该目录存在。
我们假设你的Django的static目录是/home/work/src/sites/testdjango1/testdjango/collectedstatic/ , media目录是/home/work/src/sites/testdjango1/testdjango/public/media/,请确保这些目录存在。
我们假设你的域名是 www.you.com (在调试时你可以设置成你的机器IP)
我们假设你的域名端口是 80(在调试时你可以设置一些特殊端口如 8070)
基于上面的假设,我们为conf/nginx.conf添加以下配置
server {
listen 80;
server_name www.you.com;
access_log /home/work/var/test/logs/access.log;
error_log /home/work/var/test/logs/error.log;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8077;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /static/ {
alias /home/work/src/sites/testdjango1/testdjango/collectedstatic/;
index index.html index.htm;
}
location /media/ {
alias /home/work/src/sites/testdjango1/testdjango/public/media/;
}
}
在上面的设置后,可以让Nginx来处理静态文件(/static/ 和 /media/ )。非静态文件请求Nginx会发给 socket 8077,然后让uWSGI来进行处理。
Nginx+uWSGI+Django的实现方式
在完成上面配置后,需要按以下步骤来做:
重启Nginx服务器,以使Nginx的配置生效。
nginx -s reload
重启后检查Nginx日志是否有异常。
启动uWSGI服务器
cd /home/work/src/sites/testdjango1/testdjango/mysite uwsgi -x djangochina_socket.xml
检查日志 uwsgi.log 是否有异常发现。
访问服务
基于上面的假设你的域名是www.you.com
因此,我们访问 www.you.com,如果发现程序与 单独使用Django启动的程序一模一样时,就说明成功啦!
关闭服务的方法
将uWSGi进程杀死即可。
一些建议
uWSG配置文件的进程数,可以根据实际情况分配。不要开得太大,否则机器可能会内存耗用太高。一般来说,对于一个小社区来说,4个进程已经足够了。
一般情况下,可以编写一下 stop.sh 脚本 来关闭uWSGI。
最后
最后面,请大家要支持Django中国社区哦,单靠一两个人是不行的,一起推广一下,让Django社区更有力量哈!更有人气哈!
推广链接: http://django-china.cn/
END
五步教你实现使用Nginx+uWSGI+Django方法部署Django程序的更多相关文章
- 使用Nginx+uWSGI+Django方法部署Django程序(下)
在上一篇文章<五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)>中,阐述了如何只使用uWSGI来部署Django程序. 当然,单单只有uWSGI是不够的, ...
- 使用Nginx+uWSGI+Django方法部署Django程序(上)
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
- 使用Nginx+uWSGI+Django方法部署Django程序
第一步先解决uwsgi与django的桥接.解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器. 第二步解决uwsgi与Nginx的桥接.通过nginx与uws ...
- Nginx+uWSGI或fastcgi部署Django项目
nginx+uWSGI ubuntu下先安装下C编译器和Python环境: sudo apt-get install build-essential python-dev 使用pip安装uWSGI: ...
- nginx+uwsgi+virtualenv+supervisor部署项目
一.导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的 ...
- Ubuntu Nginx Uwsgi Python布置服务器Django项目
1 安装python 3.6 ubuntu预装了2.7,不需要卸载预装库,直接安装python3.6(其实现在的阿里云18.04会给你自动装python2.7.15和3.6.8) 你可以分别查看一下 ...
- Django+Nginx+uWSGI生产环境部署
生产环境中的数据流 参考文档: wsgi详解:https://blog.csdn.net/li_101357/article/details/52748323 wsgi协议介绍(萌新版):https: ...
- Django项目部署(django+guncorn+virtualenv+nginx)
一.说明 为了django项目部署到生产环境上,能够稳定的运行,且能够同时指出http和https的访问,对django的部署进行了一些研究,决定采用django + gunicorn + virtu ...
- flask + nginx + uwsgi + ubuntu18.04部署python restful接口
目录 参考链接 效果展示 一.准备工作 1.1 可运行的python demo: 1.2 更新系统环境 二.创建python虚拟环境 三.设置flask应用程序 四.配置uWSGI 五.设置系统启动 ...
随机推荐
- 利用React实现表头维度功能
这是我真正意义上地用react实现一些东西.这次分享的是一个很简单的小组件,效果图先放上来: 前端样式用的是一套框架.功能很简单,就是根据选择的维度,在成员里选择对应这个维度的选项. 首先初始化一些数 ...
- Javascript初学篇章_2(数据类型的查看和转换/运算符)
三.数据类型的查看和转换 1.查看数据类型 typeof 说明:typeo可以查看变量的类型. 语法:alert(typeof 变量名或数据): 2.转换成字符串 var married = fal ...
- 谢欣伦 - OpenDev原创教程 - 设备查找类CxDeviceFind & CxDeviceMapFind
这是一个精练的设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxDeviceFind的使用如下: void CUsbSc ...
- HBuilder从下载到使用
听别人谈论这货,于是决定长长见识,见见世面,便屁颠屁颠到网上下一个,满怀好奇的研究了一下.对用过eclipse这款软件的人来说,上手非常容易. ☆ 准备工作 ① 确认自己的电脑连接网络,能下载东西. ...
- python-socket-SocketServer - Forking
在之前的文章中,客户端和服务端.一般情况下并非是一对一的关系.多对一,多个客户端连接一个服务端.并且服务端需要对每一个客户端进行信息处理. 在客户端不多的情况下,可以采取为每一个客户端创建一个进程对其 ...
- ThinkPHP数据库访问CRUD;__SELF__和__ACTION__的区别;自动收集表单:$n->create();
一.tp框架数据访问(pdo基础) public function test() { $n = D("Nation"); //select();find(); //查询 1.$at ...
- (。・・)ノ~个人java学习随笔记录
基本认识 1.编程思维 根据这几天的java学习,编写程序最重要的就是要有一个清晰的思路.语法上的错误可以跟随着不断的联系与学习来弥补,清晰的思维却只有自己来前期模仿,后面慢慢摸索形成一套属于自己的思 ...
- selenium python的使用(一)
下面是一个爬取知网数据的例子,使用selenium 用python爬取数据 1.创建对象,打开指定地址,在休眠的20秒内输入搜索项 driver= webdriver.Chrome() driver. ...
- Centos minimal安装
Q:为什么要安装minimal版本?而不是完整版 A:因为它资源小啊 @ @ 怎么安装就不说了,网上资源大把,Centos7好像变化挺大,mysql都装不上,还是装6吧~ 1.安装完是不能联网的,解决 ...
- 打造Linux三流娱乐环境,二流办公环境,一流Java开发环境
写这篇文章的目的首先是为让自己以后再装linux环境时候,不用再通宵google+百度,做个备忘录,其次,给新入Linux环境的同学分享一点个人经验,再高尚点的动机也算是想做为开源技术的传播布道者.我 ...