В соединении nginx отказано при подключении к восходящему потоку

У меня есть сервер, на котором я развернул API (Sinatra). Я запускаю этот API на порт 9292 и запрашиваю к нему прокси.

Мне также нужно развернуть статический файл javascript и его вспомогательные ресурсы. Я делаю это на том же сервере.

Вся приведенная ниже информация анонимизирована.

Конечная точка доступа к API следующая:

server {
    listen 80;
    server_name api.myapp.com;

    location / {
            proxy_pass http://localhost:9292;
    }
}

, а конечная точка, с которой я обслуживаю JS:

server {
    listen 80;
    server_name xsa.myapp.com;

    location / {
            root /data/mydir/xsa;
    }
}

" localhost: 3003 «сервер, который вы видите в приведенной ниже ошибке, это то место, откуда я имею в виду JS.

2018/11/23 23:31:27 [error] 18720#0: *32 connect() failed 
(111: Connection refused) while connecting to upstream, 
client: 255.255.255.7, server: api.myapp.com,
request: "GET /api/v1/sub/sub_ABCXYZ/info?token%3D56f51132-
406b-4e06-a600-7379876446ed HTTP/1.1", upstream:
"http://[::1]:9292/api/v1/sub/sub_ABCXYZ/info?token%3D56f51132
-406b-4e06-a600-7379876446ed", host: "api.myapp.com",
 referrer: "http://xsa.myapp.com/src/selector.html?
mfid=sub_ABCXYZ&location=http://localhost:3003/"

Итак, напомним:

  • Sinatra API на виртуальной машине« x »с портом 9292
  • сервер nginx на виртуальной машине» x "обслуживает прокси-сервер через порт 80 к API для запросов, поступающих на" api.myapp.com "
  • тот же сервер nginx, также обслуживает файл javascript на порту 80 для запросов, поступающих на" xsa.myapp.com " "

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

Я также вижу, что сервер Sinatra на 9292 действительно получает запрос и возвращает 200. Похоже, что проблема после этого. Так что даже не похоже, что в восходящем соединении действительно отказано. Я дважды проверил, что этот ответ в точности совпадает с ответом, когда JS обслуживается локально (и работает).

* UPDATE *

Ошибка «соединение отклонено» действительно происходит, даже когда JS обслуживается локально и работает правильно, поэтому похоже, что эта ошибка - отвлекающий маневр.

2
задан 24 November 2018 в 02:35
1 ответ

Вы получаете это сообщение об ошибке, потому что ваше приложение Sinatra не прослушивает IPv6-адрес по умолчанию для localhost, :: 1 , а вместо этого прослушивает устаревший IPv4 адрес, 127.0.0.1 .

Поскольку вы указали, что ваш восходящий поток nginx - localhost , nginx сначала пробует адрес IPv6, но поскольку ваш сервер приложений не прослушивает этот адрес , nginx получает отказ в соединении. Затем он повторно пытается установить соединение на IPv4, что успешно и обслуживает ваше приложение.

Поскольку это приводит к проблемам с производительностью, и поскольку IPv6 предпочтительнее устаревшего IPv4, вам следует перенастроить приложение Sinatra для прослушивания IPv6. Например,

set :bind, '::1'

В частности, вы должны не привязываться к 127.0.0.1.

Вы также можете просто удалить привязанный хост, потому что по умолчанию он будет прослушивать локальный IPv6, если вы используете thin (как и в prod) или WEBrick (в dev, если вы забыли gem install thin).

(И по соответствующему примечанию, вы явно настроили nginx на , а не на прослушивание IPv6, что вызовет аналогичные проблемы позже или, возможно, даже сейчас. Вы должны исправить это тоже , пока вы это делаете.)

1
ответ дан 3 December 2019 в 12:31

Теги

Похожие вопросы