У меня есть служба загрузки изображений, к которой nginx отправляет запросы. Все отлично работает. Однако иногда на сервере уже есть изображение, загружаемое пользователем. Итак, я хочу ответить раньше и закрыть соединение.
Прочитав заголовки и сверившись с сервером, я вызываю Node's response.end ([данные] [, кодировка] [, обратный вызов]).
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;
}
Вы не упоминаете своих клиентов, однако это похоже на то, чего вы добьетесь с ожидаемым заголовком. По сути, клиент устанавливает заголовок «Expect» с ожиданием «100-continue». Затем клиент ожидает ответа 100 Continue от сервера перед отправкой тела запроса.
Если сервер не хочет получать тело, он может ответить окончательным статусом, и клиент не отправляет тело.
Этот процесс определен в RFC2616, раздел 8.2.3