ubuntu 18.04 搭建flask服務器(大合集,個人實操)


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相關資源升級

  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

到此不出意外的話,恭喜你,你已經可以訪問你的網站了。

我的小站,里面什么都沒有,只是貼上來說明我操作成功了的。

我的小站還在建設中,所以如有問題后面碰到會修改,如果沒改那說明我能夠運行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM