Django在生产环境中的部署

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Django在生产环境中的部署

点击上方”python宝典”,关注获取python全套视频,

技术文章第一时间送达!

基本思路

1.方案:Nginx+uwsgi
这样大体的流程是:nginx作为服务器最前端,负责接收client的所有请求,统一管理。静态请求由Nginx自己处理。非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。
2,通信请求


the web client - the web server(nginx) - the socket - uwsgi - Django

配置Nginx

安装Nginx

如果Nginx原先安装过,最好先彻底删除再重新安装!彻底删除的方法
http://blog.csdn.net/u010571844/article/details/50819704


apt-get update
apt-get install nginx

启动Nginx


/etc/init.d/nginx start  #启动
/etc/init.d/nginx stop  #关闭
/etc/init.d/nginx restart  #重启

Nginx默认监听80端口
所以安装完毕,访问localhost或者服务器自己的ip地址就可以看到下面的画面。

Django在生产环境中的部署

配置uwsgi

安装uwsgi


pip install --upgrade pip #升级pip
pip install uwsgi`

编写测试

写一个test.py测试uwsgi


# 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

此时访问8001端口,就可以看到Hello World

Django在生产环境中的部署

连接uwsgi与Django

测试Django自身

确保Django自身可以启动运行,在Django应用的目录下:


python manage.py runserver 0.0.0.0:8002

访问8002端口,如果正常,说明Django启动成功!如下图!

Django在生产环境中的部署

编写wsgi.py文件

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


#!/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")#mysite替换为自己的项目名

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

连接Django和uwsgi

通过Django与uwsgi就已经可以形成一个简单的web服务器了
编写完成django_wsgi.py文件后执行:


uwsgi --http :8000 --chdir path/to/yoursite --module django_wsgi

这样,就可以在浏览器中的8000端口访问Django程序了。
所有的请求都是经过uwsgi传递给Django程序的。

Django在生产环境中的部署

注意到,此时是访问不了js/css静态文件的!这些静态文件将交给Nginx直接处理

编写配置文件

为了实现Nginx与uWSGI的连接,两者之间将采用soket来通讯方式

将使用uWSGI配置文件的方式来改进uWSGI的启动方式

将要让Nginx采用8077端口与uWSGI通讯,请确保此端口没有被其它程序采用。

下面编写uwsgi的配置文件
新建一个XML文件:djangochina_socket.xml,与manage.py在同一级目录


uwsgi
    socket:8077/socket
    chdirpath/to/yoursite/chdir
    moduledjango_wsgi/module
    processes4/processes !-- 进程数 -- 
    daemonizeuwsgi.log/daemonize
/uwsgi

在上面的配置中,我们使用 uwsgi.log 来记录日志,开启4个进程来处理请求。
这样,我们就配置好uWSGI了。

连接Nginx与uWSGI

上文已经连接了uWsgi与Django应用,下面连接Nginx与uwsgi
修改/etc/nginx/sites-enabled/default


server {
        listen 80 default_server;

        root /usr/share/nginx/html;
        index index.html index.htm;

        # Make site accessible from http://localhost/
        server_name www.nghuyong.top;

        location / {
                include        uwsgi_params;
                uwsgi_pass     127.0.0.1:8077;
        }

        location /static/ {
            alias  path/to/yoursite/static/;
            index  index.html index.htm;
        }
}

在上面的设置后,可以让Nginx来处理静态文件(/static)。非静态文件请求Nginx会发给 socket 8077,然后让uWSGI来进行处理。

Nginx+uWSGI+Django的实现方式

1.重启Nginx服务器,以使Nginx的配置生效。


nginx -s  reload

2.启动uWSGI服务器


cd path/to/yoursite
uwsgi -x djangochina_socket.xml

检查日志 uwsgi.log 是否有异常发现。

  • 访问服务 基于上面的假设你的域名是www.you.com

  • 因此,我们访问 www.you.com,如果发现程序与 单独使用Django启动的程序一模一样时,就说明成功啦!

    Django在生产环境中的部署

    4.关闭服务的方法
    将uWSGi进程杀死即可。
    查询8077端口的进程

    
     lsof -i:8077
    
    Django在生产环境中的部署

    杀死进程

    
    kill PID
    

    也可以写一个脚本来控制uwsgi启动和停止:

    
    #!/bin/bash
    if [ ! -n "$1" ]
    then
        echo "Usages: sh uwsgiserver.sh [start|stop|restart]"
        exit 0
    fi
    
    if [ $1 = start ]
    then
        psid=`ps aux | grep "uwsgi" | grep -v "grep" | wc -l`
        if [ $psid -gt 4 ]
        then
            echo "uwsgi is running!"
            exit 0
        else
            uwsgi /etc/uwsgi.ini
            echo "Start uwsgi service [OK]"
        fi
    
    
    elif [ $1 = stop ];then
        killall -9 uwsgi
        echo "Stop uwsgi service [OK]"
    elif [ $1 = restart ];then
        killall -9 uwsgi
        /usr/bin/uwsgi --ini /etc/uwsgi.ini
        echo "Restart uwsgi service [OK]"
    
    else
        echo "Usages: sh uwsgiserver.sh [start|stop|restart]"
    fi
    

    作者:千叶正志
    来源:CSDN
    原文:
    https://blog.csdn.net/nghuyong/article/details/54025761 

    Django在生产环境中的部署

    识别图中二维码,欢迎关注python宝典

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> Django在生产环境中的部署


     上一篇
    如何提高页面加载速度(二) 如何提高页面加载速度(二)
    点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 续上一篇 八、使用外部的JavaScript和CSS内联脚本或者样式可以减少HTTP请求,按理来说可以提高页面加载的速度。然而在实际情况中,当脚本或
    2021-04-05
    下一篇 
    新手怎么读懂一个中型的Django项目 新手怎么读懂一个中型的Django项目
    点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 【前言】中型的项目是比较多的APP,肯会涉及多数据表的操作。如果有人带那就最好了,自己要先了解基本的django框架(MTV ,ORM等)师傅可以给讲解一
    2021-04-05