django 生产环境 nginx+uwsgi环境安装

2016/6/21 posted in  python

django 生产环境

django部署生产环境使用的比较多的是nginx+uwsgi和 apache+mod_python

由于对nginx比较熟一些,所以这里先使用nginx来进行部署。

安装pip

    $ sudo apt-get install python-pip python-dev build-essential 
    $ sudo pip install --upgrade pip 
    $ sudo pip install --upgrade virtualenv 

安装uwsgi

将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。

第一步先解决uwsgi与django的桥接。解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器。

第二步解决uwsgi与Nginx的桥接。通过nginx与uwsgi的桥接,打通nginx与django的连通,从而比较完美的实现django的部署。

安装uwsgi

    $ export LDFLAGS="-Xlinker --no-as-needed"
    $ pip install uwsgi

测试uwsgi
在你的机器上写一个test.py

    #test.py
    def application(env, start_response):
        start_response('200 OK', [('Content-Type','text/html')])
        return "Hello World"

然后执行shell命令:

    uwsgi --http :8001 --wsgi-file test.py

访问网页:

    http://127.0.0.1:8001/

看在网页上是否有Hello World

安装django

django安装,我用的是比较新的版本,由于老版本总是出现这样那样的问题,也和最新的文档对接不上,django的版本升级实在是太快了。

    sudo pip install django==1.9.6

安装git

安装git,来远程获取代码

    sudo apt-get install git

安装好git之后需要导入我的代码,创建一个目录,然后在目录下

    git init
    git clone https://github.com/yourwilliam/melonblog

就可以将代码clone到本地了。

安装pip

使用django还需要把代码依赖的python包考到本地,这里也使用pip来管理,pip的安装和配置参看其他的博客中有介绍。

安装MySQL数据库和相关python驱动包

    sudo apt-get install mysql-server
    apt-get install mysql-client
    sudo apt-get install libmysqlclient-dev
    sudo apt-get install python-mysqldb

创建数据库

需要 create database

使用python来创建数据库

    python manage.py migrate
    # 创建数据库
    python manage.py makemigrations blog
    python manage.py makemigrations mshow
    # 创建各个APP的数据库
    python manage.py migrate

启动django做测试

    python manage.py runserver 0.0.0.0:8001
    root@iZ23b233aiuZ:/home# pip install django-wsgi

配置uwsgi

详细可以参考

五步教你实现使用Nginx+uWSGI+Django方法部署Django程序上

五步教你实现使用Nginx+uWSGI+Django方法部署Django程序下

编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下

编写文件时需要注意语句os.environ.setdefault。比如,如果你的项目为mysite,则你的语句应该是 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

    #!/usr/bin/env python
    # coding: utf-8
    import os
    import sys
    # 将系统的编码设置为UTF8
    reload(sys)
    sys.setdefaultencoding('utf8')
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()

升级了django和wsgi新版本之后这里需要改为

#!/usr/bin/env python
# coding: utf-8

import os
import sys

# 将系统的编码设置为UTF8
import django

reload(sys)
sys.setdefaultencoding('utf8')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hansapwiki.settings")
django.setup()

from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

启动

    udo uwsgi --http :8000 --chdir /opt/melonblog/melonblog --module django_wsgi

在这里的时候访问页面,出现css,js或者图片无法加载,可以不用担心,因为此时uwsgi仅仅处理数据请求,这些静态文件需要使用nginx来读取,在配置好nginx之后就可以配置了。

配置uwsgi的XML文件

djangochina_socket.xml, 将这个文件配置为

    <uwsgi>
        <socket>:8077</socket>
        <chdir>/opt/melonblog/melonblog</chdir>
        <module>django_wsgi</module>
        <processes>4</processes> <!-- 进程数 -->
        <daemonize>uwsgi.log</daemonize>
    </uwsgi>        

安装nginx

安装nginx

    sudo apt-get install nginx
    #启动、停止和重启
    sudo /etc/init.d/nginx start
    sudo /etc/init.d/nginx stop
    sudo /etc/init.d/nginx restart
    #或者
    sudo service nginx start

配置nginx

使用apt-get获取的nginx默认的在_etc_nginx/ 下,修改下面的nginx.conf 文件

server {
    
    listen   80;
    server_name 121.41.8.92;
    access_log /var/log/nginx/melonblog/access.log;
    error_log /var/log/nginx/melonblog/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  /opt/melonblog/melonblog/blog/static/;
        index  index.html index.htm;
    }

    location /media/ {
        alias  /opt/melonblog/melonblog/blog/static/media/;
    }
}

这样便设置了上面的目录结构

配置完成后重启nginx nginx -s reload

启动uwsgi服务器

    cd /opt/melonblog/melonblog/
    uwsgi -x djangochina_socket.xml

关闭uwsgi进程的方法

    ps -ef|grep uwsgi 
    #如果启动没有完成,这个是没有进程的,有进程代表启动成功
    kill -9 *****
    #将所有的进程杀死可以完成

其他配置

admin的样式问题

由于后台使用admin 模块,在django服务器中,会默认的将所有的static文件都写入到static目录中。但是此时是由nginx来进行静态文件转发,所以无法转发,需要在转发中添加admin部分的静态文件,在nginx配置文件中添加

    location /static/admin/ {
                alias /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/;
            }