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

在上一篇文章《五步教你实现使用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
 
124498 次点击  
文章 [ 66 ]  |  最新文章 7 年前
sincerefly
Reply   •   1 楼
sincerefly    10 年前

@Django中国社区 问题解决了,是原程序的url中的一点问题,uwsgi不识别导致。

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

@sincerefly 你原来的Django程序可以吗

sincerefly
Reply   •   3 楼
sincerefly    10 年前

补充: 直接跟在网址后面的一级目录可以访问 如115.28.xx.xx/views 但是115.28.xx.xx/user/sincere 这样的就不可访问,而且admin也是不可访问的。

sincerefly
Reply   •   4 楼
sincerefly    10 年前

很不错的教程,跟着做很快就建完成了,但是有不少界面返回的都是500,不知为何....

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

@Xavier 好的,不过觉得 其实差不多额

Xavier
Reply   •   6 楼
Xavier    10 年前

嗨,现在能更新一下了吗?都到 1.65 了

alexkh
Reply   •   7 楼
alexkh    10 年前

@异类深呼吸 我也遇到这种情况了,查了下是很正常的,是跟环境有关的。

-x -xml都有问题,需要用ini配置,不过效果都是一样的。

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

@Django中国社区 OMG,看来我只能是怀疑我的版本了么,这边是centos 6.5 minimal,所以尝试了下,我试试其他版本吧,今天一定要把这个问题解决,要不然心里一个坎呐~

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

我的配置 uwsgi --version 1.4.4

python 是2.7的

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

@Django中国社区 这个肯定是有的呢,参照你的uwsgi -x django_socket.xml,参数的话也是参照你的你的文章里的内容进行了部分的修改

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

@异类深呼吸 uwsgi -x socket.xml

你需要有XML参数~~

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

@Django中国社区 很奇怪,我到了以配置文件启动uwsgi的时候就提示我无效选项,报错如下

uwsgi: invalid option -- 'x'  
getopt_long() error

python版本2.6.6,uwsgi版本2.0.4,yum源安装

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

@异类深呼吸 有的啊

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

@Django中国社区 uwsgi -x有这个选项么?一直都没找到

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

@digglife 是啊

digglife
Reply   •   16 楼
digglife    10 年前

测试成功。又学到一招。话说,改了代码之后是杀掉uswgi然后在启动吗?

digglife
Reply   •   17 楼
digglife    10 年前

不错,正好拿来测试。多谢。

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

@396564168 第一次肯定双启动,若更改程序后,则只要重启自己的Django程序即可

396564168
Reply   •   19 楼
396564168    11 年前

这样的话,每次启动网站访问是不是需要同时启动nginx服务和uwsgi服务呢

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

@1458409827 可以不用virtualenv

看起来像是virtualenv的错误 https://bugs.launchpad.net/ubuntu/+bug/1192890