On Sat, Jan 03, 2015 at 04:40:19PM +0100, Christopher Zimmermann wrote:
> Hi,
>
>
> On Sat, 3 Jan 2015 14:42:18 +0100 Reyk Floeter <[email protected]> wrote:
>
> > On Thu, Jan 01, 2015 at 11:54:46PM -0500, Geoff Steckel wrote:
> > > Is there any way todo the equivalent of:
> > >
> > > server "an.example.com"
> > > listen on 192.168.2.99
> > > listen on 2001.fefe.1.1::99
> >
> > I used "include" directives to avoid duplications (see previous reply)
> > but the following diff allows to add aliases and multiple listen
> > statements.
> >
> > Reyk
>
> As I understand your diff you will duplicate the entire struct
> server_config for each combination of hostname (alias), listen address
> and location section.
Correct.
> Isn't this overkill?
No, it is just a few K per server block that is allocated once on
startup. How many aliases do you have?
My tests show that memory usage is not the problem but that there's
indeed a problem with the pre-opened file descriptors for servers;
something that is not necessary with aliases. A simple fix will follow.
> To me it seems like server_config is serving too much purposes here. A
> clean design should split up the struct server_config into one struct
> for connection settings, which will contain a TAILQ of hostnames, a
> TAILQ of listen addresses and a TAILQ of structs with location settings:
>
"A clean design should ..."
One could argue that a clean design wouldn't try to add too many
layers of indirection that add code complexity and kill some of the
flexibility that we have with the current implementation. I might
split up struct server_config at some point, when it is really needed,
but it is not the right time.
> TAILQ_HEAD(hostnames, char*);
>
> struct server_config {
> char location[NAME_MAX];
> char root[MAXPATHLEN];
> [...]
> }
> TAILQ_HEAD(server_configs, server_config);
>
> struct serverhost {
> struct sockaddr_storages *srv_ss;
> char *tls_cert;
> int tcpbufsize;
> [... other connection settings ...]
> struct hostnames *srv_names;
> struct server_configs *srv_confs;
> }
>
>
> For now you could simply loop over a TAILQ of hostnames in
> server_privinit() and add an inner LOOP in server_response() searching
> for the hostname/aliases.
>
>
Which makes the implementation more complicated, especially the reload
and privsep code, adds additional loops to save a few bytes of memory.
Don't get me wrong - I do care about memory usage - but this is not
per connection - it is persistent during runtime.
Reyk