Django - uwsgi +nginx進行項目部署

1.linux 下,以命令行方式啓動 Django

以下以 python37 爲例,表示 python版本爲 3.7,對應的pip37,可以根據自身需要,改爲自己對應的python版本
1.1 將本地開發完的代碼,通過git或者其他途徑,上傳至linux 服務器上(我這裏通過git方式提交,將虛擬環境目錄venv添加至.gitignore文件)

...
venv/
...

1.2 創建該項目的虛擬環境目錄
爲什麼創建虛擬環境?
爲了讓項目運行在一個獨立的局部的Python環境中,使得不同環境的項目互不干擾。

1.運行 Django 項目所需的依賴包
	pip37 install Django==3.0.2    安裝Django,如已安裝此處跳過
	pip37 install mysqlclient    安裝mysql連接工具,如已安裝此處跳過
	注意 :此處可能報錯:OSError: mysql_config not found,是因爲linux需要mysql相關的依賴包
	解決方法:yum install mysql-devel gcc gcc-devel python-devel
1.安裝虛擬環境的第三方包 virtualenv (使用清華源安裝)
	pip37 install virtualenv -i https://pypi.python.org/simple/
2.進入你的項目根目錄
	cd 你的項目根路徑
3.創建虛擬環境(-p 指定版本,venv表示虛擬環境所在目錄)
	virtualenv -p /usr/bin/python37 venv
	virtualenv --system-site-packages venv   參數 --system-site-packages 指定創建虛擬環境時繼承系統三方庫
4.激活虛擬環境
	cd venv  進入虛擬環境文件夾
	source bin/activate    激活虛擬環境
	pip37 list    查看當前虛擬環境下安裝的第三方庫
	deactivate    退出虛擬環境
5.刪除虛擬環境
	直接刪除目錄即可。
	

1.3 測試項目是否可以啓動
啓動項目:python37 manage.py runserver 0.0.0.0:9003
出現:

Starting development server at http://0.0.0.0:9003/

表示啓動成功!
此時可以使用 postman 類似的工具,調用服務端接口,測試是否成功。
注意:0.0.0.0 和 127.0.0.1 的區別:

兩者都表示本機服務器
0.0.0.0 表示本機,外網可訪問
127.0.0.1 同樣表示本機,但不能通過服務器ip進行訪問

2.uwigi + nginx 部署 Django 項目

如果完成了上一步操作,說明我們的 Django 項目沒有問題,可以進行部署。
2.1 一些相關的知識:
部署 Django 的常用方式是,使用Nginx + uWsgi。

部署的整個鏈路是:Nginx -> uWsgi -> phthon web 程序,通常還會提到supervisord 工具。

uWSGI 是一個軟件,部署服務的工具,瞭解整個過程,我們先了解一下WSGI規範,uwsgi協議等內容。

WSGI(Web Server Gateway Interface)規範,WSGI規定了Python 應用和 Python Web 服務器之間的通訊方式。目前主流的 Python Web 框架,比如Django,Flask,Tornado等,都是基於整個規範實現的。

uwsgi協議:是 uWSGI 工具獨有的協議,簡潔高效的 uwsgi 協議是選擇 uWSGI作爲部署工具的重要理由之一,詳細的 uwsgi 協議 可參考 uWSGI 文檔。uWSGI 是實現了 uwsgi 協議、WSGI規範和 HTTP 協議的一個C語言實現的軟件。

Nginx:是一個 web 服務器,是一個反向代理工具,我們通常用它來部署靜態文件。主流的 Python Web開發框架都遵循WSGI規範。
uWSGI 通過 WSGI 規範和我們編寫的服務器進程通訊,然後通過自帶的高效的 uwsgi 協議和 Nginx 進行通訊,最終 Nginx 通過 HTTP 協議將服務對外透出。
當一個訪問進來的時候,首先到 Nginx,最終 Nginx 以 HTTP 協議相應給用戶。

supervisor是一個進程管理工具。任何人都不能保證程序不異常退出,不被別人誤殺,所以一個典型的工程做法就是使用 supervisor 看守你的進程,一旦異常退出,它會立馬進程重新啓動起來。

2.2 安裝 uwsgi

pip install uwsgi

第一個 uwsgi 應用
新建 text.py 文件:

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

uWSGI Python 加載器將會搜索的默認函數 application
接下來,啓動 uwsgi 來運行一個 HTTP 服務器,將其部署在 9001 端口上:

默認啓動 單一的進程 和 一個 單一的線程
uwsgi --http :9001 --wsgi-file text.py

