Рейтинг:0

Настройка NGINX для REST API, возвращающая конфигурацию по умолчанию

флаг cn

Я нанял VPS, чтобы поиграть с некоторыми личными проектами. Для начала я пытаюсь настроить его для размещения REST API с использованием Node.js, так как я когда-либо использовал для этого только Spring Boot.

Я реализовал решения, адаптировав следующие руководства:

https://www.robinwieruch.de/node-express-server-rest-api (большая часть кода API выглядит так)

https://itnext.io/building-restful-api-with-node-js-express-js-and-postgresql-the-right-way-b2e718ad1c66 (но я постепенно перехожу на использование стандартов отсюда)

Для фактического развертывания я решил связать API с Babel и развертываю его с PM2.

https://www.nginx.com/blog/deploying-nginx-plus-as-an-api-gateway-part-1/ (но не плюс)

(Все эти ссылки доступны через http://web.archive.org/ так что они никуда не денутся в ближайшее время)

Я создал еще один проект Node.js, используя аксиомы для тестирования запросов REST. Запуск на том же VPS работает, но мне пришлось изменить код API для привязки к локальный хост. Раньше, когда адрес привязки не был указан, он привязывался к IPv6. локальный хост (если я правильно понял) и, поскольку мой домен не работает с IPv6, я буду придерживаться IPv4.

На стороне NGINX я внес больше всего изменений, так как сейчас у меня только 1 API, и я не буду использовать балансировку нагрузки. Кроме того, я изменил политику именования. я буду использовать example.com/app_or_project_name/api_or_web_or_other_kind_of_interface/project_specific_routes.

Вот как выглядит моя установка NGINX. Я анонимизировал его и изменил, чтобы использовать то же имя, что и в примере с NGINX:

api_backends.conf

вышестоящий склад {
    зона API 64k;
    сервер 127.0.0.1:some_port_number;
}

Это хост REST API и номер порта.

api_conf.d/warehouse_api.conf

# API склада
#
расположение /склад/API/ {
    # Конфигурация политики здесь (аутентификация, ограничение скорости, ведение журнала и т. д.)
    #
    access_log /var/log/nginx/warehouse_api.log основной;
    auth_request /_validate_apikey;

    # URI-маршрутизация
    #
    proxy_pass http://склад;

    вернуть 404; # Универсальный
}

api_gateway.conf

включить api_backends.conf;
включить api_keys.conf;

сервер {
    access_log /var/log/nginx/api_access.log основной; # Каждый API также может вести журнал в отдельный файл

    слушать 443 ssl;
    имя_сервера мой-домен.net;

    # Конфигурация TLS
    ssl_certificate /etc/letsencrypt/live/my-domain.net/fullchain.pem; # под управлением Certbot
    ssl_certificate_key /etc/letsencrypt/live/my-domain.net/privkey.pem; # под управлением Certbot
    ssl_session_cache общий: SSL: 10 м;
    ssl_session_timeout 5 м;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_protocols TLSv1.2 TLSv1.3;

    # определения API, по одному на файл
    включить api_conf.d/*.conf;

    # ответы об ошибках
    # error_page 404 = @400; # Недопустимые пути рассматриваются как неверные запросы
    proxy_intercept_errors включен; # Не отправлять ошибки бэкенда клиенту
    включить api_json_errors.conf; # Удобные для клиента API ответы на ошибки JSON
    приложение по умолчанию_тип/json; # Если нет типа содержимого, то предположим, что это JSON

    # Проверка ключа API
    местоположение = /_validate_apikey {
        внутренний;

        если ($ http_apikey = "") {
            вернуть 401; # Неавторизованный
        }
        если ($api_client_name = "") {
            вернуть 403; # Запрещенный
        }

        вернуть 204; # ОК (нет содержимого)
    }

}

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

api_json_errors.conf

То же, что пример.

default.conf

сервер {
    имя_сервера www.мой-домен.net;

    #access_log /var/log/nginx/host.access.log main;

    место расположения / {
        корень /usr/share/nginx/html;
        индекс index.html index.htm;
    }

    #error_page 404 /404.html;

    # перенаправить страницы ошибок сервера на статическую страницу /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    местоположение = /50x.html {
        корень /usr/share/nginx/html;
    }

    # проксировать PHP-скрипты для Apache, прослушивающего 127.0.0.1:80
    #
    #местоположение ~ \.php$ {
    # proxy_pass http://127.0.0.1;
    #}

    # передать PHP-скрипты серверу FastCGI, прослушивающему 127.0.0.1:9000
    #
    #местоположение ~ \.php$ {
    # корень html;
    # fastcgi_pass 127.0.0.1:9000;
    # fastcgi_index index.php;
    # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    # включить fastcgi_params;
    #}

    # запретить доступ к файлам .htaccess, если корневой каталог Apache
    # совпадает с nginx
    #
    #местоположение ~ /\.ht {
    # запретить все;
    #}

    слушать 443 ssl; # под управлением Certbot
    ssl_certificate /etc/letsencrypt/live/my-domain.net/fullchain.pem; # под управлением Certbot
    ssl_certificate_key /etc/letsencrypt/live/my-domain.net/privkey.pem; # под управлением Certbot
    включить /etc/letsencrypt/options-ssl-nginx.conf; # под управлением Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # под управлением Certbot

}

сервер {
    если ($ host = www.my-domain.net) {
        вернуть 301 https://$host$request_uri;
    } # управляется Certbot

    если ($ host = my-domain.net) {
        вернуть 301 https://$host$request_uri;
    } # управляется Certbot

    слушать 80;
    имя_сервера мой-домен.net www.мой-домен.net;
    вернуть 404; # под управлением Certbot

}

Мне пришлось внести некоторые изменения здесь, потому что была комбинация адреса и порта, у которой был дубликат. сервер конфигурация.

nginx.conf

пользователь nginx;
рабочие_процессы авто;

error_log /var/log/nginx/error.log информация;
pid /var/run/nginx.pid;

load_module /etc/nginx/modules/ngx_http_js_module.so;

События {
    worker_connections 1024;
}

http {
    включить /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$статус $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    журнал_доступа /var/log/nginx/access.log основной;

    отправить файл включен;
    #tcp_npush включен;

    keepalive_timeout 65;

    включить /etc/nginx/api_gateway.conf; # Все конфигурации шлюза API
    включить /etc/nginx/conf.d/*.conf; # Регулярный веб-трафик
}

Когда я запускаю тот же тестовый проект вне VPS, я получаю следующий результат:

{
  сообщение: «Запрос не выполнен с кодом состояния 404»,
  имя: 'Ошибка',
  описание: не определено,
  номер: не определено,
  имя файла: не определено,
  номер строки: не определено,
  номер_столбца: не определено,
  куча: '...',
  конфигурация: {
    URL-адрес: «https://my-domain.net/warehouse/api/messages»,
    метод: «получить»,
    заголовки: {
      Принять: 'приложение/json, текст/обычный, */*',
      'Доступ-Контроль-Разрешить-Происхождение': '*',
      «Агент пользователя»: «axios/0.21.1»
    },
    transformRequest: [[Функция: transformRequest]],
    TransformResponse: [[Функция: transformResponse]],
    тайм-аут: 0,
    адаптер: [Функция: httpAdapter],
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: «X-XSRF-TOKEN»,
    maxContentLength: -1,
    maxBodyLength: -1,
    валидатестатус: [Функция: валидатестатус],
    апикей: '...',
    данные: не определены
  },
  код: не определен
}

Одна вещь, которую мне удалось выяснить, это то, что ошибка 404 возвращается склад_api.conf потому что, если я изменюсь вернуть 404; на другой код, это код, который я получу.

Я включил отладку в NGINX, но не смог понять вывод, даже после небольшого поиска:

22.07.2021 11:54:17 [отладка] nginx_pid#nginx_pid: *757 с использованием местоположения: @404 "/warehouse/api/messages?"
22.07.2021, 11:54:31 [отладка] nginx_pid#nginx_pid: *758 http cl:-1 max:1048576
22.07.2021 11:54:31 [отладка] nginx_pid#nginx_pid: *758 фаза перезаписи: 3
22.07.2021, 11:54:31 [отладка] nginx_pid#nginx_pid: *758 HTTP-запрос финализации: 404, «/warehouse/api/messages?» а:1, в:1
22.07.2021, 11:54:31 [отладка] nginx_pid#nginx_pid: *758 специальный ответ http: 404, "/warehouse/api/messages?"
22.07.2021 11:54:31 [отладка] nginx_pid#nginx_pid: *758 тестовое местоположение: "@400"
22.07.2021 11:54:31 [отладка] nginx_pid#nginx_pid: *758 тестовое местоположение: "@401"
22.07.2021 11:54:31 [отладка] nginx_pid#nginx_pid: *758 тестовое местоположение: "@403"
22.07.2021 11:54:31 [отладка] nginx_pid#nginx_pid: *758 тестовое местоположение: "@404"
22.07.2021 11:54:31 [отладка] nginx_pid#nginx_pid: *758 с использованием местоположения: @404 "/warehouse/api/messages?"

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

