W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
有用 Python 編寫(xiě)的流行服務(wù)器來(lái)容納 WSGI 應(yīng)用并提供 HTTP 服務(wù)。這些服務(wù)器在運(yùn)行 時(shí)是獨(dú)立的:你可以從你的 web 服務(wù)器設(shè)置到它的代理。如果你遇見(jiàn)問(wèn)題,請(qǐng)注意 代理設(shè)置 一節(jié)的內(nèi)容。
Gunicorn ‘Green Unicorn’ 是一個(gè)給 UNIX 用的 WSGI HTTP 服務(wù)器。這是一個(gè)從 Ruby 的 Unicorn 項(xiàng)目移植的 pre-fork worker 模式。它既支持 eventlet ,也 支持 greenlet 。在這個(gè)服務(wù)器上運(yùn)行 Flask 應(yīng)用是相當(dāng)簡(jiǎn)單的:
gunicorn myproject:app
Gunicorn 提供了許多命令行選項(xiàng) —— 見(jiàn) gunicorn -h 。 例如,用四個(gè) worker 進(jìn)程( gunicorn -h )來(lái)運(yùn)行一個(gè) Flask 應(yīng)用,綁定 到 localhost 的4000 端口( -b 127.0.0.1:4000 ):
gunicorn -w 4 -b 127.0.0.1:4000 myproject:app
Tornado 是一個(gè)開(kāi)源的可伸縮的、非阻塞式的 web 服務(wù)器和工具集,它驅(qū)動(dòng)了 FriendFeed 。因?yàn)樗褂昧?epoll 模型且是非阻塞的,它可以處理數(shù)以千計(jì) 的并發(fā)固定連接,這意味著它對(duì)實(shí)時(shí) web 服務(wù)是理想的。把 Flask 集成這個(gè)服務(wù) 是直截了當(dāng)?shù)?
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from yourapplication import app
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()
Gevent 是一個(gè)基于協(xié)同程序的 Python 網(wǎng)絡(luò)庫(kù),使用 greenlet 來(lái)在 libevent 的事件循環(huán)上提供高層的同步 API
from gevent.wsgi import WSGIServer
from yourapplication import app
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()
如果你在一個(gè) HTTP 代理后把你的應(yīng)用部署到這些服務(wù)器中的之一,你需要重寫(xiě)一些標(biāo)頭 來(lái)讓?xiě)?yīng)用正常工作。在 WSGI 環(huán)境中兩個(gè)有問(wèn)題的值通常是 REMOTE_ADDR 和 HTTP_HOST 。你可以配置你的 httpd 來(lái)傳遞這些標(biāo)頭,或者在中間件中手動(dòng)修正。 Werkzeug 帶有一個(gè)修正工具來(lái)解決常見(jiàn)的配置,但是你可能想要為特定的安裝自己寫(xiě) WSGI 中間件。
這是一個(gè)簡(jiǎn)單的 nginx 配置,它監(jiān)聽(tīng) localhost 的 8000 端口,并提供到一個(gè)應(yīng)用的 代理,設(shè)置了合適的標(biāo)頭:
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;
}
}
如果你的 httpd 不提供這些標(biāo)頭,最常見(jiàn)的配置引用從 X-Forwarded-Host 設(shè)置的主機(jī) 名和從 X-Forwarded-For 設(shè)置的遠(yuǎn)程地址:
from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
信任標(biāo)頭
請(qǐng)記住在一個(gè)非代理配置中使用這樣一個(gè)中間件會(huì)是一個(gè)安全問(wèn)題,因?yàn)樗つ康匦湃?一個(gè)可能由惡意客戶端偽造的標(biāo)頭。
如果你想從另一個(gè)標(biāo)頭重寫(xiě)標(biāo)頭,你可能會(huì)使用這樣的一個(gè)修正程序:
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)
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: