Py学习  »  Django

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

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

在上一篇文章《五步教你实现使用Nginx+uWSGI+Django方法部署Django程序(上)》中,阐述了如何只使用uWSGI来部署Django程序。

当然,单单只有uWSGI是不够的,在实际的部署环境中,Nginx是必不可少的工具。

在本篇文章中,我将一直延用“N步法”的风格来阐述如何将uWSGI与Nginx做连接来部署Django程序。并在最后,会较为完整的阐述本社区的部署方法。

本文大纲:

  • 环境介绍
  • 配置uWSGI
  • 配置Nginx
  • Nginx+uWSGI+Django的实现方式
  • 一些建议

环境介绍

  1. Ubuntu 12.04.1 LTS
  2. django 1.4.2
  3. nginx/1.2.6
  4. 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的实现方式

在完成上面配置后,需要按以下步骤来做:

  1. 重启Nginx服务器,以使Nginx的配置生效。

    nginx -s  reload
    

    重启后检查Nginx日志是否有异常。

  2. 启动uWSGI服务器

    cd /home/work/src/sites/testdjango1/testdjango/mysite
    
    uwsgi -x djangochina_socket.xml
    

    检查日志 uwsgi.log 是否有异常发现。

  3. 访问服务

    基于上面的假设你的域名是www.you.com

    因此,我们访问 www.you.com,如果发现程序与 单独使用Django启动的程序一模一样时,就说明成功啦!

  4. 关闭服务的方法

    将uWSGi进程杀死即可。

一些建议

  1. uWSG配置文件的进程数,可以根据实际情况分配。不要开得太大,否则机器可能会内存耗用太高。一般来说,对于一个小社区来说,4个进程已经足够了。

  2. 一般情况下,可以编写一下 stop.sh 脚本 来关闭uWSGI。

最后

最后面,请大家要支持Django中国社区哦,单靠一两个人是不行的,一起推广一下,让Django社区更有力量哈!更有人气哈!

推广链接: http://django-china.cn/

END

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/124
 
125447 次点击  
文章 [ 66 ]  |  最新文章 7 年前
_二_师_兄_
Reply   •   1 楼
_二_师_兄_    10 年前

静态文件404,是什么问题?按照上面Nginx的配置.

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

@133778992 那你可以研究一下简单的 例如 web.py, bottle 之类的

133778992
Reply   •   3 楼
133778992    10 年前

@Django中国社区 你这个用后台是什么意思? 我就是想初期练练手 先不用框架写网站 但是网上资料全是 用框架 我有点茫然。我不想用框架,等学的差不多了 再看Django。不管是url处理 还是逻辑层这些我全手动,当然要行得通。

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

不同框架的配置估计会不一样。 你是用后台的? @133778992

133778992
Reply   •   5 楼
133778992    10 年前

由于没发上传图片 我只能 发远程图片了 这里是我的截图:http://url.qmail.com/51XmA6Uu

133778992
Reply   •   6 楼
133778992    10 年前

楼主好厉害,首先我回答一下上面的问题 关于没有 -x 这个选项的问题 你可以用ini 启动,或者换低版本的uwsgi。其次如果想要每次改了应用之后不重启uwsgi有好几种方法最好用一个uwsgi里面的方法具体可以看一下官网,其次可以在xml里面加上 py-autoreload> 也不用每次改完之后重启。我的问题是楼主我没用Django框架能直接用uwsgi+nginx 开发网站吗?我现在写了一个应用我把链接数据库和模板全部分离了 出来,但是下面我不知道该怎么做,url如何配置?如何配置成一个成品网站呢?我学过Django 但是没学会只能自己先默默的写一些东西了,好多人都笑我这样还不如去学习php 但是我有自己的想法啊。请楼主帮我,我没有web基础,只能写到这里了。

1yanguang-weibo
Reply   •   7 楼
1yanguang-weibo    10 年前

@376702145你是怎么解决你那个问题的啊!

376702145
Reply   •   8 楼
376702145    10 年前

@Django中国社区
已经可以咯~~谢谢你哈。

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

@376702145 你的django是以什么端口启动的?如果不是80端口,肯定访问不到啊。而且一般需要ROOT权限才能使用80端口,

https://docs.djangoproject.com/en/dev/intro/tutorial01/

376702145
Reply   •   10 楼
376702145    10 年前

@Django中国社区 哭死阿。 我简单写了一个url,然后HttpResponse("ok") 一直是直接输入网址80端口是显示django的浅蓝色界面。 只有开启 uwsgi --http :8000 --chdir /home/djangoproject/myblog --module django_wsgi 开始8000端口后才出现:OK。 如果我不开启,就一直是Django的浅蓝色界面呀。 是什么原因呢 ?

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

@376702145 你可以在服务器上开启debug模式调试一下。(可以开一个别人不知道的端口进行调试)

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

@aga0217 赞的

376702145
Reply   •   13 楼
376702145    10 年前

我已经在服务器上配好了。但是,应该怎么在服务器上完成代码的编写呢?我见到的写了一个,urls.py写了个test,views.py简单返回了个“OK”,但是我怎么打开/test,都是现实Django那个绿色的页面。是不是本地和服务器上面开发不一样呢 ?

aga0217
Reply   •   14 楼
aga0217    10 年前

我的系统是Debina 7 X64,Nginx是从Dotdeb源安装的,安装后在/etc/nginx 下有配置文件nginx.conf,但我尝试将楼主的代码直接写入发现会出现错误,后来查看了一些资料,在/etc/nginx/conf.d 下建立任意名称.conf文件,将楼主的代码全部写入并根据自己的情况修改,我只修改了服务器地址和静态文件地址,保存后重启Nginx生效。

From_scratch_2012
Reply   •   15 楼
From_scratch_2012    10 年前

我这边使用sudo apt-get nginx安装,安装完成后,找不到conf文件。@Django中国社区

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

nginx安装目录下 有 conf , conf目录下有nginx.conf文件

From_scratch_2012
Reply   •   17 楼
From_scratch_2012    10 年前

@Django中国社区, "conf/nginx.conf"路径是?

爱情的枪
Reply   •   18 楼
爱情的枪    10 年前

英文好的可以看看这里 https://uwsgi-docs.readthedocs.org/en/latest/Configuration.html?highlight=xml

lazybios
Reply   •   19 楼
lazybios    10 年前

@Django中国社区 写得真好~

imkh
Reply   •   20 楼
imkh    10 年前

@异类深呼吸 不是版本问题,是你的uwsgi不支持xml,用“ yum install libxml*”即可解决。安装uwsgi时看到 “xml = libxml2”就表示成功了。