Итак, что происходит, что не так и как мне это исправить?

Заранее спасибо.

Обновление 2021-08-04

После ответа @jose-fernando-lopez-fernandez я изменил api_conf.d/warehouse_api.conf к следующему:

# API склада
#
расположение /склад/API/ {
    # Конфигурация политики здесь (аутентификация, ограничение скорости, ведение журнала и т. д.)
    #
    access_log /var/log/nginx/warehouse_api.log основной;
    auth_request /_validate_apikey;

    # URI-маршрутизация
    #
    расположение /склад/API/ {
        proxy_pass http://склад;
    }

    вернуть 404; # Универсальный
}

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

Я исправил это, снова проверил и снова получил 404. Но теперь я получаю намного больше отдачи от nginx-отладка.

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

я тоже заменил posix_memalign, http очистка добавить, бесплатно, автор сети в и маллок строками одинаковой длины со случайными байтами.Я не знаю, должно быть это анонимно или нет. Если это необходимо для решения этого вопроса, пожалуйста, спросите, и я добавлю их обратно по мере необходимости.

Вот оно:

04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http cl:-1 max:1048576
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 фаза перезаписи: 3
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 фаза перезаписи поста: 4
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 общая фаза: 5
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 общая фаза: 6
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 общая фаза: 7
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 фаза доступа: 8
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 фаза доступа: 9
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 фаза доступа: 10
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 обработчик запроса авторизации
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 подзапрос http "/_validate_apikey?"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http отправил запрос: "/_validate_apikey?"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 фаза перезаписи: 1
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 тестовое местоположение: "/warehouse/api/"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 тестовое местоположение: "/_validate_apikey"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 с использованием конфигурации "=/_validate_apikey"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http cl:-1 max:1048576
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 фаза перезаписи: 3
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 переменная HTTP-скрипта
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http-скрипт var: "o6ZlKSX24MCY/uPwCRl80WAS"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 значение http-скрипта: ""
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 HTTP-скрипт равен
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 эквивалент http-скрипта: нет
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http-скрипт, если
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http-скрипт, если: false
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 переменная HTTP-скрипта
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 карта http запущена
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http-скрипт var: "o6ZlKSX24MCY/uPwCRl80WAS"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 карта http: "o6ZlKSX24MCY/uPwCRl80WAS" "client_one"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 HTTP-скрипт var: "client_one"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 значение http-скрипта: ""
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 HTTP-скрипт равен
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 эквивалент http-скрипта: нет
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http-скрипт, если
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http-скрипт, если: false
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 HTTP-запрос финализации: 0, "/_validate_apikey?" а:1, в:2
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 запрос авторизации выполнен s:204
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 запрос HTTP пробуждения родителя: "/warehouse/api/messages?"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http отправил запрос: "/warehouse/api/messages?"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 фаза доступа: 10
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 обработчик запроса авторизации
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 переменные набора запросов авторизации
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 этап доступа к публикации: 11
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 общая фаза: 12
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 общая фаза: 13
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 posix_memalign: 218512C89A2ED401:4096 @16
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http init upstream, клиентский таймер: 0
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 событие добавления epoll: fd:3 op:3 ev:80002005
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 копия http-скрипта: «Хост»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http-скрипт var: "склад"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 копия http-скрипта: «Соединение»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 копия http-скрипта: «закрыть»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 копия http-скрипта: ""
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 копия http-скрипта: ""
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок http-прокси: «Принять: приложение/json, текст/обычный, */*»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок HTTP-прокси: «Access-Control-Allow-Origin: *»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок HTTP-прокси: «apikey: o6ZlKSX24MCY/uPwCRl80WAS»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок HTTP-прокси: «User-Agent: axios/0.21.1»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок http-прокси:
"ПОЛУЧИТЬ/склад/API/сообщения HTTP/1.0
Хост: склад
Подключение: близко
Принять: приложение/json, текст/обычный, */*
Доступ-Контроль-Разрешить-Происхождение: *
ключ: o6ZlKSX24MCY/uPwCRl80WAS
Агент пользователя: axios/0.21.1

