1. 程式人生 > 實用技巧 >ubuntu 18.04 搭建flask伺服器(大合集,個人實操)

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

  1. def application(env, start_response):
  2. start_response('200 OK', [('Content-Type','text/html')])
  3. 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還有許多其他的配置功能,請自行查閱 官方文件):

  1. [uwsgi]
  2. # 監聽埠,使用Nginx代理時使用這個
  3. socket = 127.0.0.1:8000
  4. # 獨立伺服器執行時使用這個
  5. # http = 0.0.0.0:8000
  6. # 工作路徑(你的專案根目錄路徑)
  7. chdir = /www/myproject
  8. # wsgi 路徑,專案呼叫的主程式檔案(不在專案根目錄需要帶上路徑)
  9. wsgi-file = myproject_run.py
  10. # 專案內的python程式名稱,flask的程式通常叫app,
  11. callable = app
  12. # 設定程序 processes 和 workers 一樣的意思
  13. # processes = 2
  14. workers = 2
  15. # 每個程序下面的執行緒數
  16. threads = 4
  17. # 以獨立守護程序執行
  18. master = True
  19. # 允許在請求中開啟新執行緒
  20. enable-threads = True
  21. # 存放uwsgi程序的pid,便於重啟和關閉操作
  22. pidfile = uwsgi.pid
  23. # 日誌檔案
  24. daemonize = uwsgi_server.log
  25. # 返回一個json串,顯示各程序和worker的狀態
  26. stats=127.0.0.1:9191
  27. # 啟用記憶體報告,報告佔用的記憶體
  28. memory-report=true
  29. # 緩衝區大小,設定請求的最大大小
  30. 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配置

假設我專案路徑為

  1. myproject/
  2. ├── manage.py
  3. ├── uwsgi.ini
  4. ├── static
  5. ├── mycss.css
  6. ├── myjs.js
  7. ├── myimg.jpg
  8. └── project
  9. ├── __init__.py
  10. ├── settings.py
  11. ├── urls.py
  12. └── 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配置檔案內容
我原本檔案內容,其中註釋已經被我去掉了,佔空間

  1. server {
  2. listen 80 default_server;
  3. listen [::]:80 default_server;
  4. root /var/www/html;
  5. index index.html index.htm index.nginx-debian.html;
  6. server_name _;
  7. location / {
  8. # First attempt to serve request as file, then
  9. # as directory, then fall back to displaying a 404.
  10. try_files $uri $uri/ =404;
  11. }
  12. }

其中:
root :指定虛擬主機根目錄(web專案根目錄)
index :預設首頁

修改後:

  1. server {
  2. listen 80;
  3. server_name _ localhost;
  4. root /www/myproject; # 專案路徑
  5. location /static{
  6. # 專案靜態檔案,動靜分離
  7. alias /www/myproject/static;
  8. }
  9. location / {
  10. # uwsgi_params在Nginx裡面,使用自己的路徑
  11. include /etc/nginx/uwsgi_params;
  12. # 這裡是之前配置uwsgi時設定的埠號8000
  13. uwsgi_pass localhost:8000;
  14. }
  15. }

然後重啟Nginx,網上的許多重啟Nginx的教程和aliyun裡面安裝的Nginx對不上,比如在我的伺服器上找不到/usr/local/nginx/sbin這個路徑,我使用的方式是service nginx reload直接重啟,結果能成功,至於為什麼,我不知道,反正能用就行,哈哈。
nginx啟動:service nginx start
nginx停止:service nginx stop
nginx重啟:service nginx reload

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

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

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