1. 程式人生 > >Ubuntu+Nginx+uWSGI+Flask應用

Ubuntu+Nginx+uWSGI+Flask應用

gen art csdn 完成 進程 logs apt-get virtual style

Ubuntu 18.04,Nginx 1.14.0,uWSGI 2.0.17.1,Flask 1.0.2,Python 3.6.5,

多日未更新博客,就是在忙著把自己的Flask應用在Ubuntu上運行起來,額,是生產環境中運行起來,所以,需要用到uWSGI服務器,而不是Flask自帶的開發用服務器。

另外,順便學習Linux,比如,用戶和用戶組管理、環境變量的配置、各種配置文件修改、進程管理、服務隨機啟動配置等,只是,尚未精通,但對於目前部署自己的Flask應用時夠了。

總之,先在Ubuntu上把程序跑起來!

本文展示在本地運行起來的項目架構圖,如下:

技術分享圖片

下午在本地環境實現了開機自動啟動項目需要的服務,其中,uWSGI服務器的隨機啟動花費了自己不少時間,和自己之前安裝uWSGI的方式、不會查看uWSGI的日誌 和 對uWSGI的配置不熟悉造成的吧!

剛剛整理了一個自己遇到的Flask項目開發、部署的全過程的魚骨圖,僅供參考(大概的步驟是對的,具體細節還需調整):安裝軟件--開發應用(測試)--部署應用(測試)。

當然,下面的過程也適合於其它Python Web應用的開發部署吧,比如Django(其它的沒有接觸過)!

P.S.要不要開發一個Python Web應用開發部署工具啊?一鍵在對應的Linux發行版上部署好應用,嘿

P.S.是不是還有容器部署的方式?

技術分享圖片

【軟件安裝】

1.Python3

Ubuntu 18上已經有了,python3是可用的;

2.pip3

也已經有了,沒有的話,請使用下面的命令安裝:

apt-get install python3-pip

3.virtualenv

使用pip安裝:

pip3 install virtualenv

然後建立虛擬工作目錄,前面有博文介紹。

4.Flask

在下午配置uWSGI加載Flask應用隨機啟動時遇到了問題,雖然系統的Python3中已經安裝了Flask,可是,錯誤日誌提示找不到flask模塊,而且,嘗試了配置pythonpath也無法解決問題,最後,通過在虛擬工作目錄中安裝flask等模塊完成了配置。

使用pip安裝(虛擬工作目錄,下同):

pip install flask

5.MongoDB 和 Python的MongoDB驅動pymongo

5.1.MongoDB安裝

最新版是4.0,參考官網的安裝方式:

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

選擇了其中的推薦的Using .deb Packages (Recommended),安裝好後市4.0。

當然,安裝完畢後的配置是必要的,添加角色、用戶等。

5.2.安裝pymongo模塊

使用pip安裝:

pip install pymongo

6.Nginx安裝

在安裝之前,將pcre、openssl等安裝好;

采用的是從源碼安裝的方式;

7.uWSGI安裝

有兩種方式:

pip安裝;

apt/apt-get安裝;

自己先是使用了pip安裝(但沒安裝到虛擬工作目錄中),但在配置uWSGI隨機啟動時遇到了一系列問題,最後放棄並卸載了,改為采用apt/apt-get安裝;

使用pip安裝時,uwsgi命令出現在當前用戶家目錄的.local中,而apt/apt-get安裝時,uwsgi命令出現在公共目錄中,所有用戶都是可用的吧;

pip安裝時,沒有找到配置、日誌等的存放位置,而apt/apt-get安裝時,/etc/下有uwsgi的配置文件,/var/log/中有其日誌文件——在這裏,孤看到了隨機啟動配置時的一些錯誤信息,最後沿著錯誤信息解決了問題;

當然,若是采用pip安裝方式在虛擬工作目錄中安裝的話,或許問題也會被解決了——待驗證。

apt/apt-get安裝時,還要安裝python3-uwsgi插件,安裝命令如下:

sudo apt install uwsgi uwsgi-plugin-python3

技術分享圖片

參考鏈接(還有不少看過的文檔就沒法記錄在這裏了):

如何正確的使用uwsgi by 園友 iamroot

Linux下Nginx安裝的方法(pcre和openssl)

uWSGI中文文檔-選項(配置)

【啟動配置】

配置分為兩步,一是配置後手動啟動軟件或服務,二是配置後隨機啟動軟件或服務。

當然,還有第三步,配置後,服務在掛掉後可以自動恢復。

目前做到了第二步,但是,第二步配置有很多方法可以改進的。

1.Nginx配置

使用apt/apt-get安裝時,配置文件存在於/etc/nginx/目錄中:

