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_listening_t *
|
||||||
ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen)
|
ngx_create_listening(ngx_conf_t *cf, void *sockaddr, socklen_t socklen)
|
||||||
{
|
{
|
||||||
|
size_t len;
|
||||||
ngx_listening_t *ls;
|
ngx_listening_t *ls;
|
||||||
struct sockaddr *sa;
|
struct sockaddr *sa;
|
||||||
u_char text[NGX_SOCKADDR_STRLEN];
|
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->sockaddr = sa;
|
||||||
ls->socklen = socklen;
|
ls->socklen = socklen;
|
||||||
|
|
||||||
ls->addr_text.len = ngx_sock_ntop(sa, text, NGX_SOCKADDR_STRLEN, 1);
|
len = ngx_sock_ntop(sa, text, NGX_SOCKADDR_STRLEN, 1);
|
||||||
|
ls->addr_text.len = len;
|
||||||
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;
|
|
||||||
|
|
||||||
switch (ls->sockaddr->sa_family) {
|
switch (ls->sockaddr->sa_family) {
|
||||||
#if (NGX_HAVE_INET6)
|
#if (NGX_HAVE_INET6)
|
||||||
case AF_INET6:
|
case AF_INET6:
|
||||||
ls->addr_text_max_len = NGX_INET6_ADDRSTRLEN;
|
ls->addr_text_max_len = NGX_INET6_ADDRSTRLEN;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||||
|
case AF_UNIX:
|
||||||
|
ls->addr_text_max_len = NGX_UNIX_ADDRSTRLEN;
|
||||||
|
len++;
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
case AF_INET:
|
case AF_INET:
|
||||||
ls->addr_text_max_len = NGX_INET_ADDRSTRLEN;
|
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;
|
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->backlog = NGX_LISTEN_BACKLOG;
|
||||||
ls->rcvbuf = -1;
|
ls->rcvbuf = -1;
|
||||||
ls->sndbuf = -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);
|
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;
|
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;
|
size_t n;
|
||||||
struct sockaddr_in6 *sin6;
|
struct sockaddr_in6 *sin6;
|
||||||
#endif
|
#endif
|
||||||
|
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||||
|
struct sockaddr_un *saun;
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (sa->sa_family) {
|
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;
|
return n;
|
||||||
#endif
|
#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:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -12,21 +12,26 @@
|
|||||||
#include <ngx_core.h>
|
#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_storage)
|
||||||
* sizeof(struct sockaddr_un)
|
* sizeof(struct sockaddr_un)
|
||||||
* sizeof(struct sockaddr_in6)
|
* sizeof(struct sockaddr_in6)
|
||||||
* sizeof(struct sockaddr_in)
|
* 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)
|
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||||
#define NGX_SOCKADDRLEN sizeof(struct sockaddr_un)
|
#define NGX_SOCKADDRLEN sizeof(struct sockaddr_un)
|
||||||
#else
|
#else
|
||||||
|
@ -156,6 +156,17 @@ ngx_event_accept(ngx_event_t *ev)
|
|||||||
|
|
||||||
c->unexpected_eof = 1;
|
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;
|
rev = c->read;
|
||||||
wev = c->write;
|
wev = c->write;
|
||||||
|
|
||||||
|
@ -1128,6 +1128,12 @@ ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||||
|
case AF_UNIX:
|
||||||
|
p = 0;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
default: /* AF_INET */
|
default: /* AF_INET */
|
||||||
sin = (struct sockaddr_in *) sa;
|
sin = (struct sockaddr_in *) sa;
|
||||||
p = sin->sin_port;
|
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;
|
ngx_uint_t i, default_server;
|
||||||
struct sockaddr *sa;
|
struct sockaddr *sa;
|
||||||
ngx_http_conf_addr_t *addr;
|
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
|
* 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;
|
break;
|
||||||
#endif
|
#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 */
|
default: /* AF_INET */
|
||||||
off = offsetof(struct sockaddr_in, sin_addr);
|
off = offsetof(struct sockaddr_in, sin_addr);
|
||||||
len = 4;
|
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,
|
* 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.
|
* log, and log file structures enough to allow a signal handler to log.
|
||||||
|
Loading…
Reference in New Issue
Block a user