Py学习  »  Django

[精华] 五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)

Py站长 • 10 年前 • 97950 次点击  

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服务器。

环境介绍

  1. Ubuntu 12.04.1 LTS
  2. 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

访问网页:

http://127.0.0.1:8001/

看在网页上是否有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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/bin/env python
# coding: utf-8

import os
import sys

# 将系统的编码设置为UTF8
reload(sys)
sys.setdefaultencoding('utf8')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

连接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服务器,这样可以达到很好的客户端响应。

  • 参考文献:http://heipark.iteye.com/blog/1750970

END

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/101
 
97950 次点击  
文章 [ 51 ]  |  最新文章 7 年前
Py站长
Reply   •   1 楼
Py站长    9 年前

@From_scratch_2012 赞哈

From_scratch_2012
Reply   •   2 楼
From_scratch_2012    9 年前

嗯,我这边解决了,原来是静态文件配置的少了个逗号,报错了。所有没显示到。@Django中国社区

Py站长
Reply   •   3 楼
Py站长    9 年前

@shanyuze1029 当然可以啊

shanyuze1029
Reply   •   4 楼
shanyuze1029    9 年前

@Django中国社区,那就在linux上配了,centos可以吧!

Py站长
Reply   •   5 楼
Py站长    9 年前

@shanyuze1029 windows下没玩过啊。。windows不靠谱的

shanyuze1029
Reply   •   6 楼
shanyuze1029    9 年前

@Django中国社区,uwsgi+nginx可以再windows上进行部署吗?我怎么安装不上uwsgi(用pip install uwsgi)??求解答,先谢了

Py站长
Reply   •   7 楼
Py站长    9 年前

@From_scratch_2012 你提供的东西太少了,show下你的uwsgi的日志

From_scratch_2012
Reply   •   8 楼
From_scratch_2012    9 年前

@Django中国社区

From_scratch_2012
Reply   •   9 楼
From_scratch_2012    9 年前

求教下,我用uwsgi起我的项目,怎么在页面上无法显示样式,图片等。但是,直接runserver是正常的。

异类深呼吸
Reply   •   10 楼
异类深呼吸    9 年前

@LYcSon wsgi和uwsgi不是一码事,亲,需要的nginx和django通信用的时uwsgi,默认的django自带的时wsgi

wangyu190810
Reply   •   11 楼
wangyu190810    9 年前

必须赞一个!

eastunbeaten-weibo
Reply   •   12 楼
eastunbeaten-weibo    9 年前

赞,喜欢这种风格简洁,步骤清晰的文章,支持

Py站长
Reply   •   13 楼
Py站长    10 年前

@CodeMonkey徐栋栋-weibo 嗯,起名字起的不是很好

CodeMonkey徐栋栋-weibo
Reply   •   14 楼
CodeMonkey徐栋栋-weibo    10 年前

我有个问题, 既然uwsgi和wsgi是两个接口协议,为什么在命名时,使用django_wsgi,而实际是用uwsgi协议?

Py站长
Reply   •   15 楼
Py站长    10 年前

@405436867

你要用 uwsgi --http :8000 --chdir /home/work/src/sites/testdjango1/testdjango/mysite --module django_wsgi 这种啊

405436867
Reply   •   16 楼
405436867    10 年前

uwsgi --http :8001 --wsgi-file test.py 执行完这一步然后在浏览器中访问的时候显示无法连接到127.0.0.1,请问这是什么情况?

我心荡漾
Reply   •   17 楼
我心荡漾    10 年前

说实话,python + nginx 我一直都很头疼,不过有这文章,支持再支持

Py站长
Reply   •   18 楼
Py站长    10 年前

@LYcSon 嗯嗯

LYcSon
Reply   •   19 楼
LYcSon    10 年前

Django 1.5 已经自动帮我们生成 wsgi.py,所以启动的命令需要稍微改一下。

项目路径:/var/www/mysite,那么 wsgi.py 的完整路径是:/var/www/mysite/mysite/wsgi.py

启动命令:uwsgi --http :8000 --chdir /var/www/mysite/ --module mysite.wsgi

jingzuo
Reply   •   20 楼
jingzuo    10 年前

uwsgi --http :8000 --chdir /home/work/src/sites/testdjango1/testdjango/mysite --module django_wsgi

有发现导入错误啊。NO module named django_wsgi啊,在本目录添加了django——wsgi.py 文件的。