我有一个简单的 UWSGI 应用程序,它位于 LB 后面,具有以下 .ini 配置
[uwsgi]
socket=0.0.0.0:5071
chdir = src/
wsgi-file = uwsgi.py
processes=2
threads=1
protocol=http
plugins=python
exit-on-reload=false
master=true
# Cleanup of temp files
vacuum = true
当所有2x1
线程都忙时,应用程序继续服务通过对传入的连接进行排队,等待线程释放。
对我来说,这是一种不受欢迎的行为,因为我希望 UWSGI 返回 5xx 状态代码,这样我就不会过度饱和单个发行版的资源。
客户端测试代码
附加 UWSGI 应用程序的测试客户端代码
proxy = {
'http':'http://localhost:5071'
}
@threaded
def f():
print('Sending request')
response = requests.get('http://dummy.site',proxies=proxy)
print(str(response.status_code )+ response.text)
for i in range(5):
f()
测试 (1)
添加listen = 2
到.ini 并同时触发 3 个请求只会打印:
*** uWSGI listen queue of socket "0.0.0.0:5071" (fd: 3) full !!! (3/2) ***
而第三个连接似乎仍然以某种方式被接受,排队并随后执行,而不是5xx
引发错误。
测试(2)
添加listen = 0
到 .ini 并同时触发 5 个请求只会一次执行两个请求。完整队列输出不再显示。不知何故,当线程被释放时,请求仍然在某处排队并执行。
当所有线程都忙时,如何阻止传入到 UWSGI 应用程序的连接?
答案1
这是一个非常奇怪的要求,但如果你真的想这样做,你可以尝试减少监听队列(归零),即--listen 0
。我还没有测试过,也不知道零是否被视为有效值。这通常是增加因为网站的流量在增加,而不是减少。