Ubuntu+Nginx+uWSGI+Flask應用


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?

路漫漫~

 


免責聲明!

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



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