### 导航
- [索引](# "总目录")
- [下一页](# "uWSGI") |
- [上一页](# "mod_wsgi (Apache)") |
- [Flask 0.10.1 文档](#) »
- [部署选择](#) »
# 独立 WSGI 容器
有用 Python 编写的流行服务器来容纳 WSGI 应用并提供 HTTP 服务。这些服务器在运行时是独立的:你可以从你的 web 服务器设置到它的代理。如果你遇见问题,请注意[*代理设置*](#) 一节的内容。
### Gunicorn
[Gunicorn](http://gunicorn.org/) [http://gunicorn.org/] ‘Green Unicorn' 是一个给 UNIX 用的 WSGI HTTP 服务器。这是一个从Ruby 的 Unicorn 项目移植的 pre-fork worker 模式。它既支持 [eventlet](http://eventlet.net/) [http://eventlet.net/] ,也支持 [greenlet](http://codespeak.net/py/0.9.2/greenlet.html) [http://codespeak.net/py/0.9.2/greenlet.html] 。在这个服务器上运行 Flask 应用是相当简单的:
~~~
gunicorn myproject:app
~~~
[Gunicorn](http://gunicorn.org/) [http://gunicorn.org/] 提供了许多命令行选项 —— 见 gunicorn-h 。例如,用四个 worker 进程( gunicorn-h )来运行一个 Flask 应用,绑定到 localhost 的4000 端口( -b127.0.0.1:4000 ):
~~~
gunicorn -w 4 -b 127.0.0.1:4000 myproject:app
~~~
### Tornado
[Tornado](http://www.tornadoweb.org/) [http://www.tornadoweb.org/] 是一个开源的可伸缩的、非阻塞式的 web 服务器和工具集,它驱动了[FriendFeed](http://friendfeed.com/) [http://friendfeed.com/] 。因为它使用了 epoll 模型且是非阻塞的,它可以处理数以千计的并发固定连接,这意味着它对实时 web 服务是理想的。把 Flask 集成这个服务是直截了当的:
~~~
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
[Gevent](http://www.gevent.org/) [http://www.gevent.org/] 是一个基于协同程序的 Python 网络库,使用 [greenlet](http://codespeak.net/py/0.9.2/greenlet.html) [http://codespeak.net/py/0.9.2/greenlet.html] 来在[libevent](http://monkey.org/~provos/libevent/) [http://monkey.org/~provos/libevent/] 的事件循环上提供高层的同步 API
~~~
from gevent.wsgi import WSGIServer
from yourapplication import app
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()
~~~
### 代理设置
如果你在一个 HTTP 代理后把你的应用部署到这些服务器中的之一,你需要重写一些标头来让应用正常工作。在 WSGI 环境中两个有问题的值通常是 REMOTE_ADDR 和HTTP_HOST 。你可以配置你的 httpd 来传递这些标头,或者在中间件中手动修正。Werkzeug 带有一个修正工具来解决常见的配置,但是你可能想要为特定的安装自己写WSGI 中间件。
这是一个简单的 nginx 配置,它监听 localhost 的 8000 端口,并提供到一个应用的代理,设置了合适的标头:
~~~
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 不提供这些标头,最常见的配置引用从 X-Forwarded-Host 设置的主机名和从 X-Forwarded-For 设置的远程地址:
~~~
from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
~~~
信任标头
请记住在一个非代理配置中使用这样一个中间件会是一个安全问题,因为它盲目地信任一个可能由恶意客户端伪造的标头。
如果你想从另一个标头重写标头,你可能会使用这样的一个修正程序:
~~~
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)
~~~
© 版权所有 2013, Armin Ronacher.
- 欢迎使用 Flask
- 前言
- 给有经验程序员的前言
- 安装
- 快速入门
- 教程
- 介绍 Flaskr
- 步骤 0: 创建文件夹
- 步骤 1: 数据库模式
- 步骤 2: 应用设置代码
- 步骤 3: 创建数据库
- 步骤 4: 请求数据库连接
- 步骤 5: 视图函数
- 步骤 6: 模板
- 步骤 7: 添加样式
- 福利: 应用测试
- 模板
- 测试 Flask 应用
- 记录应用错误
- 配置处理
- 信号
- 即插视图
- 应用上下文
- 请求上下文
- 用蓝图实现模块化的应用
- Flask 扩展
- 与 Shell 共舞
- Flask 代码模式
- 大型应用
- 应用程序的工厂函数
- 应用调度
- 使用 URL 处理器
- 部署和分发
- 使用 Fabric 部署
- 在 Flask 中使用 SQLite 3
- 在 Flask 中使用 SQLAlchemy
- 上传文件
- 缓存
- 视图装饰器
- 使用 WTForms 进行表单验证
- 模板继承
- 消息闪现
- 用 jQuery 实现 Ajax
- 自定义错误页面
- 延迟加载视图
- 在 Flask 中使用 MongoKit
- 添加 Favicon
- 数据流
- 延迟请求回调
- 添加 HTTP Method Overrides
- 请求内容校验码
- 基于 Celery 的后台任务
- 部署选择
- mod_wsgi (Apache)
- 独立 WSGI 容器
- uWSGI
- FastCGI
- CGI
- 聚沙成塔
- API
- JSON 支持
- Flask 中的设计决策
- HTML/XHTML 常见问题
- 安全注意事项
- Flask 中的 Unicode
- Flask 扩展开发
- Pocoo 风格指引
- Python 3 支持
- 升级到最新版本
- Flask Changelog
- 许可证
- 术语表