目前自己是 直接修改 sites-available目錄下的default文件 實現請求轉發給後端的uWSGI服務器的。

技術分享圖片

使用apt/apt-get安裝時,Nginx服務器已經是隨機啟動了,其腳本位於/etc/init.d/目錄中:

技術分享圖片

Nginx的日誌文件存放於/var/log/nginx/目錄下:

技術分享圖片

2.MongoDB配置

版本是最新的4.0,使用官方的.deb的方式安裝後,mongod、mongo命令是所有用戶可以用的。

但是,服務需要自己執行命令(假設讀者已經會使用MongoDB了)。

MongoDB會有配置文件,但孤目前只使用過命令行啟動模式,命令如下:

mongod --dbpath /home/log/ws/mdb/data0725 --logpath /home/log/ws/mdb/data0725/log --logappend --auth --directoryperdb

默認端口,需要認證,僅可以在本機訪問。

配置隨機啟動:

在/etc/init.d/目錄中建立啟動腳本mongo01:

只有一條命令,註意,命令最後需要添加&符號

技術分享圖片

在/etc/rc3.d/目錄中建立mongo01的軟連接:

技術分享圖片

就可以了,重新啟動計算機後,可以使用mongo訪問MongoDB服務器了。

3.uWSGI配置

這個是 重難點!耗費了不少時間啊!

前面有提及了,使用pip安裝方式,一直無法配置好隨機啟動。

之後更改為apt/apt-get安裝方式,找到了配置文件,然後才一步一步配置完成隨機啟動。

在兩種安裝方式下,都可以使用uwsgi命令,但pip方式安裝時只屬於安裝它的用戶,而apt/apt-get方式安裝時則所有用戶都可以用,而且,更規範一下,雖然版本較低一點。

本文僅介紹apt/apt-get安裝方式下成功配置隨機啟動的過程。

uWSGI的配置存在於/etc/uwsgi/中:

包含兩個目錄——apps-available、apps-enabled(和Nginx類似),其中,前者存放的是真正的配置文件的地方,可以多個——需要避免沖突吧?,後者存放前者配置文件的 軟鏈接。

技術分享圖片

最重大的問題就出現在這裏:孤以為把之前手動執行的配置文件直接放到apps-available就可以了,可是,行不通,然後,一下午的時間就耗在這裏了!

對比下面兩個 手動vs自動 版本的配置文件:

相比於手動,多了plugins、virtualenv兩個配置項,另外,socket的配置用的上/run/uwsgi/下的一個socket文件。

尚不清楚為何plugins是python而不是python3,因為虛擬工作目錄的python就是Python 3版本的?錯誤信息:

-- unavailable modifier requested: 0 --

socket使用/run/uwsgi/下的socket文件,和權限有關系,具體的還沒搞清楚。日誌文件權限問題導致的錯誤信息:

error removing unix socket, unlink(): Permission denied [core/socket.c line 198]

關於配置virtualenv,沒有配置的話,會出現下面的錯誤:居然找不到flask(期間嘗試了配置pythonpath,均失敗了;加上之前看的博文都是配置virtualenv的,所以,才會有這次嘗試,否則,又要更多精時耗費了,不過,之前看博文也是需要耗費精時的嘛,)

from flask import Flask, render_template
ModuleNotFoundError: No module named ‘flask‘

技術分享圖片

還好,找到了uwsgi的全局日誌文件,存在於/var/log/uwsgi/中,每個app一個日誌文件(感謝日誌文件):

日誌文件的名稱對應配置文件中的apps-enabled目錄下的軟鏈接名稱。

技術分享圖片

隨機啟動?寫好uWSGI加載Flask應用的配置文件,扔到apps-available下並在apps-enabled中建立軟鏈接即可。

其它應用也是如此的吧?

然後,其它的就由uWSGI的位於/etc/init.d/目錄下的啟動腳本負責了(挺長的,自己目前改不了):

技術分享圖片

當然,隨機啟動還有其它配置方式的,還需要學習。為何MongoDB的啟動腳本的軟鏈接建立在/etc/rc3.d/目錄中呢?這和Linux的運行級別有關系。

最後,重啟,測試是否都隨機啟動了。啟動後執行下面的命令:

ps -ef | grep -e nginx -e mongod -e uwsgi

下圖顯示,三個服務器都啟動了。

技術分享圖片

進一步,通過瀏覽器訪問自己開發的Flask應用,結果顯示也是成功的,否則,請檢查各種問題吧!

後記

服務壞了怎麽辦?

通知?

監控?

計劃任務?

systemd?

路漫漫~

Ubuntu+Nginx+uWSGI+Flask應用