Openresty, большой набор модулей для Nginx'a, открывает много возможностей для разработки прямо на популярном Web сервере. Одним из главных достоинств этого пакета является расширение для поддержки языка Lua в Nginx.
Установка
В Debian системах все, что нужно, есть в пакете:
1 |
yum install nginx-extras |
Hello world
Выведем hello world:
1 2 3 4 5 6 7 8 9 |
server { location /hello { default_type 'text/plain'; content_by_lua ' ngx.say("Hello world!") '; } } |
# Выведем известную строку прямо с помощью Nginx'a
Теперь перезапустим Nginx:
1 |
nginx -s reload |
И по адресу http://сайт/hello увидим:
1 |
Hello world! |
Вывод HTML
Чтобы вывести HTML достаточно заменить тип контента и указать сам контент:
1 2 3 4 5 6 7 8 9 |
server { location /hello { default_type <b>'text/html'</b>; content_by_lua ' ngx.say("<b>Hello <b>world</b>!</b>") '; } } |
# Выводим HTML из Nginx Lua
Организация кода
Для удобства стоит использовать внешние Lua файлы:
1 2 3 4 5 6 7 8 9 10 |
server { location / { default_type 'text/plain'; <b>content_by_lua_file /var/www/lua/index.lua</b>; <span class="comment"> # Отключим кэширование кода для разработки </span> <span class="comment"> # (это нужно закомментировать, когда выкатим на продакшн) </span> lua_code_cache off; } } |
# загрузка Lua кода из внешних файлов
Во время разработки удобно использовать lua_code_cache, т.к. код файла можно будет менять без перезапуска Nginx'a.
Несколько обработчиков
1 2 3 4 5 6 7 8 9 10 11 |
server { <b>location /</b> { default_type 'text/plain'; content_by_lua_file /var/www/lua/index.lua; } <b>location /admin</b> { default_type 'text/plain'; content_by_lua_file /var/www/lua/admin.lua; } } |
Глобальные переменные
Для настроек и статистики удобно использовать глобальные переменные (они будут иметь одинаковые значения для всех запросов):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
http { <span class="comment"> # объявляем глобальный контейнер </span> <b>lua_shared_dict stats 1m</b>; server { location / { content_by_lua ' <span class="comment"> # увеличим переменную hits на 1 при каждом запросе </span> <b>ngx.shared.stats:incr("hits", 1)</b> <span class="comment"> # выведем текущее значение </span> ngx.say(ngx.shared.stats:get("hits")) '; } } } |
# Используем глобальную переменную для подсчета количества запросов
Работа с данными
Nginx поддерживает работу с разными базами данных, в т.ч. Mysql и Redis.
1 |
apt-get install lua-nginx-redis |
Пример простого скрипта для подсчета количества запросов в Redis'e:
1 2 3 4 5 6 7 8 9 10 11 12 |
server { location / { content_by_lua ' local redis = require "nginx.redis" local red = redis:new() local ok, err = red:connect("127.0.0.1", 6379) ok, err = red:incr("test") local res, err = red:get("test") ngx.say("hits: ", res) '; } } |
# Увеличиваем счетчик test с помощью Redis
Openresty позволяет использовать Nginx не просто как Web сервер, а как полноценную платформу. С помощью Lua можно реализовать большой набор функционала, в т.ч. и работу с данными.