我使用的python3
準備工作
自行google安裝以下軟件:
- python3 pip3 virtualenv
- nginx
- 數據庫
遠程復制項目文件到服務器
參考上篇ubuntu創建git服務器與使用hooks實現web自動部署
直接使用git push之后,代碼自動被checkout到指定的目錄。從而實現遠程復制。以后改動也會被自動checkout,相比遠程復制命令scp要方便許多
我使用的是/srv/nginx/
目錄,git push之后代碼被自動checkout到/srv/nginx/
目錄
pip3 isntall 依賴包
我使用的是python3,所以可以直接使用python3 -m venv
創建虛擬環境,用來安裝依賴包
cd /srv/nginx/
mkdir venv
python3 -m venv venv
激活虛擬環境:
source venv/bin/activate
然后根據requirements.txt
文件安裝依賴包:
pip3 install -r requirements.txt
pip3 install gunicorn
Gunicorn (獨角獸)是一個高效的Python WSGI Server,通常用它來運行 wsgi application(由我們自己編寫遵循WSGI application的編寫規范) 或者 wsgi framework(如Django,Paster),地位相當于Java中的Tomcat。
WSGI就是這樣的一個協議:它是一個Python程序和用戶請求之間的接口。WSGI服務器的作用就是接受并分析用戶的請求,調用相應的python對象完成對請求的處理,然后返回相應的結果。
簡單來說gunicorn封裝了HTTP的底層實現,我們通過gunicorn啟動服務,用戶請求與服務相應都經過gunicorn傳輸。
在上步激活的python環境中:
pip3 install gunicorn
創建一個wsgi.py文件
from app import create_app
application = create_app('production')
if __name__ == '__main__':
application.run()
不再通過manage.py啟動服務,那只在開發的時候使用
啟動服務:
gunicorn -w 4 -b 127.0.0.1:8000 wsgi:application
記住端口號這時候設置的端口號(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;
}
}
- 監聽http默認的端口號80
- server_name:個人網站域名
- 把請求代理到本機的8000端口(gunicorn啟動服務指定的端口)
剩下proxy_set_header照抄
gunicorn和nginx關系:
gunicorn 可以單獨提供服務,但生產環境一般不這樣做。首先靜態資源(jscssimg)會占用不少的請求資源,而對于 gunicorn 來講它本身更應該關注實際業務的請求與處理而不應該把資源浪費在靜態資源請求上;此外,單獨運行 gunicorn 是沒有辦法起多個進程多個端口來負載均衡的。
nginx 的作用就是彌補以上問題,首先作為前端服務器它可以處理一切靜態文件請求,此時 gunicorn 作為后端服務器,nginx 將會把動態請求轉發給后端服務器,因此我們可以起多個 gunicorn 進程,然后讓 nginx 作均衡負載轉發請求給多個 gunicorn 進程從而提升服務器處理效率與處理能力。最后,nginx 還可以配置很多安全相關、認證相關等很多處理,可以讓你的網站更專注業務的編寫,把一些轉發規則等其它業務無關的事情交給 nginx 做。
配置好后打開本地瀏覽器,輸入域名,應該就能訪問了。
Systemd
還差一點就是我們想讓服務器啟動之后就自動啟動網站服務。而不是需要每次都手動啟動服務。
我的vps的系統是16.04,Systemd替換upstart成為當前系統版本的啟動守護進程。
創建systemd文件:
sudo nano /etc/systemd/system/flasky.service
里邊內容如下:
[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]
里的內容:
- User Group所屬用戶和群組
- WorkingDirectory 指向服務器目錄
- Environment 用到的python虛擬環境目錄
- ExecStart gunicorn啟動服務命令
我們現在可以啟動創建的Gunicorn服務,并啟用它,以便它在系統啟動時啟動:
sudo systemctl start flasky
sudo systemctl enable flasky
// 當發布新版代碼之后重啟服務,重新運行項目,加載最新代碼
sudo systemctl restart flasky
然后。。。。。。重啟vps,等幾分鐘再請求試試。是不是請求依然成功了!
打完收工
遇到的問題
安裝虛擬環境:
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