Python社区  »  Django

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

Py站长 • 6 年前 • 114970 次点击  

在上一篇文章《五步教你实现使用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
 
114970 次点击  
分享到微博
文章 [ 66 ]  |  最新文章 1 年前
Py站长
Reply   •   1 楼
Py站长    1 年前

hi

支付小哥
Reply   •   2 楼
支付小哥    2 年前

@badarse 你看下uwsgi的日志,看报了什么错误,才能具体问题具体分析

badarse
Reply   •   3 楼
badarse    2 年前

请教楼主一下, nginx + uwsgi 部署django经常出现502错误怎么办,时好时坏,也照着网上设置过一些超时什么的,都没用, 而且admin界面每次都会502

1933543607
Reply   •   4 楼
1933543607    2 年前

你好,请问如果我想在window平台部署项目,楼主有解决的方案吗?

bOohoOmm-weibo
Reply   •   5 楼
bOohoOmm-weibo    3 年前

哇哈哈哈,我解决了,在xml里加上一行,<plugins>python</plugins>就可以了

bOohoOmm-weibo
Reply   •   6 楼
bOohoOmm-weibo    3 年前

之前不用nginx的上一步是ok的,配上nginx之后,就一直502,errorlog里的信息是upstream prematurely closed connection while reading response header from upstream。求解~~~~

461371216
Reply   •   7 楼
461371216    3 年前

补充下,uwsgi就报404错误的时候,uwsgi.log的日志也不会刷

461371216
Reply   •   8 楼
461371216    3 年前

请教个问题。我uwsgi+nginx+django都搭好了,直接返回ip有正常返回的。django的默认admin我也搭好了,用django自带的轻量服务器,是可以访问到数据库的,但是用uwsgi就报404错误。。求教

296358012
Reply   •   9 楼
296358012    3 年前

nginx.conf 里的server配置是直接加在最下面吗?报了个这样的错:nginx: [emerg] "server" directive is not allowed here in /etc/nginx/nginx.conf:98 不知道怎么解决了,谢谢楼主

zh正-在路上-weibo
Reply   •   10 楼
zh正-在路上-weibo    3 年前

查看了uwsgi.log也看不到有用的信息,故意把html中引用静态文件的路径改成错的,log文件中能看到404错误,但是改成对的就没提示200ok

zh正-在路上-weibo
Reply   •   11 楼
zh正-在路上-weibo    3 年前

@Django中国社区 我没用到media,只用到了static,我的static目录是在项目的根目录下,settings.py关于静态目录的设置是这样的: STATIC_ROOT = '' STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(os.path.dirname(file), '../static/').replace('\','/'), ) 然后按照你上面的代码也把location /static/改为mysite/static/了,但是失败了,导致我的界面没加载静态文件(css,js,图片等),全只有文字

1208269520
Reply   •   12 楼
1208269520    3 年前

学习了

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

@578295258 当然可以啦

578295258
Reply   •   14 楼
578295258    3 年前

@Django中国社区 文章很赞,您好,我也正在利用nginx+uwsgi+django部署网站。遇到了问题,可以请教你吗?

asmary
Reply   •   15 楼
asmary    4 年前

为何部署以后,页面翻页的时间,底部的显示不全?

Tangwzzz
Reply   •   16 楼
Tangwzzz    4 年前

现在想换wordpress 可是进入域名总是Welcome to nginx! 请问怎么解除域名和nginx的绑定,转为进去wordpress?

tekin
Reply   •   17 楼
tekin    4 年前

@Django中国社区 如果我要部署多个应用怎么部署? 比如: project1 project2 project3 访问时需要
http://127.0.0.1/project1 http://127.0.0.1/project2 http://127.0.0.1/project3 来访问,各自是独立的,都部署在站点根目录下、需要怎么配置 nginx ,uwsgi 要用ini来配置。

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

@Hiro_Fu 是啊,从1.6开始好像必须设置这个的。。。

Hiro_Fu
Reply   •   19 楼
Hiro_Fu    4 年前

@Hiro_Fu 找到问题原因了,搜了一天和 nginx 部署的问题,结果导致问题出现的原因是因为网站 app 的 setting.py 中的 ALLOWED_HOSTS 没有填入值,加上自己主机的地址就解决了。。。真伤心,浪费了这么多时间

Hiro_Fu
Reply   •   20 楼
Hiro_Fu    4 年前

老大,今天我重启了下 nginx 然后更换了网站的文件,然后打开网站就 400 错误了。恢复成昨天的文件也不管用了,纠结一天了,请问有什么办法能解决不?