nginx >= 1.5.7 (в более новых воспроизводится)
Собран с lua модулем (0.9.8) (ошибка воспроизводится и с более новыми версиями)
# ./sbin/nginx -V
nginx version: nginx/1.5.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
configure arguments: --add-module=../lua-nginx-module
Конфиг
user nginx;
worker_processes 1;
error_log /var/log/nginx/nginx-error.log error;
events {
use epoll;
}
http {
gzip on;
server {
listen 80;
root /usr/local/nginx/html;
location = /empty/ {
empty_gif;
}
location = /include/ {
content_by_lua '
ngx.location.capture("/empty/")
ngx.location.capture("/empty/")
';
}
location = /ssi.html {
ssi on;
}
}
}
Содержимое /usr/local/nginx/html/ssi.html
HEADER
<!--#include virtual="/include/" wait="yes" -->
При запросе http://localhost/ssi.html получаю пустой ответ (без заголовков и без тела)
И в логе
[alert] 20457#0: *1 the http output chain is empty, client: 127.0.0.1, server: , request: "GET /ssi.html HTTP/1.1", subrequest: "/include/"
То есть, если из ssi запроса делаем 2 lua подзапроса и при этом перед ssi запросом что-то выводится, и включен gzip модуль, то получаем пустой ответ.
Ошибка появилась с версии 1.5.7. Так как в src/http/modules/ngx_http_gzip_filter_module.c была добавлена проверка, что цепочка чайнов (chain) не NULL
- if (ctx->nomem) {
+ if (ctx->nomem || in == NULL) {
При этом при 2х луа подзапросах из луа модуля вызывается ngx_http_lua_flush_pending_output, которая вызывает
rc = ngx_http_lua_output_filter(r, NULL) как раз с пустой цепочкой чайнов. И вероятно из за этого и случается ошибка.
Помогите понять. Это проблема nginx или lua модуля? И как это можно пофиксить?
Зачем это условие в gzip фильтре?
Или вероятно из lua модуля должно вызваться ngx_http_send_special(r, flags); с флагом NGX_HTTP_FLUSH, которая вызовет фильтры с некоторым чайном?