Flask 系列之 部署發布

《Flask 系列之 部署發布》

說明

  • 操作系統:Windows 10
  • Python 版本:3.7x
  • 虛擬環境管理器:virtualenv
  • 代碼編輯器:VS Code

實驗目標

通過 Windows 的 WSL,將我們的項目網站部署到 Ubuntu 16.04 上面

操作

運行環境搭建

打開 WSL,執行下述操作

  • 安裝 Python3 pip3 以及虛擬環境管理工具 virtualenv
sudo apt-get install python3
sudo apt-get install python3-pip
pip3 install virtualenv
  • 安裝並啟動 Mysql

安裝完成之後需要進入 Mysql 的 Shell 中創建我們程序需要實驗的的數據庫 todo

略,具體可參考:Flask 系列之 SQLAlchemy

  • 安裝並啟動 Nginx
# 安裝並啟動 Nginx
sudo apt-get install nginx
sudo service nginx start

sudo service nginx stop

注:執行完畢后可嘗試訪問:http://127.0.0.1, 看是否正常。

代碼打包與上傳


pip freeze > requirements.txt

cp -R /mnt/c/Users/hippieZhou/Desktop/Flask_todolist /home/hippie/todolist

cd /home/hippie/todolist

# 創建虛擬環境
python -m virtualenv venv

# 激活虛擬環境
source venv/bin/activate

# 安裝項目依賴包
pip3 install -r requirements.txt

# 測試網站是否能正常初始化和運行
flask initdb
flask admin
flask run

上傳代碼之前可以先將我們現有的虛擬環境對於的文件目錄 venv 刪除掉,因為我們之前的虛擬環境是基於 Windows 創建的,在 Ubuntu 不適用,需要重新創建。

使用 gunicorn

進入當前項目的虛擬環境執行下述操作

# 安裝
pip install gunicorn

# 查看幫助
gunicorn -h

# 直接運行
gunicorn 運行文件名稱:Flask 程序實例名

# 測試運行
# -w 4 :以 4 個進程來啟動
# -b 127.0.0.1:5000 :綁定到本地的 127.0.0.1:5000 來運行
# -D :以守護進程的方式運行
# --access-logfile ./logs/log :將當前訪問的日誌信息記錄到當前目錄下的 logs/log 文件中,注:logs 文件夾需要提前創建
# manage:app :manage 代表入口函數對應的文件名稱;app 為 Flask 對象
gunicorn -w 4 -b 127.0.0.1:5000 -D --access-logfile ./logs/log manage:app

# 查看當前運行的後台進程, 通過此方法可查詢到有 5 個進程,其中一個是主進程,另外 4 個是子進程
ps  aux | grep gunicorn

# 通過上述命令查看主進程的 pid 退出該後台進程
kill -9 pid

配置 Nginx

# 備份 Nginx 的原始配置文件
 sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

 # 編輯我們的網站對應的配置文件
sudo vim /etc/nginx/sites-available/default

# 配置完成之後執行下述操作檢查配置是否正常
sudo nginx -t

# 重啟 Nginx
sudo service nginx restart

Nginx 的配置如下所示:

server {
    listen 80;

    server_name hippiezhou.fun *.hippiezhou.fun;

    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        proxy_pass         http://127.0.0.1:5000/; #此處和你gunicore的ip和端口一致
        proxy_redirect     off;

        proxy_set_header   Host                 $host;
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto    $scheme;
    }
}

基於最簡配置原則,我們只需修改第一個 server 中的 location 結點,並且需要屏蔽掉裏面的 try_files 字段即可。

此時,如果之前我們的網站已經通過 gunicorn 運行着的話,那麼我們重啟一下我們的 Nginx 服務,即可通過 127.0.0.1 訪問我們的網站了。

Nginx 對應的錯誤日誌位於 /var/log/nginx 目錄下,通過查看相關日誌可以排查問題。

配置 HTTPS

登陸到遠程服務器上,執行下述 bash 操作:

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python-certbot-nginx

sudo certbot --nginx

# sudo certbot renew --dry-run

sudo ufw allow https

sudo systemctl restart nginx

修改之後的 Nginx 配置如下圖所示:
《Flask 系列之 部署發布》

使用 crontab 定期更新證書

# 每個月凌晨 0:0:0 更新證書
crontab 0 0 1 * * /usr/bin/certbot renew --force-renewal
# 每個月凌晨 0:0:5 更新 Nginx
crontab 5 0 1 * * /usr/sbin/service nginx restart

注:crontab 中有六個字段,其含義如下:

  • 第1個字段:分鐘 (0-59)
  • 第2個字段:小時 (0-23)
  • 第3個字段:日期 (1-31)
  • 第4個字段:月份 (1-12 [12 代表 December])
  • 第5個字段:一周當中的某天 (0-7 [7 或 0 代表星期天])
  • /path/to/command – 計劃執行的腳本或命令的名稱

相關參考

点赞

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *