1. 程式人生 > >Django學習之路(七)生產環境中的使用

Django學習之路(七)生產環境中的使用

基本思路

1,方案:Nginx+uwsgi
這個方案的大體思路就是:nginx作為伺服器最前端,負責接收client的所有請求,統一管理。
靜態請求由Nginx自己處理,非動態請求通過uwsgi傳遞給Django,由Django來進行處理,從而完成一次web請求。
2,通訊請求:

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

配置Nginx

安裝Nginx

Ubuntu上:
sudo install nginx
Centos上:
yum install
nginx

啟動Nginx

service nginx start #啟動
service nginx stop #關閉
service nginx restart #重啟

在阿里雲的centos中安裝nginx時候發現無法啟動,最後發現是http的埠被佔用。這時候可以輸入命令停止佔用埠的服務:

systemctl stop httpd
systemctl disable httpd

按照正常道理來說這樣就可以直接通過伺服器的IP來訪問網頁。
實際操作中又發現,在阿里雲部署的nginx無法出現正常的網頁“Welcome to nginx”。具體原因是需要在阿里雲的安全組中新增80埠的許可權。

http://blog.csdn.net/sinat_35537471/article/details/72355362
http://blog.csdn.net/KascLiyuan/article/details/73438093
以上網頁有具體解決方案。

配置uwsgi

安裝uwsgi:

#假如說缺少libxml2檔案:
yum install libxml*
#假如說缺少python-devel
yum install python-devel

pip install uwsgi

不建議使用yum或者apt-get。

連線uwsgi與Django

通過Django與uwsgi可以形成了一個簡單的web伺服器。想要完成這一個環節,需要在開啟manage.py的同級目錄,新建django_wsgi.py檔案。

# coding: utf-8

import os
import sys

# 將系統的編碼設定為UTF8
reload(sys)
sys.setdefaultencoding('utf8')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")#mysite替換為自己的專案名
#啟動django的服務
import django
django.setup()

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

在編寫django_wsgi.py檔案後執行:

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

這樣,就可以在瀏覽器的8000埠訪問django程式。所有請求都是經過uwsgi傳遞給Django程式。
此時是無法訪問js/css靜態檔案,這些檔案都將交給Nginx處理。

實現Nginx與uwsgi的連線

一,編寫uwsgi配置檔案
在manage.py同級目錄下新建xml檔案:django_socket.xml:

<uwsgi>
    <socket>:8077</socket>
    <chdir>path/to/yoursite</chdir>
    <module>django_wsgi</module>
    <processes>4</processes> <!-- 程序數 --> 
    <daemonize>uwsgi.log</daemonize>
</uwsgi>

以上開啟4個程序來處理請求。佔用埠8077。
二,Nginx配置
以上連線uwsgi與django,下面配置Nginx。
開啟/etc/nginx/nginx.conf檔案,新增以下內容:

server {
    listen         80; 
    server_name    127.0.0.1 
    charset UTF-8;
    access_log      /var/log/nginx/myweb_access.log;
    error_log       /var/log/nginx/myweb_error.log;

    client_max_body_size 75M;

    location / { 
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8077;
        uwsgi_read_timeout 2;
    }   
    location /static {
        expires 30d;
        autoindex on; 
        add_header Cache-Control private;
        alias path/to/yoursite/static/;
     }
 }

類似這樣,nginx到底是如何與uwsgi產生關聯,目前理解為這兩行配置:

include uwsgi_params;
uwsgi_pass 127.0.0.1:8077

uwsgi_pass需要與本文django_socket.xml配置檔案中的埠一致。

結尾

重新啟動nginx

service nginx reload
service nginx restart

開啟manage.py同級目錄下的命令列:

uwsgi -x django_socket.xml

最後就可以在瀏覽器中通過伺服器ip訪問網頁。