社区所有版块导航
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站长 • 10 年前 • 122728 次点击  

在上一篇文章《五步教你实现使用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
 
122728 次点击  
文章 [ 66 ]  |  最新文章 6 年前
_二_师_兄_
Reply   •   1 楼
_二_师_兄_    9 年前

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

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

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

133778992
Reply   •   3 楼
133778992    9 年前

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

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

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

133778992
Reply   •   5 楼
133778992    9 年前

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

133778992
Reply   •   6 楼
133778992    9 年前

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

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

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

376702145
Reply   •   8 楼
376702145    9 年前

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

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

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

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

376702145
Reply   •   10 楼
376702145    9 年前

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

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

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

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

@aga0217 赞的

376702145
Reply   •   13 楼
376702145    9 年前

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

aga0217
Reply   •   14 楼
aga0217    9 年前

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

From_scratch_2012
Reply   •   15 楼
From_scratch_2012    9 年前

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

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

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

From_scratch_2012
Reply   •   17 楼
From_scratch_2012    9 年前

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

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

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

lazybios
Reply   •   19 楼
lazybios    9 年前

@Django中国社区 写得真好~

imkh
Reply   •   20 楼
imkh    9 年前

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