Flask程序部署--WSGI獨立容器

有一些流行的服務器用Python編寫的,包含WSGI應用程序並提供HTTP服務。這些服務器能夠獨立運行; 您能夠從您的Web服務器代理它們。若是遇到問題,請翻閱代理安裝程序的issues。python

1.Gunicorn

Gunicorn--'Green Unicorn'是運行在UNIX下的WSGI HTTP服務器,這是從Ruby的獨角獸項目(Unicorn Project)移植的pre-fork工做模式,它支持eventlet和greenlet,在此服務器上運行Flask應用程序很是簡單:nginx

gunicorn myproject:app

Gunicorn提供了許多命令行選項(能夠使用gunicorn -h查看)。例如,要使用4個工做進程去Flask應用程序(-w 4)並綁定到本地主機端口4000(-b 127.0.0.1:4000):web

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:app

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的遠程地址:code

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)
相關文章
相關標籤/搜索