Используйте NGINX для замены тела из proxy_pass

Я новичок в openresty/nginx и я пытаюсь заменить тело, полученное в результате более раннего вызова proxy_pass, на следующий код:

body_filter_by_lua_block {
  ngx.arg[1] = '{"count"' .. ":2}'
  ngx.arg[2] = true
}

У меня изначально не было линии для ngx.arg[2] = true, но я получу обратно тело дважды (это означает, что тело, которое я заменяю, имеет 2 куска?). Я добавил в ngx.arg[2] = true строка и теперь вывод из запроса выглядит хорошо. Когда я разверну nginx файл, служба выглядит хорошо для нескольких запросов, то nginx запросы начинают зависать. Является ли правильная / лучшая практика для замены тела ответа? Что мне делать вместо этого?

1 ответ

Решение

В body_filter_by_lua_block:

ngx.arg[1] текущий кусок тела ответа.

ngx.arg[2] это флаг конца файла. Я часто вижу этот флаг установлен в отдельном body_filter_by_lua_block вызов, когда ngx.arg[1] является nil,

Вот почему вы видели свою строку дважды.

Флаг EOF выше имеет доступ на чтение / запись, поэтому, если вы установите его true это означает просто выбросить все оставшиеся данные чанка.

Изменение содержания тела работает для меня нормально, даже я провел некоторое тестирование производительности, никогда не видел зависаний при использовании этого.

PS: не забудьте включить header_filter_by_lua_block { ngx.header.content_length = nil } если вы измените тело.

Также могут быть некоторые хитрости со сжатым контентом.

Другие вопросы по тегам