Openresty, большой набор модулей для Nginx'a, открывает много возможностей для разработки прямо на популярном Web сервере. Одним из главных достоинств этого пакета является расширение для поддержки языка Lua в Nginx.

Установка

В Debian системах все, что нужно, есть в пакете:

apt-get install nginx-extras

Hello world

Выведем hello world:

server {
  location /hello {
    default_type 'text/plain';

    content_by_lua '
        ngx.say("Hello world!")
    ';
  }
}

# Выведем известную строку прямо с помощью Nginx'a

Теперь перезапустим Nginx:

nginx -s reload

И по адресу http://сайт/hello увидим:

Hello world!

Вывод HTML

Чтобы вывести HTML достаточно заменить тип контента и указать сам контент:

server {
  location /hello {
    default_type 'text/html';

    content_by_lua '
        ngx.say("Hello <b>world</b>!")
    ';
  }
}

# Выводим HTML из Nginx Lua

Организация кода

Для удобства стоит использовать внешние Lua файлы:

server {
  location / {
    default_type 'text/plain';
    content_by_lua_file /var/www/lua/index.lua;

    # Отключим кэширование кода для разработки
    # (это нужно закомментировать, когда выкатим на продакшн)
    lua_code_cache off;
  }
}

# загрузка Lua кода из внешних файлов

Во время разработки удобно использовать lua_code_cache, т.к. код файла можно будет менять без перезапуска Nginx'a.

Несколько обработчиков

server {
  location / {
    default_type 'text/plain';
    content_by_lua_file /var/www/lua/index.lua;
  }

  location /admin {
    default_type 'text/plain';
    content_by_lua_file /var/www/lua/admin.lua;
  }
}

Глобальные переменные

Для настроек и статистики удобно использовать глобальные переменные (они будут иметь одинаковые значения для всех запросов):

http {
    # объявляем глобальный контейнер
    lua_shared_dict stats 1m;

    server {
        location / {
            content_by_lua '
		# увеличим переменную hits на 1 при каждом запросе
                ngx.shared.stats:incr("hits", 1)
		
		# выведем текущее значение
                ngx.say(ngx.shared.stats:get("hits"))
            ';
        }
    }
}

# Используем глобальную переменную для подсчета количества запросов

Работа с данными

Nginx поддерживает работу с разными базами данных, в т.ч. Mysql и Redis.

apt-get install lua-nginx-redis

Пример простого скрипта для подсчета количества запросов в Redis'e:

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 можно реализовать большой набор функционала, в т.ч. и работу с данными.