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.status
及uwsgi.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 即可。