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. 環境配置
- python環境
這裏使用虛擬環境,關於虛擬環境這裏不做詳細介紹。- 獲取原虛擬環境中的python包列表
pip freeze > plist.txt
- 將plist.txt與項目代碼上傳至服務器
- 創建python虛擬環境,還原python包
mkvirtualenv 虛擬環境名稱 source /虛擬環境名稱/bin/activate #切換至虛擬環境 pip install -r plist.txt
- 獲取原虛擬環境中的python包列表
- uwsgi
- 安裝
pip install uwsgi
- 配置
[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
- 運行
uwsgi --ini uwsgi.ini
- 查看
ps aux | grep uwsgi
- 停止
uwsgi --stop uwsgi.pid
- 注意:當配置文件中使用的是 http=127.0.0.1:8000時,運行後就可以在瀏覽器中進行訪問項目了,但是此時的靜態文件是不能訪問的
- 安裝
- Nginx
- 安裝:看了很多的安裝方式,感覺都比較麻煩,而且很容易出錯,突然發現直接用apt-get居然可以安裝,意不意外!
sudo apt-get install nginx
- 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 詳細版本信息,包括編譯參數
- 配置:默認配置文件路徑一般在/etc/nginx/nginx.conf,可以通過nginx -t 命令找到
- 可以直接在默認配置文件中編寫自己 的配置文件,也可以在默認配置文件目錄下的子目錄 conf.d 下編寫單獨的配置文件,因爲nginx.conf中默認導入了該目錄下所有的配置文件:include /etc/nginx/conf.d/*.conf;
- 配置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/; #靜態文件路徑,任意指定,需要將靜態文件收集在此目錄下 } }
- 啓動
nginx
- 安裝:看了很多的安裝方式,感覺都比較麻煩,而且很容易出錯,突然發現直接用apt-get居然可以安裝,意不意外!
- 靜態文件收集
1. 在項目的配置文件中添加靜態文件收集路徑
STATIC_ROOT='/var/www/myproject/static/'
2. 執行manage.py收集靜態文件
python manage.py collectstatic
3. 注意:執行完後在該目錄下可能沒有收集項目文件static下的所有文件,只有admin,不知道爲啥,但是我這兒遇到了,我是直接這些文件cp過去,效果一樣,沒有遇到問題。
3. 負載均衡
我的理解是同一個項目使用uwsgi啓動多個服務,然後使用Nginx統一代理,然後將請求分發給這些服務,默認是循環遍歷服務,逐個分發,也可以指定權重。
- 實現
- 編寫兩個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 #日誌文件
- Nginx中使用upstream反向代理服務
upstream myproj{ server 127.0.0.1:8000; #uwsgi的啓動Django項目時啓動的端口 server 127.0.0.1:8010; #uwsgi1的啓動Django項目時啓動的端口 }
- 啓動Nginx和uwsgi
#啓動順序沒有影響 nginx uwsgi --ini uwsgi.ini uwsgi --ini uwsgi1.ini
- 查看服務
如圖,Nginx正常啓動,uwsgi和uwsgi1都正常運行
- 查看uwsgi日誌文件
在兩個終端查看便於比較tail -f uwsgi.log tail -f uwsg1.log
- 多次發起請求,比較uwsgi日誌文件
從訪問時間可以看出:每次訪問的uwsgi服務是交替分發的
- 編寫兩個uwsgi配置文件
4. 總結
- Nginx+uwsgi+Django個人理解類似於任務管理系統。
Nginx:即是一個用於接收任務的,然後分發任務。
uwsgi:web服務器,用於運行Django項目
Django:worker,用於處理任務 - Nginx也可以理解爲一個跟高級的路由系統。
- Nginx+uwsgi+Django結構