跳到主要内容

proxy-buffering

proxy-buffering 插件动态禁用 NGINX proxy_buffering 指令。

在配置 API7 网关使用 Server-Sent Events (SSE) 上游服务,或响应分块数据(如 etcd 监视事件)的服务时,应禁用缓冲。

示例

使用 SSE 上游进行配置

以下示例演示了如何在具有 SSE 上游服务的路由上禁用 proxy_buffering

为 SSE 启动一个示例上游服务

docker run -d -p 8080:8080 jmalloc/echo-server

创建一个指向上游的路由并配置 proxy-buffering

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "proxy-buffering-route",
"uri": "/.sse",
"plugins": {
"proxy-buffering": {
"disable_proxy_buffering": true
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:8080": 1
}
}
}'

向路由发送请求:

curl "http://127.0.0.1:9080/.sse" -H "Accept: text/event-stream"

你应该会收到 HTTP/1.1 200 OK 响应,并看到类似于以下的连续事件流:

event: server
data: 162291b28f55
id: 1

event: request
data: GET /.sse HTTP/1.1
data:
data: Host: 127.0.0.1:9080
data: Accept: text/event-stream
data: User-Agent: curl/7.74.0
data: X-Forwarded-For: 172.19.0.1
data: X-Forwarded-Host: 127.0.0.1
data: X-Forwarded-Port: 9080
data: X-Forwarded-Proto: http
data: X-Real-Ip: 172.19.0.1
data:
id: 2

event: time
data: 2023-10-19T02:13:53Z
id: 3

event: time
data: 2023-10-19T02:13:54Z
id: 4

event: time
data: 2023-10-19T02:13:55Z
id: 5

...

(可选) 查看缓冲效果

在本节中,如果不关闭 proxy_buffering,你将看到代理缓冲对 SSE 的影响。为了演示,代理缓冲区大小将调整为较大的值。

将以下代码段添加到配置文件中:

config.yaml
nginx_config:
http_configuration_snippet: |
server {
listen 9080;

location /sse {
proxy_buffering on;
proxy_buffers 4 2m;
}
}

❶ 虽然显式配置,但 proxy_buffering 默认on

❷ 配置 proxy_buffers 使用 4 个缓冲区,每个缓冲区大小为 2 MB。

重新加载网关以使更改生效。

重新创建不带 proxy-buffering 的路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "proxy-buffering-route",
"uri": "/.sse",
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:8080": 1
}
}
}'

向路由发送请求:

curl "http://127.0.0.1:9080/.sse" -H "Accept: text/event-stream"

你应该会收到 HTTP/1.1 200 OK 响应并看到相同的事件流。但是,请注意,由于缓冲的影响,事件不会定期收到,这在处理 SSE 上游时是不希望出现的。