基本思路

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地址就可以看到下面的画面。

配置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

连接uwsgi与Django

测试Django自身

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

python manage.py runserver 0.0.0.0:8002

访问8002端口,如果正常,说明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程序的。

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

编写配置文件

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

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

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

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

<uwsgi>
    <socket>:8077</socket>
    <chdir>path/to/yoursite</chdir>
    <module>django_wsgi</module>
    <processes>4</processes> <!-- 进程数 --> 
    <daemonize>uwsgi.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 是否有异常发现。

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

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

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

 lsof -i:8077

杀死进程

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


识别图中二维码,领取python全套视频资料

Django在生产环境中的部署的更多相关文章

  1. 生产环境中CentOS7部署NET Core应用程序

    NET Core应用程序部署至生产环境中(CentOS7) 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. ...

  2. redis的生产环境中的部署?

    使用的是redis cluster 10台机器,5台机器部署了redis主实例,另外5台机器部署了redis 的从实例,每个主实例挂了一个从实例,5个节点对外提供读写服务,每个节点的读写高峰qps可能 ...

  3. linux安装Django 以及 生产环境部署实现高并发

    1.首先安装python Python编译安装 主要介绍linux环境下安装 cd  /usr/local/src     //进入安装目录 wget  https://www.python.org/ ...

  4. Kubernetes用户指南(三)--在生产环境中使用Pod来工作、管理部署

    一.在生产环境中使用Pod来工作 本节将介绍一些在生产环境中运行应用非常有用的功能. 1.持久化存储 容器的文件系统只有当容器正常运行时有效,一旦容器奔溃或者重启,所有对文件系统的修改将会丢失,从一个 ...

  5. 13.生产环境中的 redis 是怎么部署的?

    作者:中华石杉 面试题 生产环境中的 redis 是怎么部署的? 面试官心理分析 看看你了解不了解你们公司的 redis 生产集群的部署架构,如果你不了解,那么确实你就很失职了,你的 redis 是主 ...

  6. 生产环境中使用Docker Swarm的一些建议

    译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...

  7. [virtualenv]生产环境中使用virtualenv

    virtualenv 对于python开发和部署都是好工具,可以隔离多个python版本和第三方库的版本,这里作者总结了几个常用python服务怎么样结合virtual部署 原文链接 Python 中 ...

  8. .NET跨平台之旅:在生产环境中上线第一个运行于Linux上的ASP.NET Core站点

    2016年7月10日,我们在生产环境中上线了第一个运行于Linux上的ASP.NET Core站点,这是一个简单的提供后端服务的ASP.NET Core Web API站点. 项目是在Windows上 ...

  9. 理解Docker(6):若干企业生产环境中的容器网络方案

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

随机推荐

  1. 读取数据库中timestamp类型去掉毫秒

    数据库中查询出来的时间是:2015-09-24 14:30:26.2,带有毫秒,需要去掉. 方法一: public static Timestamp getSystemTime() { Date dt ...

  2. haproxy+keepalived实现高可用负载均衡(转)

      软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. ...

  3. Unix系统编程():分散输入和集中输出(Scatter-Gather IO):readv和writev

    分散输入和集中输出(Scatter-Gather IO):readv和writev 请问这个v又代表什么? readv和writev系统调用分别实现了分散输入和集中输出的功能. #include< ...

  4. windbg的使用

      1. set 1.1. 设置Symbol file path file->symbol file path, 如: D:\***\TestProject\pdb   1.2 设置source ...

  5. sql 追踪 神器

    http://www.thinkphp.cn/download/690.html 一个中国人开发的php工具箱此工具能几秒钟追踪出sql 数据库操作, 能分析出 Thinkphp3.2 的任意sql ...

  6. [android] AndroidManifest.xml -【manifest】

    <manifest> 原文链接:http://www.android-doc.com/guide/topics/manifest/manifest-element.html 最早引入的AP ...

  7. Ribbon,主要提供客户侧的软件负载均衡算法。

    Ribbon Ribbon,主要提供客户侧的软件负载均衡算法.Ribbon客户端组件提供一系列完善的配置选项,比如连接超时.重试.重试算法等.Ribbon内置可插拔.可定制的负载均衡组件.下面是用到的 ...

  8. java------HashMap与HashSet的区别

    HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的问题不涉及到HashSet和H ...

  9. Python3创建RIDE桌面快捷方式的另一种方法

    今天尝试了一下Python3下安装Robot Framework,但是原来的Python2下创建ride快捷方式的方法都不奏效,启动不了ride.于是,转为VBS脚本的方式来间接创建快捷方式.毕竟,每 ...

  10. 实例讲解JQuery中this和$(this)区别

    这篇文章主要介绍了实例讲解JQuery中this和$(this)的区别,this表示当前的上下文对象是一个html对象,可以调用html对象所拥有的属性和方法,$(this),代表的上下文对象是一个j ...