Flask專案部署記錄!
部署基於ubuntu 16.04系統,使用 Gunicorn + Nginx 進行佈署,雲伺服器為阿里雲
匆匆忙忙敲完了這個 新經資訊 的專案, 經過一番折騰,終於把專案部署到了伺服器上,這裡來記錄一下部署流程以及踩的坑。
配置伺服器
在這裡使用了阿里雲的免費的一個月的伺服器,畢竟窮,而且這也不是什麼大專案,等以後再弄好的
- 選擇雲伺服器:阿里雲伺服器 https://www.aliyun.com
- 個人免費獲取 [https://free.aliyun.com/]
- 建立伺服器選擇ubuntu16.04 64位
的作業系統
申請完伺服器,進入控制檯, 檢視例項建立情況
給安全組配置規則,新增5000埠(一併加上5001埠),應該就是設定哪些埠可以訪問
注意:要新增上 80 埠,不然無法訪問
登入
使用命令列進行遠端登入
ssh 使用者名稱@ip地址
不同公司的伺服器有不同的使用者名稱,阿里的預設是 root,ip 地址在伺服器例項詳情頁就可以看見。
登入會提示輸入密碼,但是此時並沒有配置密碼,所以會一直登入失敗,需要去設定一個密碼:
設定了密碼可能需要在控制檯中重啟伺服器再進行遠端登入
重新登入;
這就是個遠端的 linux 伺服器,沒有圖形介面,純命令列操作
配置環境
連線上伺服器後就需要對專案執行的環境進行相關的配置
- 先更新 apt 相關源
sudo apt-get update
- mysql安裝
apt-get install mysql-server
apt-get install libmysqlclient-dev
- redis安裝
sudo apt-get install redis-server
- 安裝虛擬環境
pip install virtualenv pip install virtualenvwrapper
- 使得安裝的virtualenvwrapper生效,編輯~/.bashrc檔案,內容如下:
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/bin/virtualenvwrapper.sh
- 使編輯後的檔案生效
source ~/.bashrc
在這裡其實可以不用建立虛擬環境,直接使用就行,但是為了區別還是建立一下,注意一定要指定 python3 這個版本,不然在後面執行時會出錯
# 建立虛擬環境
mkvirtualenv -p python3 py3_flask
workon py3_flask
上傳專案
因為專案是使用的 git 進行了管理,也在 GitHub 和 Gitee 上進行了上傳,直接克隆一份即可
- 安裝 git
sudo apt-get install git
- 克隆倉庫:
git clone https://gitee.com/QYFabc/Information.git
requirements檔案
執行專案需要很多配置庫,但是一個個下載又很慢,使用下面的方法可以快速對配置庫進行下載安裝。
Python 專案中可以包含一個 requirements.txt 檔案,用於記錄所有依賴包及其精確的版本號,以便在新環境中進行部署操作。
- 在虛擬環境使用以下命令將當前虛擬環境中的依賴包以版本號生成至檔案中:
pip freeze > requirements.txt
- 當需要建立這個虛擬環境的完全副本,可以建立一個新的虛擬環境,並在其上執行以下命令:
pip install -r requirements.txt
- 在安裝 Flask-MySQLdb 的時候可能會報錯,可能是依賴包沒有安裝,執行以下命令安裝依賴包:
sudo apt-get build-dep python-mysqldb
遇到的問題
因為專案是在 windows 環境中進行開發的,所有有些庫不一樣,在安裝 Flask-MySQLdb 和 mysqlclient 這兩個庫時報錯,在這裡我谷歌了下,使用了下面兩個命令來解決
sudo apt-get install python-dev libmysqlclient-dev
sudo apt-get install python3-dev
資料的準備
- 進入 mysql 資料庫,建立新聞倉庫
mysql -u使用者名稱 -p密碼 show databases; create database information04 charset utf8;
- 執行資料庫遷移:
先退出資料庫,進入專案的檔案路徑,執行下面的命令進行資料庫遷移,建立資料表
python manage.py db init python manage.py db migrate -m"initial" python manage.py db upgrade
- 檢視資料庫表是否建立完成
show tables;
- 拷貝本地檔案到遠端
scp -r 本地檔案路徑 [email protected]:遠端儲存路徑
將測試資料 sql 檔案使用該命令上傳到伺服器中
使用命令
source 檔案路徑
, 將資料新增到資料庫中source 路徑/information_info_category.sql source 路徑/information_info_news.sql
負載均衡 Nginx
- 採用 C 語言編寫
- 實現分流、轉發、負載均衡
相關操作
- 安裝
$ sudo apt-get install nginx
- 執行及停止
/etc/init.d/nginx start #啟動
/etc/init.d/nginx stop #停止
- 配置檔案
-
- 編輯檔案:/etc/nginx/sites-available/default
-
# 如果是多臺伺服器的話,則在此配置,並修改 location 節點下面的 proxy_pass
upstream flask {
server 127.0.0.1:5000;
server 127.0.0.1:5001;
}
server {
# 監聽80埠
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# 請求轉發到gunicorn伺服器
proxy_pass http://127.0.0.1:5000;
# 請求轉發到多個gunicorn伺服器
# proxy_pass http://flask;
# 設定請求頭,並將頭資訊傳遞給伺服器端
proxy_set_header Host $host;
# 設定請求頭,傳遞原始請求ip給 gunicorn 伺服器
proxy_set_header X-Real-IP $remote_addr;
}
}
Gunicorn
- Gunicorn(綠色獨角獸)是一個Python WSGI的HTTP伺服器
- 從Ruby的獨角獸(Unicorn )專案移植
- 該Gunicorn伺服器與各種Web框架相容,實現非常簡單,輕量級的資源消耗
- Gunicorn直接用命令啟動,不需要編寫配置檔案
相關操作
- 安裝
pip install gunicorn
- 檢視選項
gunicorn -h
- 執行
# -w: 表示程序(worker) -b:表示繫結ip地址和埠號(bind)
# 如果想在伺服器執行起來後不影響其他操作,加上引數 -D 即可
gunicorn -w 2 -b 127.0.0.1:5000 執行檔名稱:Flask程式例項名
gunicorn -w 2 -b 127.0.0.1:5000 manage:app
在執行完命令後一直執行不起來,觀察後發現是 gunicorn 找沒有找到 python3 執行程式,一直在以 python2 來執行程式。
谷歌了半天,也沒有找到合適的解決方案,最後重新建立虛擬環境來解決了這個問題,建立虛擬環境時一定要注意指定 python3 這個版本!
Nginx、Gunicorn在伺服器中分別起什麼作用?
Nginx 是專業的伺服器,效能更好,更專業,併發更高,可以做負載均衡,可以做靜態檔案快取,還可以限制 ip 訪問的頻率等等。
Gunicorn 一般用來管理多個程序,有程序掛了Gunicorn可以把它拉起來,防止伺服器長時間停止服務,還可以動態調整 worker 的數量,請求多的時候增加 worker 的數量,請求少的時候減少,這就是所謂的 pre-fork 模型,這貌似就是它的主要優點。(worker 貌似就是程序,不是很確定,因為我們在使用的過程中沒有發現程序數量有變化。。。)
也可以用 supervisor 來啟動 Gunicorn,這樣即使Gunicorn 的管理程序掛了也可以自動起來
網站的 ip 地址是 [http://39.107.233.84], 想著加個域名,折騰半天申請了域名,也就使用了 10 分鐘,就告訴我需要備案,而且伺服器必須買了三個月以上才行,好氣啊!!!
就不寫域名如何申請了。。。
至此,專案算是完整結束了,也可以通過外網訪問了,總的來說還算可以吧,畢竟也算是一個完整的專案。
不過感覺還是不是很到位,很多東西並沒有記住,得好好搞一下。