1. 程式人生 > >Django學習筆記五:通過nginx+uwsgi部署Django專案(暫時靜態檔案沒有部署上去)

Django學習筆記五:通過nginx+uwsgi部署Django專案(暫時靜態檔案沒有部署上去)

概念

Nginx:是一款面向效能設計的HTTP伺服器,相較於Apache、lighttpd具有佔有記憶體少,穩定性高等優勢
uwsgi::是一個Web伺服器,它實現了WSGI協議、uwsgi、http等協議。Nginx中HttpUwsgiModule的作用是與uWSGI伺服器進行交換。
執行過程:
nginx作為伺服器的最前端,它將接受WEB的所有請求,統一管理請求。nginx把所有靜態請求自己來處理(這是nginx的強項,靜態檔案像我們django部落格專案中的static資料夾下面的圖片,css,js)。然後nginx將所有的非靜態請求(像顯示文章的詳細資訊,通常這類資訊都儲存在資料庫,因此需要呼叫資料庫獲取資料)通過uwsgi傳遞給Django,由django來處理,從而完成一次WEB請求。uwsgi的作用就類似一個橋接器,起到橋樑的作用。

部署環境

阿里雲伺服器ubuntu14.04 (域名買了還沒備案,所以部落格暫時是通過ip訪問的)

python3.5.2
nginx 1.4.6
uwsgi 2.0.15
django 1.11.3
markdown 1.0.1

安裝nginx

開啟putty遠端控制雲伺服器輸入賬號和密碼:

sudo apt-get install update 更新ubuntu庫資源
sudo apt-get install nginx  安裝nginx:
service nginx restart  啟動nginx(重啟)這個命令在後面要常用到

訪問:http://59.110.155.51(這是我的雲伺服器的ip)
這裡寫圖片描述


出現上圖,則說明nginx啟動成功

安裝uwsgi

sudo apt-get install python3-pip
pip3 install uwsgi

測試uwsgi,建立test.py檔案(注意:linux建立目錄的命令是:mkdir,建立test.py用 “vi test.py”命令)

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

函式名字application,這是預設的函式,uwsgi的python載入器將會搜尋這個名字
把它部署到htto埠8000(現在執行uwsgi來啟動一個會把請求傳遞給你的wsgi應用的http伺服器):

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

這裡寫圖片描述
出現上圖,則說明測試成功:

從github上獲取django專案

sudo apt-get install git 安裝git
git clone https://github.com/xuna123/Django_study1.git

安裝django和markdwon

pip3 install django
pip3 install markdown

將nginx+uwsgi部署到django部落格專案

我們實現的目錄:
這裡寫圖片描述
在我們從git拉下來Django_study1專案的時候,在子目錄下回自動幫我們生成wsgi.py檔案,所以我們只需要建立
myweb_uwsgi.ini配置檔案。

vim myweb_uwsgi.ini

檔案內容:

# Django-related settings

socket = :8000

# the base directory (full path)
chdir           = /root/Django_study1


# Django s wsgi file
module          = easyblog.wsgi

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

檔案意思:

  • socket :指定專案執行的埠號
  • chadir :指定專案的目錄
  • module :可以這麼來理解,對於- myweb_uwsgi.ini檔案來說,與它的平級的有一個easyblog目錄,這個目錄下有一個wsgi.py檔案
  • master :允許主執行緒存在(true)
  • processes:開啟的程序數量(這裡是開啟4個程序)
  • vacuum :當伺服器退出的時候自動清理環境,刪除unix socket檔案和pid檔案

配置nginx:

接下來要做的就是修改nginx的配置檔案,開啟/etc/nginx/sites-available/default檔案,刪除所有內容,寫入下面內容:

server {
    listen         8099;
    server_name    59.110.155.51
    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 59.110.155.51:8000;
        uwsgi_read_timeout 2;
    }
    location /static {
        expires 30d;
        autoindex on;
        add_header Cache-Control private;
        alias /Django_study1/blog/static;
     }
 }
  • listen 指定的是nginx代理uwsgi對外的埠號(這個要自己阿里雲伺服器的安全組中新增)
  • server_name : 伺服器的名字,(因為暫時沒有域名,就寫的ip地址)
  • access_log :用來指定日誌檔案的存放路徑
  • error_log :用來指定錯誤日誌檔案的存放路徑
  • include uwsgi_params “一般來說,你只需包含uwsgi_params檔案 (包含在nginx發行版本中),使用uwsgi_pass指令來設定uWSGI socket的地址。
  • uwsgi_pass 設定uwsgi伺服器的協議和地址,協議可是uwsgi或suwsgi(uwsgi over ssl); 地址可以是ip地址,域名,和可選的埠。
  • uwsgi_read_timeout:指令的含義是如果檢視函式處理的時間超時,uwsgi便會關閉連線,這個關閉只是針對Nginx這邊的關閉,檢視函式還會繼續執行,處理完成後,檢視函式那邊會報IO寫入。
  • expires 30d:意味著靜態和媒體資料夾中的所有內容將在30天內由瀏覽器快取,但不會刪除任何內容,您將無需
    重新生成伺服器中的任何內容
  • autoindex on;啟用目錄流量, 預設為off,顯示的檔案時間為GMT時間。改為on後,顯示的檔案時間為檔案的服務
    器時間
  • add_header Cache-Control private: HTTP協議的Cache -Control指定請求和響應遵循的快取機制。private(預設): 只能在瀏覽器中快取, 只有在第一次請求的時候才訪問伺服器, 若有max-age, 則快取期間不訪問
    伺服器.
  • alias /Django_study1/blog/static; 靜態檔案的位置(暫時這麼理解)

接下里還有 一部修改settings.py裡面的8ALLOWED_HOSTS增加我們訪問的ip,如下:

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['localhost','59.110.155.51']

現在我們重啟nginx 和uwsgi:

service nginx restart
uwsgi --ini myweb_uwsgi.ini

這裡寫圖片描述