例:生成 4 個進程,每個進程有 2 個線程
--stats:表示執行監控任務
uwsgi --http :9001 --wsgi-file text.py --master --processes 4 --threads 2

如果要執行監控任務,可以使用stats子系統,監控的數據格式爲 JSON

uwsgi --http :9001 --wsgi-file text.py --master --processes 4 --threads 2 --stats 127.0.0.1:9091

使用 uwsgitop(類似Linux top 命令)來查看監控數據:

pip install uwsgitop

2.3 配置uwsgi + nginx,啓動 django 項目

測試:進入使用命令啓動 uwsgi,啓動後使用 postman 或者其他接口調用工具測試,測試接口是否可以調用成功

uwsgi --http :9002 --wsgi-file django_web/wsgi.py --home venv/

如調用成功,可以將命令存到.ini 文件中,使用命令uwsgi xxxx.ini啓動。
如:新建 start_uwsgi.ini文件,並將其放置在項目根路徑下
根路徑下新建文件夾uwsgi,用於存放uwsgi.statusuwsgi.pid文件

[uwsgi]
http = :9002  # 對外提供 http 服務的端口
socket = 0.0.0.0:9001  # 上線使用
# django 程序的主目錄
chdir=/home/workspace/myTaobao/admin_python
wsgi-file = django_web/wsgi.py
# 虛擬環境路徑
home = %(chdir)/venv/
# uwsgi 進程的狀態文件存放
stats=%(chdir)/uwsgi/uwsgi.status
# uwsgi 文件啓動後的ip
pidfile=%(chdir)/uwsgi/uwsgi.pid
# 進程與線程
processes = 4
threads = 2
# 後臺運行,並輸出日誌
daemonize=/home/logs/myTaobao.log
vacuum=true  # 當服務器退出的時候自動清理環境,刪除unix socket文件和pid文件

uwsgi 常用命令:

運行 sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py --processes 4 --threads 3
啓動:uwsgi --ini uwsgi.ini
停止:uwsgi --stop uwsgi/uwsgi.pid
重啓:uwsgi --connect-and-read uwsgi/uwsgi.status
查看端口是否佔用:lsof -i :9001
根據 PID 殺掉進程:sudo kill -9 2208

其他可能用到的命令:

ps aux | grep python    查看系統中運行的 python 進程
ps -ef | grep python    同上
kill -1 PID    優雅的重啓進程,對服務器無影響
kill -9 PID    強制殺死進程
sodu pkill -f uwsgi -9    強制殺掉 uwsgi 進程
sudo lsof -p PID    查看進程打開了哪些文件
sudo lsof -p PID | grep TCP    查看進程中的 TCP 連接信息
netstat -nltp    查看服務器中監控了那些端口
sudo lsof -i :80    查看具體端口的佔用情況

vi 退出編輯相關命令:
先按 ESC 鍵跳到命令模式,然後:
:w    保存文件,但不退出vi
:w file 將修改另外保存到 file 中,不退出vi
:w!    強制保存,不退出vi
:wq    保存並退出
:wq!    強制保存文件,並退出
:q    不保存文件,退出vi
:q!    不保存文件,並強制退出vi
:e!    放棄所有修改,從上次保存文件開始再編輯

nginx配置:
假如我們的網站頁面部署在端口8001上,使用nginx配置將請求指向到 uwsgi 的 9001 端口上

server {
  # 監聽綁定 8001 端口
  listen 8001;
  # 域名,多的用空格分割
  # server_name image.imooc.com;
  autoindex off;
  access_log /usr/local/nginx/logs/access.log combined;
  index index.html index.htm;
  # ssl on;
  # ssl_certificate ../certbo/1523694051089.pem;    #改證書路徑
  # ssl_certificate_key ../certbo/1523694051089.key; #改私鑰路徑
  # ssl_session_timeout 5m;
  # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  # ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  # ssl_prefer_server_ciphers on;
  
  error_page   500 502 503 504  /50x.html;
  if ( $query_string ~* ".*[\;'\<\>].*" ){
      return 404;
  }
  # 指定網頁
  location / {
    root  /home/workspace/XXXX/web;
    add_header Cache-Control no-store;  # 不緩存
  }
  # 跳轉 uwsgi
  location /api {
    # proxy_pass http://127.0.0.1:9001/api;
	# add_header Access-Control-Allow-Origin *;
    uwsgi_pass 127.0.0.1:9001;
    include uwsgi_params;
  }
}

最後,啓動 nginx 即可。

發佈了55 篇原創文章 · 獲贊 22 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章