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

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

hi

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

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

badarse
Reply   •   3 楼
badarse    8 年前

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

1933543607
Reply   •   4 楼
1933543607    8 年前

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

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

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

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

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

461371216
Reply   •   7 楼
461371216    8 年前

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

461371216
Reply   •   8 楼
461371216    8 年前

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

296358012
Reply   •   9 楼
296358012    8 年前

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

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

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

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

@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    9 年前

学习了

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

@578295258 当然可以啦

578295258
Reply   •   14 楼
578295258    9 年前

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

asmary
Reply   •   15 楼
asmary    10 年前

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

Tangwzzz
Reply   •   16 楼
Tangwzzz    10 年前

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

tekin
Reply   •   17 楼
tekin    10 年前

@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站长    10 年前

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

Hiro_Fu
Reply   •   19 楼
Hiro_Fu    10 年前

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

Hiro_Fu
Reply   •   20 楼
Hiro_Fu    10 年前

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