Назад | Перейти на главную страницу

Nginx и Lua: хаки, оптимизации и наблюдения

После этого поста об использовании Lua для увеличения гибкости nginx и для уменьшения нагрузки на веб-стек мне любопытно узнать, как люди используют Lua для расширения возможностей nginx.

Есть ли заметные хаки, оптимизации и наблюдения с использованием Lua? Хаки, которые люди использовали для обнаружения возможностей Nginx, которые в противном случае были бы сложны / невозможны с веб-сервером или обратным прокси?

Редактировать:
Ссылки:
http://thechangelog.com/post/3249294699/super-nginx-killer-build-of-nginx-build-for-luajit-plus
http://skillsmatter.com/podcast/home/scripting-nginx-with-lua/te-4729
http://devblog.mixlr.com/2012/06/26/how-we-use-nginx-lua-and-redis-to-beta-ify-mixlr/

Ранее мы написали решение, которое динамически получает корень документа на основе указанного домена или псевдонима домена. Он использует базу данных mysql для хранения сопоставлений доменных имен и псевдонимов. Ссылка на это http://www.logicwreck.com/index.php/2012/09/11/dynamic-hosts-for-nginx-with-database-storage-of-domain-and-alias-info/
Довольно интересный способ взлома, так как он может помешать вам иметь несколько настроенных виртуальных хостов и вместо этого иметь только один.

В моем корневом решении для документов также используется Lua, но вместо базы данных используется сценарий bash. Короче говоря, он меняет местами части домена и использует их в качестве структуры каталогов. В этой структуре каталоги с префиксом _ могут использоваться для различения корней документов от поддоменов.

например domain.com -> com / domain / _public sub.domain.com -> com / domain / sub / _public

server_name _ ~^(?<www>www\.)?(?<domain>[a-zA-Z0-9-\.]+)$;

set_by_lua $docRoot "
  local f = assert(io.popen('/path/to/conversion/script.sh '..ngx.var.domain, 'r'))
  local s = assert(f:read('*a'))
  f:close()
  return s
";

root /var/www/$docRoot/_public;

Тогда мой сценарий преобразования:

echo $1 | tr "." "\n"  | tac | tr "\n" "/" | rev | cut -b 2- | rev | tr -d "\n"

Cut удаляет дополнительную косую черту, в то время как последний tr необходим, потому что наличие новой строки в корне nginx обрезает / _public

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