Как с помощью nginx отдать заглушку картинки и вызвать lua скрипт?

То есть, сделать проксирование картинок с таким алгоритмом действий:
1. Запрос картинки
2. Nginx проверяет существует ли запрашиваемая картинка на сервере
3. Если да - отдаём её,
4. Если нет, то отдаём заглушку-картинку с кешированием, допустим, в 10 минут и вызываем lua скрипт, который скачивает картинку с определённого сайта, колдует над ней и складывает в директорию, чтобы через 10 минут отдать уже её.

Пока пытаюсь просто добиться хотя бы того, чтобы отдавалась заглушка и вызывался луа скрипт, как то так:

Конфиг nginx
......
       location / {
                # Проверим есть ли файл и если да - отдадим его
                # если нет, вызовем @lua_call
                try_files $uri @lua_call;
        }

        location @lua_call {
            #rewrite ^ /default.jpg;  - если убрать коммент не будет вызова луа-скрипта ниже
            rewrite_by_lua_file /var/www/site/www/images/hello.lua;
            # Отключим кэширование кода для разработки
            lua_code_cache off;
        }


Скрипт hello.lua работает, но смущается то, что выдача заглушки идёт в конце скрипта, после "хардкора"

hello.lua (пока просто создадим текстовый файл, дабы убедиться что скрипт вызывается)
local file = io.open("/var/www/site/www/images/test.txt", "w");
file:write("Hello World");
file:close();
return ngx.exec('/default.jpg');
  • Вопрос задан
  • 415 просмотров
Решения вопроса 1
JetMaster
@JetMaster Автор вопроса
оказалось всё просто

location @lua_call {
rewrite ^ /default.jpg break;
rewrite_by_lua_file /var/www/site/www/images/hello.lua;
# Отключим кэширование кода для разработки
lua_code_cache off;
}

читаем доку https://github.com/openresty/lua-nginx-module#rewr...

This will be the case if rewrite ^ /bar last is used as this will similarly initiate an internal redirection. If the break modifier is used instead, there will be no internal redirection and the rewrite_by_lua code will be executed.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Randewoo
ngx.say('<img src="/default.jpg">');
ngx.eof();

Ну как бы и да.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы