O nginx permite que um servidor upstream responda e feche um pedido antes de terminar?

6

Eu tenho um serviço de upload de imagens para o qual o nginx faz proxy de solicitações. Tudo funciona muito bem. Às vezes, o servidor já tem a imagem que o usuário está enviando. Então, eu quero responder cedo e fechar a conexão.

Depois de ler os cabeçalhos e verificar com o servidor, eu chamo o response.end do Node ([data] [ codificação] [ , callback]) .

Nginx barfs e retorna uma resposta em branco:

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

Meu palpite é que o nginx assume que algo de ruim aconteceu no servidor upstream, descarta a conexão do cliente imediatamente sem enviar a resposta do servidor upstream.

Alguém sabe como responder corretamente e fechar a conexão do cliente quando o nginx é o proxy? Eu sei que isso é possível fazer: veja: enviando a resposta antes que a solicitação estivesse

Aqui está o arquivo conf 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;
}
    
por thesmart 17.03.2015 / 07:42

1 resposta

2

Você não menciona quais são seus clientes, no entanto, isso soa como algo que você alcançaria com um cabeçalho esperado. Em essência, o cliente define um cabeçalho "Expect" com uma expectativa "100-continue". Em seguida, o cliente aguarda uma resposta de 100 Continue do servidor, antes de enviar o corpo da solicitação.

Se o servidor não quiser receber o corpo, ele poderá responder com um status final e o cliente não enviará o corpo.

Este processo é definido em RFC2616, seção 8.2.3

    
por 09.04.2015 / 23:35