设为首页 加入收藏

TOP

Flask程序部署--WSGI独立容器
2017-09-30 13:02:25 】 浏览:1321
Tags:Flask 程序 部署 --WSGI 独立 容器

有一些流行的服务器用Python编写的,包含WSGI应用程序并提供HTTP服务。这些服务器可以独立运行; 您可以从您的Web服务器代理它们。如果遇到问题,请翻阅代理安装程序的issues。

1.Gunicorn

Gunicorn--'Green Unicorn'是运行在UNIX下的WSGI HTTP服务器,这是从Ruby的独角兽项目(Unicorn Project)移植的pre-fork工作模式,它支持eventlet和greenlet,在此服务器上运行Flask应用程序非常简单:

gunicorn myproject:app

Gunicorn提供了许多命令行选项(可以使用gunicorn -h查看)。例如,要使用4个工作进程去Flask应用程序(-w 4)并绑定到本地主机端口4000(-b 127.0.0.1:4000):

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app

2.GEVENT

Gevent是一个基于协同程序的Python网络库,它使用greenlet在libev事件循环基础上提供的一个高级别的同步API:

from gevent.wsgi import WSGIServer
from yourapplication import app

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

3.Twisted Web

Twisted是一个成熟的非阻塞事件驱动的网络库,Twisted Web是Twisted提供的Web服务器。Twisted Web附带一个标准的WSGI容器,可以使用twistd实用程序从命令行控制:

twistd web --wsgi myproject.app

此示例将在myproject的文件夹内运行名为app的Flask应用程序。

Twisted Web支持许多标志和选项,而twistd实用程序也是如此; 有关详细信息,请参阅twistd -h和twistd web -h。例如,要在前台运行Twisted Web服务器,在端口8080上,应用程序来自myproject:

twistd -n web --port 8080 --wsgi myproject.app

4.代理设置

如果您想要在HTTP代理之后再使用其中一个服务器部署应用程序,则需要重写几个headers才能使应用程序正常工作。WSGI虚拟环境中两个有问题的值通常是REMOTE_ADDR和HTTP_HOST。您可以通过配置httpd来传递这些头文件,也可以在中间件中对他们进行修复。Werkzeug发布了一个可以解决一些常见设置的修复程序,但您可能希望为特定设置编写自己的WSGI中间件。

下面这是一个简单的nginx配置,它代理在端口8000上localhost上提供的应用程序,设置适当的头文件:

server {
    listen 80;

    server_name _;

    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        proxy_pass         http://127.0.0.1:8000/;
        proxy_redirect     off;

        proxy_set_header   Host                 $host;
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   X-Forwarded-For      $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto    $scheme;
    }
}

如果您的httpd没有提供这些头文件,最常见的设置将调用从X-Forwarded-Host设置的主机和X-Forwarded-For的远程地址:

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)

Trusting Headers
请记住,在非代理设置中使用这样的中间件是存在安全问题的,因为它将盲目信任可能被恶意客户端伪造的传入头文件。
如果要从另一个头文件重写头文件,可能需要使用如下的修补程序:

class CustomProxyFix(object):

    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        host = environ.get('HTTP_X_FHOST', '')
        if host:
            environ['HTTP_HOST'] = host
        return self.app(environ, start_response)

app.wsgi_app = CustomProxyFix(app.wsgi_app)
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Flask程序部署--WSGI独立容器 下一篇Hello PyQt5

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目