1. 程式人生 > >flask web 應用部署

flask web 應用部署

在 DigitalOcean 上部署留言板應用過程中學到了很多東西,現在將其中的點滴知識記錄下來。

1. 環境

  1. VPS :DigitalOcean
  2. 系統:ubuntu 14.04 64
  3. Web Server: Nginx
  4. 程序管理工具: supervisor
  5. WSGI Server: Gunicorn
  6. 虛擬環境: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 後,就能通過域名訪問這個這個留言板應用了。

參考: