關(guān)鍵字:Linux, CentOS, Flask, uWsgi
1. 配置anaconda下的python虛擬環(huán)境
為了使項(xiàng)目具有很好的獨(dú)立性十减,我們給項(xiàng)目配置一個(gè)自己?jiǎn)为?dú)的python運(yùn)行環(huán)境氢哮。
之前我們?cè)贑entOS下安裝了anaconda辱揭,并配置了國(guó)內(nèi)下載源裆泳,接下來繼續(xù)在此基礎(chǔ)上配置一個(gè)python 3.7.3的虛擬環(huán)境竟闪。
1.1 創(chuàng)建虛擬環(huán)境
conda create -n venv python==3.7.3
1.2 查看系統(tǒng)上的虛擬環(huán)境
conda env list
1.3 進(jìn)入虛擬環(huán)境
source activate venv
進(jìn)入后命令提示符的最前面括號(hào)里就變成了虛擬環(huán)境的名字 這里是venv
1.4 刪除虛擬環(huán)境
conda remove -n your_env_name --all
2. 安裝uWSGI
直接用pip就可以安裝
pip install uwsgi
安裝完成后可以在anaconda的bin目錄下找到它摊溶,如果不知道它在哪兒谐岁,也可以用命令在整個(gè)根目錄下查找
find / -name "uwsgi"
為了便于我們使用,給它創(chuàng)建一個(gè)軟鏈接幢竹,這相當(dāng)于在windows下將某個(gè)exe寫在系統(tǒng)環(huán)境變量的PATH中耳峦,可以隨處在命令行使用一樣
ln -s /root/anaconda3/bin/uwsgi /usr/bin/uwsgi
3. 創(chuàng)建uwsgi配置文件
通常在項(xiàng)目所在的虛擬環(huán)境下創(chuàng)建uwsgi的配置文件,這里虛擬環(huán)境的目錄在
/root/anaconda3/envs/venv/
vi /root/anaconda3/envs/venv/uwsgi.ini
寫入以下配置信息
[uwsgi]
# dir for file manage.py
chdir = /opt/KangheSPC
# flask file name
wsgi-file = manage.py
# object that call the run() function
callable = app
# processor number
processes = 4
# ip address and port
http = 0.0.0.0:5000
# dir for log files
daemonize = /opt/KangheSPC/log
# write pids to pidfile before lost authority
pidfile = project-master.pid
下面簡(jiǎn)單說明一下配置項(xiàng)(有些配置項(xiàng)這里沒有配置):
- socket:指出了一個(gè)套接字焕毫,相當(dāng)于為外界留出一個(gè)uwsgi服務(wù)器的接口蹲坷。這里我用的是sock文件,沒有用IP:端口是因?yàn)樽髡咴诤竺孢\(yùn)行遇到了錯(cuò)誤邑飒,請(qǐng)看后面描述循签,如果只用了uwsgi,沒有配合Nginx一起,這里就可以配置成http.
- pythonpath:指出了python的目錄.
- module:指出了項(xiàng)目啟動(dòng)腳本的名字.
- wsgi-file:指出了真正的腳本的文件名.
- callable:指出的是具體執(zhí)行.run方法的那個(gè)實(shí)體的名字疙咸,一般而言都是app=Flask(__name__)的所以這里是app县匠。
- processes/threads:指出了啟動(dòng)uwsgi服務(wù)器之后,服務(wù)器會(huì)打開幾個(gè)并行的進(jìn)程,每個(gè)進(jìn)程會(huì)開幾條線程來等待處理請(qǐng)求聚唐,顯然這個(gè)數(shù)字應(yīng)該合理,太小會(huì)使得處理性能不好而太大則會(huì)給服務(wù)器本身帶來太大負(fù)擔(dān)腔召。
- daemonize:該項(xiàng)的出現(xiàn)表示把uwsgi服務(wù)器作為后臺(tái)進(jìn)程啟動(dòng)杆查,項(xiàng)的值指向一個(gè)文件表明后臺(tái)中的所有輸出都重定向到這個(gè)日志中去。
- chmod-socket/chmod unix socket:是個(gè)文件臀蛛,所以會(huì)受到unix系統(tǒng)的權(quán)限限制亲桦。如果你的uwsgi客戶端沒有權(quán)限訪問uWSGI socket,你可以用這個(gè)選項(xiàng)設(shè)置unix socket的權(quán)限
- pidfile: 在失去權(quán)限前浊仆,將pid寫到指定的pidfile文件中客峭。
- chdir: 在失去權(quán)限前,使用chdir()到指定目錄抡柿。
以上這些配置項(xiàng)都是一些最為常見的配置項(xiàng)舔琅,實(shí)際上uwsgi還有很多很多配置。洲劣。除了寫一個(gè)配置文件的啟動(dòng)方式之外备蚓,還有命令行的啟動(dòng)方式,這里就不多說了囱稽。請(qǐng)需要的自己百度uwsgi配置
此外上面也說到這次碰到的一個(gè)坑郊尝,就是關(guān)于socket和http的差別。從概念上來說战惊,socket本身不是協(xié)議而是一種具體的TCP/IP實(shí)現(xiàn)方式流昏,而HTTP是一種協(xié)議且基于TCP/IP。具體到這個(gè)配置這里來吞获,如果我只配了socket = 127.0.0.1:5051的話况凉,通過瀏覽器或者其他HTTP手段是無法成功訪問的。而在uwsgi這邊的日志里會(huì)提示請(qǐng)求包的長(zhǎng)度超過了最大固定長(zhǎng)度衫哥。另一方面茎刚,如果配置的是http = 127.0.0.1:5051的話,那么就可以直接通過一般的http手段來訪問到目標(biāo)撤逢。但這會(huì)引起nginx無法正常工作膛锭。正確的做法應(yīng)該是,如果有nginx在uwsgi之前作為代理的話應(yīng)該配socket蚊荣,而如果想讓請(qǐng)求直接甩給uwsgi的話那么就要配http初狰。
配置完成之后就可以鍵入 uwsgi 配置文件.ini來啟動(dòng)uwsgi,再查看日志(如果配置了daemonize的話)如果最終沒有報(bào)錯(cuò)互例,ps也能看到processes指定個(gè)數(shù)的uwsgi進(jìn)程在跑的話說明成功啟動(dòng)奢入。如果直接把uwsgi作為留給外部的連接接口發(fā)布應(yīng)用的話當(dāng)然也可以,但是一般而言我們肯定還要在uwsgi前面再加上一個(gè)nginx媳叨。nginx的好處在于可以進(jìn)行安全過濾腥光,防DDOS攻擊关顷,多臺(tái)機(jī)器的負(fù)載均衡等工作。
4. 啟動(dòng)uWSGI生產(chǎn)服務(wù)器
下面我們寫一個(gè)簡(jiǎn)單的flask應(yīng)用程序武福,然后在uWSGI上運(yùn)行议双。
4.1 簡(jiǎn)單的hello world
編寫一個(gè)manage.py的文件放到我們的項(xiàng)目文件夾中
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
4.2 啟動(dòng)服務(wù)器
執(zhí)行命令
uwsgi --ini /root/anaconda3/envs/venv/uwsgi.ini
然后可以用命令查看5000端口是哪個(gè)進(jìn)程在使用
netstat -lnp | grep 5000
截圖如下:
為了驗(yàn)證服務(wù)器已經(jīng)正確啟動(dòng)了,我們?cè)趙indows下訪問我們的服務(wù)器捉片,在瀏覽器中輸入服務(wù)器的地址
可以看到服務(wù)器響應(yīng)了我們的http請(qǐng)求
此外平痰,還可以在log文件中看到服務(wù)器的運(yùn)行狀態(tài)
vi /opt/KangheSPC/log
4.3 關(guān)閉服務(wù)器
killall -9 uwsgi
貌似大家都是用這種很粗暴的方式,以后找到新的方式了再更新伍纫。
參考文獻(xiàn)
https://blog.csdn.net/t8116189520/article/details/82108135
https://blog.csdn.net/tengqingyong/article/details/82020733
https://blog.csdn.net/woshizhiwu/article/details/78237921
https://blog.csdn.net/qq_44670803/article/details/91894534