Django + uwsgi + nginx 部署

更多關(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

報錯整理

  • Ignoring ensurepip failure: pip 7.1.2 requires SSL/TLS

    原因,沒有安裝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

測試

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

將其保存為 foobar.py。
正如你所見,它由一個簡單的Python函數(shù)組成。之所以稱之為 “application”,是因為它是uWSGI Python加載器將會搜索的默認(rèn)函數(shù) (但你顯然可以自定義)。
將其部署在HTTP端口9090
現(xiàn)在,啟動uWSGI來運(yùn)行一個HTTP服務(wù)器/路由器,它會傳遞請求到你的WSGI應(yīng)用:

uwsgi --http :9090 --wsgi-file foobar.py

就這樣。

添加并發(fā)和監(jiān)控

你想進(jìn)行的第一個調(diào)整可能是增加并發(fā)性 (默認(rèn)情況下,uWSGI啟動一個單一的進(jìn)程和一個單一的線程)。

你可以用 --processes 選項添加更多的進(jìn)程,或者使用 --threads 選項添加更多的線程 (或者可以同時添加)。

uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2

這將會生成4個進(jìn)程 (每個進(jìn)程有2個線程),一個master進(jìn)程 (在Inc死掉的時候會生成它們) 和HTTP路由器 (見前面)。

一個重要的任務(wù)是監(jiān)控。在生產(chǎn)部署上,了解正在發(fā)生的事情是至關(guān)重要的。stats子系統(tǒng)允許你將uWSGI的內(nèi)部統(tǒng)計數(shù)據(jù)作為JSON導(dǎo)出:

uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

對你的應(yīng)用進(jìn)行幾次請求,然后telnet到端口9191,你會獲得大量有趣的信息。你可能想要使用”uwsgitop” (僅需 pip install 來安裝它),這是一個類似于top的工具,用來監(jiān)控實(shí)例。

將它放在一個完整的web服務(wù)器之后

即使uWSGI HTTP路由器是穩(wěn)定并且高性能的,但是你或許想要將你的應(yīng)用放在一個全功能的web服務(wù)器之后。

uWSGI原生支持HTTP, FastCGI, SCGI及其特定的名為”uwsgi”的協(xié)議 (是噠,錯誤的命名選擇)。最好的協(xié)議顯然是uwsgi,nginx和Cherokee已經(jīng)支持它了 (雖然有各種Apache模塊可用)

一個常用的nginx配置如下:

location / {
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:3031;
}

這表示“傳遞每一個請求給綁定到3031端口并使用uwsgi協(xié)議的服務(wù)器”。

現(xiàn)在,我們可以生成uWSGI來本地使用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 ,那么你會看到一個進(jìn)程。已經(jīng)移除了HTTP路由器,因為我們的“worker” (被分配給uWSGI的進(jìn)程) 本地使用uwsgi協(xié)議。

如果你的代理/web服務(wù)器/路由器使用HTTP,那么你必須告訴uWSGI本地使用http協(xié)議 (這與會自己生成一個代理的–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個進(jìn)程,每個進(jìn)程有2個線程)。

假設(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中,需要使用它來正確加載模塊。

哎呀!這是什么鬼?!是噠,你是對的,對的……處理這樣長的命令行并不實(shí)際,并且愚蠢而易于犯錯。不要害怕!uWSGI支持多種配置風(fēng)格。在這個入門中,我們會使用.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 選項來去除權(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。它們在去除權(quán)限之前創(chuàng)建,并且可以通過 =N 語法引用,其中, N 是socket號 (從0開始):

[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)用部署的一個常見問題是“卡住的請求”。你所有的線程/worker都卡住了 (請求阻塞) ,而你的應(yīng)用無法接收更多的請求。要避免這個問題,你可以設(shè)置一個 harakiri 定時器。它是一個監(jiān)控器 (由master進(jìn)程管理),會摧毀那些卡住超過指定秒數(shù)的進(jìn)程 (小心選擇 harakiri 值)。例如,你也許想要摧毀那些阻塞超過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

除此之外,自uWSGI 1.9起,stats服務(wù)器導(dǎo)出了全部請求變量,因此,你可以(實(shí)時)看到你的實(shí)例正在做什么 (對于每個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;
    }
}

注意訪問nginx端口,不是uwsgi端口 ?。。?/p>

更多關(guān)注:
http://www.mknight.cn/post/602/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容