flask web 應用部署
在 DigitalOcean 上部署留言板應用過程中學到了很多東西,現在將其中的點滴知識記錄下來。
1. 環境
- VPS :DigitalOcean
- 系統:ubuntu 14.04 64
- Web Server: Nginx
- 程序管理工具: supervisor
- WSGI Server: Gunicorn
- 虛擬環境:virtualenv
2. 配置使用者環境
如果要跑多個站,最好將它們完全隔離,每個站對應一個使用者,所以下面所有操作針對使用者 swing
##推薦安裝 zsh 作為預設 shell
$ sudo apt-get install zsh
$ sudo apt-get install git
##安裝 oh-my-zsh 外掛
$ wget --no-check-certificate https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh
##新增使用者 swing
##引數-G:指定使用者所在組
##引數-d:指定使用者目錄
##引數-m:如果目錄不存在則建立
##引數-s:指定使用的 shell
$ useradd swing -G 27 -d /home/swing -m -s /bin/zsh
# 給 swing 使用者新增密碼
$ passwd swing
擁有sudo許可權的使用者屬於一個group,只在這個group裡面的使用者就都有sudo的許可權了,那個這個group到底是多少呢?檢視一下/etc/group檔案就知道了,這個組號是 27
3. 安裝應用
使用 git 下載程式碼到 /home/swing/message-board
$ git clone https://github.com/David-Guo/message-board.git
$ cd message-board
啟用虛擬環境,安裝應用依賴
$ sudo pip install virtualenv
$ virtualenv venv
##啟用 virtualenv
$ source ./venv/bin/activate
##安裝依賴
(venv)$ pip isntall -r requirements.txt
##取消啟用命令:
deactivate
4. 安裝配置 Gunicorn
Gunicorn是用於部署 WSGI 應用的。雖說 python run.py
也能讓網站直接跑起來,但只是使用生產環境下,Flask 自帶的伺服器,無法滿足效能要求。線上環境,還是需要更高效的組建。所以我們這裡 Gunicorn 做 wsgi 容器。
依然在 virtualenv 環境下安裝
(venv)$ pip install gunicorn
安裝好 Gunicorn 之後,需要用 Gunicorn 啟動 Flask ,Flask 用自帶的伺服器啟動時,Flask 裡面的 name 裡面的程式碼啟動了 app.run()
。而這裡我們使用 Gunicorn,run.py
就等同於一個庫檔案,被 Gunicorn 呼叫,這裡啟動:
(venv)$ gunicorn -w 4 -b 0.0.0.0:8000 run.app
其中的 run 就是 run.py
, app 就是那個 wsgifunc 的名字,這樣執行監聽埠 8000,原先的 5000 埠並沒有開啟,-w 表示使用多少個 worker(程序),-b 表示 bind(繫結)ip 地址與埠號。
想要結束 Gunicorn 只需執行 pkill gunicorn,需要找到程序號 pid,這對開發來說,過於繁瑣。因此要使用另一個工具 –supervisor,一個專門程序的工具,還可以管理系統的程序。
Gunicorn 也可以使用配置檔案,由於這裡的命令列非常簡單,所以就不詳細描述配置檔案了。
5. 安裝 Supervisor
Supervisor可以同時啟動多個應用,最重要的是,當某個應用Crash的時候,他可以自動重啟該應用,保證可用性。
supervisor 安裝以及常用命令如下:
$ sudo apt-get install supervisor
##重新讀取配置檔案
$ sudo supervisorctl reload
##檢視 supervisor 管理程序的狀態
$ sudo supervisorctl status
##重啟服務
$ sudo service supervisor restart
##啟動所有/指定 supervisor 管理的程式程序
$ sudo supervisorctl start [all]|[appname]
##關閉所有/指定 supervisor 管理的程式程序
$ sudo supervisorctl stop [all]|[appname]
前三個命令是比較常用的。修改了配置檔案,需要手動重啟 supervisor 服務,遇到問題時,多使用 restart 和 status, 檢視日誌檔案
現在訪問 http://127.0.0.1:8000
就可以看到 gunicorn 啟動返回的頁面了。
配置應用的 supervisor 服務,總配置檔案在 /etc/supervisor/supervisor.conf
。不同應用分別配置,然後被總的配置檔案 include 。/etc/supervisor/conf.d/
目錄下存放應用的配置檔案
##新建編輯留言板應用的檔案
$ sudo vim /etc/supervisor/conf.d/messageBoard.conf
##檔案內容
[program:swing]
##專案的根目錄在/home/swing/message-board
command/home/swing/message-board/gunicorn -w 3 -b 0.0.0.0:8000 run:app
directory=/home/swing/message-board
user=swing
autostart=false
autorestart=false
stdout_logfile=/home/swing/logs/gunicorn_supervisor.log
stderr_logfile=/home/swing/logs/gunicorn_supervisor.log
6. 安裝配置 Nginx
配置好 gunicorn,supervisor,本地的環境就搭好了,如果想通過域名訪問 VPS 上的網站,還需要 Nginx。
Nginx 是輕量級、效能強、佔用資源少,能很好處理高併發的反向代理軟體。
Nginx 安裝與常用命令如下:
##安裝Nginx
$ sudo apt-get install nginx
##啟動服務
$ sudo service nginx start
##檢視服務狀態
$ sudo service nginx status
##重啟與暫停服務
$ sudo service nginx restart
$ sudo service nginx stop
Nginx 的配置檔案和 supervisor 類似,不同的程式可以分別配置,被總配置檔案檔案include。遇到問題時,第一思路是檢視日誌檔案,錯誤日誌檔案在目錄 /var/log/nginx/error.log
下。
##新建編輯 loveswing.tk 專案的配置檔案
$ sudo vim /etc/nginx/sites-enabled/loveswing.tk
##檔案內容
server {
listen 80; //埠
server_name loveswing.tk; //訪問域名
root /home/swign/message-board/;
access_log /home/swing/logs/access.log;
error_log /home/swing/logs/access.err;
location / {
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://127.0.0.1:8000; //留言板應用的gunicorn埠
break;
}
}
}
7. 結束
到這裡,一個完整的線上環境就完成了,註冊域名並修改好記錄繫結上 VPS 的 ip 後,就能通過域名訪問這個這個留言板應用了。
參考: