mirror of
https://github.com/nginx/nginx.git
synced 2024-12-12 18:29:00 +08:00
http listen unix domain sockets
This commit is contained in:
parent
657b3b7f7d
commit
baf8e409ba
@ -15,6 +15,7 @@ ngx_os_io_t ngx_io;
|
||||
ngx_listening_t *
|
||||
ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen)
|
||||
{
|
||||
size_t len;
|
||||
ngx_listening_t *ls;
|
||||
struct sockaddr *sa;
|
||||
u_char text[NGX_SOCKADDR_STRLEN];
|
||||
@ -36,23 +37,20 @@ ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen)
|
||||
ls->sockaddr = sa;
|
||||
ls->socklen = socklen;
|
||||
|
||||
ls->addr_text.len = ngx_sock_ntop(sa, text, NGX_SOCKADDR_STRLEN, 1);
|
||||
|
||||
ls->addr_text.data = ngx_pnalloc(cf->pool, ls->addr_text.len);
|
||||
if (ls->addr_text.data == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ngx_memcpy(ls->addr_text.data, text, ls->addr_text.len);
|
||||
|
||||
ls->fd = (ngx_socket_t) -1;
|
||||
ls->type = SOCK_STREAM;
|
||||
len = ngx_sock_ntop(sa, text, NGX_SOCKADDR_STRLEN, 1);
|
||||
ls->addr_text.len = len;
|
||||
|
||||
switch (ls->sockaddr->sa_family) {
|
||||
#if (NGX_HAVE_INET6)
|
||||
case AF_INET6:
|
||||
ls->addr_text_max_len = NGX_INET6_ADDRSTRLEN;
|
||||
break;
|
||||
#endif
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
case AF_UNIX:
|
||||
ls->addr_text_max_len = NGX_UNIX_ADDRSTRLEN;
|
||||
len++;
|
||||
break;
|
||||
#endif
|
||||
case AF_INET:
|
||||
ls->addr_text_max_len = NGX_INET_ADDRSTRLEN;
|
||||
@ -62,6 +60,16 @@ ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen)
|
||||
break;
|
||||
}
|
||||
|
||||
ls->addr_text.data = ngx_pnalloc(cf->pool, len);
|
||||
if (ls->addr_text.data == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ngx_memcpy(ls->addr_text.data, text, len);
|
||||
|
||||
ls->fd = (ngx_socket_t) -1;
|
||||
ls->type = SOCK_STREAM;
|
||||
|
||||
ls->backlog = NGX_LISTEN_BACKLOG;
|
||||
ls->rcvbuf = -1;
|
||||
ls->sndbuf = -1;
|
||||
@ -604,6 +612,21 @@ ngx_close_listening_sockets(ngx_cycle_t *cycle)
|
||||
ngx_close_socket_n " %V failed", &ls[i].addr_text);
|
||||
}
|
||||
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
|
||||
if (ls[i].sockaddr->sa_family == AF_UNIX
|
||||
&& ngx_process != NGX_PROCESS_WORKER)
|
||||
{
|
||||
u_char *name = ls[i].addr_text.data + sizeof("unix:") - 1;
|
||||
|
||||
if (ngx_delete_file(name) == -1) {
|
||||
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,
|
||||
ngx_delete_file_n " %s failed", name);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
ls[i].fd = (ngx_socket_t) -1;
|
||||
}
|
||||
}
|
||||
|
@ -68,6 +68,9 @@ ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len, ngx_uint_t port)
|
||||
size_t n;
|
||||
struct sockaddr_in6 *sin6;
|
||||
#endif
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
struct sockaddr_un *saun;
|
||||
#endif
|
||||
|
||||
switch (sa->sa_family) {
|
||||
|
||||
@ -108,6 +111,17 @@ ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len, ngx_uint_t port)
|
||||
return n;
|
||||
#endif
|
||||
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
|
||||
case AF_UNIX:
|
||||
saun = (struct sockaddr_un *) sa;
|
||||
|
||||
/* we do not include trailing zero in address length */
|
||||
|
||||
return ngx_snprintf(text, len, "unix:%s%Z", saun->sun_path) - text - 1;
|
||||
|
||||
#endif
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
@ -12,21 +12,26 @@
|
||||
#include <ngx_core.h>
|
||||
|
||||
|
||||
#define NGX_INET_ADDRSTRLEN (sizeof("255.255.255.255") - 1)
|
||||
#define NGX_INET6_ADDRSTRLEN \
|
||||
(sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1)
|
||||
|
||||
#define NGX_SOCKADDR_STRLEN (NGX_INET6_ADDRSTRLEN + sizeof(":65535") - 1)
|
||||
|
||||
|
||||
/*
|
||||
* TODO: autoconfigure NGX_SOCKADDRLEN as
|
||||
* TODO: autoconfigure NGX_SOCKADDRLEN and NGX_SOCKADDR_STRLEN as
|
||||
* sizeof(struct sockaddr_storage)
|
||||
* sizeof(struct sockaddr_un)
|
||||
* sizeof(struct sockaddr_in6)
|
||||
* sizeof(struct sockaddr_in)
|
||||
*/
|
||||
|
||||
#define NGX_INET_ADDRSTRLEN (sizeof("255.255.255.255") - 1)
|
||||
#define NGX_INET6_ADDRSTRLEN \
|
||||
(sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1)
|
||||
#define NGX_UNIX_ADDRSTRLEN \
|
||||
(sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path))
|
||||
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
#define NGX_SOCKADDR_STRLEN (sizeof("unix:") - 1 + NGX_UNIX_ADDRSTRLEN)
|
||||
#else
|
||||
#define NGX_SOCKADDR_STRLEN (NGX_INET6_ADDRSTRLEN + sizeof(":65535") - 1)
|
||||
#endif
|
||||
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
#define NGX_SOCKADDRLEN sizeof(struct sockaddr_un)
|
||||
#else
|
||||
|
@ -156,6 +156,17 @@ ngx_event_accept(ngx_event_t *ev)
|
||||
|
||||
c->unexpected_eof = 1;
|
||||
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
if (c->sockaddr->sa_family == AF_UNIX) {
|
||||
c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;
|
||||
c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
|
||||
#if (NGX_SOLARIS)
|
||||
/* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */
|
||||
c->sendfile = 0;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
rev = c->read;
|
||||
wev = c->write;
|
||||
|
||||
|
@ -1128,6 +1128,12 @@ ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
case AF_UNIX:
|
||||
p = 0;
|
||||
break;
|
||||
#endif
|
||||
|
||||
default: /* AF_INET */
|
||||
sin = (struct sockaddr_in *) sa;
|
||||
p = sin->sin_port;
|
||||
@ -1170,6 +1176,9 @@ ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
|
||||
ngx_uint_t i, default_server;
|
||||
struct sockaddr *sa;
|
||||
ngx_http_conf_addr_t *addr;
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
struct sockaddr_un *saun;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* we can not compare whole sockaddr struct's as kernel
|
||||
@ -1187,6 +1196,13 @@ ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
|
||||
break;
|
||||
#endif
|
||||
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
case AF_UNIX:
|
||||
off = offsetof(struct sockaddr_un, sun_path);
|
||||
len = sizeof(saun->sun_path);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default: /* AF_INET */
|
||||
off = offsetof(struct sockaddr_in, sin_addr);
|
||||
len = 4;
|
||||
|
@ -675,6 +675,8 @@ ngx_master_process_exit(ngx_cycle_t *cycle)
|
||||
}
|
||||
}
|
||||
|
||||
ngx_close_listening_sockets(cycle);
|
||||
|
||||
/*
|
||||
* Copy ngx_cycle->log related data to the special static exit cycle,
|
||||
* log, and log file structures enough to allow a signal handler to log.
|
||||
|
Loading…
Reference in New Issue
Block a user