Совместное использование данных lua между блоками?

#nginx #lua #symfony

#nginx #lua #symfony

Вопрос:

Я пытаюсь использовать lua для обслуживания 301 перенаправления непосредственно из nginx вместо того, чтобы проходить через php или другие материалы.

Я вдохновлен этой статьей здесь:

http://www.agileweboperations.com/supporting-millions-of-pretty-url-rewrites-in-nginx-with-lua-and-redis

Идея в том, что я могу сохранить список перенаправлений непосредственно в redis, затем сопоставить и обслуживать их с lua непосредственно в nginx для повышения производительности.

Поскольку серверным проектом является Symfony, мне нужно найти способ немного изменить код в соответствии с моими потребностями, ниже то, что у меня есть:

Здесь я пытаюсь соответствовать обычному mysite.com/this/that просьбы. Сначала я включаю сценарий lua для обработки перенаправления, если ничего не совпадает, я разрешаю nginx try_files

 location / {
    include /etc/nginx/include.d/lua_st_redis_rewrites.lua;
    try_files $uri @rewriteapp;
}
location @rewriteapp {
    rewrite ^(.*)$ /app.php/$1 last;
}
  

Поскольку я хочу поддерживать среду разработки, я также должен обрабатывать URL-адрес следующим образом: mysite.com/app_dev.php/this/that

Эти URL-адреса не будут соответствовать местоположению / блоку, поэтому я должен снова вызвать include lua здесь. Проблема в том, что теперь ссылки mysite.com/this/that фактически вызовет сценарий lua дважды.

Моя идея заключается в том, что я могу инициализировать флаг true / false в первом вызове, а затем использовать его во втором вызове, чтобы проверить, включен ли скрипт уже? Однако на данном этапе я совершенно запутался в области действия переменной:

 # pass the PHP scripts to FastCGI server from upstream phpfcgi
location ~ ^/(app|app_dev).php(/|$) {
    # # Setup var defaults
    # set $no_cache "";

    include /etc/nginx/include.d/lua_st_redis_rewrites.lua;

    # some more usual code for symfony here
}
  
  1. Должен ли я использовать глобальные переменные в этом случае для обмена данными между 2 блоками кода lua? Я вижу, что использование глобальных переменных настоятельно не рекомендуется?
  2. Если я дважды включу сценарий lua, могу ли я с уверенностью предположить, что переменные, объявленные в скрипте, всегда будут повторно объявляться при каждом его вызове?

Спасибо, я совершенно новичок в этом, поэтому, пожалуйста, простите мой очевидный вопрос.

Ответ №1:

Насколько я знаю, вы не можете включать файлы Lua напрямую таким образом. Предполагая, что вы используете Openresty, вам необходимо использовать соответствующую фазу *_by_lua для обработки запроса, в данном случае rewrite_by_lua .

Разные блоки не могут получить доступ к глобальным файлам друг друга, но вы можете использовать таблицу ngx.ctx, которая сохраняется на время выполнения запроса.

Здесь есть удобная схема этапов openresty.

Комментарии:

1. Спасибо, я загляну в ngx.ctx, похоже, это то, что мне нужно. Как ни странно, включение работает так, как показано в скрипте, хотя я подозреваю, что предложенный вами способ может быть лучшим способом сделать это

2. Просто обновление: ngx.ctx содержит значение только в этом конкретном запросе / дополнительном запросе, поэтому для меня это не работает, потому что это означает, что данные не используются в этих 2 блоках местоположения выше в моем примере. Итак, теперь я изучаю возможность использования модуля local foo = require «foo», но проблема в том, что модуль сохраняет общие данные во всех запросах до тех пор, пока рабочий nginx все еще жив.