ubuntu16安裝Django + nginx後臺執行

weixin_34138139發表於2018-04-29

安裝Django (2.1.3)

請確保已安裝python3、pip3

pip3 install django  #安裝django
----------以下命令是建立django專案----------------
mkdir ~/django # 建立目錄
cd ~/django
virtualenv venv #在~/django目錄下,建立一個venv的虛擬環境
source venv/bin/activate #開啟虛擬環境
pip install django #用pip工具線上安裝Django
mkdir ~/workplace #建立工作目錄
cd ~/workplace
django-admin.py startproject helloworld #建立一個django專案
cd ~/helloworld
----------

補充說明:
pip :是一個安裝python索引包的工具(pip is a tool for installing Python package from the Python Package Index)
virtualenv :是一個建立獨立python環境的工具(is a tool to create isolated Python environments)(使用情景:不同專案需要不同的版本,而不同的專案都在同一臺電腦上開發或執行,這就需要在每個專案下建立一個獨立的虛擬環境)。

測試 >> 使用雲服務(外網IP)

python manage.py runserver 0.0.0.0:8000

測試 >>使用雲服務(內網)

python manage.py runserver  120.0.0.1:8000

安裝uwsgi

python3 -m pip install uwsgi
或
pip3 install uwsgi
  • uwsgi 常用選項
    http : 協議型別和埠號
    processes : 開啟的程式數量
    workers : 開啟的程式數量,等同於processes(官網的說法是spawn the specified number ofworkers / processes)
    chdir : 指定執行目錄(chdir to specified directory before apps loading)
    wsgi-file : 載入wsgi-file(load .wsgi file)
    stats : 在指定的地址上,開啟狀態服務(enable the stats server on the specified address)
    threads : 執行執行緒。由於GIL的存在,我覺得這個真心沒啥用。(run each worker in prethreaded mode with the specified number of threads)
    master : 允許主程式存在(enable master process)
    daemonize : 使程式在後臺執行,並將日誌打到指定的日誌檔案或者udp伺服器(daemonize uWSGI)。實際上最常用的,還是把執行記錄輸出到一個本地檔案上。
    pidfile : 指定pid檔案的位置,記錄主程式的pid號。
    vacuum : 當伺服器退出的時候自動清理環境,刪除unix socket檔案和pid檔案(try to remove all of the generated file/sockets)
    -M 開啟Master程式
    -p 4 開啟4個程式
    -s 使用的埠或者socket地址
    -d (後臺執行)使用daemon的方式執行, 注意, 使用-d後, 需要加上log檔案地址, 比如-d /var/log/uwsgi.log
    -R 10000 開啟10000個程式後, 自動respawn下
    -t 30 設定30s的超時時間, 超時後, 自動放棄該連結
    –limit-as 32 將程式的總記憶體量控制在32M
    -x 使用配置檔案模式

test.py

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

測試 >> 雲服務外網訪問

sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py

測試 >> 內網訪問

sudo uwsgi --http 127.0.0.1:8000 --wsgi-file test.py

這樣啟動django專案服務就多了一個

uwsgi --http :8001 --file website/wsgi.py

使用配置檔案,在django專案目錄下建立uwsgi.ini並寫入;建議使用單獨放在一下資料夾script中

# uwsig使用配置檔案啟動
[uwsgi]
# 專案目錄
chdir=/var/local/www/website
# 指定專案的application
module=website.wsgi:application
# 指定sock的檔案路徑
socket=/var/local/www/website/script/uwsgi.sock
# 程式個數
workers=5
pidfile=/var/local/www/website/script/uwsgi.pid
# 指定IP埠
http=127.0.0.1:8888
# 指定靜態檔案
static-map=/static=/var/local/www/website/static
# 啟動uwsgi的使用者名稱和使用者組
uid=root
gid=root
# 啟用主程式
master=true
# 自動移除unix Socket和pid檔案當服務停止的時候
vacuum=true
# 序列化接受的內容,如果可能的話
thunder-lock=true
# 啟用執行緒
enable-threads=true
# 設定自中斷時間
harakiri=30
# 設定緩衝
post-buffering=4096
# 設定日誌目錄
daemonize=/var/local/www/website/script/uwsgi.log

啟動,之後可使用nginx增強動態處理能力

sudo uwsgi --ini script/uwsgi.ini

如果訪問超時建議換個埠試試。
啟用並一切正常訪問後會生成以下幾個檔案可供nginx服務使用

  1. uwsgi.log
  2. uwsgi.pid
  3. uwsgi.sock //重要

安裝nginx (當前安裝版本1.10.3)

sudo apt-get install nginx

配置django.conf

server {

    listen 80; # 我要監聽那個埠

    server_name 127.0.0.1; # 你訪問的路徑前面的url名稱

    #access_log /var/log/nginx/access.log main; # Nginx日誌配置

    charset utf-8; # Nginx編碼

    gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream; # 支援壓縮的型別

    error_page 404 /404.html; # 錯誤頁面
    error_page 500 502 503 504 /50x.html; # 錯誤頁面

    # 指定專案路徑uwsgi
    location / {
        include uwsgi_params;       # 匯入一個Nginx模組他是用來和uWSGI進行通訊的
        uwsgi_connect_timeout 30;   # 設定連線uWSGI超時時間
        uwsgi_pass unix:/var/local/www/website/script/uwsgi.sock; # 指定uwsgi的sock檔案所有動態請求就會直接丟給他
    }

    # 指定靜態檔案路徑
    location /static/ {
        alias /var/local/www/website/static/;
        index index.html index.htm;
    }

}

Django + Uwsgi + Nginx 的結合

相關文章