Map module - mass hosting

Hello all,

I’d like to use map module for my vhost configuration to setup user name
in
root or fastcgi_pass parameter.

At this point i’ve 300 domains configured and my config look like this:

http
{
server {

root /home/someuser;

  location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/www/someuser/fpm.socket;

include fastcgi_params.conf;

}

 ............
  }

}

I’d like to replace this model by using map module like this

http
{

#map with about 300 domains

map $http_host $username {
example.com someuser;
escample2.com someuser2;

}

   server {
   ..........
    root /home/$username;

  include fastcgi.conf;

 ............
  }

}

fastcgi.conf:

location ~ .php$ {
try_files $uri =404;
fastcgi_pass unix:/var/www/$username/fpm.socket;

include fastcgi.conf;

}

My question is - Is this a good idea to use map like this ? Every
request
needs to find out username by $http_host searching through few hundreds
of
domains. Maybe i’m wrong but it can slow down request processing
significantly.
Any suggestions ?

Posted at Nginx Forum:

Hello!

On Wed, Apr 23, 2014 at 08:07:42AM -0400, beatnut wrote:

I’d like to use map module for my vhost configuration to setup user name in
root or fastcgi_pass parameter.

At this point i’ve 300 domains configured and my config look like this:

http
{
server {

root /home/someuser;

[…]

escample2.com someuser2;

}

   server {
   ..........
    root /home/$username;

[…]

My question is - Is this a good idea to use map like this ? Every request
needs to find out username by $http_host searching through few hundreds of
domains. Maybe i’m wrong but it can slow down request processing
significantly.
Any suggestions ?

Searching within a map is basically identical to searching for
appropriate server{} block, both use the same internal mechanism
(ngx_hash). As long as you don’t use regular expressions,
lookup complexity is O(1).

Distinct server{} blocks might be more CPU-efficient due to no need to
evaluate variables and dynamically allocate memory for resulting
strings on each request.

On the other hand, multiple server{} blocks consume memory for
each server’s configuration, and map{} approach may be more
effective if there are many mostly identical server{} blocks.


Maxim D.
http://nginx.org/

Thank You for answer.
I’ve additional questions.

Maxim D. Wrote:

domains. Maybe i’m wrong but it can slow down request processing
significantly.
Any suggestions ?

Searching within a map is basically identical to searching for
appropriate server{} block, both use the same internal mechanism
(ngx_hash). As long as you don’t use regular expressions,
lookup complexity is O(1).

So using for example:

.example.com
or
example.*

have more complexity or it shoud have full list of subdomains for
better
performance:

www.example.com
example.com

Distinct server{} blocks might be more CPU-efficient due to no need to

evaluate variables and dynamically allocate memory for resulting
strings on each request.

My configuration include one file with server{} per domain.
exaple.com.conf
example2.conf
etc

The main improvement i’d like to implement is to have one file with php
config like fastcgi.conf above and then include it in every server{}
Map module gives me this opportunity.

[email protected]
nginx Info Page

Posted at Nginx Forum:

Thank You for explanation and advise.

Maxim D. Wrote:

www.example.com

strings on each request.
Map module gives me this opportunity.

Maxim D.
http://nginx.org/


nginx mailing list
[email protected]
nginx Info Page

Posted at Nginx Forum:

Hello!

On Wed, Apr 23, 2014 at 09:27:33AM -0400, beatnut wrote:

[…]

have more complexity or it shoud have full list of subdomains for better
performance:

www.example.com
example.com
example.somedomain.com

While wildcards require more work on each lookup, complexity is
still O(1). Note that regular expressions != wildcard names.

The main improvement i’d like to implement is to have one file with php
config like fastcgi.conf above and then include it in every server{}
Map module gives me this opportunity.

This is not something I would recommend to do. If you have
server{} block per domain, you should have enough data to write
configuration without introducing another map ($document_root,
$server_name, and so on).

Please also see this FAQ article:

http://nginx.org/en/docs/faq/variables_in_config.html


Maxim D.
http://nginx.org/