FlaskLinux系統部署實操(避坑指南)——以華為雲Ubuntulinux系統為例
本人產品經理一枚,一直想自己搞個網站(飛狗小眾景點網),於是學習了李輝大佬《Flask Web 開發實戰》一書,歷時大半年,終於學成,在部署時卻反覆踩坑,斷斷續續花了近一個月才部署成功,覺得有必要將自己的部署經驗總結分享一下,讓大家少走一些彎路。
本部署是基於LinuxUbuntu作業系統(當時買華為雲伺服器時,特地裝B要了Linux,結果發現沒有介面,全部要靠命令,-_-|| )
1. 安裝基本庫和工具
1.1 先更新系統可安裝的包列表,並對可升級的包進行升級
$ apt update
$ apt upgrade
1.2 接著需要安裝必備的包和開發工具
$ sudo apt install python3-dev python3-pip
1.3 安裝Pipenv
sudo -H pip3 install pipenv
2. 建立專案目錄
我把我的專案建立在了home/fegwo
華為雲的cloudshell支援視覺化建立資料夾(右鍵即可建立),不能視覺化建立的,可以搜一下Linux建立資料夾的命令 mkdir
3. 推送程式碼到伺服器
也就是把你本地的程式碼,上傳到你剛剛建的目錄,命令(下面的命令是在你本地電腦執行的)如下:
scp -r 你本地專案路徑 root@你的伺服器Ip地址:/home/fewgo
4. 安裝依賴
進入到你linux系統中專案資料夾,執行下面的命令安裝依賴
pip install -r requirements.txt
注:requirements.txt檔案是你在本地開發時,需要生成的,用於記錄依賴包。如果你開發時沒有生成,那麼你在伺服器上執行程式時,會收到很多個提示:XXX Not defind,也就是你的依賴包沒有被安裝,也可以根據提示一個個安裝。
安裝成功後,你可以嘗試用 flask run來啟動程式(flask run)會啟動你專案根目錄下的wsgi.py檔案。
執行成功後,還不能訪問網站,因為linux根本沒有瀏覽器視窗,沒地方輸入http://127.0.0.1:5000/,要支援遠端訪問,接下來要安裝gunicorn。
5. 安裝使用gunicorn
5.1 首先啟用虛擬環境
在你的專案目錄下source venv/bin/activate
5.2 然後安裝gunicorn
執行命令:pip install gunicorn
5.3 執行gunicorn
執行命令:gunicorn --workers=4 --bind=0.0.0.0:8000 wsgi:app
注:需臨時設定防火牆以允許對8000埠的訪問,執行命令:sudo ufw allow 8000
執行後,可以檢視防火牆的狀態,執行命令:sudo ufw status
如果看到下面的內容,則表示防火牆8000開啟成功
Status: active
To Action From
-- ------ ----
8000 ALLOW Anywhere
至此,如果你運行了gunicorn --workers=4 --bind=0.0.0.0:8000 wsgi:app ,那麼你在你本地的電腦瀏覽器輸入 你的伺服器ip:8000,就可以訪問你的網站了,如果你的IP還解析了域名,也可以通過你的域名:8000訪問。
如果你還不能訪問,那麼恭喜你,可能遇到了跟我一樣的坑!雲伺服器的安全組沒有開啟8000埠!(很多雲伺服器阿里雲、華為雲等,除了防火牆外,還有一個安全組),這時候你需要登入你的雲伺服器安全組裡新增8000埠(具體可以搜尋百度一下)。
安全組開啟之後,就可以正常訪問了。因為gunicorn是後端服務,為了提供更好的效能服務,需要用Nginx來進行服務轉發,將gunicorn的服務轉發到Nginx上,所以接下來安裝Nginx。
6. 使用Nginx反向代理
6.1 首先使用下面的命令安裝Nginx
$ sudo apt install nginx
6.2 刪除Nginx預設的配置檔案,新增自己網站的Nginx檔案
刪除命令:$ sudo rm /etc/nginx/sites-enabled/default
新建命令:$ sudo nano /etc/nginx/sites-enabled/fewgo
6.3 編輯新建的Nginx檔案,配置服務資訊,如下:
server {
listen 80 default_server;
server_name www.fewgo.cn; # 如果你映射了域名,那麼可以寫在這裡,我的是www.fewgo.cn
access_log /var/log/nginx/access.log;#可以不用改
error_log /var/log/nginx/error.log;#可以不用改
location / {
proxy_pass http://127.0.0.1:8000; # 轉發的地址,即Gunicorn執行的地址
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;
}
location /static { # 處理靜態資料夾中的靜態檔案
alias /home/greyli/bluelog/bluelog/static/;#這裡是借鑑了李輝大佬書中的靜態檔案,具體可以換成你自己專案的靜態檔案
expires 30d; # 設定快取過期時間
}
}
6.4 儲存,檢查Nginx語法正確性,執行如下命令:
$ sudo nginx –t
看到如下程式碼,則表示語法正確
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
6.5 重啟Nginx
$ sudo service nginx restart
這時候,你再執行 gunicorn -w 4 wsgi:app(沒錯,可以不加8000埠了)
執行之後,你就可以用伺服器的IP或域名,直接訪問網站了
7. 補充說明
7.1 安裝Nginx之後,可以關閉防火牆8000埠了,執行如下命令$ sudo ufw delete allow 8000
7.2 gunicorn執行之後,按下Crtl+C停止Gunicorn(停止gunicorn會造成網站不能訪問)
7.3 如果gunicorn執行失敗,可能是埠被佔用,這時候就要把佔用的埠找出來,然後kill掉(端口占用查詢及kill方法,自行百度)
最後,可以訪問我部署好的網站來看看效果www.fewgo.cn,簡稱飛狗小眾景點網,一個分享小眾旅遊景點的網站。