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)