ubuntu 18.04 搭建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相關資源升級
- linux資源升級
sudo apt-get update
- 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
到此不出意外的話,恭喜你,你已經可以訪問你的網站了。
我的小站,里面什么都沒有,只是貼上來說明我操作成功了的。
我的小站還在建設中,所以如有問題后面碰到會修改,如果沒改那說明我能夠運行