django 的 uwsgi+Nginx 部署配置

Python 安装 uWSGI

1、通过 pip 命令:

pip install uwsgi

2、下载安装脚本:

curl http://uwsgi.it/install | bash -s default /tmp/uwsgi

将 uWSGI 二进制安装到 /tmp/uwsgi ,你可以修改它。

3、源代码安装:

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

安装完成后,在当前目录下,你会获得一个 uwsgi 二进制文件。


第一个 WSGI 应用

让我们从一个简单的 "Hello World" 开始,创建文件 foobar.py,代码如下:

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

uWSGI Python 加载器将会搜索的默认函数 application 。

接下来我们启动 uWSGI 便可以运行一个 HTTP 服务器,将程序部署在HTTP端口 9090 上

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

在浏览器内输入:http://127.0.0.1:9090,查看是否有"Hello World"输出,若没有输出,请检查你的安装过程。

添加并发和监控

默认情况下,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

然后输入:uwsgitop http://127.0.0.1:9191

或者通过如下命令启动uWSGI:

uwsgi --http :9090 --wsgi-file hello.py --master --processes 4 --threads 2 --stats /tmp/stats.socket

然后输入:uwsgitop /tmp/stats.socket

都可以获得下面这样的实时监视状态:

其中每个字段的介绍如下:

Field

Description

WID

Worker ID

%

Worker usage

PID

Worker PID

REQ

Worker从最近一次启动算起执行的请求次数

RPS

每秒请求次数

EXC

异常次数

SIG

被管理的uWSGI信号

STATUS

Worker是忙碌状态还是空闲状态

AVG

平均请求时间

RSS

Worker RSS(Resident Set Size,参阅linux内存管理)

VSZ

Worker VSZ(Virtual Memory Size,参阅linux内存管理)

TX

worker传输了多少数据

ReSpwn

重启次数(Respawn count)

HC

Harakiri 次数(Harakiri是可以设置一个请求超过多少秒后会被中断)

RunT

Worker运行了多长时间

LastSpwn

最后一次启动时间


结合  Nginx Web 服务器使用

你可以阅读 Nginx 安装配置 了解更多内容。

 

我们可以将 uWSGI 和 Nginx Web 服务器结合使用,实现更高的并发性能。

一个常用的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


如上,在浏览器内输入:http://127.0.0.1:9191查看是否有"Hello World"输出,若没有输出,请检查你的安装过程。

 

WSGI 部署 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

uwsgi 配置+Nginx配置

uwsgi支持ini、xml等多种配置方式,本文以 ini 为例, 在/etc/目录下新建uwsgi9090.ini,添加如下配置:

[uwsgi]
socket = 127.0.0.1:9090 //传递给为 3031 的 uWSGI 服务来处理
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的安装目录(如:/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" 了。

然后输入:uwsgitop http://127.0.0.1:9191

或者通过如下命令启动uWSGI:

uwsgi --http :9090 --wsgi-file hello.py --master --processes 4 --threads 2 --stats /tmp/stats.socket

然后输入:uwsgitop /tmp/stats.socket

都可以获得下面这样的实时监视状态:

其中每个字段的介绍如下:

Field

Description

WID

Worker ID

%

Worker usage

PID

Worker PID

REQ

Worker从最近一次启动算起执行的请求次数

RPS

每秒请求次数

EXC

异常次数

SIG

被管理的uWSGI信号

STATUS

Worker是忙碌状态还是空闲状态

AVG

平均请求时间

RSS

Worker RSS(Resident Set Size,参阅linux内存管理)

VSZ

Worker VSZ(Virtual Memory Size,参阅linux内存管理)

TX

worker传输了多少数据

ReSpwn

重启次数(Respawn count)

HC

Harakiri 次数(Harakiri是可以设置一个请求超过多少秒后会被中断)

RunT

Worker运行了多长时间

LastSpwn

最后一次启动时间

posted @ 2020-11-12 10:52  yoyo008  阅读(271)  评论(0编辑  收藏  举报