每个框架或者应用都是为了解决某些问题才出现旦生的,没有一个事物是可以解决所有问题的。如果觉得某个框架或者应用使用很不方便,那么很有可能就是你没有将其使用到正确的地方,没有按开发者的设计初衷来使用它,当你将一个框架的优势使用到极致时一定是非常舒服和顺手的一件事。但同时也有可能衍生另一个问题,这个框架只解决了你的问题一,没有解决问题二、三等等,因此,就出现了多个框架/应用相结合的情况。比如Django + uWSGI + nginx。

  本人初学python,找了一些实例进行了一些操作,以下纯属目前的理解,如有偏差,欢迎修正。

一、关于Django、uwsgi、nginx这三者关系的理解。

  Django是一个WEB框架。所谓WEB框架,那么一定是搭建了一些模型,在安装完框架后,可以很方便的调用框架的方法,实现web功能。Django的特点在于MVC,模型--视图--控制。关于MVC不同的框架有不同的定义,不用纠结去统一MVC的定义,只需要理解各个框架自身的设计的特点的优势。关于Django框架,M模型:指的的数据库模型的管理(对于Django更多的在数据库相关的应用程序开发上有一点的优势);V视图:指的是如何根据业务需求来显示M中的哪些数据,更多是与业务相关;C控制:指的是用户访问的浏览器的地址与视图的映射关系。由于C比较简单已经由Django封装好了,基本上只用按正则表达示写一些类似配置文件的东西即可。而人们说到MVC时一般会有一个表示层,即业务数据在页面如果显示,以表格还是其它方式,表格的样式如何等等,该层在Django中也可被称为T模板,被合并到V中。所以使用Django,我们一般关心的是MTV的管理。

  既然Django其重点在于MVC的模架管理,虽然也可以使用Django完成WEB服务器的功能(执行命令python manage.py runserver),但是仅仅是在测试环境中使用,对于要求稳定性和性能的生产环境,它无法达到。因此需要加入uWSGI。wsgi是一种协议,仅仅是协议并未实现,而uwsgi也是一种协议,两者有所不同。而uWSGI就是使用python将wsgi与uwsgi进行实现的WEB服务器,Django + uWSGI其WEB服务器的功能要更优于Django本身自带的web服务器。

  那么有了uWSGI为什么还需要nginx?因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。

二、环境搭建。

  1、安装Django。

    关于Django的使用网上资料很多,本人选择了两个比较合适的资料进行了实战操作,觉得不错。可参见”Django搭建及源码分析(一)“,提到了搭建方法和,参考资料。下面进入本节主题。

    本人的系统环境centos6.0、python2.6、Django1.6,虽然都比较老了,但是不影响了解事物的本质的特点。继续...

  2、安装uWSGI。

    Django环境的搭建与配置请参见"Django搭建及源码分析(一)“,在保证Django可以访问之后,加入uWSGI。

    使用pip install uwsgi

    我安装的是uwsgi 2.0.1版本。

  3、验证uWSGI是否安装成功。

    新建test.py文件,内容如下:

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

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

    在浏览器内输入:http://ip:8001,查看是否有"Hello World"输出,若没有输出,请检查你的安装过程。

  4、验证Django+uWSGI是否连接成功。

    uwsgi --http :8000 --wsgi-file /home/MyDjProj/MyDjProj/wsgi.py

    将test.py修改为Django项目中生成的wsgi.py,通过浏览器访问Django框架中的页面,成功。则说明两者连接正常。

  5、安装nginx。

    下载自已喜欢的nginx版本,我下的是当前最新稳定版nginx-1.8.0.tar.gz。

    ./configure --prefix=/usr/local/nginx-1.8 \ --with-http_stub_status_module \ --with-http_gzip_static_module

    make && make install

  6、配置uwsgi

    uwsgi支持ini、xml等多种配置方式,本文以 ini 为例在/etc下创建uwsgi8000.ini   

