我发现了问题。原来我的应用程序代码很好,问题出在Waitress和nginx上:
Pyramid使用的默认Web服务器Waitress以18000字节的块缓冲所有输出(有关详细信息,请参阅此问题)。
问题的根源是我放在Pyramid应用程序前面的Web服务器nginx对我隐藏的,该服务器 还 缓冲响应。
(1)可以通过以下任一方法解决:
send_bytes = 1
在.ini文件中配置的女服务员。这种修复的流问题,但让你的整个应用 超 慢。正如@Zitrax所提到的,您可以使用较高的值恢复某些速度,但是任何大于1的值都有可能使消息卡在缓冲区中。切换到Gunicorn。我不知道gunicorn是否仅使用较小的缓冲区,或者使用时,它的性能是否更好
app_iter
,但是它可以正常工作,并保持我的应用程序快速运行。
(2)可以通过配置nginx禁用流路由缓冲来解决。
您需要
proxy_buffering off在nginx
conf中进行设置。此设置适用于通过托管的网站
proxy_pass。如果您不使用
proxy_pass,则可能需要其他设置。
您可以将nginx配置为基于请求标头为每个响应动态启用/禁用缓冲,如本主题中的问题所示(EventSource / Server-Sent Events的良好解决方案)
您也可以
location
在nginx conf中的一个块中配置它。如果您使用的是EventSource以外的东西,并且不希望收到特定的标头,或者如果您使用的是EventSource,但想从普通的浏览器选项卡中调试响应,而无法发送Accept
标头,则这样做很好根据您的要求。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)