我正在使用Python开发基于HTTP服务器的游戏。计划是尽可能减少依赖关系,所以我希望它能够在不安装独立的Web服务器(如Apache,Lighttpd或nginx)的情况下工作。问题是,它不起作用。
我尝试了以下版本:
当处于重负荷(siege -b -c 100 -t 30s
)时,它们都会部分失败,无论是
[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer
或
[error] socket: -1313092800 address is unavailable.: Cannot assign requested address
部分地我的意思是:有些请求被提供,有些则没有。
另一方面,当我尝试使用Lighttpd + Flask(即WSGI)甚至Lighttpd + PHP(仅作为控制案例)时,它的工作原理非常好。可用性100%,并发100%。
由于后面的工作版本,我认为问题不是siege
,或运行siege
和同一台机器上的服务器,或者机器本身(顺便说一下Ubuntu 12.04)。 / p>
注意:在所有情况下,我都测试了简单的“hello world”服务器,以尽量减少错误的可能性。
所以我的两个问题:
答案 0 :(得分:2)
所以我的两个问题: 为什么Python Web服务器不稳定? (究竟是什么原因,而不是解决方案?)
这里的问题是 unstable 这个词。 您已达到服务器进程的实现限制。这并不一定意味着它不稳定。 这就像把你的车推到极限。当没有更多的速度你可以获得你会说你的车不稳定吗?
这是“找到合适工作的好工具”的典型问题。 一件事是应用程序服务器,另一件事是服务大量请求和处理连接池。后者是由(web)服务器处理的任务,如nginx,lighttpd,apache,uwsgi,它们是为处理并发和路由而构建的。
详细地说,您尝试的服务器是为处理最大量的请求而构建的。达到该限制后,他们会断开连接。它们不是为了以后对连接进行排队而构建的。
如果您从未尝试过,请查看Tornado,这对游戏服务器有用。
使用独立的webserver + Python是唯一/最佳解决方案(如果我坚持使用Python),还是我错过了什么?
是。这是最好的解决方案,而不仅仅是Python。这是一种常见的设计模式。即使在Ruby,PHP,Java中也会看到相同的方法。 最常见的任务是跨应用程序服务器群集分配负载。
典型的环境是:
USER -> BALANCER (nginx,apache,ecc) -> APPSERVER (uwsgi, twisted, gunicorn, ..) -> WSGI Application