aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/ngx_connection.c9
-rw-r--r--src/core/ngx_connection.h2
-rw-r--r--src/event/ngx_event.c25
-rw-r--r--src/http/ngx_http.c4
-rw-r--r--src/stream/ngx_stream.c4
5 files changed, 30 insertions, 14 deletions
diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c
index 61ea4c2dd..33682532a 100644
--- a/src/core/ngx_connection.c
+++ b/src/core/ngx_connection.c
@@ -96,7 +96,7 @@ ngx_create_listening(ngx_conf_t *cf, struct sockaddr *sockaddr,
ngx_int_t
-ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls)
+ngx_clone_listening(ngx_cycle_t *cycle, ngx_listening_t *ls)
{
#if (NGX_HAVE_REUSEPORT)
@@ -104,20 +104,19 @@ ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls)
ngx_core_conf_t *ccf;
ngx_listening_t ols;
- if (!ls->reuseport) {
+ if (!ls->reuseport || ls->worker != 0) {
return NGX_OK;
}
ols = *ls;
- ccf = (ngx_core_conf_t *) ngx_get_conf(cf->cycle->conf_ctx,
- ngx_core_module);
+ ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
for (n = 1; n < ccf->worker_processes; n++) {
/* create a socket for each worker process */
- ls = ngx_array_push(&cf->cycle->listening);
+ ls = ngx_array_push(&cycle->listening);
if (ls == NULL) {
return NGX_ERROR;
}
diff --git a/src/core/ngx_connection.h b/src/core/ngx_connection.h
index ef0755800..54059629e 100644
--- a/src/core/ngx_connection.h
+++ b/src/core/ngx_connection.h
@@ -210,7 +210,7 @@ struct ngx_connection_s {
ngx_listening_t *ngx_create_listening(ngx_conf_t *cf, struct sockaddr *sockaddr,
socklen_t socklen);
-ngx_int_t ngx_clone_listening(ngx_conf_t *cf, ngx_listening_t *ls);
+ngx_int_t ngx_clone_listening(ngx_cycle_t *cycle, ngx_listening_t *ls);
ngx_int_t ngx_set_inherited_sockets(ngx_cycle_t *cycle);
ngx_int_t ngx_open_listening_sockets(ngx_cycle_t *cycle);
void ngx_configure_listening_sockets(ngx_cycle_t *cycle);
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index 57af81324..a18b1132c 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -410,12 +410,37 @@ ngx_handle_write_event(ngx_event_t *wev, size_t lowat)
static char *
ngx_event_init_conf(ngx_cycle_t *cycle, void *conf)
{
+#if (NGX_HAVE_REUSEPORT)
+ ngx_uint_t i;
+ ngx_listening_t *ls;
+#endif
+
if (ngx_get_conf(cycle->conf_ctx, ngx_events_module) == NULL) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
"no \"events\" section in configuration");
return NGX_CONF_ERROR;
}
+#if (NGX_HAVE_REUSEPORT)
+
+ ls = cycle->listening.elts;
+ for (i = 0; i < cycle->listening.nelts; i++) {
+
+ if (!ls[i].reuseport || ls[i].worker != 0) {
+ continue;
+ }
+
+ if (ngx_clone_listening(cycle, &ls[i]) != NGX_OK) {
+ return NGX_CONF_ERROR;
+ }
+
+ /* cloning may change cycle->listening.elts */
+
+ ls = cycle->listening.elts;
+ }
+
+#endif
+
return NGX_CONF_OK;
}
diff --git a/src/http/ngx_http.c b/src/http/ngx_http.c
index 9d8b6d79a..5e2022690 100644
--- a/src/http/ngx_http.c
+++ b/src/http/ngx_http.c
@@ -1685,10 +1685,6 @@ ngx_http_init_listening(ngx_conf_t *cf, ngx_http_conf_port_t *port)
break;
}
- if (ngx_clone_listening(cf, ls) != NGX_OK) {
- return NGX_ERROR;
- }
-
addr++;
last--;
}
diff --git a/src/stream/ngx_stream.c b/src/stream/ngx_stream.c
index 0efbda89e..4abe387e8 100644
--- a/src/stream/ngx_stream.c
+++ b/src/stream/ngx_stream.c
@@ -538,10 +538,6 @@ ngx_stream_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)
break;
}
- if (ngx_clone_listening(cf, ls) != NGX_OK) {
- return NGX_CONF_ERROR;
- }
-
addr++;
last--;
}