Ubuntu+Nginx+uWSGI+Flask應用

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

 

多日未更新博客,就是在忙着把本身的Flask應用在Ubuntu上運行起來,額,是生產環境中運行起來,因此,須要用到uWSGI服務器,而不是Flask自帶的開發用服務器。python

另外,順便學習Linux,好比,用戶和用戶組管理、環境變量的配置、各類配置文件修改、進程管理、服務隨機啓動配置等,只是,還沒有精通,但對於目前部署本身的Flask應用時夠了。nginx

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

 

本文展現在本地運行起來的項目架構圖,以下:flask

 

下午在本地環境實現了開機自動啓動項目須要的服務,其中,uWSGI服務器的隨機啓動花費了本身很多時間,和本身以前安裝uWSGI的方式、不會查看uWSGI的日誌 和 對uWSGI的配置不熟悉形成的吧!ubuntu

剛剛整理了一個本身遇到的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?

路漫漫~

相關文章
相關標籤/搜索