附加uWSGI到Mongrel2

Mongrel2 是下下一代的web服务器,关注于现代web应用。

就像uWSGI,它完全语言无关,集群友好,并且富有争议 :)

它使用令人惊奇的 ZeroMQ 库来通信,允许可靠容易的消息队列,以及免配置的可扩展性。

从版本0.9.8-dev起,uWSGI可以被用作Mongrel2处理器。

要求

要在uWSGI中启用对ZeroMQ/Mongrel2的支持,你需要zeromq库 library (2.1+)和uuid库。

Mongrel2可以使用JSON或者tnetstring来将数据 (例如头部和各种其他信息) 传递给处理器。uWSGI默认支持tnetstring,但需要 Jansson 库来解析JSON数据。如果你没安装jansson,或者不想使用JSON,那么确保你在Mongrel2中的Handler部分指定了 protocol='tnetstring' ,因为默认是使用JSON的。这会导致uWSGI日志中一条相当模糊的“JSON支持未启用。跳过请求”。

配置Mongrel2

find你可以发现uWSGI源代码配备了 mongrel2-uwsgi.conf 。你可以以这个文件为基础来配置Mongrel2。

main = Server(
    uuid="f400bf85-4538-4f7a-8908-67e313d515c2",
    access_log="/logs/access.log",
    error_log="/logs/error.log",
    chroot="./",
    default_host="192.168.173.11",
    name="test",
    pid_file="/run/mongrel2.pid",
    port=6767,
    hosts = [
        Host(name="192.168.173.11", routes={
            '/': Handler(send_spec='tcp://192.168.173.11:9999',
                    send_ident='54c6755b-9628-40a4-9a2d-cc82a816345e',
                    recv_spec='tcp://192.168.173.11:9998', recv_ident='',
                    protocol='tnetstring')
        })
    ]
)

settings = {'upload.temp_store':'tmp/mongrel2.upload.XXXXXX'}
servers = [main]

这是一个相当标准的Mongrel2配置,启动了上传流。

为Mongrel2配置uWSGI

要将uWSGI附加到Mongrel2,只需简单实用 OptionZeromq 选项:

uwsgi --zeromq tcp://192.168.173.11:9999,tcp://192.168.173.11:9998

你可以生成多个进程 (每个都会订阅到Mongrel2,并使用一个不同的uuid)

uwsgi --zeromq tcp://192.168.173.11:9999,tcp://192.168.173.11:9998 -p 4

你也可以使用线程。每个线程将订阅Mongrel2队列,但是响应者socket将会由所有线程共享,并由互斥锁包含。

uwsgi --zeromq tcp://192.168.173.11:9999,tcp://192.168.173.11:9998 -p 4 --threads 8
# This will spawn 4 processes with 8 threads each, totaling 32 threads.

一起测试

添加一个应用到uWSGI (一如既往,我们将使用werkzeug.testapp)

uwsgi --zeromq tcp://192.168.173.11:9999,tcp://192.168.173.11:9998 -p 4 --threads 8 --module werkzeug.testapp:test_app

现在,在所有你想要的服务器上启动命令,Mongrel2将会自动分发请求给它们。

异步模式

警告

对ZeroMQ的异步支持仍然在开发中,因为ZeroMQ使用边沿触发事件,这些事件会复杂化uWSGI异步架构中的东东。

Chroot

默认情况下,Mongrel2会 chroot() 。这对于安全是件好事,但是对于文上传流会让人头疼。记住,Mongrel2将会在它自己的chroot jail中上传文件,因此,如果你的uWSGI实例并不处于同一个chroot jail中,那么你将必须小心选择路径。在这个例子中,我们的Mongrel2配置文件使用了一个相对路径来轻松让uWSGI访问文件。

性能

Mongrel2即使是在巨大负载的情况下也是非常快且可靠的。tnetstring和JSON是基于文本的 (因此,它们比二进制 uwsgi protocol 稍微低效率点。然而,因为Mongrel2不需要昂贵的一请求一连接方法,因此与(例如) Nginx + uWSGI 方法相比,你应该会得到几乎相同的(如果不是更高的)的结果。

uWSGI集群 + ZeroMQ

你可以轻松地将uWSGI clustering 和ZeroMQ混在一起。

选择主节点,然后运行

uwsgi --zeromq tcp://192.168.173.11:9999,tcp://192.168.173.11:9998 -p 4 --threads 8 --module werkzeug.testapp:test_app --cluster 225.1.1.1:1717

然后在所有其他节点上,简单运行

uwsgi --cluster 225.1.1.1:1717

用ZeroMQ混合标准socket

除了ZeroMQ,你还可以添加uwsgi/HTTP/FastCGI/... socket到你的uWSGI服务器中,但如果你这样做,记得禁用线程!这个限制未来可能会被修复。

通过ZeroMQ进行日志记录

参见

ZeroMQLogging