社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

Py站长 • 11 年前 • 100311 次点击  

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
 
100311 次点击  
文章 [ 51 ]  |  最新文章 8 年前
Py站长
Reply   •   1 楼
Py站长    10 年前

@From_scratch_2012 赞哈

From_scratch_2012
Reply   •   2 楼
From_scratch_2012    10 年前

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

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

@shanyuze1029 当然可以啊

shanyuze1029
Reply   •   4 楼
shanyuze1029    10 年前

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

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

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

shanyuze1029
Reply   •   6 楼
shanyuze1029    10 年前

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

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

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

From_scratch_2012
Reply   •   8 楼
From_scratch_2012    10 年前

@Django中国社区

From_scratch_2012
Reply   •   9 楼
From_scratch_2012    10 年前

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

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

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

wangyu190810
Reply   •   11 楼
wangyu190810    11 年前

必须赞一个!

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

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

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

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

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

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

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

@405436867

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

405436867
Reply   •   16 楼
405436867    11 年前

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

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

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

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

@LYcSon 嗯嗯

LYcSon
Reply   •   19 楼
LYcSon    11 年前

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    11 年前

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

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