[uwsgi]
socket = 127.0.0.1:8000
master = true //主进程
vhost = true //多站模式
no-stie = true //多站模式时不设置入口模块和文件
workers = 2 //子进程数
reload-mercy = 10
vacuum = true //退出、重启时清理文件
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi8000.pid //pid文件,用于下面的脚本启动、停止该进程
daemonize = /var/log/uwsgi8000.log //日志文件
pythonpath = /usr/lib/python2.6/site-packages //同环境变量PYTHONPATH

  7、配置nginx

    找到nginx的安装目录(如:/usr/local/nginx-1.8/),打开conf/nginx.conf文件,修改server配置:

    server {
listen 80;
server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location /{
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;            //必须和uwsgi中的设置一致
uwsgi_param UWSGI_SCRIPT MyDjProj.wsgi;    //入口文件,即wsgi.py相对于Django项目根目录的位置,“.”相当于一层目
uwsgi_param UWSGI_CHDIR /home/MyDjProj;    //Django项目根目录  
index index.html index.htm;
client_max_body_size 35m;
}

  8、测试Django + uwsgi + nginx

    uwsgi --ini /etc/uwsgi8000.ini & /usr/local/nginx-1.8/sbin/nginx

    在浏览器输入:http://ip/,你就可以看到django的"It work"了。http://ip/hello,可以打开Django项目中,通过urlconf配置的hello子页面的view视图

三、遇到的问题。

  1、在连接Django与uwsgi时(uwsgi --http :8000 --wsgi-file /home/MyDjProj/MyDjProj/wsgi.py),报出“ImportError: Could not import settings 'MyDjProj.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named MyDjProj.settings”

    可以看出执行/home/MyDjProj/MyDjProj/wsgi.py时,在sys.path中无法找到MyDjProj.settings,需要所/home/MyDjProj加入到sys.path中即可,加入方法有很多,在此我使用的是export PYTHONPATH=$PYTHONPATH:/home/MyDjProj,加入后,再访问即可。

    在连接Django、uwsgi和nginx时,sys.path不受环境变量PYTHONPATH的影响,也会自动将nginx配置中的项目根目录加入到sys.path中,因此在后续步骤中此问题不影响三者连接。

  2、在连接Django、uwsgi和nginx时,报出File "./MyDjProj/wsgi.py", line 17, in <module> from django.core.wsgi import get_wsgi_application ImportError: No module named django.core.wsgi

    可以看出在执行/home/MyDjProj/MyDjProj/wsgi.py时,在sys.path中无法找到 django.core.wsgi,通过在MyDjProj/wsgi中加入sys.path的打印看出,sys.path中缺少/usr/lib/python2.6/site-packages,原因暂不清楚。

    通过在uwsgi8000.ini中加入“pythonpath = /usr/lib/python2.6/site-packages”,重新连接成功。

  3、遇到其它问题时,先判断端口是否正常打开,使用netstat -plnt查看。

  4、修改后配置后,最好关闭uwsgi及nginx后,重新连接。关闭方法:fuser -k 端口/tcp。如:fuser -k 80/tcp; fuser -k 8000/tcp

  5、多查看日志文件,文件中详细的报错信息,对于nginx的日志,可以通过在nginx.conf中配置error_log  /var/log/nginx_error.log info;将出错信息打印到该文件中便于定位。

Django搭建及源码分析(三)---+uWSGI+nginx的更多相关文章

  1. Django搭建及源码分析(二)

    上节针对linux最小系统,如何安装Django,以及配置简单的Django环境进行了说明. 本节从由Django生成的manage.py开始,分析Django源码.python版本2.6,Djang ...

  2. Django搭建及源码分析(一)

    一.关于Django以下两个站点,在使用方面有详细说明. http://www.nowamagic.net/academy/part/13/286 http://www.w3cschool.cc/dj ...

  3. tomcat源码分析(三)一次http请求的旅行-从Socket说起

    p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...

  4. 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入

    使用react全家桶制作博客后台管理系统   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...

  5. Django如何启动源码分析

    Django如何启动源码分析 启动 我们启动Django是通过python manage.py runsever的命令 解决 这句话就是执行manage.py文件,并在命令行发送一个runsever字 ...

  6. Django之DRF源码分析(二)---数据校验部分

    Django之DRF源码分析(二)---数据校验部分 is_valid() 源码 def is_valid(self, raise_exception=False): assert not hasat ...

  7. Django rest framework源码分析(3)----节流

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  8. Django rest framework源码分析(1)----认证

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  9. Django rest framework 源码分析 (1)----认证

    一.基础 django 2.0官方文档 https://docs.djangoproject.com/en/2.0/ 安装 pip3 install djangorestframework 假如我们想 ...

随机推荐

  1. HTTP Response中的Status-Code

    1XX : 通知信息.请求被接收,继续处理2XX : 成功.请求动作被成功接收.理解和接受3XX : 重定向.需要其他的动作来完成这个请求4XX : 客户端错误.请求包含错误的语法或者缺少语法5XX  ...

  2. 防止ARP欺骗的方法!!!

    防止ARP欺骗的方法!!! 根据鄙人上网经常掉线,怀疑可能是某人使用网络剪刀手,网络执行官,局域网终结者等工具.经过搜索有关资料,有了一点点防范经验,借以参考~! 一 首先我们来了解下这类攻击工具的原 ...

  3. C++学习10 static静态成员变量和静态成员函数

    一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局 ...

  4. [Java] 日期的简单处理

    package test.date; import java.text.ParseException; import java.text.SimpleDateFormat; import java.u ...

  5. shell local

    Shell函数定义的变量默认是global的,其作用域从"函数被调用时执行变量定义的地方"开始,到shell结束 http://blog.chinaunix.net/xmlrpc. ...

  6. Ext TreeGrid提交修改过的数据

    本打算将整个treestore的数据提交到服务器,但找来找去没有找到好的方法,在翻api的时候发现了getUpdatedRecords()方法,拿来一试,试出此方法可以拿到被修改过的record so ...

  7. Windows server 2008 下iis7 架设ftp服务器

    架设了一天的ftp服务器,终于搞定了. 按着windows server 2003的思路在windows server 2008把ftp设置好后,登录过程老是出现:530 User cannot lo ...

  8. PL/SQL Developer使用技巧、快捷键

    1.类SQL PLUS窗口:File->New->Command Window,这个类似于oracle的客户端工具sql plus,但比它好用多了. 2.设置关键字自动大写:Tools-& ...

  9. Machine Schedule(最小覆盖)

    其实也是个最小覆盖问题 关于最小覆盖http://blog.csdn.net/u014665013/article/details/49870029 Description As we all kno ...

  10. C++ STL小知识

    五种迭代器: 在STL中,迭代器主要分为5类,分别是:输入迭代器.输出迭代器.前向迭代器.双向迭代器和随机访问迭代器. 输入迭代器 :只读,支持++.==.!=: 输出迭代器 :只写,支持++: 前向 ...