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

Оберните сокеты unix, чтобы сделать их совместимыми с HTTP

Я хочу использовать сигнал через Интернет. signald - это приложение, которое предоставляет сокет unix и обменивается данными в JSON.

Я могу использовать nginx для подключения к сокету unix через HTTP (S). Но signald не понимает HTTP, только чистый JSON. Он вызывает следующие ошибки:

com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'GET': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at [Source: (String)"GET / HTTP/1.0"; line: 1, column: 4]

Есть ли способ отправить JSON в мой сокет unix с переадресацией через Интернет, как любой API, обслуживаемый веб-сервером? Я представляю себе что-то вроде nginx <-> http wrapper <-> unix socket.

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

Первая установка nginx-extras

Загрузите модули ndk_http_module и ngx_http_lua_module (в этом порядке) в nginx.conf вот так:

load_module modules/ndk_http_module.so;
load_module modules/ngx_http_lua_module.so;

Это location блок для подключения к сокету unix с расширением lua. Он отправит данные запроса в сокет unix и прочитает с помощью tcpsocket: получить (). Так и будет сказать() строка как ответ.

    location / {
        content_by_lua_block {
            ngx.req.read_body()
            local body_data = ngx.req.get_body_data()

            local sock = ngx.socket.tcp()
            local ok, err = sock:connect("unix:/var/run/signald/signald.sock")

            local bytes = sock:send(body_data)

            local line, err, part = sock:receive()
            if line then
                ngx.say(line)
            end

            ok, err = sock:close()
        }
    }

Проверьте это с помощью вызова curl, подобного этому (вам не нужно беспокоиться о Content-Type или метод):

curl -d '{"type":"version"}' https://example.com:1234