1. 程式人生 > >ubuntu上web專案的部署,:uwsgi, uwsgi + nginx, uwsgi+nginx分散式部署

ubuntu上web專案的部署,:uwsgi, uwsgi + nginx, uwsgi+nginx分散式部署

Ubuntu中pip和pip3區別:
pip預設給python2用,pip3預設給Python3使用

django中有runserver可以執行專案為什麼還要部署:
因為runserver是一個單執行緒的伺服器,不支援多執行緒訪問

專案部署有三種方式:
1. uwsgi
2. uwsgi + nginx(充當靜態資源伺服器和反向代理)
3. uwsgi + nginx分散式部署(充當靜態資源伺服器和負載均衡)

##########################################################################################
專案部署需要在ubuntu伺服器上安裝的東西:
1. python
2. Django
3. MySQL
4. 專案依賴的庫

win需要安裝的東西:
xshell, xftp
##########################################################################################
Ubuntu:
可以先更新一下軟體包:
sudo apt-get update
1.安裝python3:
sudo apt-get instal python3
2.安裝pip3:
sudo apt-get install pip3
如果無法定位軟體包:
apt install python3-pip
3.安裝MySQL資料庫:
sudo apt-get install mysql-server
4. 安裝Django
sudo apt-get install django==1.11
5.也可以一次性安裝所有的依賴庫:
進入本機專案開發的環境下,把檔案通過xftp傳送到ubuntu中:
pip freeze > requirements.txt
到ubunu的環境下:
pip3 install -r requirements.txt

6.uWSGI專案部署,uwsgi是python的一個模組,要確保它的安裝
pip3 instal uwsgi
##########################################################################################
4. 在ubuntu上安裝xshell和xftp的伺服器實現遠端訪問和檔案傳輸。
ubuntu上實現遠端訪問:
1.sudo apt-get install  openssh-server
2.cd /etc/ssh
3.sudo vim sshd_config
4.修改:PermitRootLogin yes
5.重啟服務 service sshd restart
6.ifconfig  檢視IP 遠端連線
7.在另一臺電腦上可以通過xsheel這樣的工具輸入ubuntu的IP和設定的root密碼即可訪問!

ubuntu上實現xftp遠端傳輸
1. sudo apt-get install vsftpd
2.cd /etc/
3.sudo vim vsftpd.conf
4.修改以下(把前面的#刪掉):
    write_enable=YES
    local_umask=022
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
5.重啟服務
    service vsftpd restart
6.在另一臺電腦上可以通過xftp這樣的工具輸入ubuntu的IP和設定的root密碼即可進行檔案傳輸!
##########################################################################################
一:將專案部署在uwsgi伺服器上:
首先在ubuntu的主目錄下建立一個資料夾用於放置專案:
mkdir work
修改部署檔案的資料夾許可權chmod 777 work
將本機的整個專案壓縮成一個壓縮包通過xftp放到work資料夾下
解壓zip檔案, unzip 壓縮包名,檢查專案完整性
進入專案的setting檔案檢視專案連線的是哪種資料庫以及資料庫名稱:more setting.py, 如果是mysql
進入Mysql: mysql -u root -p 連線接入資料庫
建立setting檔案中指定的資料庫:create database 資料庫名稱 default charset 'utf8';
show databases;
use 資料庫名稱

同步資料,切換到專案主目錄下:
python manage.py makemigrations
python manage.py migrate

如果有初始資料需要先從本機資料庫的視覺化工具中以SQL格式匯出資料,檢視的時候只需用inset語句,用於同步完遷移檔案生成表後,mysql命令列執行insert語句插入原始資料

查看錶,檢視插入的原始資料
select * from 表明; 檢視所有的插入資料

ubuntu在主專案下建立靜態資料夾用於收集靜態檔案:
mkdir static_file
使用pwd複製絕對路徑,在setting檔案的靜態檔案區域新增,讓django知道靜態檔案應該去哪裡找:
STATIC_ROOT='將靜態檔案的絕對路徑複製過來'
儲存退出之後執行命令收集靜態檔案:
python manage.py collectstatic

兩種專案執行方式:
1.uwsgi --http=本機Ip:port --file=shopping/wsgi.py --static-map=/static=static_file
2.uwsgi --http=本機Ip:port --file=shopping/wsgi.py --static-map=/static=static_file & 表示在後臺執行,前臺就看不到了
##########################################################################################
但是這樣執行太過繁瑣,推薦使用的方式:
在專案的主目錄下建立usigi.ini檔案,通過配置所需要的選項啟動uwsig服務:
vim uwsgi.ini 
[uwsgi]
http: 192.168.37.128:8000
chdir = /home/damu/work/shopping(寫自己專案主目錄)
wsgi-file = shopping/wsgi.py(wsgi檔案的路徑)
processes = 4 (開啟四個程序)
threads = 2(每個程序開啟兩個執行緒)
master = true
pidfile=uwsgi.pid
daemonize = uwsgi.log(記錄日誌)
static-map=/static=static_file
wq! 儲存退出
執行:
uwsgi --ini uwsgi.ini
可以去usgi的官方文件檢視更詳細的配置
##########################################################################################
二:uwsgi + nginx(反向代理)專案部署
使用第一種方式對靜態檔案支援不是太友好
uwsgi: 用於部署web程式應用
nginx作用: 反向代理,靜態檔案伺服器
使uwsgi伺服器停止執行:
uwsgi --stop uwsgi.pid
檢查服務是否停止:
ps -ef|grep uwsgi

修改uwsgi.ini檔案:
將http註釋掉,修改為:
socket: 127.0.0.1:8000
static-map註釋掉
wq! 儲存退出

安裝nginx:
apt-get install nginx
也可以下載nginx原始碼(nginx.tar.gz)->解壓->make & make install

1.修改nginx配置檔案:
/etc/nginx/nginx.conf
新增虛擬伺服器配置[server]:
    新增反向代理路由配置[location - uwsgi_pass]
    新增靜態檔案伺服器路由配置[location - alias]
重啟nginx
修改nginx配置檔案具體步驟:
vim nginx.conf找到http{}這一個模組,配置伺服器,直接在模組內部的最後追加:
server{
    listen 80;
    server_name 伺服器ip或者域名;
    # 下面是反向代理的配置
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8000;
    }
    # 下面是靜態檔案的配置
    location / static{
        alias /home/damu/work/shopping/static_file;(前面收集的靜態檔案的資料夾路徑)
    }
}
wq!儲存退出
輸入nginx啟動nginx伺服器
ps -ef|grep nginx 檢視服務是否啟動

