Django在生產環境中的部署

基本思路

1.方案:Nginx+uwsgi 
這樣大致的流程是:nginx做爲服務器最前端,負責接收client的全部請求,統一管理。靜態請求由Nginx本身處理。非靜態請求經過uwsgi傳遞給Django,由Django來進行處理,從而完成一次WEB請求。
2,通訊請求css

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

配置Nginx

安裝Nginxhtml

若是Nginx原先安裝過,最好先完全刪除再從新安裝!完全刪除的方法
http://blog.csdn.net/u010571844/article/details/50819704前端

apt-get update
apt-get install nginx

啓動Nginxjava

/etc/init.d/nginx start  #啓動
/etc/init.d/nginx stop  #關閉
/etc/init.d/nginx restart  #重啓

Nginx默認監聽80端口 
因此安裝完畢,訪問localhost或者服務器本身的ip地址就能夠看到下面的畫面。python

Django在生產環境中的部署

配置uwsgi

安裝uwsginginx

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

編寫測試web

寫一個test.py測試uwsgishell

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

而後執行shell命令:django

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>
    <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啓動的程序如出一轍時,就說明成功啦!

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全套視頻資料

相關文章
相關標籤/搜索