Мне интересно
https://github.com/nginx/nginx/blob/master/src/core/ngx_connection.c
В частности, строка 838 в ngx_configure_listening_sockets()
:
#if 0
if (1) {
int tcp_nodelay = 1;
if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_NODELAY,
(const void *) &tcp_nodelay, sizeof(int))
== -1) //old-the current code calls an internal function to do this
{
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,
"setsockopt(TCP_NODELAY) %V failed, ignored",
&ls[i].addr_text);
}
}
#endif
Используя getsockopt
, я действительно смог определить, что ни в одном из моих accept
сокетов не было установлено TCP_NODELAY
. Удаление блока препроцессора исправило это. Но почему это там? Если мы намерены позже и явно сконфигурировать принятый сокет, я не могу понять, где это происходит.
Это приложение создает полные ответы перед вызовом send, поэтому традиционным решением было бы отключить nagle (enable TCP_NODELAY
), но * Я полагаю, что существует либо правильный способ включить TCP_NODELAY
или у nginx есть очень веская причина не включать его. *
Правильно ли я, и если да, то что это?
(для протокола, этот вопрос в основном включает