我很好奇 https://github.com/nginx/nginx/blob/master/src/core/ngx_connection.c
具体来说,ngx_configure_listening_sockets()
中的第838行:
#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(启用TCP_NODELAY
),但是 *我认为这是正确的一种启用TCP_NODELAY
或nginx有一个很好的理由不启用它。*
我正确了吗?如果是,那是什么?
(为了记录,这个问题主要涉及