Linux/Deepin環境下部署Nginx+uwsgi+Django,使產品項目上線
前言
最近這段時間想着把Django在學一學,就從網上找了個幾年前的項目,收穫頗豐,這篇博客就是記錄我在最後部署項目上線的時候踩過的一些坑。說的不明白的地方還請各位指出,免得誤人子弟。(備註:在部署前,大家一定先讓自己的Django能夠在Linux/Deepin跑起來。)
Linux/Deepin
這邊的話就長話短說了,這倆系統的話在平常上實驗課的時候機房都是Linux的,但是Deepin這款系統相比較Linux來說的話特別華麗,而且功能的話不比Linux弱,所以就在虛擬機中裝了Deepin,具體安裝的話百度上邊都有的,這邊就不在一一贅述,大家可以看下頁面。
Nginx和uwsgi的關係
想要安裝Nginx和uwsgi之前,我想說讓大家先了解這二者之間的關係,因爲只有你更加了解他們之間的關係,以後的部署和操作大家看起來就不會有這麼多的疑問。(這塊很重要一定要看,別嫌多,對以後你開發來說很有幫助)
uwsgi
uWGSI:是一個web服務器,或者wsgi server服務器,他的任務就是接受用戶請求,由於用戶請求是通過網絡發過來的,其中用戶到服務器端之間用的是http協議,所以我們uWSGI要想接受並且正確解出相關信息,我們就需要uWSGI實現http協議,沒錯,uWSGI裏面就實現了http協議。所以現在我們uWSGI能準確接受到用戶請求,並且讀出信息。現在我們的uWSGI服務器需要把信息發給Django,我們就需要用到WSGI協議,剛好uWSGI實現了WSGI協議,所以。uWSGI把接收到的信息作一次簡單封裝傳遞給Django,Django接收到信息後,再經過一層層的中間件,於是,對信息作進一步處理,最後匹配url,傳遞給相應的視圖函數,視圖函數做邏輯處理…後面的就不敘述了,然後將處理後的數據通過中間件一層層返回,到達Djagno最外層,然後,通過WSGI協議將返回數據返回給uWSGI服務器,uWSGI服務器通過http協議將數據傳遞給用戶。這就是整個流程。
這個過程中我們似乎沒有用到uwsgi協議,但是他也是uWSGI實現的一種協議,魯迅說過,存在即合理,所以說,他肯定在某個地方用到了。我們過一會再來討論
我們可以用這條命令:python manage.py runserver,啓動Django自帶的服務器,具體叫什麼名字,我真不知道(知道的可以留言)。DJango自帶的服務器(runserver 起來的 HTTPServer 就是 Python 自帶的 simple_server)。是默認是單進程單多線程的,對於同一個http請求,總是先執行一個,其他等待,一個一個串行執行。無法並行。而且django自帶的web服務器性能也不好,只能在開發過程中使用。於是我們就用uWSGI代替了。但是uWSGI也不夠好,爲什麼看下圖。
爲什麼有了uWSGI爲什麼還需要nginx?
因爲nginx具備優秀的靜態內容處理能力,然後將動態內容轉發給uWSGI服務器,這樣可以達到很好的客戶端響應。支持的併發量更高,方便管理多進程,發揮多核的優勢,提升性能。這時候nginx和uWSGI之間的溝通就要用到uwsgi協議。
嫌棄上邊文字多的一定要看圖!!一定要看圖!!一定要看圖!!
Nginx安裝
在終端下輸入sudo apt-get install nginx
,我這裏已經安裝過了,大家安裝的時候頁面會稍許不同。
緊接着輸入ps aux|grep nginx
查看nginx是否運行。
這時候我們就可以訪問nginx了,大家可以在命令行下輸入ifconfig查看自己的本機ip地址。然後複製到瀏覽器進行訪問。
噠噠噠,這就出來了!
uwsgi安裝
這個安裝還是很好說的直接pip3 install uwsgi
,等待安裝成功。安裝成功以後這時候我們就可以測試uwsgi了。測試的時候大家根據情況輸入uwsgi --http :8000 --module 你自己的項目名稱.wsgi
,這裏呢我提醒下大家,大家運行這句話的時候是在自己的項目文件夾下運行的,比如說我的文件項目名叫做MX_Django,就cd到這個文件夾下運行uwsgi --http:8000 --module MX_Django.uwsgi
就可以了。
正式部署
大家可以看到,雖然項目跑起來了,但是靜態文件卻沒有加載進去,這就是因爲前邊我給大家說的nginx和uwsgi之間的關係(ps:如果沒懂的再去前邊看看),所以這時候就nginx就派上了用場了,這裏我們就開始配置我們的nginx,讓它能夠找到我們自己的靜態文件。
- 首先我們新建一個uc_nginx.conf配置文件,這裏我是直接將該配置文件新建到我的項目下,然後將下邊這段代碼複製進去,具體的目錄大家根據自己的項目進行配置。
# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
server_name 你的ip地址 ; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias 你的目錄/項目名稱/media; # 指向django的media目錄
}
location /static {
alias 你的目錄/項目名稱/static; # 指向django的static目錄
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}
}
- 然後我們將該配置文件加入到nginx的啓動配置文件中
sudo ln -s 你的目錄/項目名稱/uc_nginx.conf /etc/nginx/conf.d/
或者可以直接將你的配置文件複製過去
sudo cp uc_nginx.conf /etc/nginx.conf
這兩種方法都行,大家選其一就可以,具體的區別大家可以百度一下,我這稍微一提,ln就是相當於軟鏈接,用這個方法配置的,大家在對源文件的內容修改以後,目標文件也會隨之修改,cp的話就只是單純的複製過去。
- 緊接着配置完成以後重新啓動nginx服務器
sudo service nginx restart
- 接下來我們就需要配置Django的settings文件了,我們在settings文件的最下邊加入
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
,同時將STATICFILES_DIRS這個註釋掉,因爲這句話使我們在開發的時候使用的,真正部署項目的時候就用不到了。 - 在總的urls.py文件中配置如下兩句話
from MX_Django.settings import STATIC_ROOT
urlpatterns = [
url(r'^static/(?P<path>.*)$', serve, {"document_root": STATIC_ROOT}),
]
- 然後運行
python manage.py collectstatic
,將所有的靜態文件配置到static文件夾下。
- 新建一個uwsgi的配置文件叫做uwsgi.ini。
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /目錄/項目名稱
# Django's wsgi file
module = 項目名稱.wsgi
# the virtualenv (full path)
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = 127.0.0.1:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
# virtualenv = 虛擬環境目錄
# 注:
# chdir: 表示需要操作的目錄,也就是項目的目錄
# module: wsgi文件的路徑
# processes: 進程數
# virtualenv:虛擬環境的目錄
- 運行該配置文件
uwsgi -i uwsgi.ini &
- 最後在瀏覽器輸入自己的ip地址,噹噹噹!!!大功告成
寫在最後
其實django部署上線坑很多,還有好多我沒有列出來,如果你們有不明白或者疑惑的地方在下方評論留言,我看到會及時回覆的,最後祝大家項目部署成功!!!