在阿里雲部署 Flask 應用
本文簡單記錄在阿里雲部署 Flask 應用的過程。由於我的應用是業餘的,Demo 性質的(在簡書中有說明過初衷),很多操作也是現搜現用,怎麼方便怎麼來,所以並不適合真正的生產要求。這更有點像是知乎問題“自己擁有一臺服務器可以做哪些很酷的事情?”的一個稍稍跑題的回答吧。
雲服務器購買
雙十二時以 1 折(¥799.00/3年起)購買了一臺ECS共享型n4服務器。操作系統選擇了 ubuntu_18_04_64,因爲 Ubuntu 比 CentOS 更適合“把玩”。
環境搭建
前期準備
- 安裝本地 SSH 客戶端
我本地是 Windows 系統,可以選擇的有 SecureCRT,Putty,Bitvise SSH 等。最後我選擇的是 Bitvise SSH,個人用戶免費,界面也友好。可以在官網下載(速度慢),也可以在 CSDN 資源下載。
- 添加安全組規則
在阿里雲控制檯,添加“入方向”的安全組規則,端口範圍:80/80,授權對象:0.0.0.0/0。這樣才能通過 80 端口訪問你的 Web 應用程序。
- 域名解析
我的域名也是在阿里雲註冊的,可以在域名控制檯進行域名解析設置。主機記錄填寫“@”或“www”域名前綴,效果是“http://example.com/”或“http://www.example.com/”。記錄值填寫雲服務器外網 IP。
軟件安裝
在安裝軟件前,先通過 SSH 客戶端連接到雲服務器,更新系統軟件源。沒有通過更新系統軟件源的話,可能無法通過apt install
安裝我們需要用到的軟件 :
$ sudo apt update
$ sudo apt upgrade
安裝 Python 虛擬環境管理工具
Python 虛擬環境管理也有很多工具,如 pyenv + virtualenv/venv + virtualenvwrapper 等。我平時主要是在 Windows 下工作,習慣了 Anaconda,所以在服務器上也選擇 Anaconda。但對於常規的 Python 開發來說,Anaconda 太重了,而且主要面向科學計算領域,但是精簡版的 Miniconda 卻是一個很好的 Python 版本和虛擬環境管理工具。可以根據官方文檔Installing on Linux進行安裝,不過在官網下載安裝文件有可能很慢,在清華大學開源軟件鏡像站下載就快很多了。
安裝 Gunicorn
在安裝完 Miniconda 後創建 Python 虛擬環境,然後在虛擬環境中安裝 Gunicorn:pip install gunicorn
。
安裝 Nginx
除了源碼編譯,如果想方便,用簡單的apt
命令就可以安裝了,apt install nginx
,安裝完畢可以用curl
測試是否成功,curl IP
,如果不是返回...Failed to connect to...
字樣的信息則是成功了。
安裝 Supervisor
Supervisor 是一個進程管理工具,當進程中斷的時候 Supervisor 能自動重新啓動。同樣可以用apt
命令安裝,apt install supervisor
。
應用部署
在安裝完必須的軟件後就可以開始正式部署了,首先上傳應用文件到雲服務器,可以直接 FTP 上傳,也可以先上傳到 GitHub,然後通過 git clone
下載。然後安裝應用依賴,進入 Python 虛擬環境執行命令:pip install -r requirements.txt
。
配置 Gunicorn
Gunicorn 支持以 Python 文件配置,更詳細的配置可參考官方文檔http://docs.gunicorn.org/en/stable/settings.html#settings,以下是我自己的配置,gconfig.py:
from gevent import monkey
monkey.patch_all()
import multiprocessing
debug = False
loglevel = 'debug'
bind = 'localhost:5002' # 綁定與Nginx通信的端口
pidfile = 'log/gunicorn.pid'
logfile = 'log/debug.log'
workers = multiprocessing.cpu_count() * 2 + 1 # 開啓的進程數
worker_class = 'gevent' # worker 進程的工作方式
reload = True
配置 Nginx
先備份 /etc/nginx/sites-available/default 文件,修改爲 default_old,然後再創建 default 文件。
mv default default_old
vim default
然後輸入以下內容,這是我的配置具體根據實際情況不同修改,需要注意的是要和前面 Gunicorn 綁定的端口號要一致:
server {
listen 80;
root /www/ebox001;
server_name mfzxs.com;
location / {
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://localhost:5002/; # Gunicorn 綁定的端口號
}
# 配置static的靜態文件:
location ~ ^\/static\/.*$ {
root /www/ebox001;
}
}
修改配置文件後用nginx -t
檢查文件,最後重新加載配置文件nginx -s reload
。
配置 Supervisor
在/etc/supervisor/conf.d/
目錄下創建控制進程的配置文件,並以.conf
結尾,這樣將會自動應用到主配置文件當中,創建後添加如下的配置內容,[program:ebox001]
,ebox001是進程名,gconfig.py
是 Gunicorn 的配置文件:
[program:ebox001]
command=/www/ebox001/venv/bin/gunicorn -c /www/gconfig.py run:app
directory=/www/ebox001 //項目目錄
user=root
autorestart=true //設置自動重啓
startretries=3 //重啓失敗3次
保存配置文件之後,我們需要通過命令來更新配置文件:supervisorctl update
,然後通過supervisorctl
進行管理,start ebox001
這時 Gunicorn 服務器應用就已經啓動了。可以通過curl IP
進行測試,或者直接在瀏覽器上輸入域名訪問,譬如我的應用是:http://www.mfzxs.com/news_at_zhihu
原域名爲企業備案,現以遷移到個人備案站點 ebox001 :https://www.ebox001.com/news_at_zhihu 數據也放在了 GitHub 上,倉庫地址:https://github.com/JeetChan/history_json_daily_zhihu