mirror of
https://github.com/nginx/nginx.git
synced 2024-12-27 09:21:18 -06:00
Added the "so_keepalive=" parameter to the "listen" directive.
The "so_keepalive" directive in mail module was deprecated. Thanks to Vsevolod Stakhov for initial work.
This commit is contained in:
parent
1ea2eb56ef
commit
92edf47ff9
14
auto/unix
14
auto/unix
@ -328,6 +328,20 @@ ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_DEFER_ACCEPT, NULL, 0)"
|
|||||||
. auto/feature
|
. auto/feature
|
||||||
|
|
||||||
|
|
||||||
|
ngx_feature="TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_KEEPCNT"
|
||||||
|
ngx_feature_name="NGX_HAVE_KEEPALIVE_TUNABLE"
|
||||||
|
ngx_feature_run=no
|
||||||
|
ngx_feature_incs="#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netinet/tcp.h>"
|
||||||
|
ngx_feature_path=
|
||||||
|
ngx_feature_libs=
|
||||||
|
ngx_feature_test="setsockopt(0, IPPROTO_TCP, TCP_KEEPIDLE, NULL, 0);
|
||||||
|
setsockopt(0, IPPROTO_TCP, TCP_KEEPINTVL, NULL, 0);
|
||||||
|
setsockopt(0, IPPROTO_TCP, TCP_KEEPCNT, NULL, 0)"
|
||||||
|
. auto/feature
|
||||||
|
|
||||||
|
|
||||||
ngx_feature="accept4()"
|
ngx_feature="accept4()"
|
||||||
ngx_feature_name="NGX_HAVE_ACCEPT4"
|
ngx_feature_name="NGX_HAVE_ACCEPT4"
|
||||||
ngx_feature_run=no
|
ngx_feature_run=no
|
||||||
|
@ -462,6 +462,7 @@ ngx_open_listening_sockets(ngx_cycle_t *cycle)
|
|||||||
void
|
void
|
||||||
ngx_configure_listening_sockets(ngx_cycle_t *cycle)
|
ngx_configure_listening_sockets(ngx_cycle_t *cycle)
|
||||||
{
|
{
|
||||||
|
int keepalive;
|
||||||
ngx_uint_t i;
|
ngx_uint_t i;
|
||||||
ngx_listening_t *ls;
|
ngx_listening_t *ls;
|
||||||
|
|
||||||
@ -499,6 +500,56 @@ ngx_configure_listening_sockets(ngx_cycle_t *cycle)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ls[i].keepalive) {
|
||||||
|
keepalive = (ls[i].keepalive == 1) ? 1 : 0;
|
||||||
|
|
||||||
|
if (setsockopt(ls[i].fd, SOL_SOCKET, SO_KEEPALIVE,
|
||||||
|
(const void *) &keepalive, sizeof(int))
|
||||||
|
== -1)
|
||||||
|
{
|
||||||
|
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,
|
||||||
|
"setsockopt(SO_KEEPALIVE, %d) %V failed, ignored",
|
||||||
|
keepalive, &ls[i].addr_text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
|
||||||
|
if (ls[i].keepidle) {
|
||||||
|
if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPIDLE,
|
||||||
|
(const void *) &ls[i].keepidle, sizeof(int))
|
||||||
|
== -1)
|
||||||
|
{
|
||||||
|
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,
|
||||||
|
"setsockopt(TCP_KEEPIDLE, %d) %V failed, ignored",
|
||||||
|
ls[i].keepidle, &ls[i].addr_text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ls[i].keepintvl) {
|
||||||
|
if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPINTVL,
|
||||||
|
(const void *) &ls[i].keepintvl, sizeof(int))
|
||||||
|
== -1)
|
||||||
|
{
|
||||||
|
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,
|
||||||
|
"setsockopt(TCP_KEEPINTVL, %d) %V failed, ignored",
|
||||||
|
ls[i].keepintvl, &ls[i].addr_text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ls[i].keepcnt) {
|
||||||
|
if (setsockopt(ls[i].fd, IPPROTO_TCP, TCP_KEEPCNT,
|
||||||
|
(const void *) &ls[i].keepcnt, sizeof(int))
|
||||||
|
== -1)
|
||||||
|
{
|
||||||
|
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,
|
||||||
|
"setsockopt(TCP_KEEPCNT, %d) %V failed, ignored",
|
||||||
|
ls[i].keepcnt, &ls[i].addr_text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (NGX_HAVE_SETFIB)
|
#if (NGX_HAVE_SETFIB)
|
||||||
if (ls[i].setfib != -1) {
|
if (ls[i].setfib != -1) {
|
||||||
if (setsockopt(ls[i].fd, SOL_SOCKET, SO_SETFIB,
|
if (setsockopt(ls[i].fd, SOL_SOCKET, SO_SETFIB,
|
||||||
|
@ -27,6 +27,11 @@ struct ngx_listening_s {
|
|||||||
int backlog;
|
int backlog;
|
||||||
int rcvbuf;
|
int rcvbuf;
|
||||||
int sndbuf;
|
int sndbuf;
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
int keepidle;
|
||||||
|
int keepintvl;
|
||||||
|
int keepcnt;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* handler of accepted connection */
|
/* handler of accepted connection */
|
||||||
ngx_connection_handler_pt handler;
|
ngx_connection_handler_pt handler;
|
||||||
@ -60,6 +65,7 @@ struct ngx_listening_s {
|
|||||||
#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
|
#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
|
||||||
unsigned ipv6only:2;
|
unsigned ipv6only:2;
|
||||||
#endif
|
#endif
|
||||||
|
unsigned keepalive:2;
|
||||||
|
|
||||||
#if (NGX_HAVE_DEFERRED_ACCEPT)
|
#if (NGX_HAVE_DEFERRED_ACCEPT)
|
||||||
unsigned deferred_accept:1;
|
unsigned deferred_accept:1;
|
||||||
|
@ -1762,6 +1762,13 @@ ngx_http_add_listening(ngx_conf_t *cf, ngx_http_conf_addr_t *addr)
|
|||||||
ls->rcvbuf = addr->opt.rcvbuf;
|
ls->rcvbuf = addr->opt.rcvbuf;
|
||||||
ls->sndbuf = addr->opt.sndbuf;
|
ls->sndbuf = addr->opt.sndbuf;
|
||||||
|
|
||||||
|
ls->keepalive = addr->opt.so_keepalive;
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
ls->keepidle = addr->opt.tcp_keepidle;
|
||||||
|
ls->keepintvl = addr->opt.tcp_keepintvl;
|
||||||
|
ls->keepcnt = addr->opt.tcp_keepcnt;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
|
#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
|
||||||
ls->accept_filter = addr->opt.accept_filter;
|
ls->accept_filter = addr->opt.accept_filter;
|
||||||
#endif
|
#endif
|
||||||
|
@ -3815,6 +3815,97 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ngx_strncmp(value[n].data, "so_keepalive=", 13) == 0) {
|
||||||
|
|
||||||
|
if (ngx_strcmp(&value[n].data[13], "on") == 0) {
|
||||||
|
lsopt.so_keepalive = 1;
|
||||||
|
|
||||||
|
} else if (ngx_strcmp(&value[n].data[13], "off") == 0) {
|
||||||
|
lsopt.so_keepalive = 2;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
u_char *p, *end;
|
||||||
|
ngx_str_t s;
|
||||||
|
|
||||||
|
end = value[n].data + value[n].len;
|
||||||
|
s.data = value[n].data + 13;
|
||||||
|
|
||||||
|
p = ngx_strlchr(s.data, end, ':');
|
||||||
|
if (p == NULL) {
|
||||||
|
p = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p > s.data) {
|
||||||
|
s.len = p - s.data;
|
||||||
|
|
||||||
|
lsopt.tcp_keepidle = ngx_parse_time(&s, 1);
|
||||||
|
if (lsopt.tcp_keepidle == NGX_ERROR) {
|
||||||
|
goto invalid_so_keepalive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s.data = (p < end) ? (p + 1) : end;
|
||||||
|
|
||||||
|
p = ngx_strlchr(s.data, end, ':');
|
||||||
|
if (p == NULL) {
|
||||||
|
p = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p > s.data) {
|
||||||
|
s.len = p - s.data;
|
||||||
|
|
||||||
|
lsopt.tcp_keepintvl = ngx_parse_time(&s, 1);
|
||||||
|
if (lsopt.tcp_keepintvl == NGX_ERROR) {
|
||||||
|
goto invalid_so_keepalive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s.data = (p < end) ? (p + 1) : end;
|
||||||
|
|
||||||
|
if (s.data < end) {
|
||||||
|
s.len = end - s.data;
|
||||||
|
|
||||||
|
lsopt.tcp_keepcnt = ngx_atoi(s.data, s.len);
|
||||||
|
if (lsopt.tcp_keepcnt == NGX_ERROR) {
|
||||||
|
goto invalid_so_keepalive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lsopt.tcp_keepidle == 0 && lsopt.tcp_keepintvl == 0
|
||||||
|
&& lsopt.tcp_keepcnt == 0)
|
||||||
|
{
|
||||||
|
goto invalid_so_keepalive;
|
||||||
|
}
|
||||||
|
|
||||||
|
lsopt.so_keepalive = 1;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
"the \"so_keepalive\" parameter accepts "
|
||||||
|
"only \"on\" or \"off\" on this platform");
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
lsopt.set = 1;
|
||||||
|
lsopt.bind = 1;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
invalid_so_keepalive:
|
||||||
|
|
||||||
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
"invalid so_keepalive value: \"%s\"",
|
||||||
|
&value[n].data[13]);
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
"invalid parameter \"%V\"", &value[n]);
|
"invalid parameter \"%V\"", &value[n]);
|
||||||
return NGX_CONF_ERROR;
|
return NGX_CONF_ERROR;
|
||||||
|
@ -77,6 +77,7 @@ typedef struct {
|
|||||||
#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
|
#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
|
||||||
unsigned ipv6only:2;
|
unsigned ipv6only:2;
|
||||||
#endif
|
#endif
|
||||||
|
unsigned so_keepalive:2;
|
||||||
|
|
||||||
int backlog;
|
int backlog;
|
||||||
int rcvbuf;
|
int rcvbuf;
|
||||||
@ -84,6 +85,11 @@ typedef struct {
|
|||||||
#if (NGX_HAVE_SETFIB)
|
#if (NGX_HAVE_SETFIB)
|
||||||
int setfib;
|
int setfib;
|
||||||
#endif
|
#endif
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
int tcp_keepidle;
|
||||||
|
int tcp_keepintvl;
|
||||||
|
int tcp_keepcnt;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
|
#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)
|
||||||
char *accept_filter;
|
char *accept_filter;
|
||||||
|
@ -308,6 +308,12 @@ found:
|
|||||||
addr->ctx = listen->ctx;
|
addr->ctx = listen->ctx;
|
||||||
addr->bind = listen->bind;
|
addr->bind = listen->bind;
|
||||||
addr->wildcard = listen->wildcard;
|
addr->wildcard = listen->wildcard;
|
||||||
|
addr->so_keepalive = listen->so_keepalive;
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
addr->tcp_keepidle = listen->tcp_keepidle;
|
||||||
|
addr->tcp_keepintvl = listen->tcp_keepintvl;
|
||||||
|
addr->tcp_keepcnt = listen->tcp_keepcnt;
|
||||||
|
#endif
|
||||||
#if (NGX_MAIL_SSL)
|
#if (NGX_MAIL_SSL)
|
||||||
addr->ssl = listen->ssl;
|
addr->ssl = listen->ssl;
|
||||||
#endif
|
#endif
|
||||||
@ -373,6 +379,13 @@ ngx_mail_optimize_servers(ngx_conf_t *cf, ngx_array_t *ports)
|
|||||||
ls->log.data = &ls->addr_text;
|
ls->log.data = &ls->addr_text;
|
||||||
ls->log.handler = ngx_accept_log_error;
|
ls->log.handler = ngx_accept_log_error;
|
||||||
|
|
||||||
|
ls->keepalive = addr[i].so_keepalive;
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
ls->keepidle = addr[i].tcp_keepidle;
|
||||||
|
ls->keepintvl = addr[i].tcp_keepintvl;
|
||||||
|
ls->keepcnt = addr[i].tcp_keepcnt;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
|
#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
|
||||||
ls->ipv6only = addr[i].ipv6only;
|
ls->ipv6only = addr[i].ipv6only;
|
||||||
#endif
|
#endif
|
||||||
|
@ -39,6 +39,12 @@ typedef struct {
|
|||||||
#endif
|
#endif
|
||||||
#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
|
#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
|
||||||
unsigned ipv6only:2;
|
unsigned ipv6only:2;
|
||||||
|
#endif
|
||||||
|
unsigned so_keepalive:2;
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
int tcp_keepidle;
|
||||||
|
int tcp_keepintvl;
|
||||||
|
int tcp_keepcnt;
|
||||||
#endif
|
#endif
|
||||||
} ngx_mail_listen_t;
|
} ngx_mail_listen_t;
|
||||||
|
|
||||||
@ -94,6 +100,12 @@ typedef struct {
|
|||||||
#endif
|
#endif
|
||||||
#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
|
#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
|
||||||
unsigned ipv6only:2;
|
unsigned ipv6only:2;
|
||||||
|
#endif
|
||||||
|
unsigned so_keepalive:2;
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
int tcp_keepidle;
|
||||||
|
int tcp_keepintvl;
|
||||||
|
int tcp_keepcnt;
|
||||||
#endif
|
#endif
|
||||||
} ngx_mail_conf_addr_t;
|
} ngx_mail_conf_addr_t;
|
||||||
|
|
||||||
|
@ -24,6 +24,12 @@ static char *ngx_mail_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,
|
|||||||
void *conf);
|
void *conf);
|
||||||
|
|
||||||
|
|
||||||
|
static ngx_conf_deprecated_t ngx_conf_deprecated_so_keepalive = {
|
||||||
|
ngx_conf_deprecated, "so_keepalive",
|
||||||
|
"so_keepalive\" parameter of the \"listen"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
static ngx_command_t ngx_mail_core_commands[] = {
|
static ngx_command_t ngx_mail_core_commands[] = {
|
||||||
|
|
||||||
{ ngx_string("server"),
|
{ ngx_string("server"),
|
||||||
@ -52,7 +58,7 @@ static ngx_command_t ngx_mail_core_commands[] = {
|
|||||||
ngx_conf_set_flag_slot,
|
ngx_conf_set_flag_slot,
|
||||||
NGX_MAIL_SRV_CONF_OFFSET,
|
NGX_MAIL_SRV_CONF_OFFSET,
|
||||||
offsetof(ngx_mail_core_srv_conf_t, so_keepalive),
|
offsetof(ngx_mail_core_srv_conf_t, so_keepalive),
|
||||||
NULL },
|
&ngx_conf_deprecated_so_keepalive },
|
||||||
|
|
||||||
{ ngx_string("timeout"),
|
{ ngx_string("timeout"),
|
||||||
NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
|
NGX_MAIL_MAIN_CONF|NGX_MAIL_SRV_CONF|NGX_CONF_TAKE1,
|
||||||
@ -446,6 +452,96 @@ ngx_mail_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ngx_strncmp(value[i].data, "so_keepalive=", 13) == 0) {
|
||||||
|
|
||||||
|
if (ngx_strcmp(&value[i].data[13], "on") == 0) {
|
||||||
|
ls->so_keepalive = 1;
|
||||||
|
|
||||||
|
} else if (ngx_strcmp(&value[i].data[13], "off") == 0) {
|
||||||
|
ls->so_keepalive = 2;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
u_char *p, *end;
|
||||||
|
ngx_str_t s;
|
||||||
|
|
||||||
|
end = value[i].data + value[i].len;
|
||||||
|
s.data = value[i].data + 13;
|
||||||
|
|
||||||
|
p = ngx_strlchr(s.data, end, ':');
|
||||||
|
if (p == NULL) {
|
||||||
|
p = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p > s.data) {
|
||||||
|
s.len = p - s.data;
|
||||||
|
|
||||||
|
ls->tcp_keepidle = ngx_parse_time(&s, 1);
|
||||||
|
if (ls->tcp_keepidle == NGX_ERROR) {
|
||||||
|
goto invalid_so_keepalive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s.data = (p < end) ? (p + 1) : end;
|
||||||
|
|
||||||
|
p = ngx_strlchr(s.data, end, ':');
|
||||||
|
if (p == NULL) {
|
||||||
|
p = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p > s.data) {
|
||||||
|
s.len = p - s.data;
|
||||||
|
|
||||||
|
ls->tcp_keepintvl = ngx_parse_time(&s, 1);
|
||||||
|
if (ls->tcp_keepintvl == NGX_ERROR) {
|
||||||
|
goto invalid_so_keepalive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s.data = (p < end) ? (p + 1) : end;
|
||||||
|
|
||||||
|
if (s.data < end) {
|
||||||
|
s.len = end - s.data;
|
||||||
|
|
||||||
|
ls->tcp_keepcnt = ngx_atoi(s.data, s.len);
|
||||||
|
if (ls->tcp_keepcnt == NGX_ERROR) {
|
||||||
|
goto invalid_so_keepalive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ls->tcp_keepidle == 0 && ls->tcp_keepintvl == 0
|
||||||
|
&& ls->tcp_keepcnt == 0)
|
||||||
|
{
|
||||||
|
goto invalid_so_keepalive;
|
||||||
|
}
|
||||||
|
|
||||||
|
ls->so_keepalive = 1;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
"the \"so_keepalive\" parameter accepts "
|
||||||
|
"only \"on\" or \"off\" on this platform");
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
ls->bind = 1;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
|
||||||
|
#if (NGX_HAVE_KEEPALIVE_TUNABLE)
|
||||||
|
invalid_so_keepalive:
|
||||||
|
|
||||||
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
|
"invalid so_keepalive value: \"%s\"",
|
||||||
|
&value[i].data[13]);
|
||||||
|
return NGX_CONF_ERROR;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||||
"the invalid \"%V\" parameter", &value[i]);
|
"the invalid \"%V\" parameter", &value[i]);
|
||||||
return NGX_CONF_ERROR;
|
return NGX_CONF_ERROR;
|
||||||
|
Loading…
Reference in New Issue
Block a user