Django項目部署

Nginx+uwsgi+Django實現簡單的項目部署

自己看了很多Nginx+uwsgi相關配置的教程,但是總是不明白各個配置的用意所在。這裏簡單總結自己的理解,以及簡單的實現。

1. 創建項目

在開始前首先要保證項目能正常運行,這裏我創建了一個簡單的Django項目,只有一個視圖,頁面效果如圖。
在這裏插入圖片描述
index.html

<html>
<head>
    <title>第三方包</title>
</head>
<body>
<h1>第三方包</h1>
<hr>
<h1>佈署</h1>
<img src="/static/image/mv.jpg"/>	
</body>
</html>

注意:靜態文件的路徑採用靜態訪問方式:
訪問方式爲:127.0.0.1:8000/static/image/mv.jpg

2. 環境配置

  1. python環境
    這裏使用虛擬環境,關於虛擬環境這裏不做詳細介紹。
    1. 獲取原虛擬環境中的python包列表
      pip freeze > plist.txt
      
    2. 將plist.txt與項目代碼上傳至服務器
    3. 創建python虛擬環境,還原python包
      mkvirtualenv 虛擬環境名稱
      source /虛擬環境名稱/bin/activate 	#切換至虛擬環境
      pip install -r plist.txt	
      
  2. uwsgi
    1. 安裝
      pip install uwsgi
      
    2. 配置
      [uwsgi] 
      # 配合Nginx使用
      socket=127.0.0.1:8000
      #直接作爲web服務器使用
      #http=127.0.0.1:8000
      #項目的絕對路徑
      chdir=/home/shu/Desktop/ProjectDeploy/ProjectDeployment
      #項目中wsgi.py,相對路徑
      wsgi-file=ProjectDeployment/wsgi.py
      processes=4  
      threads=2
      master=True
      pidfile=uwsgi.pid
      #日誌文件
      daemonize=uwsgi.log
      #python虛擬環境路徑,一般可以不寫
      virtualenv=/home/shu/Desktop/ProjectDeploy/venv
      
    3. 運行
      uwsgi --ini uwsgi.ini
      
    4. 查看
      ps aux | grep uwsgi
      
    5. 停止
      uwsgi --stop uwsgi.pid
      
    6. 注意:當配置文件中使用的是 http=127.0.0.1:8000時,運行後就可以在瀏覽器中進行訪問項目了,但是此時的靜態文件是不能訪問的
  3. Nginx
    1. 安裝:看了很多的安裝方式,感覺都比較麻煩,而且很容易出錯,突然發現直接用apt-get居然可以安裝,意不意外!
      sudo apt-get install nginx
      
    2. Nginx常用命令,親測可用!
      nginx  -c filename	#指定配置文件,也可以直接使用nginx命令使用默認配置文件
      nginx -s quit         優雅停止nginx,有連接時會等連接請求完成再殺死worker進程  
      nginx -s reload     優雅重啓,並重新載入配置文件nginx.conf
      nginx -s reopen     重新打開日誌文件,一般用於切割日誌
      nginx -v            查看版本  
      nginx -t            檢查nginx的配置文件
      nginx -h            查看幫助信息
      nginx -V       詳細版本信息,包括編譯參數 
      
    3. 配置:默認配置文件路徑一般在/etc/nginx/nginx.conf,可以通過nginx -t 命令找到
      1. 可以直接在默認配置文件中編寫自己 的配置文件,也可以在默認配置文件目錄下的子目錄 conf.d 下編寫單獨的配置文件,因爲nginx.conf中默認導入了該目錄下所有的配置文件:include /etc/nginx/conf.d/*.conf;
      2. 配置Nginx
        upstream myproj{
        			server 127.0.0.1:8000;		#uwsgi的啓動Django項目時啓動的端口
        			server 127.0.0.1:8010;		#uwsgi的啓動Django項目時啓動的端口
        }
        server {
        	        listen 80;						#Nginx監聽端口,用於訪問Nginx
        	        server_name 127.0.0.1;  #訪問Nginx的地址,用於訪問Nginx
        	        location / {
        	                include /etc/nginx/uwsgi_params;
        	                #uwsgi_pass 127.0.0.1:8000;			#直接指定被代理的服務器地址
        	                uwsgi_pass myproj;			#尋找upstream指定多個被代理服務器地址,實現負載均衡
        	        }
        	        location /static {
        	                alias /var/www/myproject/static/;			#靜態文件路徑,任意指定,需要將靜態文件收集在此目錄下
        	        }
        	}
        
      3. 啓動
        nginx
        
  4. 靜態文件收集
    1. 在項目的配置文件中添加靜態文件收集路徑
    STATIC_ROOT='/var/www/myproject/static/'
    2. 執行manage.py收集靜態文件
    python manage.py collectstatic
    3. 注意:執行完後在該目錄下可能沒有收集項目文件static下的所有文件,只有admin,不知道爲啥,但是我這兒遇到了,我是直接這些文件cp過去,效果一樣,沒有遇到問題。

3. 負載均衡

我的理解是同一個項目使用uwsgi啓動多個服務,然後使用Nginx統一代理,然後將請求分發給這些服務,默認是循環遍歷服務,逐個分發,也可以指定權重。

  1. 實現
    1. 編寫兩個uwsgi配置文件
      區別如下,其他配置相同
      #uwsgi.ini
      socket=127.0.0.1:8000
      pidfile=uwsgi.pid			#關閉時使用的文件
      daemonize=uwsgi.log 	#日誌文件
      #uwsgi1.ini
      socket=127.0.0.1:8010
      pidfile=uwsgi1.pid			#關閉時使用的文件
      daemonize=uwsgi1.log 	#日誌文件
      
    2. Nginx中使用upstream反向代理服務
        upstream myproj{
      				server 127.0.0.1:8000;		#uwsgi的啓動Django項目時啓動的端口
      				server 127.0.0.1:8010;		#uwsgi1的啓動Django項目時啓動的端口
      	}
      
    3. 啓動Nginx和uwsgi
      #啓動順序沒有影響
      nginx
      uwsgi --ini uwsgi.ini
      uwsgi --ini uwsgi1.ini
      
    4. 查看服務
      如圖,Nginx正常啓動,uwsgi和uwsgi1都正常運行
      在這裏插入圖片描述
    5. 查看uwsgi日誌文件
      在兩個終端查看便於比較
      tail -f uwsgi.log
      tail -f uwsg1.log
      
    6. 多次發起請求,比較uwsgi日誌文件
      從訪問時間可以看出:每次訪問的uwsgi服務是交替分發的
      在這裏插入圖片描述

4. 總結

  1. Nginx+uwsgi+Django個人理解類似於任務管理系統。
    Nginx:即是一個用於接收任務的,然後分發任務。
    uwsgi:web服務器,用於運行Django項目
    Django:worker,用於處理任務
  2. Nginx也可以理解爲一個跟高級的路由系統。
  3. Nginx+uwsgi+Django結構
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章