Virtualhosts and map

Maxim Dounin mdounin at mdounin.ru
Wed Feb 27 13:03:54 UTC 2013


Hello!

On Wed, Feb 27, 2013 at 06:40:27AM -0500, Varix wrote:

> Hallo Jonathan,
> 
> I have some proplems with the english language. This is bad in the IT
> section.
> 
> My problem is, i can't find an complett example to do that for education.
> All I find is
> the "old Way" with sites-availbled and sites-enabled, what I have done for
> years.
> 
> In January I chance nginx to the new version.
> 
> My files in the folder sites-availabled
> default
> example1.com
> example2.com
> example3.com
> 
> 
> My default file
> 
> # default server
> #
> 
> server {
>     listen       80 default_server;
>     server_name  _;
>     access_log logs/default/default.access.log;
>     error_log logs/default/default.error.log;
>     
>     root /www/default;
>     
>     location / {
>         root   /www/default;
>         index  index.html index.htm;
>     }
> 
>     location /i/ {
>          alias /www/123/;
>         }     
>     
>     # redirect server error pages to the static page /40x.html
>     #
>     
>     error_page 400 401 402 403 404  /40x.html;
>     location = /40x.html {
>          root  /www/default/html;
>     }
> 
>     # redirect server error pages to the static page /50x.html
>     #
>     error_page   500 502 503 504  /50x.html;
>     location = /50x.html {
>         root   /www/default/html;
>     }
>     
> 
> If the IP (xxx.xxx.xxx.xxx) is type in the browser, it shows only domain
> example1.com.
> 
> After a few days I found the reason for this:
> 
> Change: now if the "include" directive with mask is used on Unix
>              systems, included files are sorted in alphabetical order.

This can't be a reason as long as you have "default_server" 
parameter of the "listen" directive properly set for listen 
sockets used.

> My solution for this is to make a new big nginx.conf
> In the part with the serverblocks the latest is the default one and all is
> OK.
> This solution is OK for a few domains, but not for many domains.
> I read that this can be done with map. But I can't find an example for
> this.
> 
> Now I am looking for examples how I can do that with map.
> 
> This from the nginx docu is not enough for me.
> 
> map $http_host $name {
>     hostnames;
> 
>     default       0;
> 
>     example.com   1;
>     *.example.com 1;
>     example.org   2;
>     *.example.org 2;
>     .example.net  3;
>     wap.*         4;
> }

Maps may be used to handle multiple domains in one server block, 
e.g. to set document root depending on a domain:

    map $host $server_root {
        hostnames;

        default           /www/default;
        foo.example.com   /www/foo;
        foo.example.org   /www/foo;
        bar.example.com   /www/bar;
    }

    server {
        listen 80;
        server_name foo.example.com foo.example.org bar.example.com ...;

        root $server_root;

        ...
    }

This aproach may be usable if you have mostly identical handling 
for many domains, with some minor differences which can be handled 
using variables.  It only makes sense if you have really many 
domains (thousands of), and can't afford distinct server{} blocks 
for them.

-- 
Maxim Dounin
http://nginx.com/support.html



More information about the nginx mailing list