更多關(guān)注:
http://www.mknight.cn/post/602/
python3 編譯安裝
依賴環(huán)境安裝
#你就裝吧鸵熟,不裝就等著后悔吧
yum install openssl-devel sqlite-devel -y-y
下載
cd /usr/src
wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
解壓
tar -zxvf Python-3.5.1.tgz
cd Python-3.5.1
./configure --prefix=/usr/local/python3
make
make install
創(chuàng)建命令軟連接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
報(bào)錯(cuò)整理
-
Ignoring ensurepip failure: pip 7.1.2 requires SSL/TLS
原因,沒(méi)有安裝open-ssl
解決蛤迎,yum install open-ssl -
python3提示sqlite3模塊不存在解決方法
首先
yum install sqlite-devel -y
然后重裝下python3(一定要重裝)
cd Python-3.4.2
./configure --prefix=/usr/local/python3
make && make install
附錄:
Python下載地址 https://www.python.org/ftp/python/
uwsgi部署
安裝uwsgi
pip install uwsgi
#or
curl http://uwsgi.it/install | bash -s default /tmp/uwsgi
測(cè)試
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
將其保存為 foobar.py炒辉。
正如你所見(jiàn)其徙,它由一個(gè)簡(jiǎn)單的Python函數(shù)組成谱煤。之所以稱之為 “application”亥曹,是因?yàn)樗莡WSGI Python加載器將會(huì)搜索的默認(rèn)函數(shù) (但你顯然可以自定義)噪服。
將其部署在HTTP端口9090
現(xiàn)在毡泻,啟動(dòng)uWSGI來(lái)運(yùn)行一個(gè)HTTP服務(wù)器/路由器,它會(huì)傳遞請(qǐng)求到你的WSGI應(yīng)用:
uwsgi --http :9090 --wsgi-file foobar.py
就這樣粘优。
添加并發(fā)和監(jiān)控
你想進(jìn)行的第一個(gè)調(diào)整可能是增加并發(fā)性 (默認(rèn)情況下仇味,uWSGI啟動(dòng)一個(gè)單一的進(jìn)程和一個(gè)單一的線程)呻顽。
你可以用 --processes 選項(xiàng)添加更多的進(jìn)程,或者使用 --threads 選項(xiàng)添加更多的線程 (或者可以同時(shí)添加)丹墨。
uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2
這將會(huì)生成4個(gè)進(jìn)程 (每個(gè)進(jìn)程有2個(gè)線程)廊遍,一個(gè)master進(jìn)程 (在Inc死掉的時(shí)候會(huì)生成它們) 和HTTP路由器 (見(jiàn)前面)。
一個(gè)重要的任務(wù)是監(jiān)控贩挣。在生產(chǎn)部署上喉前,了解正在發(fā)生的事情是至關(guān)重要的。stats子系統(tǒng)允許你將uWSGI的內(nèi)部統(tǒng)計(jì)數(shù)據(jù)作為JSON導(dǎo)出:
uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
對(duì)你的應(yīng)用進(jìn)行幾次請(qǐng)求王财,然后telnet到端口9191卵迂,你會(huì)獲得大量有趣的信息。你可能想要使用”uwsgitop” (僅需 pip install 來(lái)安裝它)绒净,這是一個(gè)類似于top的工具狭握,用來(lái)監(jiān)控實(shí)例。
將它放在一個(gè)完整的web服務(wù)器之后
即使uWSGI HTTP路由器是穩(wěn)定并且高性能的疯溺,但是你或許想要將你的應(yīng)用放在一個(gè)全功能的web服務(wù)器之后论颅。
uWSGI原生支持HTTP, FastCGI, SCGI及其特定的名為”uwsgi”的協(xié)議 (是噠,錯(cuò)誤的命名選擇)囱嫩。最好的協(xié)議顯然是uwsgi恃疯,nginx和Cherokee已經(jīng)支持它了 (雖然有各種Apache模塊可用)
一個(gè)常用的nginx配置如下:
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3031;
}
這表示“傳遞每一個(gè)請(qǐng)求給綁定到3031端口并使用uwsgi協(xié)議的服務(wù)器”。
現(xiàn)在墨闲,我們可以生成uWSGI來(lái)本地使用uwsgi協(xié)議:
uwsgi --socket 127.0.0.1:3031 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
如果你要運(yùn)行 ps aux 今妄,那么你會(huì)看到一個(gè)進(jìn)程。已經(jīng)移除了HTTP路由器鸳碧,因?yàn)槲覀兊摹皐orker” (被分配給uWSGI的進(jìn)程) 本地使用uwsgi協(xié)議盾鳞。
如果你的代理/web服務(wù)器/路由器使用HTTP,那么你必須告訴uWSGI本地使用http協(xié)議 (這與會(huì)自己生成一個(gè)代理的–http不同):
uwsgi --http-socket 127.0.0.1:3031 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
部署Django
Django大概是最常使用的Python web框架了瞻离。部署它是相當(dāng)容易的 (我們繼續(xù)配置4個(gè)進(jìn)程腾仅,每個(gè)進(jìn)程有2個(gè)線程)。
假設(shè)Django工程位于 /home/foobar/myproject:
uwsgi --socket 127.0.0.1:3031 --chdir /home/foobar/myproject/ --wsgi-file myproject/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
(使用 --chdir 套利,我們移到指定的目錄下)推励。在Django中,需要使用它來(lái)正確加載模塊肉迫。
哎呀验辞!這是什么鬼?喊衫!是噠跌造,你是對(duì)的,對(duì)的……處理這樣長(zhǎng)的命令行并不實(shí)際族购,并且愚蠢而易于犯錯(cuò)壳贪。不要害怕陵珍!uWSGI支持多種配置風(fēng)格。在這個(gè)入門中撑碴,我們會(huì)使用.ini文件撑教。
[uwsgi]
socket = 127.0.0.1:3031
chdir = /home/foobar/myproject/
wsgi-file = myproject/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:9191
好得多了!
僅需運(yùn)行:
uwsgi yourfile.ini
安全性和可用性
總是 避免以root用戶運(yùn)行你的uWSGI實(shí)例醉拓。你可以使用 uid 和 gid 選項(xiàng)來(lái)去除權(quán)限:
[uwsgi]
https = :9090,foobar.crt,foobar.key
uid = foo
gid = bar
chdir = path_to_web2py
module = wsgihandler
master = true
processes = 8
如果你需要綁定到特許端口 (例如用于HTTPS的443)伟姐,那么使用共享socket。它們?cè)谌コ龣?quán)限之前創(chuàng)建亿卤,并且可以通過(guò) =N 語(yǔ)法引用愤兵,其中, N 是socket號(hào) (從0開(kāi)始):
[uwsgi]
shared-socket = :443
https = =0,foobar.crt,foobar.key
uid = foo
gid = bar
chdir = path_to_web2py
module = wsgihandler
master = true
processes = 8
web應(yīng)用部署的一個(gè)常見(jiàn)問(wèn)題是“卡住的請(qǐng)求”排吴。你所有的線程/worker都卡住了 (請(qǐng)求阻塞) 秆乳,而你的應(yīng)用無(wú)法接收更多的請(qǐng)求。要避免這個(gè)問(wèn)題钻哩,你可以設(shè)置一個(gè) harakiri 定時(shí)器屹堰。它是一個(gè)監(jiān)控器 (由master進(jìn)程管理),會(huì)摧毀那些卡住超過(guò)指定秒數(shù)的進(jìn)程 (小心選擇 harakiri 值)街氢。例如扯键,你也許想要摧毀那些阻塞超過(guò)30秒的worker:
[uwsgi]
shared-socket = :443
https = =0,foobar.crt,foobar.key
uid = foo
gid = bar
chdir = path_to_web2py
module = wsgihandler
master = true
processes = 8
harakiri = 30
除此之外,自u(píng)WSGI 1.9起珊肃,stats服務(wù)器導(dǎo)出了全部請(qǐng)求變量荣刑,因此,你可以(實(shí)時(shí))看到你的實(shí)例正在做什么 (對(duì)于每個(gè)worker, thread 或者異步核)伦乔。
備注
nginx
示例
server {
listen 89;
server_name 192.168.1.40;
location / {
root /data/project/scm;
uwsgi_pass 127.0.0.1:3031; #uwsgi
include uwsgi_params;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
}
location = /50x.html {
root html;
}
#靜態(tài)文件
location ^~ /static/ {
root /data/project/scm;
}
}
注意訪問(wèn)nginx端口丛肢,不是uwsgi端口 V上场!侣夷!
更多關(guān)注:
http://www.mknight.cn/post/602/