Позволяет ли nginx вышестоящий сервер отвечать и закрывать запрос до его завершения?

У меня есть сервис загрузки изображений, который запрашивает прокси nginx. Все отлично работает. Однако иногда на сервере уже есть изображение, которое загружает пользователь. Итак, я хочу ответить рано и закрыть связь.

После прочтения заголовков и проверки на сервере я вызываю Node's response.end ([data] [, encoding] [, callback]).

Nginx barfs и возвращает пустой ответ:

[error] 3831#0: *12879 readv() failed (104: Connection reset by peer) while reading upstream

Я предполагаю, что nginx предполагает, что на вышестоящем сервере произошло что-то плохое, немедленно обрывает клиентское соединение, не отправляя ответ вышестоящего сервера.

Кто-нибудь знает, как правильно реагировать и закрывать клиентское соединение, когда nginx является прокси? Я знаю, что это можно сделать: см.: отправка ответа до того, как запрос был в

Вот файл конфигурации nginx:

worker_processes 8; # the number of processors
worker_rlimit_nofile 128; # each connection needs 2 file handles

events {
  worker_connections 128; # two connections per end-user connection (proxy)
  multi_accept on;
  use kqueue;
}

http {
  sendfile on;
  tcp_nopush on; # attempt to send HTTP response head in one packet
  tcp_nodelay off; # Nagle algorithm, wait until we have the maximum amount of data the network can send at once
  keepalive_timeout 65s;

  include nginx.mime.types;
  default_type application/octet-stream;

  error_log /usr/local/var/log/nginx/error.log;
  log_format main '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  gzip off;

}

upstream upload_service {
  server 127.0.0.1:1337 fail_timeout=0;
  keepalive 64;
}

location /api/upload_service/ {
  # setup proxy to UpNode
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header Host $http_host;
  proxy_set_header X-NginX-Proxy true;
  proxy_set_header Connection "";
  proxy_pass http://upload_service;

  # The timeout is set only between two successive read operations
  proxy_read_timeout 500s;
  # timeout for reading client request body, only for a period between two successive read   operations
  client_body_timeout 30s;
  # maximum allowed size of the client request body, specified in the "Content-Length"
  client_max_body_size 64M;
}

2 ответа

Вы не упоминаете, что ваши клиенты, однако, это звучит как то, что вы бы достигли с ожидаемым заголовком. По сути, клиент устанавливает заголовок "Expect" с ожиданием "100-continue". Затем клиент ждет ответа 100 Continue от сервера, прежде чем отправлять свое тело запроса.

Если сервер не хочет получать тело, он может ответить с окончательным статусом, и клиент не отправляет тело.

Этот процесс определен в RFC2616, раздел 8.2.3.

https://forum.nginx.org/read.php?2,254918,254918#msg-254918 также связано упоминание

Согласно RFC2616, 8.2.2 RFC2616, 8.2.2:1 , если запрос содержал Content-Length и клиент (в данном случае nginx) перестает передавать тело (из-за ошибочного ответа), клиенту (nginx) придется закрыть соединение.

Другие вопросы по тегам