ubuntu 18.04 搭建flask伺服器(大合集,個人實操)
ubuntu 18.04 搭建flask伺服器(大合集)
Ubuntu
python
flask
伺服器
本次使用的Ubuntu版本為:Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-112-generic x86_64)
本文件基於aliyun伺服器上部署個人站步驟建立,全為個人實操,請參考自己專案使用,因為aliyun伺服器中的Ubuntu映象預設使用的就是阿里源,所以我不需要進行換源操作(推薦換為國內源軟體下載速度快)
因為伺服器上使用的是root賬戶,所以部分命令沒有加sudo許可權也能使用,個人電腦上安裝時,相應命令無法使用時,可以加上
sudo
許可權試試
準備:
本次搭建的是flask伺服器環境,需要安裝的元件有Nginx、MySQL、uwsgi、flask
Ubuntu 18.04中自帶的python版本為
Python 2.7.17 (default, Jul 20 2020, 15:37:01)
Python 3.6.9 (default, Jul 17 2020, 12:50:27)
我的專案python3.6就夠用了,所以我不需要對python環境進行改變,如有其它需求,請自行對應修改。
對Ubuntu相關資源升級
1. linux資源升級 sudo apt-get update
2. linux軟體升級 sudo apt-get upgrade
Nginx元件下載安裝
1、Nginx下載並安裝 sudo apt install nginx
2、檢視安裝狀態:sudo systemctl status nginx
3、檢視安裝版本:sudo nginx -v
4、上面結果正確後,瀏覽器訪問你伺服器的地址可得到下面結果(預設情況下,阿里雲的80埠是開啟的,如果是本地的話還可能需要配置埠以及防火牆,請自行操作,本地地址http://127.0.0.1:80)
MySQL下載安裝
1、MySQL下載安裝:sudo apt-get install mysql-server
2、配置MySQL,初始化:sudo mysql_secure_installation
1)驗證密碼外掛可以用來測試密碼提高安全性。它檢查密碼的強度只允許使用者設定足夠安全。是否要設定驗證密碼外掛?
我選的 N (因為我是個人站,學習使用)
2)然後輸入密碼,第二次再次輸入確認,這個密碼就是MySQL資料庫的root賬號密碼
3)預設情況下,MySQL安裝有一個匿名使用者,允許任何人登入MySQL而不必為他們建立的使用者帳戶。這只是為了測試,並使安裝變得更加順利。您應該在進入生產之前刪除它們環境。
我選的 N
4)通常,只允許根使用者從“本地主機”。這確保了有人不能猜到來自網路的根密碼。
我選的 Y
5)預設情況下,MySQL附帶一個名為“test”的資料庫任何人都可以訪問。這也僅用於測試,在投入生產前應將其移除環境。
我選的 Y
6)重新載入特權表將確保所有更改到目前為止,將立即生效。
我選的 Y
3、檢查服務狀態 systemctl status mysql.service
,出現以下結果及說明正常。
4、配置遠端訪問(僅本地使用即可不管)
1)首先使用root使用者登入MySQL sudo mysql -uroot -p
,回車後輸入密碼
2)GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "password";
\*.*
:代表可以訪問所有資料庫和表
root
:代表遠端登入的使用者名稱為root
"%"
:代表任何ip地址都可訪問,預設為本地localhost
"password"
:代表遠端訪問root使用者的密碼是password
成功後會輸出如下字樣:Query OK, 0 rows affected, 1 warning (0.00 sec)
成功後使用exit;
退出資料庫命令列
例項:
1 建立資料庫weixx
CREATE DATABASE weixx;
2 建立使用者wxx(密碼654321) 並允許wxx使用者可以從任意機器上登入mysql的weixx資料庫
GRANT ALL PRIVILEGES ON weixx.* TO wxx@"%" IDENTIFIED BY "654321";
5、編輯mysql配置檔案vi /etc/mysql/mysql.conf.d/mysqld.cnf
。
將bind-address= 127.0.0.1
注掉。
或者在bind-address後面增加遠端訪問IP地址
bind-address=127.0.0.1 114.196.197.1
(允許多個IP可訪問mysql伺服器,空格隔開)
我是簡單粗暴直接註釋掉
6、重啟MySQL服務 service mysql restart
,重啟後systemctl status mysql.service
檢查服務狀態是否為runing,是則正確。
flask 環境安裝配置
flask可以安裝在虛擬環境中,也可全域性安裝
1、全域性安裝 pip3 install Flask
,flask後面可跟版本號,不加版本號預設安裝資源路徑最新版, (aliyun的Ubuntu中pip預設指向的是python2,我需要用python3,所以使用pip3,如果你預設pip指向為python3則使用pip即可)
使用python -m Flask --version
命令驗證安裝,該命令將列印 Flask 版本.
我使用的是 python3 -m flask --version 命令,本教程記錄時flask最新版為1.1.2
Python 3.6.9
Flask 1.1.2
Werkzeug 1.0.1
2、虛擬環境中安裝。
1)安裝虛擬模組 sudo apt-get install python3-venv
.
對於使用python2的來說,那麼 venv 模組無法使用。相應的,必須安裝 virtualenv.
virtualenv 通過作業系統的包管理器安裝:
sudo apt-get install python-virtualenv
2)在任何安全位置建立一個你的專案資料夾,用於存放你的專案和虛擬環境,如myproject
。然後進入myproject.
使用python3 -m venv venv
建立一個環境.建立完成後myproject裡面會多一個venv
資料夾
3)啟用相應的虛擬環境:
. venv/bin/activate
,也可以使用source venv/bin/activate
啟用
啟用後,你的終端提示符會顯示虛擬環境的名稱venv
。
4)啟用後,在虛擬環境中可使用pip安裝flask: pip install Flask
使用命令 pip 而不是 pip3 、 python 而不是 python3。
(不過我在實際使用中,專案後面安裝元件的時候有時使用python安裝不上,而使用python3反而安裝上了,請自己結合實際使用)
5)使用python -m flask --version
驗證安裝
到此flask就安裝完成了。接著就開始在你的專案中寫程式碼吧
3、停用虛擬環境
完成工作後,通過鍵入 deactivate
來停用環境,您將返回正常的 shell。
flask 專案部署
首先將你的完整專案上傳到伺服器上,上傳的方法有許多,自行上傳
我使用的是git方式: git在Ubuntu 18.04上安裝方法
專案上傳到伺服器上後,安裝缺少的元件
在本地生成requirements.txt檔案
pip freeze > requirements.txt
然後在伺服器虛擬環境中安裝requirements.txt依賴
pip install -r requirements.txt
所有依賴安裝完成後使用python執行專案,如果能成功執行則進入下一步,否則解決所有錯誤。
專案除錯完畢後,進行專案部署
uwsgi 安裝和配置
1、使用命令 pip3 install uwsgi
安裝uwsgi
安裝檢測:
建立test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello uwsgi! uwsgi is ok!"]
然後使用 uwsgi執行該檔案
uwsgi --http-socket :5000 --wsgi-file test.py
然後瀏覽器訪問伺服器的5000埠(aliyun伺服器記得配置5000埠的安全組,或者改成你已經有的埠,但不能是80等其他程式佔用了的)。
如果瀏覽器得到** Hello uwsgi! uwsgi is ok! **輸出則成功。
2、uwsgi 配置
在專案更目錄下新建一個ini檔案 vi uwsgi.ini
檔案內容參考如下(下面是我使用的ini配置,uwsgi還有許多其他的配置功能,請自行查閱 官方文件):
[uwsgi]
# 監聽埠,使用Nginx代理時使用這個
socket = 127.0.0.1:8000
# 獨立伺服器執行時使用這個
# http = 0.0.0.0:8000
# 工作路徑(你的專案根目錄路徑)
chdir = /www/myproject
# wsgi 路徑,專案呼叫的主程式檔案(不在專案根目錄需要帶上路徑)
wsgi-file = myproject_run.py
# 專案內的python程式名稱,flask的程式通常叫app,
callable = app
# 設定程序 processes 和 workers 一樣的意思
# processes = 2
workers = 2
# 每個程序下面的執行緒數
threads = 4
# 以獨立守護程序執行
master = True
# 允許在請求中開啟新執行緒
enable-threads = True
# 存放uwsgi程序的pid,便於重啟和關閉操作
pidfile = uwsgi.pid
# 日誌檔案
daemonize = uwsgi_server.log
# 返回一個json串,顯示各程序和worker的狀態
stats=127.0.0.1:9191
# 啟用記憶體報告,報告佔用的記憶體
memory-report=true
# 緩衝區大小,設定請求的最大大小
buffer-size = 65535
3、uwsgi 相關操作
(ini就是上面新建的ini檔案,pid檔案在ini執行後會出現)
啟動:uwsgi --ini xxx.ini
重啟:uwsgi --reload xxx.pid
停止:uwsgi --stop xxx.pid
如果你配置的是 http = 0.0.0.0:8000 的話,啟動以後你就可以在瀏覽器中訪問你的網站了,不過當前還沒有進行Nginx代理,所以瀏覽器收不到靜態資原始檔,網頁上的靜態檔案就,反正我自己理解是這樣的。
Nginx配置
假設我專案路徑為
myproject/
├── manage.py
├── uwsgi.ini
├── static
├── mycss.css
├── myjs.js
├── myimg.jpg
└── project
├── __init__.py
├── settings.py
├── urls.py
└── works.py
myproject專案
路徑為/www/myproject
static
為專案靜態檔案
manage.py
為專案啟動檔案
uwsgi.ini
為uwsgi配置檔案
Nginx配置檔案
路徑在/etc/nginx/sites-available/default
我是直接改的原本的Nginx配置檔案,不想修改原檔案的可以複製一份或者網上檢視其它教程。
不知道為什麼aliyun的Nginx安裝後配置檔案和網上許多教程路徑(/etc/nginx/nginx.conf)不一樣,aliyun在nginx.conf檔案裡面又匯入了sites-available資料夾裡面的default檔案,然後default裡面的內容才和網路上大部分教程內容相同(我沒研究過Nginx),反正結合自己的實際為準。
vi /etc/nginx/sites-available/default
修改Nginx配置檔案內容
我原本檔案內容,其中註釋已經被我去掉了,佔空間
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
其中:
root :指定虛擬主機根目錄(web專案根目錄)
index :預設首頁
修改後:
server {
listen 80;
server_name _ localhost;
root /www/myproject; # 專案路徑
location /static{
# 專案靜態檔案,動靜分離
alias /www/myproject/static;
}
location / {
# uwsgi_params在Nginx裡面,使用自己的路徑
include /etc/nginx/uwsgi_params;
# 這裡是之前配置uwsgi時設定的埠號8000
uwsgi_pass localhost:8000;
}
}
然後重啟Nginx,網上的許多重啟Nginx的教程和aliyun裡面安裝的Nginx對不上,比如在我的伺服器上找不到/usr/local/nginx/sbin
這個路徑,我使用的方式是service nginx reload
直接重啟,結果能成功,至於為什麼,我不知道,反正能用就行,哈哈。
nginx啟動:service nginx start
nginx停止:service nginx stop
nginx重啟:service nginx reload
到此不出意外的話,恭喜你,你已經可以訪問你的網站了。
我的小站,裡面什麼都沒有,只是貼上來說明我操作成功了的。
我的小站還在建設中,所以如有問題後面碰到會修改,如果沒改那說明我能夠執行