#nginx #lua #symfony
#nginx #lua #symfony
Вопрос:
Я пытаюсь использовать lua для обслуживания 301 перенаправления непосредственно из nginx вместо того, чтобы проходить через php или другие материалы.
Я вдохновлен этой статьей здесь:
Идея в том, что я могу сохранить список перенаправлений непосредственно в 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
}
- Должен ли я использовать глобальные переменные в этом случае для обмена данными между 2 блоками кода lua? Я вижу, что использование глобальных переменных настоятельно не рекомендуется?
- Если я дважды включу сценарий lua, могу ли я с уверенностью предположить, что переменные, объявленные в скрипте, всегда будут повторно объявляться при каждом его вызове?
Спасибо, я совершенно новичок в этом, поэтому, пожалуйста, простите мой очевидный вопрос.
Ответ №1:
Насколько я знаю, вы не можете включать файлы Lua напрямую таким образом. Предполагая, что вы используете Openresty, вам необходимо использовать соответствующую фазу *_by_lua для обработки запроса, в данном случае rewrite_by_lua .
Разные блоки не могут получить доступ к глобальным файлам друг друга, но вы можете использовать таблицу ngx.ctx, которая сохраняется на время выполнения запроса.
Здесь есть удобная схема этапов openresty.
Комментарии:
1. Спасибо, я загляну в ngx.ctx, похоже, это то, что мне нужно. Как ни странно, включение работает так, как показано в скрипте, хотя я подозреваю, что предложенный вами способ может быть лучшим способом сделать это
2. Просто обновление: ngx.ctx содержит значение только в этом конкретном запросе / дополнительном запросе, поэтому для меня это не работает, потому что это означает, что данные не используются в этих 2 блоках местоположения выше в моем примере. Итак, теперь я изучаю возможность использования модуля local foo = require «foo», но проблема в том, что модуль сохраняет общие данные во всех запросах до тех пор, пока рабочий nginx все еще жив.