我使用的python3
準備工作
自行g(shù)oogle安裝以下軟件:
- python3 pip3 virtualenv
- nginx
- 數(shù)據(jù)庫
遠程復(fù)制項目文件到服務(wù)器
參考上篇ubuntu創(chuàng)建git服務(wù)器與使用hooks實現(xiàn)web自動部署
直接使用git push之后,代碼自動被checkout到指定的目錄。從而實現(xiàn)遠程復(fù)制。以后改動也會被自動checkout,相比遠程復(fù)制命令scp要方便許多
我使用的是/srv/nginx/目錄,git push之后代碼被自動checkout到/srv/nginx/目錄
pip3 isntall 依賴包
我使用的是python3,所以可以直接使用python3 -m venv創(chuàng)建虛擬環(huán)境,用來安裝依賴包
cd /srv/nginx/
mkdir venv
python3 -m venv venv
激活虛擬環(huán)境:
source venv/bin/activate
然后根據(jù)requirements.txt文件安裝依賴包:
pip3 install -r requirements.txt
pip3 install gunicorn
Gunicorn (獨角獸)是一個高效的Python WSGI Server,通常用它來運行 wsgi application(由我們自己編寫遵循WSGI application的編寫規(guī)范) 或者 wsgi framework(如Django,Paster),地位相當于Java中的Tomcat。
WSGI就是這樣的一個協(xié)議:它是一個Python程序和用戶請求之間的接口。WSGI服務(wù)器的作用就是接受并分析用戶的請求,調(diào)用相應(yīng)的python對象完成對請求的處理,然后返回相應(yīng)的結(jié)果。
簡單來說gunicorn封裝了HTTP的底層實現(xiàn),我們通過gunicorn啟動服務(wù),用戶請求與服務(wù)相應(yīng)都經(jīng)過gunicorn傳輸。
在上步激活的python環(huán)境中:
pip3 install gunicorn
創(chuàng)建一個wsgi.py文件
from app import create_app
application = create_app('production')
if __name__ == '__main__':
application.run()
不再通過manage.py啟動服務(wù),那只在開發(fā)的時候使用
啟動服務(wù):
gunicorn -w 4 -b 127.0.0.1:8000 wsgi:application
記住端口號這時候設(shè)置的端口號(8000),下步配置nginx的時候要用到。
nginx
nginx的配置文件為:/etc/nginx/sites-available/default
添加如下配置:
server {
listen 80;
server_name bi123.wang;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
- 監(jiān)聽http默認的端口號80
- server_name:個人網(wǎng)站域名
- 把請求代理到本機的8000端口(gunicorn啟動服務(wù)指定的端口)
剩下proxy_set_header照抄
gunicorn和nginx關(guān)系:
gunicorn 可以單獨提供服務(wù),但生產(chǎn)環(huán)境一般不這樣做。首先靜態(tài)資源(jscssimg)會占用不少的請求資源,而對于 gunicorn 來講它本身更應(yīng)該關(guān)注實際業(yè)務(wù)的請求與處理而不應(yīng)該把資源浪費在靜態(tài)資源請求上;此外,單獨運行 gunicorn 是沒有辦法起多個進程多個端口來負載均衡的。
nginx 的作用就是彌補以上問題,首先作為前端服務(wù)器它可以處理一切靜態(tài)文件請求,此時 gunicorn 作為后端服務(wù)器,nginx 將會把動態(tài)請求轉(zhuǎn)發(fā)給后端服務(wù)器,因此我們可以起多個 gunicorn 進程,然后讓 nginx 作均衡負載轉(zhuǎn)發(fā)請求給多個 gunicorn 進程從而提升服務(wù)器處理效率與處理能力。最后,nginx 還可以配置很多安全相關(guān)、認證相關(guān)等很多處理,可以讓你的網(wǎng)站更專注業(yè)務(wù)的編寫,把一些轉(zhuǎn)發(fā)規(guī)則等其它業(yè)務(wù)無關(guān)的事情交給 nginx 做。
配置好后打開本地瀏覽器,輸入域名,應(yīng)該就能訪問了。
Systemd
還差一點就是我們想讓服務(wù)器啟動之后就自動啟動網(wǎng)站服務(wù)。而不是需要每次都手動啟動服務(wù)。
我的vps的系統(tǒng)是16.04,Systemd替換upstart成為當前系統(tǒng)版本的啟動守護進程。
創(chuàng)建systemd文件:
sudo nano /etc/systemd/system/flasky.service
里邊內(nèi)容如下:
[Unit]
Description=Gunicorn instance to serve Flasky
After=network.target
[Service]
User=root
Group=root
WorkingDirectory=/srv/nginx
Environment="PATH=/srv/nginx/venv/bin"
ExecStart=/srv/nginx/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 wsgi:application
[Install]
WantedBy=multi-user.target
主要是[Service]里的內(nèi)容:
- User Group所屬用戶和群組
- WorkingDirectory 指向服務(wù)器目錄
- Environment 用到的python虛擬環(huán)境目錄
- ExecStart gunicorn啟動服務(wù)命令
我們現(xiàn)在可以啟動創(chuàng)建的Gunicorn服務(wù),并啟用它,以便它在系統(tǒng)啟動時啟動:
sudo systemctl start flasky
sudo systemctl enable flasky
// 當發(fā)布新版代碼之后重啟服務(wù),重新運行項目,加載最新代碼
sudo systemctl restart flasky
然后。。。。。。重啟vps,等幾分鐘再請求試試。是不是請求依然成功了!
打完收工
遇到的問題
安裝虛擬環(huán)境:
python3 -m venv venv
報錯:
Error: Command '['/home/dpottsagilisys/test/bin/python3', '-Im', 'ensurepip',
'--upgrade', '--default-pip']' returned non-zero exit status 1.
解決辦法:
python3.6 -m venv --without-pip test
source test/bin/activate
curl https://bootstrap.pypa.io/get-pip.py | python
deactivate
source test/bin/activate