"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 очистка http добавить: 90C9DA232086B6FA
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 получить одноранговый узел rr, попробовать: 1
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 потоковый сокет 15
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 epoll добавить соединение: fd:15 ev:80002005
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 подключиться к 127.0.0.1:some_port_number, fd:15 #2
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 HTTP восходящее соединение: -2
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 posix_memalign: A9E50626EC2A1D36:128 @16
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 добавление таймера событий: 15: 60000:878601635
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 HTTP-запрос финализации: -4, "/warehouse/api/messages?" а:1, в:2
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 количество HTTP-запросов: 2 blk: 0
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 HTTP-запрос на запуск: "/warehouse/api/messages?"
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http upstream check client, write event:1, "/warehouse/api/messages"
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http восходящий запрос: "/warehouse/api/messages?"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 обработчик HTTP-запроса на отправку вверх по течению
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 HTTP-запрос на отправку вверх по течению
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 тело запроса отправки исходящего потока http
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 цепочка записи buf fl:1 s:225
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 цепной писатель в: 4C4F626384F523C9
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 writev: 225 из 225
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 выход цепи записи: 0000000000000000
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 таймер событий del: 15: 878601635
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 добавление таймера событий: 15: 60000:878601636
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 http восходящий запрос: "/warehouse/api/messages?"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок восходящего процесса http
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 malloc: 1D36E73206B5EE11:4096
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 recv: eof:1, avail:-1
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 recv: fd:15 444 из 4096
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 статус http-прокси 404 «404 не найден»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок http-прокси: «X-Powered-By: Express»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок HTTP-прокси: «Access-Control-Allow-Origin: *»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок http-прокси: «Content-Security-Policy: default-src 'none'"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок http-прокси: «X-Content-Type-Options: nosniff»
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок http-прокси: «Content-Type: text/html; charset=utf-8»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок HTTP-прокси: «Длина содержимого: 168»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок http-прокси: «Дата: среда, 04 августа 2021 г., 17:43:08 по Гринвичу»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок http-прокси: «Соединение: закрыть»
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 заголовок HTTP-прокси готов
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 завершить запрос http восходящего потока: 404
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 завершить запрос HTTP-прокси
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 бесплатный одноранговый узел rr 1 0
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 закрыть восходящее http-соединение: 15
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 свободен: A9E50626EC2A1D36, неиспользовано: 48
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 таймер событий del: 15: 878601636
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 повторно используемое соединение: 0
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 HTTP-запрос финализации: 404, "/warehouse/api/messages?" а:1, в:1
04.08.2021, 17:43:08 [отладка] nginx_pid#nginx_pid: *1 специальный ответ http: 404, "/warehouse/api/messages?"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 тестовое местоположение: "@400"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 тестовое местоположение: "@401"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 тестовое местоположение: "@403"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 тестовое местоположение: "@404"
04.08.2021 17:43:08 [отладка] nginx_pid#nginx_pid: *1 с использованием местоположения: @404 "/warehouse/api/messages?"

