21 March 2011

http_handlersocket_json_module

Nginx
О назначении модуля можно догодаться из названия. О HandlerSocket говорят много и на разных языках (в основном на японском, английском и последнее время немного на русском).
Модуль NGX_HTTP_HANDLERSOCKET_JSON_MODULE обращается к данным MySQL через протокол HandlerSocket и отдает данные в формате JSON. Область применения AJAX.
Исходники

О конфигурации, особенностях и ограничениях можно почиать ниже.

Инсталляция

Инсталляция стандартная, конфигурирование с опцией --add-module:

./configure --add-module=/full/path/to/dir/nginx_http_handlersocket_json_module
далее
make & sudo make install;
Конфигурация

Конфигурация определена в контексте локейшена. Пример ниже:
location ~ /json/(.+)/$ {
hs_json;

hs_json_host 127.0.0.1;
hs_json_port 9998;

hs_json_db test;
hs_json_table hs_test;

hs_json_index code; # PRIMARY default
hs_json_fields keyid,value,code;

hs_json_op "="; # = default
hs_json_limit 10; # default 10

set $hs_request $1;
}


Более подробно:

hs_json; — активирует модуль

Параметры соединения (хост и порт по умолчанию localhost:9998, так что можно не указывать, а вот имя базы данных указать прийдется обязательно):
hs_json_host 127.0.0.1;
hs_json_port 9998;
hs_json_db test;

Таблица данных и список выбранных полей (все параметры обязательные):
hs_json_table hs_test;
hs_json_fields keyid,value,code;

Индекс, по которому должна осуществляться выборка:
hs_json_index code;
При отсутствии данной опции используется PRIMARY индекс.

Операция, это условие по выборке данных.
hs_json_op "="; # = default
Возможны следующие операции: =, <, <=, >, >=
По умолчанию, при отсутствие директивы применяется операция «равно»

Ограничение на вывод данных:
hs_json_limit 10;
При отсутствии директивы 10.

Условие на выбор данных, осуществляется через переменную $hs_request. Данные можно назначить как часть урла:
location ~ /json/(.+)/$ {
set $hs_request $1;
}
Как переменную GET или COOKIES:
location ~ /json {
set $hs_request $get_id;
}

ПРИМЕР:
Пусть необходимо выбрать города по нескольким первым буквам. Список ограничен 10 позициями. Города выбираются из таблицы:
CREATE TABLE city {
name VARCHAR(45),
id INT,
PRIMARY (id),
KEY `name` (`name`),
}
Если использовать следующую часть конфига:
location ~ /city/(.+)/${
..... // параметры соединения
hs_json_index name,
hs_json_fields name;
hs_json_op ">=";
set $hs_request $1;
}

то это будет аналог запроса: SELECT * FROM cities WHERE city_name >= '$hs_request' LIMIT 10
Запрос будет браться из последней части урл, Наприме для запроса: http: // myserver.com/city/san/ будет сформирован набор даных:
[{"name":"San Amaro"},{"name":"San Andreas"},{"name":"San Andrs"} ... ]
Ошибки

  1. 500 — неправильная конфигурация, ошибка реализации протокола или ошибка ответа HS
  2. 503 — нет соединения с HS или ошибки ввода/вывода
Если ключ не найден — отдается пустой ответ: {[]}, 404 ошибка не формируется.

Ограничения
  • Величина выходного буфера должна быть не более 1К (1024), регулируется #define BUFF_SIZE. Для моих задач больше не нужно.
  • Можно использовать только простой индекс (выборка данных только по одному критерию)
  • пока русские буквы не реализованы (UTF-8), устранится в ближайшее время

О всех багах в багрепорте, о фичах и пожеланиях в личку или комменты
Tags:nginxnginx modulenginx patchhandlersocketjsonmysql
Hubs: Nginx
+32
1.5k 80
Comments 52
Top of the last 24 hours