第一个请求不终止(无 FIN)uWSGI + nginx
First request doesnt terminate (no FIN) uWSGI + nginx
我在 uWSGI 服务器(烧瓶应用程序)前使用 nginx 作为反向代理。
由于内存泄漏,使用 --max-requests
在多次调用后重新加载 worker。
问题如下:当工作人员刚刚 restarted/started 时,它收到的第一个请求在 uWSGI 和 NGINX 之间保持挂起状态,flask 应用程序内部的处理时间通常非常快,但客户端等待直到 uwsgi_send_timeout
被触发。
使用tcpdump查看请求(nginx是XXX.14,uWSGI是XXX.11):
你可以在时间列中看到它挂起 300 秒 (uwsgi_send_timeout) 尽管 HTTP 请求已经被 NGINX 接收到...uWSGI 只是不发送 [FIN] 数据包来发出信号连接已关闭。然后 NGINX 触发超时并关闭会话。
最终客户端收到截断的响应。带有 200 状态代码。这非常令人沮丧。
每次重新加载 worker 时都会发生这种情况,只有一次,无论请求有多大,都是第一个请求。
有人有解决此问题的方法吗?我配置错误了吗?
uwsgi.ini
[uwsgi]
# Get the location of the app
module = api:app
plugin = python3
socket = :8000
manage-script-name = true
mount = /=api:app
cache2 = name=xxx,items=1024
# Had to increase buffer-size because of big authentication requests.
buffer-size = 8192
## Workers management
# Number of workers
processes = $(UWSGI_PROCESSES)
master = true
# Number of requests managed by 1 worker before reloading (reload is time expensive)
max-requests = $(UWSGI_MAX_REQUESTS)
lazy-apps = true
single-interpreter = true
nginx-server.conf
server {
listen 443 ssl http2;
client_max_body_size 50M;
location @api {
include uwsgi_params;
uwsgi_pass api:8000;
uwsgi_read_timeout 300;
uwsgi_send_timeout 300;
}
由于一些奇怪的原因,在 nginx 配置中添加参数 uwsgi_buffering off;
解决了这个问题。
我仍然不明白为什么,但现在这解决了我的问题。如果有人有合理的解释,请不要犹豫。
server {
listen 443 ssl http2;
client_max_body_size 50M;
location @api {
include uwsgi_params;
uwsgi_pass api:8000;
uwsgi_buffering off;
uwsgi_read_timeout 300;
uwsgi_send_timeout 300;
}
我在 uWSGI 服务器(烧瓶应用程序)前使用 nginx 作为反向代理。
由于内存泄漏,使用 --max-requests
在多次调用后重新加载 worker。
问题如下:当工作人员刚刚 restarted/started 时,它收到的第一个请求在 uWSGI 和 NGINX 之间保持挂起状态,flask 应用程序内部的处理时间通常非常快,但客户端等待直到 uwsgi_send_timeout
被触发。
使用tcpdump查看请求(nginx是XXX.14,uWSGI是XXX.11):
你可以在时间列中看到它挂起 300 秒 (uwsgi_send_timeout) 尽管 HTTP 请求已经被 NGINX 接收到...uWSGI 只是不发送 [FIN] 数据包来发出信号连接已关闭。然后 NGINX 触发超时并关闭会话。
最终客户端收到截断的响应。带有 200 状态代码。这非常令人沮丧。
每次重新加载 worker 时都会发生这种情况,只有一次,无论请求有多大,都是第一个请求。
有人有解决此问题的方法吗?我配置错误了吗?
uwsgi.ini
[uwsgi]
# Get the location of the app
module = api:app
plugin = python3
socket = :8000
manage-script-name = true
mount = /=api:app
cache2 = name=xxx,items=1024
# Had to increase buffer-size because of big authentication requests.
buffer-size = 8192
## Workers management
# Number of workers
processes = $(UWSGI_PROCESSES)
master = true
# Number of requests managed by 1 worker before reloading (reload is time expensive)
max-requests = $(UWSGI_MAX_REQUESTS)
lazy-apps = true
single-interpreter = true
nginx-server.conf
server {
listen 443 ssl http2;
client_max_body_size 50M;
location @api {
include uwsgi_params;
uwsgi_pass api:8000;
uwsgi_read_timeout 300;
uwsgi_send_timeout 300;
}
由于一些奇怪的原因,在 nginx 配置中添加参数 uwsgi_buffering off;
解决了这个问题。
我仍然不明白为什么,但现在这解决了我的问题。如果有人有合理的解释,请不要犹豫。
server {
listen 443 ssl http2;
client_max_body_size 50M;
location @api {
include uwsgi_params;
uwsgi_pass api:8000;
uwsgi_buffering off;
uwsgi_read_timeout 300;
uwsgi_send_timeout 300;
}