[PATCH] SO_REUSEPORT support for listen sockets

Piotr Sikora piotr at cloudflare.com
Fri Jul 26 10:59:47 UTC 2013


Hey,

> @@ -76,6 +78,13 @@
>       0,
>       NULL },
>
> +    { ngx_string("so_reuseport"),
> +      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
> +      ngx_set_so_reuseport,
> +      0,
> +      0,
> +      NULL },
> +
>     { ngx_string("debug_points"),
>       NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
>       ngx_conf_set_enum_slot,
> @@ -1361,3 +1370,24 @@
>
>     return NGX_CONF_OK;
> }
> +
> +
> +static char *
> +ngx_set_so_reuseport(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
> +{
> +    ngx_str_t        *value;
> +    ngx_core_conf_t  *ccf;
> +
> +    ccf = (ngx_core_conf_t *) conf;
> +
> +    value = (ngx_str_t *) cf->args->elts;
> +
> +    if (ngx_strcmp(value[1].data, "on") == 0) {
> +        ccf->so_reuseport = 1;
> +    } else if (ngx_strcmp(value[1].data, "off") == 0) {
> +        ccf->so_reuseport = 0;
> +    } else {
> +        return "invalid value";
> +    }
> +    return NGX_CONF_OK;
> +}

This can be replaced with ngx_conf_set_flag_slot(), i.e.:

+    { ngx_string("so_reuseport"),
+      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,
+      ngx_conf_set_flag_slot,
+      0,
+      offsetof(ngx_core_conf_t, so_reuseport),
+      NULL },

Also:
1) like Tom said, you definitely need to guard code to make sure
SO_REUSEPORT is available,
2) this feature should be disabled on DragonFly versions prior to the
740d1d9 commit, because it clearly wouldn't do any good there,
3) it might make sense to expose this as an option of "listen"
directive, instead of a global setting,
4) how does this (OS-level sharding) play with nginx's upgrade process
(forking of new binary and passing listening fds)? Are there any
side-effects of this change that could result in dropped packets /
requests?

Best regards,
Piotr Sikora



More information about the nginx-devel mailing list