• [转]使用gunicorn部署web.py应用


    原文地址:http://blog.csdn.net/raptor/article/details/8681357

    经常看到有人问python的web应用如何部署的问题。

    常见的方案是用apache的mod_wsgi,或者高端一点的用uWsgi。但是个人觉得这些都太复杂了,使用维护都不方便,我一般是推荐用gunicorn,配合Apache或Nginx,可以实现简单高效的应用部署和维护。

    为此特地写了这么个文档来介绍,并且本文提交pull request到web.py项目的cookbook,只是Aaron Swartz去世之后,web.py不知道是谁在维护,提交了一个月也没人处理,看了一下pull request列表,还有2年前的请求在挂着……

    所以我只好fork了一个,加上这个页面,未来我作的维护,都会更新在这个分支上。

    通过Gunicorn在Apache和Nginx下部署

    下面的代码基于Gunicorn 0.14.6在Debian 6.0.6和FreeBSD 9.0系统下测试。

    目前最新版本的Gunicorn在使用方法上没有区别。 其它Linux发行版、各种BSD、Mac OS X等系统应该也没问题。 但不推荐Windows系统,因为目测会多出很多不必要的困难。

    Note:

    • 你可以重命名 code.py为任何你自己愿意的名字,该例子还是以code.py为例。
    • /path-to/webpy-app 为包含你的 code.py代码的路径。
    • /path-to/webpy-app/code.py 应该是你的**python file**的完整路径。

    可以在命令行运行 gunicorn --version 查看当前gunicorn的版本。

    安装Gunicorn

    参见Gunicorn官网:

    http://gunicorn.org/#quickstart

    官 网的建议是用virtualenv方式安装,这是个好方法。这里不再介绍virtualenv(个人推荐用virtualenvwrapper), 以下以已安装好的virtualenv环境为例介绍,当然你也可以跳过virtualenv,直接全局安装(需要加上sudo)。

    pip install gunicorn
    

    用Gunicorn部署web.py应用

    Gunicorn是用于部署wsgi应用的,任何支持wsgi的应用都可以,不止是web.py。

    整个部署过程分为两个部分:

    • 用Gunicorn运行web.py/wsgi应用
    • 配置web server前端的反向代理

    用Gunicorn运行web.py应用

    前面已经说过,Gunicorn是用来部署wsgi应用的,所以首先要修改code.py,使之成为一个wsgi应用。

    #  ...
    app = web.application(urls, globals())
    #  在这里加入下面这句,即可
    application = app.wsgifunc()
    

    最简单的运行方式就是:

    gunicorn code:application
    

    其中code就是指code.py,application就是那个wsgifunc的名字。

    这样运行的话, gunicorn 默认作为一个监听 127.0.0.1:8000 的web server,可以在本机通过: http://127.0.0.1:8000 访问。

    如果要通过网络访问,则需要绑定不同的地址(也可以同时设置监听端口):

    gunicorn -b 192.168.0.123:8080 code:application

    在多核服务器上,为了支持更多的并发访问并充分利用资源,可以使用更多的 gunicorn 进程:

    gunicorn -w 8 code:application

    这样就可以启动8个进程同时处理HTTP请求,提高系统的使用效率及性能。

    另外, gunicorn 默认使用同步阻塞的网络模型(-k sync),对于大并发的访问可能表现不够好, 它还支持其它更好的模式,比如:gevent或meinheld。

    #  gevent
    gunicorn -k gevent code:application
    #  meinheld
    gunicorn -k egg:meinheld#gunicorn_worker code:application
    

    当然,要使用这两个东西需要另外安装,具体请参考各自的文档。

    以上设置还可以通过 -c 参数传入一个配置文件实现。

    配置Apapache的反向代理

    简单的反向代理配置如下(以在VirtualHost里为例):

        ProxyPass / http://127.0.0.1:8000/
        ProxyPassReverse / http://127.0.0.1:8000/
        ProxyPreserveHost On
        ProxyErrorOverride Off
    

    将对根路径的所有访问请求全部代理到 http://127.0.0.1:8000 的 gunicorn 服务上。

    配置Nginx的反向代理

    简单的反向代理配置如下(同样是以virtual host为例):

        location / {
            try_files $uri @test;
        }
    
        location @test {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass http://127.0.0.1:8000;
        } 
    

    将对根路径的所有访问请求全部代理到 http://127.0.0.1:8000 的 gunicorn 服务上。

    实际应用中可能需要设置更多的 proxy_set_header 变量,视应用需求而定。

  • 相关阅读:
    Java-23,final关键字
    Java-22,抽象类
    Java-21,多态的三个条件
    Java-20,object类之equals方法
    面试题
    平时碰到系统CPU飙高和频繁GC,你会怎么排查?
    django中的FBV和CBV
    flask + celery实现定时任务和异步
    python面试题大全
    Apollo配置中心介绍
  • 原文地址:https://www.cnblogs.com/catmelo/p/3060433.html
Copyright © 2020-2023  润新知