說明
- 操作系統: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 配置如下圖所示:
使用 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 – 計划執行的腳本或命令的名稱