Как получить тело запроса ожидающих или поставленных в очередь запросов на nginx? - PullRequest
1 голос
/ 16 октября 2019

Я использую NGINX в качестве балансировщика нагрузки и прокси-сервера для приложения Python, размещенного на Gunicorn. Серверу приложений (gunicorn) требуется больше времени, чтобы дать ответ, и у него есть один рабочий. Запросы, поступающие на сервер nginx в то время, когда сервер приложений не свободен, затем эти запросы остаются в очереди на обработку, ожидая обработки. Здесь мне нужна запись о расположении запросов в очереди ожидания вместе с телом запроса для получения статуса.

Я пытался использовать журналы nginx, а также некоторые сторонние инструменты для этого, но не смог выполнить мойтребование.

Тело моего запроса выглядит следующим образом:

{
  "BatchNbr": "Batch_80",
  "SharedFolderName":"0.0.0.0/SharedFolder",
  "InputPath": "TestPath/pdfs/20190516",
  "OutputPath":"TestPath/output",
  "DecryptFlag":"False"
}

И я сохраняю статус партии в следующем формате:

Batch Number  StartTime (IST)         EndTime (IST)      Status
Batch_80    2019-10-16 14:16:39  2019-10-16 14:16:39       QUEUED
Batch_70    2019-10-16 14:13:04  2019-10-16 14:13:04       QUEUED
Batch_71    2019-10-16 14:13:04  2019-10-16 14:13:06       FAILURE
batch_test1 2019-10-16 14:09:22  2019-10-16 14:09:22       SUCCESS

Мне нужен статус партии, поставленный в очередь, когда партиязапрос находится в очереди ожидания сервера nginx, статус меняется на RUNNING, когда запрос достигает сервера приложений, а когда обработка запроса завершена, статус меняется на SUCCESS. Любые выводы будут очень полезны.

1 Ответ

1 голос
/ 31 октября 2019

Возможно, нет способа получить данные об ожидающих запросах из nginx. Мы можем получить только количество обращений, количество ожидающих запросов или количество активных запросов, но мы не можем получить данные запроса из него. Поэтому я попробовал другой способ выполнить свою задачу. Я получил данные из tcp-дампов машины через порт, на котором работал nginx, это дало мне целые данные запроса, как только пользователь нажал на api, затем проанализировал эти данные в python, чтобы получить подробную информацию о том, что мне нужно. Вот код для извлечения данных из слоя tcp:

# sudo tcpdump -nn -A -s1500 -l -i ens4 port 5000
while True:
    p = sub.Popen(('sudo', 'tcpdump', '-nn', '-A', '-s1500', '-l', '-i', 'ens4', 'port', '5000'), stdout=sub.PIPE)
    for row in iter(p.stdout.readline, b''):
        val = row.rstrip()
        # process here

Этот код просматривает дампы tcp на порту 5000. Вы также можете проверить это, выполнив эту команду на терминале linux: sudo tcpdump -nn -A -s1500 -l -i ens4 port 5000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...