首頁 > 軟體

Django+Nginx+uwsgi伺服器部署

2022-06-13 14:04:47

一、安裝 uwsgi

uWSGI是一個Web伺服器,它實現了WSGI協定、uwsgi、http等協定,旨在提供專業的 Python web應用釋出和開發。Nginx中HttpUwsgiModule的作用就是與uWSGI伺服器進行交換。WSGI是一種Web伺服器閘道器介面。它是一個Web伺服器(如nginx,uWSGI等伺服器)與web應用(如用Flask框架寫的程式)通訊的一種規範。

uwsgi:https://pypi.python.org/pypi/uWSGI

uwsgi 引數詳解:http://uwsgi-docs.readthedocs.org/en/latest/Options.html

1、通過 pip 命令:

pip install uwsgi

2、通過原始碼安裝

wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
tar zxvf uwsgi-latest.tar.gz
cd uwsgi-latest
make

安裝完成後,在當前目錄下,你會獲得一個 uwsgi 二進位制檔案。

3、測試 uwsgi 是否正常:

uwsgi --version    # 檢視 uwsgi 版本

1、第一個 WSGI 應用

讓我們從一個簡單的 "Hello World" 開始,新建 test.py 檔案,內容如下:

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

uWSGI Python 載入器將會搜尋的預設函數 application 。

接下來我們啟動 uWSGI 來執行一個 HTTP 伺服器,將程式部署在HTTP埠 8001上:

uwsgi --http :8001 --wsgi-file test.py

在瀏覽器內輸入:http://127.0.0.1:8001,檢視是否有"Hello World"輸出,若沒有輸出,請檢查你的安裝過程。

2、新增並行和監控

預設情況下,uWSGI 啟動一個單一的程序和一個單一的執行緒。

你可以用 --processes 選項新增更多的程序,或者使用 --threads 選項新增更多的執行緒 ,也可以兩者同時使用。

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

以上命令將會生成 4 個程序, 每個程序有 2 個執行緒。

如果你要執行監控任務,可以使用 stats 子系統,監控的資料格式是 JSON:

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

我們可以安裝 uwsgitop(類似 Linux top 命令) 來檢視監控資料:

pip install uwsgitop

3、uwsgi 設定

uwsgi支援ini、xml等多種設定方式,本文以 ini 為例, 在/etc/目錄下新建uwsgi9090.ini,新增如下設定:

[uwsgi]
socket = 127.0.0.1:9090
master = true         //主程序
vhost = true          //多站模式
no-site = true        //多站模式時不設定入口模組和檔案
workers = 2           //子程序數
reload-mercy = 10     
vacuum = true         //退出、重啟時清理檔案
max-requests = 1000   
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi9090.pid    //pid檔案,用於下面的指令碼啟動、停止該程序
daemonize = /website/uwsgi9090.log

二、安裝 Nginx

我們可以將 uWSGI 和 Nginx Web 伺服器結合使用,實現更高的並行效能。

安裝命令如下:

cd ~
wget http://nginx.org/download/nginx-1.5.6.tar.gz
tar xf nginx-1.5.6.tar.gz
cd nginx-1.5.6
./configure --prefix=/usr/local/nginx-1.5.6 
--with-http_stub_status_module 
--with-http_gzip_static_module
make && make install

你可以閱讀 Nginx 安裝設定 瞭解更多內容。

一個常用的nginx設定如下:

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

以上程式碼錶示使用 nginx 接收的 Web 請求傳遞給埠為 3031 的 uWSGI 服務來處理。

現在,我們可以生成 uWSGI 來本地使用 uwsgi 協定:

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

如果你的 Web 伺服器使用 HTTP,那麼你必須告訴 uWSGI 本地使用 http 協定 (這與會自己生成一個代理的–http不同):

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

Nginx 設定

找到nginx的安裝目錄(如:/usr/local/nginx/),開啟conf/nginx.conf檔案,修改server設定:

server {
        listen       80;
        server_name  localhost;
        
        location / {            
            include  uwsgi_params;
            uwsgi_pass  127.0.0.1:9090;              //必須和uwsgi中的設定一致
            uwsgi_param UWSGI_SCRIPT demosite.wsgi;  //入口檔案,即wsgi.py相對於專案根目錄的位置,「.」相當於一層目錄
            uwsgi_param UWSGI_CHDIR /demosite;       //專案根目錄
            index  index.html index.htm;
            client_max_body_size 35m;
        }
    }

你可以閱讀 Nginx 安裝設定 瞭解更多內容。

設定完成後,在終端執行:

uwsgi --ini /etc/uwsgi9090.ini &
/usr/local/nginx/sbin/nginx

在瀏覽器輸入:http://127.0.0.1,你就可以看到 django 的 "It work" 了。

三、部署 Django

Django 是最常使用的 Python web 框架,假設 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 用於指定專案路徑。

我們可以把以上的命令弄成一個 yourfile.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

接下來你只需要執行以下命令即可:

uwsgi yourfile.ini

四、部署 Flask

Flask 是一個流行的 Python web 框架。

建立檔案 myflaskapp.py ,程式碼如下:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "I am app 1"

執行以下命令:

uwsgi --socket 127.0.0.1:3031 --wsgi-file myflaskapp.py --callable app --processes 4 --threads 2 --stats 127.0.0.1:9191

到此這篇關於Django+Nginx+uwsgi伺服器部署的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com