16 static void ngx_drain_connections(
void);
53 #if (NGX_HAVE_UNIX_DOMAIN)
75 ls->
type = SOCK_STREAM;
96 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
98 struct accept_filter_arg af;
100 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
108 if (ls[i].sockaddr == NULL) {
113 if (getsockname(ls[i].fd, ls[i].sockaddr, &ls[i].socklen) == -1) {
115 "getsockname() of the inherited "
116 "socket #%d failed", ls[i].
fd);
121 switch (ls[i].sockaddr->sa_family) {
130 #if (NGX_HAVE_UNIX_DOMAIN)
144 "the inherited socket #%d has "
145 "an unsupported protocol family", ls[i].
fd);
151 if (ls[i].addr_text.data == NULL) {
155 len =
ngx_sock_ntop(ls[i].sockaddr, ls[i].addr_text.data, len, 1);
166 if (getsockopt(ls[i].fd, SOL_SOCKET, SO_RCVBUF, (
void *) &ls[i].rcvbuf,
171 "getsockopt(SO_RCVBUF) %V failed, ignored",
179 if (getsockopt(ls[i].fd, SOL_SOCKET, SO_SNDBUF, (
void *) &ls[i].sndbuf,
184 "getsockopt(SO_SNDBUF) %V failed, ignored",
193 #if (NGX_HAVE_SETFIB)
195 if (getsockopt(ls[i].setfib, SOL_SOCKET, SO_SETFIB,
196 (
void *) &ls[i].setfib, &olen)
200 "getsockopt(SO_SETFIB) %V failed, ignored",
209 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
211 ngx_memzero(&af,
sizeof(
struct accept_filter_arg));
212 olen =
sizeof(
struct accept_filter_arg);
214 if (getsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER, &af, &olen)
224 "getsockopt(SO_ACCEPTFILTER) for %V failed, ignored",
229 if (olen <
sizeof(
struct accept_filter_arg) || af.af_name[0] ==
'\0') {
234 if (ls[i].accept_filter == NULL) {
239 (u_char *) af.af_name, 16);
242 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
247 if (getsockopt(ls[i].fd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &timeout, &olen)
251 "getsockopt(TCP_DEFER_ACCEPT) for %V failed, ignored",
256 if (olen <
sizeof(
int) || timeout == 0) {
260 ls[
i].deferred_accept = 1;
279 #if (NGX_SUPPRESS_WARN)
287 for (tries = 5; tries; tries--) {
299 if (ls[i].fd != -1) {
303 if (ls[i].inherited) {
320 if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
321 (
const void *) &reuseaddr,
sizeof(
int))
325 "setsockopt(SO_REUSEADDR) %V failed",
337 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
339 if (ls[i].sockaddr->sa_family == AF_INET6) {
342 ipv6only = ls[
i].ipv6only;
344 if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
345 (
const void *) &ipv6only,
sizeof(
int))
349 "setsockopt(IPV6_V6ONLY) %V failed, ignored",
373 "bind() %V #%d ", &ls[i].addr_text, s);
375 if (bind(s, ls[i].sockaddr, ls[i].socklen) == -1) {
383 "bind() to %V failed", &ls[i].addr_text);
400 #if (NGX_HAVE_UNIX_DOMAIN)
402 if (ls[i].sockaddr->sa_family == AF_UNIX) {
409 if (chmod((
char *) name, mode) == -1) {
411 "chmod() \"%s\" failed", name);
423 if (listen(s, ls[i].backlog) == -1) {
425 "listen() to %V, backlog %d failed",
426 &ls[i].addr_text, ls[i].backlog);
449 "try again to bind() after 500ms");
470 #if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
471 struct accept_filter_arg af;
473 #if (NGX_HAVE_DEFERRED_ACCEPT && defined TCP_DEFER_ACCEPT)
482 if (ls[i].rcvbuf != -1) {
483 if (setsockopt(ls[i].fd, SOL_SOCKET, SO_RCVBUF,
484 (
const void *) &ls[i].rcvbuf,
sizeof(
int))
488 "setsockopt(SO_RCVBUF, %d) %V failed, ignored",
493 if (ls[i].sndbuf != -1) {
494 if (setsockopt(ls[i].fd, SOL_SOCKET, SO_SNDBUF,
495 (
const void *) &ls[i].sndbuf,
sizeof(
int))
499 "setsockopt(SO_SNDBUF, %d) %V failed, ignored",
504 if (ls[i].keepalive) {
507 if (setsockopt(ls[i].fd, SOL_SOCKET, SO_KEEPALIVE,
508 (
const void *) &keepalive,
sizeof(
int))
512 "setsockopt(SO_KEEPALIVE, %d) %V failed, ignored",
517 #if (NGX_HAVE_KEEPALIVE_TUNABLE)
519 if (ls[i].keepidle) {
520 if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPIDLE,
521 (
const void *) &ls[i].keepidle,
sizeof(
int))
525 "setsockopt(TCP_KEEPIDLE, %d) %V failed, ignored",
530 if (ls[i].keepintvl) {
531 if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPINTVL,
532 (
const void *) &ls[i].keepintvl,
sizeof(
int))
536 "setsockopt(TCP_KEEPINTVL, %d) %V failed, ignored",
542 if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPCNT,
543 (
const void *) &ls[i].keepcnt,
sizeof(
int))
547 "setsockopt(TCP_KEEPCNT, %d) %V failed, ignored",
554 #if (NGX_HAVE_SETFIB)
555 if (ls[i].setfib != -1) {
556 if (setsockopt(ls[i].fd, SOL_SOCKET, SO_SETFIB,
557 (
const void *) &ls[i].setfib,
sizeof(
int))
561 "setsockopt(SO_SETFIB, %d) %V failed, ignored",
571 if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_NODELAY,
572 (
const void *) &tcp_nodelay,
sizeof(
int))
576 "setsockopt(TCP_NODELAY) %V failed, ignored",
586 if (listen(ls[i].fd, ls[i].backlog) == -1) {
588 "listen() to %V, backlog %d failed, ignored",
598 #if (NGX_HAVE_DEFERRED_ACCEPT)
600 #ifdef SO_ACCEPTFILTER
602 if (ls[i].delete_deferred) {
603 if (setsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0)
607 "setsockopt(SO_ACCEPTFILTER, NULL) "
608 "for %V failed, ignored",
611 if (ls[i].accept_filter) {
613 "could not change the accept filter "
614 "to \"%s\" for %V, ignored",
621 ls[
i].deferred_accept = 0;
624 if (ls[i].add_deferred) {
625 ngx_memzero(&af,
sizeof(
struct accept_filter_arg));
627 (u_char *) ls[i].accept_filter, 16);
629 if (setsockopt(ls[i].fd, SOL_SOCKET, SO_ACCEPTFILTER,
630 &af,
sizeof(
struct accept_filter_arg))
634 "setsockopt(SO_ACCEPTFILTER, \"%s\") "
635 "for %V failed, ignored",
640 ls[
i].deferred_accept = 1;
645 #ifdef TCP_DEFER_ACCEPT
647 if (ls[i].add_deferred || ls[i].delete_deferred) {
649 if (ls[i].add_deferred) {
650 timeout = (int) (ls[i].post_accept_timeout / 1000);
656 if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_DEFER_ACCEPT,
657 &timeout,
sizeof(
int))
661 "setsockopt(TCP_DEFER_ACCEPT, %d) for %V failed, "
669 if (ls[i].add_deferred) {
670 ls[
i].deferred_accept = 1;
727 "close listening %V #%d ", &ls[i].
addr_text, ls[i].
fd);
734 #if (NGX_HAVE_UNIX_DOMAIN)
736 if (ls[i].sockaddr->sa_family == AF_UNIX
768 "the new socket has number %d, "
769 "but only %ui files are available",
779 ngx_drain_connections();
785 "%ui worker_connections are not enough",
905 c->
write->locked = 0;
969 "reusable connection: %ui", reusable);
975 (void) ngx_atomic_fetch_add(ngx_stat_waiting, -1);
988 (void) ngx_atomic_fetch_add(ngx_stat_waiting, 1);
995 ngx_drain_connections(
void)
1001 for (i = 0; i < 32; i++) {
1010 "reusing connection");
1025 struct sockaddr_in *sin;
1026 #if (NGX_HAVE_INET6)
1028 struct sockaddr_in6 *sin6;
1033 #if (NGX_HAVE_INET6)
1037 for (addr = 0, i = 0; addr == 0 && i < 16; i++) {
1038 addr |= sin6->sin6_addr.s6_addr[
i];
1046 addr = sin->sin_addr.s_addr;
1054 if (getsockname(c->
fd, (
struct sockaddr *) &sa, &len) == -1) {