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部署上線坑很多,還有好多我沒有列出來,如果你們有不明白或者疑惑的地方在下方評論留言,我看到會及時回覆的,最後祝大家項目部署成功!!!在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章