Mercurial > hg > nginx
comparison src/http/ngx_http_core_module.c @ 7478:4f9b72a229c1
Multiple addresses in "listen".
Previously only one address was used by the listen directive handler even if
host name resolved to multiple addresses. Now a separate listening socket is
created for each address.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Fri, 15 Mar 2019 15:45:56 +0300 |
parents | 81d49f85afed |
children | c19ca381b2e6 |
comparison
equal
deleted
inserted
replaced
7477:c74904a17021 | 7478:4f9b72a229c1 |
---|---|
2713 static char * | 2713 static char * |
2714 ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy) | 2714 ngx_http_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy) |
2715 { | 2715 { |
2716 char *rv; | 2716 char *rv; |
2717 void *mconf; | 2717 void *mconf; |
2718 size_t len; | |
2719 u_char *p; | |
2718 ngx_uint_t i; | 2720 ngx_uint_t i; |
2719 ngx_conf_t pcf; | 2721 ngx_conf_t pcf; |
2720 ngx_http_module_t *module; | 2722 ngx_http_module_t *module; |
2721 struct sockaddr_in *sin; | 2723 struct sockaddr_in *sin; |
2722 ngx_http_conf_ctx_t *ctx, *http_ctx; | 2724 ngx_http_conf_ctx_t *ctx, *http_ctx; |
2800 *cf = pcf; | 2802 *cf = pcf; |
2801 | 2803 |
2802 if (rv == NGX_CONF_OK && !cscf->listen) { | 2804 if (rv == NGX_CONF_OK && !cscf->listen) { |
2803 ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t)); | 2805 ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t)); |
2804 | 2806 |
2805 sin = &lsopt.sockaddr.sockaddr_in; | 2807 p = ngx_pcalloc(cf->pool, sizeof(struct sockaddr_in)); |
2808 if (p == NULL) { | |
2809 return NGX_CONF_ERROR; | |
2810 } | |
2811 | |
2812 lsopt.sockaddr = (struct sockaddr *) p; | |
2813 | |
2814 sin = (struct sockaddr_in *) p; | |
2806 | 2815 |
2807 sin->sin_family = AF_INET; | 2816 sin->sin_family = AF_INET; |
2808 #if (NGX_WIN32) | 2817 #if (NGX_WIN32) |
2809 sin->sin_port = htons(80); | 2818 sin->sin_port = htons(80); |
2810 #else | 2819 #else |
2823 #if (NGX_HAVE_TCP_FASTOPEN) | 2832 #if (NGX_HAVE_TCP_FASTOPEN) |
2824 lsopt.fastopen = -1; | 2833 lsopt.fastopen = -1; |
2825 #endif | 2834 #endif |
2826 lsopt.wildcard = 1; | 2835 lsopt.wildcard = 1; |
2827 | 2836 |
2828 (void) ngx_sock_ntop(&lsopt.sockaddr.sockaddr, lsopt.socklen, | 2837 len = NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1; |
2829 lsopt.addr, NGX_SOCKADDR_STRLEN, 1); | 2838 |
2839 p = ngx_pnalloc(cf->pool, len); | |
2840 if (p == NULL) { | |
2841 return NGX_CONF_ERROR; | |
2842 } | |
2843 | |
2844 lsopt.addr_text.data = p; | |
2845 lsopt.addr_text.len = ngx_sock_ntop(lsopt.sockaddr, lsopt.socklen, p, | |
2846 len, 1); | |
2830 | 2847 |
2831 if (ngx_http_add_listen(cf, cscf, &lsopt) != NGX_OK) { | 2848 if (ngx_http_add_listen(cf, cscf, &lsopt) != NGX_OK) { |
2832 return NGX_CONF_ERROR; | 2849 return NGX_CONF_ERROR; |
2833 } | 2850 } |
2834 } | 2851 } |
3777 return NGX_CONF_ERROR; | 3794 return NGX_CONF_ERROR; |
3778 } | 3795 } |
3779 | 3796 |
3780 ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t)); | 3797 ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t)); |
3781 | 3798 |
3782 ngx_memcpy(&lsopt.sockaddr.sockaddr, &u.sockaddr, u.socklen); | |
3783 | |
3784 lsopt.socklen = u.socklen; | |
3785 lsopt.backlog = NGX_LISTEN_BACKLOG; | 3799 lsopt.backlog = NGX_LISTEN_BACKLOG; |
3786 lsopt.rcvbuf = -1; | 3800 lsopt.rcvbuf = -1; |
3787 lsopt.sndbuf = -1; | 3801 lsopt.sndbuf = -1; |
3788 #if (NGX_HAVE_SETFIB) | 3802 #if (NGX_HAVE_SETFIB) |
3789 lsopt.setfib = -1; | 3803 lsopt.setfib = -1; |
3790 #endif | 3804 #endif |
3791 #if (NGX_HAVE_TCP_FASTOPEN) | 3805 #if (NGX_HAVE_TCP_FASTOPEN) |
3792 lsopt.fastopen = -1; | 3806 lsopt.fastopen = -1; |
3793 #endif | 3807 #endif |
3794 lsopt.wildcard = u.wildcard; | |
3795 #if (NGX_HAVE_INET6) | 3808 #if (NGX_HAVE_INET6) |
3796 lsopt.ipv6only = 1; | 3809 lsopt.ipv6only = 1; |
3797 #endif | 3810 #endif |
3798 | |
3799 (void) ngx_sock_ntop(&lsopt.sockaddr.sockaddr, lsopt.socklen, lsopt.addr, | |
3800 NGX_SOCKADDR_STRLEN, 1); | |
3801 | 3811 |
3802 for (n = 2; n < cf->args->nelts; n++) { | 3812 for (n = 2; n < cf->args->nelts; n++) { |
3803 | 3813 |
3804 if (ngx_strcmp(value[n].data, "default_server") == 0 | 3814 if (ngx_strcmp(value[n].data, "default_server") == 0 |
3805 || ngx_strcmp(value[n].data, "default") == 0) | 3815 || ngx_strcmp(value[n].data, "default") == 0) |
3921 continue; | 3931 continue; |
3922 } | 3932 } |
3923 | 3933 |
3924 if (ngx_strncmp(value[n].data, "ipv6only=o", 10) == 0) { | 3934 if (ngx_strncmp(value[n].data, "ipv6only=o", 10) == 0) { |
3925 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) | 3935 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) |
3926 struct sockaddr *sa; | 3936 if (ngx_strcmp(&value[n].data[10], "n") == 0) { |
3927 | 3937 lsopt.ipv6only = 1; |
3928 sa = &lsopt.sockaddr.sockaddr; | 3938 |
3929 | 3939 } else if (ngx_strcmp(&value[n].data[10], "ff") == 0) { |
3930 if (sa->sa_family == AF_INET6) { | 3940 lsopt.ipv6only = 0; |
3931 | |
3932 if (ngx_strcmp(&value[n].data[10], "n") == 0) { | |
3933 lsopt.ipv6only = 1; | |
3934 | |
3935 } else if (ngx_strcmp(&value[n].data[10], "ff") == 0) { | |
3936 lsopt.ipv6only = 0; | |
3937 | |
3938 } else { | |
3939 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | |
3940 "invalid ipv6only flags \"%s\"", | |
3941 &value[n].data[9]); | |
3942 return NGX_CONF_ERROR; | |
3943 } | |
3944 | |
3945 lsopt.set = 1; | |
3946 lsopt.bind = 1; | |
3947 | 3941 |
3948 } else { | 3942 } else { |
3949 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | 3943 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
3950 "ipv6only is not supported " | 3944 "invalid ipv6only flags \"%s\"", |
3951 "on addr \"%s\", ignored", lsopt.addr); | 3945 &value[n].data[9]); |
3946 return NGX_CONF_ERROR; | |
3952 } | 3947 } |
3948 | |
3949 lsopt.set = 1; | |
3950 lsopt.bind = 1; | |
3953 | 3951 |
3954 continue; | 3952 continue; |
3955 #else | 3953 #else |
3956 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | 3954 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
3957 "ipv6only is not supported " | 3955 "ipv6only is not supported " |
4104 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, | 4102 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, |
4105 "invalid parameter \"%V\"", &value[n]); | 4103 "invalid parameter \"%V\"", &value[n]); |
4106 return NGX_CONF_ERROR; | 4104 return NGX_CONF_ERROR; |
4107 } | 4105 } |
4108 | 4106 |
4109 if (ngx_http_add_listen(cf, cscf, &lsopt) == NGX_OK) { | 4107 for (n = 0; n < u.naddrs; n++) { |
4110 return NGX_CONF_OK; | 4108 lsopt.sockaddr = u.addrs[n].sockaddr; |
4111 } | 4109 lsopt.socklen = u.addrs[n].socklen; |
4112 | 4110 lsopt.addr_text = u.addrs[n].name; |
4113 return NGX_CONF_ERROR; | 4111 lsopt.wildcard = ngx_inet_wildcard(lsopt.sockaddr); |
4112 | |
4113 if (ngx_http_add_listen(cf, cscf, &lsopt) != NGX_OK) { | |
4114 return NGX_CONF_ERROR; | |
4115 } | |
4116 } | |
4117 | |
4118 return NGX_CONF_OK; | |
4114 } | 4119 } |
4115 | 4120 |
4116 | 4121 |
4117 static char * | 4122 static char * |
4118 ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) | 4123 ngx_http_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) |