Мои поиски простого сервера pubsub для удовлетворения относительно скромных потребностей в публикации / подписке для моего Android приложения побудили меня выбрать Nchan - расширение Nginx. NChan удивительно гибок и очень прост в настройке. По большей части я смог пройтись по документации и понять все, что требуется. Тем не менее, есть одна проблема, которая все еще ускользает от меня:
Одна из возможностей NChan - пересылать входящие сообщения для обработки в восходящем направлении, прежде чем разрешить их публикацию и предоставление другим клиентам. Раздел Пересылка сообщений документации гласит:
Код ответа в восходящем направлении определяет порядок продолжения публикации: 304 Not Modified публикует сообщение как полученное без изменения. 204 Нет содержимого отбрасывает сообщение 200 OK используется для изменения сообщения. Вместо исходного входящего сообщения сообщение, содержащееся в этом HTTP-ответе, публикуется .
Тестовый стек, который я должен увидеть, как это работает, выглядит следующим образом
Моя Nginx конфигурация
location ~ /pub/(\w+)$
{
nchan_publisher;
nchan_channel_id "$1"; #first capture of the location match
nchan_publisher_upstream_request /beforepub;
}
location = /beforepub
{
proxy_pass https://another-example.com/beforepub/;
proxy_set_header X-Publisher-Type $nchan_publisher_type;
proxy_set_header X-Prev-Message-Id $nchan_prev_message_id;
proxy_set_header X-Channel-Id $nchan_channel_id;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
По сути, я беру входящее сообщение и пересылаю его на /beforepub/
на том же сервере, где с ним работает следующий скрипт index.php
.
Есть одна из двух вещей, которые я хочу сделать с этим перенаправленным сообщением
"Записать некоторую информацию : в локальную базу данных, обычно связанную с заголовком X-Channel-ID
и затем вернуть заголовок 204
, чтобы ничего не публиковалось
<?php
header("HTTP/1.1 204 OK");
$channelID = getallheaders()['X-Channel-ID'];
//inspect and record the channel ID
?>
Возвращать измененный ответ :
<?php
header("HTTP/1.1 200 OK");
$headers = getallheaders();
$channelID = $headers['X-Channel-ID'];
//return a response dependendent on the channelID
echo "modified response";
?>
в надеюсь, что другие подписчики канала увидят измененный ответ .
. Чтобы проверить это поведение в первую очередь, я использую
NChan может принимать соединения pubsub, используя либо Протоколы wss
или http(s)
. Я использую wss
для подключения sub
в Simple Websocket Client, SW C и https
для подключения паба в клиенте Advanced REST AR C.
Имея это, я подписываюсь на сообщения в "альфа-канале" v ia SW C в
wss://example.com:443/sub/alpha
и
подключаются и публикуют sh сообщений на одном и том же "альфа-канале" из AR C и POST к URL https://example.com/pub/alpha
с содержанием POST original content
. Я обнаружил, что SW C возвращает пустой ответ в виде
[2020-01-30 18:04:14.204]
Мне не ясно, так ли это, потому что я как-то неправильно установили мои Nginx настройки прокси или просто полностью неправильно поняли, что переадресация NChan должна работать.