Мне кажется странным, что он, кажется, рассматривает склад как имя хоста. С другой стороны, NGINX определяет некоторые адреса с таким именем, так что это может быть связано с этим.

Рейтинг:1
флаг sz

Я предполагаю, что вы просто заглушили махинации, связанные с прокси, для обработки позже в вашем файле API хранилища, но на самом деле это не сработает, как вы узнали.

# API склада
#
расположение /склад/API/ {
    # Конфигурация политики здесь (аутентификация, ограничение скорости, ведение журнала и т. д.)
    #
    access_log /var/log/nginx/warehouse_api.log основной;
    auth_request /_validate_apikey;

    # URI-маршрутизация
    #
    proxy_pass http://склад;

    вернуть 404; # Универсальный
}

Сравните эту строку, отвечающую за маршрутизацию URI, с версией в приведенном вами примере.

# API склада
#
расположение /api/склад/ {
    # Конфигурация политики здесь (аутентификация, ограничение скорости, ведение журнала и т. д.)
    #
    access_log /var/log/nginx/warehouse_api.log основной;
    auth_request /_validate_apikey;

    # URI-маршрутизация
    #
    местоположение /api/склад/инвентарь {
        proxy_pass http://warehouse_inventory;
    }

    расположение /api/склад/цены {
        proxy_pass http://warehouse_pricing;
    }

    вернуть 404; # Универсальный
}

Причина, по которой пример работает, а ваш нет, связана с «приоритетом» («немедленность» может быть лучшим термином) возвращаться директива.

Согласно документации, возвращаться директива немедленно заставляет Nginx прекратить обработку текущего запроса и сразу же вернуться1. Это означает, что ваш proxy_pass директива даже не получает шанс даже попытаться выполнить.

Однако в этом примере в блоке есть два вложенных местоположения на основе префикса, что означает, что Nginx выберет самое длинное совпадение. Вот почему пример запроса выполнен успешно; запрошенный URI, https://api.example.com/api/warehouse/pricing/item001, соответствует второму из двух вложенных блоков местоположения, поэтому запрос был проксирован, как и ожидалось.

В заключение необходимо добавить вложенный блок местоположения для proxy_pass директиву для выполнения внутри, если вы хотите воспроизвести пример. В противном случае, похоже, вы сможете просто удалить возвращаться директива, и ваш настроенный вышестоящий бэкэнд сможет попытаться сделать свое дело.

GuiRitter avatar
флаг cn
Спасибо! Однако теперь он терпит неудачу дальше по линии. Я обновил первый пост с дополнительной информацией.
Jose Fernando Lopez Fernandez avatar
флаг sz
Я действительно не знаю, является ли это источником проблемы, но Warehouse API — это функция Plus, не так ли? Честно говоря, у меня нет опыта с этим, поэтому я могу ошибаться, но 401 звучит так, как будто это он, верно?
GuiRitter avatar
флаг cn
Я не понимаю, как это может быть. Насколько я понимаю, Warehouse API — это просто пример, где «Склад» — это гипотетическое приложение, которое обращается к гипотетическому API, а пример NGINX показывает, как открыть этот API.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.