Lua — компактный встраиваемый язык программирования с интерпретатором размером около 250 КБ. Создавался как механизм расширения приложений. Ключевая особенность: таблица — единственная составная структура данных, заменяющая массивы, словари, объекты и модули.
Как работает Lua
Lua компилирует исходный код в байткод, который выполняется виртуальной машиной. LuaJIT (Just-In-Time компилятор) компилирует горячие участки в машинный код — один из самых быстрых динамических языков в бенчмарках. Lua легко встраивается в C/C++ приложения через простое API: приложение регистрирует функции, Lua их вызывает.
Применение в веб-инфраструктуре
Главное применение — OpenResty: Nginx с встроенным LuaJIT. OpenResty позволяет писать логику обработки запросов прямо в конфигурации Nginx:
-- Проверка JWT в Nginx до передачи на бэкенд
access_by_lua_block {
local jwt = require "resty.jwt"
local token = ngx.req.get_headers()["Authorization"]
local verified = jwt:verify("secret_key", token)
if not verified["verified"] then
ngx.status = 401
ngx.exit(ngx.HTTP_UNAUTHORIZED)
end
}
Cloudflare использует Lua/OpenResty на своей инфраструктуре для обработки триллионов HTTP-запросов. Kong API Gateway — популярное решение на OpenResty/Lua для управления API.
Применение в играх
Lua — стандартный язык скриптинга в игровой индустрии: World of Warcraft (система аддонов), Roblox (игровые скрипты), VLC Media Player (плагины), Wireshark (диссекторы протоколов), Neovim (конфигурация с Lua 5.1+).
История
Lua создан Роберто Иерусалимски (Roberto Ierusalimschy), Луисом Энрике де Фигейредо (Luiz Henrique de Figueiredo) и Вальдемаром Железнику (Waldemar Celes) в Pontifical Catholic University of Rio de Janeiro (PUC-Rio) в 1993 году. Lua 5.1 (2006) — наиболее распространённая версия: LuaJIT совместим именно с ней. Lua 5.4 (2020) — текущая версия с generational GC и to-be-closed переменными.
Lua в хостинге
OpenResty доступен как пакет или через Docker: openresty/openresty. На VPS OpenResty устанавливается рядом с обычным Nginx или вместо него — конфигурация Nginx-совместима. Reverse proxy на OpenResty с Lua-валидацией JWT позволяет авторизовывать запросы без изменения кода бэкенд-приложения.
Lua как язык конфигурации
Neovim использует Lua как основной язык конфигурации с версии 0.5 (2021). Конфиг в ~/.config/nvim/init.lua позволяет писать полноценную программную логику вместо Vimscript. Redis поддерживает Lua-скрипты через EVAL: скрипт выполняется атомарно на сервере Redis.
# Атомарная операция через Lua в Redis
EVAL "
local current = redis.call('GET', KEYS[1])
if tonumber(current) > tonumber(ARGV[1]) then
return redis.call('DECRBY', KEYS[1], ARGV[1])
end
return -1
" 1 counter 10
Особенности языка
Lua индексирует массивы с 1, а не с 0. Таблица {1, 2, 3} имеет индексы 1, 2, 3. Это часто путает разработчиков, привыкших к C-подобным языкам. Нет классов — ООП реализуется через метатаблицы и __index. Строки неизменяемы — конкатенация создаёт новую строку. Для эффективной работы со строками используют table.concat.
Производительность
LuaJIT в бенчмарках часто обгоняет Python 3 в 10–50 раз на вычислительных задачах и сравним с Java. Для Nginx/OpenResty это означает возможность обрабатывать логику авторизации, rate limiting и трансформации запросов прямо в прокси без дополнительных сетевых вызовов. Overhead минимален — LuaJIT инициализируется за микросекунды.