• flask+gevent+gunicorn+nginx 初试


    1.安装flask

    pip install flask

    2.安装gevent

    pip install gevent

    3.安装gunicorn

    pip install gunicorn

    版本信息例如以下:

    [root@rs-2 ~]# pip list

    Flask (0.10.1)

    gevent (1.0.1)

    greenlet (0.4.2)

    gunicorn (18.0)

    pip (1.5.5)

    setuptools (3.6)


    4.安装nginx

    下载源代码包安装,版本号信息例如以下

    [root@rs-2 sbin]# ./nginx -v

    nginx version: nginx/1.7.0


    5.nginx配置反向代理

            listen       80;

            server_name  localhost;


            #charset koi8-r;


            #access_log  logs/host.access.log  main;


            location / {

                try_files @uri @pp;

            }


            location @pp {

                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                proxy_set_header Host $http_host;

                proxy_pass http://127.0.0.1:5000;

            }


    全部请求转发到gunicorn监听的5000上。

    6.gunicorn配置

    [root@rs-2 pythonTest]# cat gun.conf 

    import os

    bind='127.0.0.1:5000'

    workers=4

    backlog=2048

    worker_class="gevent" #sync, gevent,meinheld

    debug=True

    proc_name='gunicorn.pid'

    pidfile='/var/log/gunicorn/debug.log'

    loglevel='debug'

    [root@rs-2 pythonTest]# 


    7.測试脚本编写

    [root@rs-2 pythonTest]# cat run_test.py 

    from flask import Flask
    from flask import render_template_string
    
    import os
    
    from werkzeug.contrib.fixers import ProxyFix
    
    app = Flask(__name__)
    
    @app.route("/")
    def index():  
        return "Hello World"
    
    
    app.wsgi_app = ProxyFix(app.wsgi_app)
    if __name__ == "__main__":
        app.run()


    8.启动脚本

    [root@rs-2 pythonTest]# gunicorn -c gun.conf  run_test:app


    看到例如以下部分输入

    2014-05-12 10:29:41 [30260] [INFO] Listening at: http://127.0.0.1:5000 (30260)

    2014-05-12 10:29:41 [30260] [INFO] Using worker: gevent

    2014-05-12 10:29:41 [30265] [INFO] Booting worker with pid: 30265

    2014-05-12 10:29:41 [30266] [INFO] Booting worker with pid: 30266

    2014-05-12 10:29:41 [30267] [INFO] Booting worker with pid: 30267

    2014-05-12 10:29:41 [30268] [INFO] Booting worker with pid: 30268


    监听本机的5000port,

    工作模式为gevent,

    开启4个进程

    9.压力測试

    在还有一台虚拟上进行用ab模拟并发请求

    报错:apr_socket_recv: No route to host (113)

    [root@rs-1 ~]# time ab -n 200 -c 200 http://172.16.3.92/

    This is ApacheBench, Version 2.3 <$Revision: 1554214 $>

    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

    Licensed to The Apache Software Foundation, http://www.apache.org/


    Benchmarking 172.16.3.92 (be patient)

    apr_socket_recv: No route to host (113)


    real 0m0.078s

    user 0m0.021s

    sys 0m0.046s


    解决方法:关闭目标server的防火墙

    [root@rs-2 pythonTest]# service iptables stop

    Flushing firewall rules:                                   [  OK ]

    Setting chains to policy ACCEPT: filter                    [  OK ]

    Unloading iptables modules:                                [  OK ]


    ok, 这下能够压力測试了

    [root@rs-1 ~]# time ab -n 2000 -c 200 http://172.16.3.92/ 

    This is ApacheBench, Version 2.3 <$Revision: 1554214 $>

    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

    Licensed to The Apache Software Foundation, http://www.apache.org/


    Benchmarking 172.16.3.92 (be patient)

    Completed 200 requests

    Completed 400 requests

    Completed 600 requests

    Completed 800 requests

    Completed 1000 requests

    Completed 1200 requests

    Completed 1400 requests

    Completed 1600 requests

    Completed 1800 requests

    Completed 2000 requests

    Finished 2000 requests



    Server Software:        nginx/1.7.0

    Server Hostname:        172.16.3.92

    Server Port:            80


    Document Path:          /

    Document Length:        11 bytes


    Concurrency Level:      200

    Time taken for tests:   16.273 seconds

    Complete requests:      2000

    Failed requests:        0

    Total transferred:      334000 bytes

    HTML transferred:       22000 bytes

    Requests per second:    122.90 [#/sec] (mean)

    Time per request:       1627.313 [ms] (mean)

    Time per request:       8.137 [ms] (mean, across all concurrent requests)

    Transfer rate:          20.04 [Kbytes/sec] received


    Connection Times (ms)

                  min  mean[+/-sd] median   max

    Connect:        0   40 486.7      1    8992

    Processing:   276 1032 250.5   1028    6300

    Waiting:      273 1032 250.5   1027    6300

    Total:        283 1072 618.1   1029   15292


    Percentage of the requests served within a certain time (ms)

      50%   1029

      66%   1055

      75%   1074

      80%   1096

      90%   1210

      95%   1245

      98%   1361

      99%   2416

     100%  15292 (longest request)


    real 0m16.316s

    user 0m0.598s

    sys 0m1.447s


  • 相关阅读:
    spring之为java.util.Properties类型的属性进行赋值
    spring之为级联集合属性进行赋值
    spring之级联属性赋值的两种方式
    打造最佳开发团队的几点建议
    软件开发中的11个系统思维定律
    走向“持续部署”
    关于“兴趣爱好”之我见
    技术人员应真正学会的第二课程
    Java语言的动态性支持
    Java深度历险(九)——Java安全
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4020179.html
Copyright © 2020-2023  润新知