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