然後在位址列輸入伺服器Ip不需要加埠就可以直接訪問

備註:
nginx對於靜態檔案的處理優於uwsgi
uwsgi對於動態請求的操作非常優秀,所以用nginx反向代理讓uwsgi處理動態請求
也可以把django專案單獨部署在nginx伺服器上,但是步驟非常繁瑣
##########################################################################################

三:uwsgi + nginx 分散式部署
當併發請求資料特別巨大的情況下,第二種部署方式就不一定能滿足!
此時就需要分散式專案部署操作
1.單伺服器模式[偽分散式]
在一臺服務上邊用uwsgi部署多個專案或者多個相同的專案,使用nginx做靜態資源伺服器和負載均衡,負載均衡就是當客戶端發來請求,負責請求的分發,發往不同的uwsgi伺服器,靜態伺服器直接去靜態檔案查詢對應的資料,這就是一臺伺服器的配置模型
先把伺服器停下:
uwsgi --stop uswgi.pid

1.uwsgi.ini改造:
將uwsgi的接受請求的方式,修改為http方式[nginx由反向代理的角色->請求分發]
進入主專案下的uwsgi.ini檔案:
[uwsgi]
http = 127.0.0.1:8001
...
下面的都一樣
wq!儲存
啟動專案:
uwsgi --ini uwsgi.ini

然後將同一個專案部署多份:
cp -rf shopping shopping2
然後修改shopping2中的uwsgi檔案埠改為8002
chdir最後邊改成shopping2
wq!儲存
啟動專案:
uwsgi --ini uwsgi.ini


2.nginx配置
cd /etc/nginx
vim nginx.conf
在http{}中server中配置靜態檔案伺服器
location / static {
    alias /home/damu/work/shopping/static_file;(前面收集的靜態檔案的資料夾路徑)
}

同時在nginx.conf的http中配置負載均衡:
upstream myweb {
    server ip:port;(本地ip127.0.0.1:不同的埠號)
    server ip:port;
    ...
}
http的server中:
location / {
    proxy_pass http://myweb;
}
wq!儲存
退出一下nginx
nginx -s quit
再啟動nginx
nginx
使用xshell另外開兩個連結視窗分別進入兩個shopping專案:
tail -f uwsgi.log 命令是實時檢視uwsgi.log最後10行的日誌更新。

備註:
預設情況下, nginx的負載均衡,請求輪詢發給所有的後端伺服器
一般會把專案部署多份uwsgi伺服器,當有內容需要更新的時候,先進入一個專案的主目錄停止一個uwsgi伺服器uwsgi --stop uwsgi.pid,這時另外的uwsgi伺服器是會正常工作的,更新完內容後再啟動這個伺服器就會自動恢復與nginx的連線(因為nginx一直在於後臺伺服器傳送心跳連線,實時監控後臺伺服器的執行情況),以這樣的方式依次把所有的專案都更新完成


2.多伺服器模式[分散式叢集]
模型就是把專案部署到多臺伺服器上,然後在任何一臺伺服器上部署nginx都可以,只需部署一個nginx,然後修改nginx的
在uwsgi.ini的http中末尾配置負載均衡:
upstream myweb {
    server ip:port; (ip和埠寫各個伺服器的IP和埠)
    server ip:port;
    ...
}

百度不同省份都有自己的nginx前端伺服器
nginx + uwsgi整個稱為web的服務端,nginx在軟體架構上稱為前端伺服器,uwsgi在軟體架構上稱為後端伺服器


##########################################################################################
uwsgi伺服器的啟動:
uwsgi --ini uwsgi.ini
uwsgi伺服器的停止:
uwsgi --stop uwsgi.pid

退出nginx:
nginx -s quit
啟動nginx:
nginx