浅析nginx的server及server_name的意义详解

一、server_name 详解

  当Nginx接到请求后,会匹配其配置中的server模块。匹配方法就是靠请求携带的host和port正好对应其配置中的server_name 和listen。如果做过ip和域名绑定,ip和域名二者是对等的。

  server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序的优先级分别为:

1、准确的server_name匹配:server {     listen       80;     server_name  domain.com  www.domain.com;     }

2、以*通配符开始的字符串:server {     listen       80;     server_name  *.domain.com;   }

3、以*通配符结束的字符串:server {     listen       80;     server_name  www.*;     }

注意: 通配符名字只可以在名字的起始处或结尾处包含一个星号,并且星号与其他字符之间用点分隔。所以 www.*.example.org w*.example.org 都是非法的。

有一种形如 .example.org 的特殊通配符,它可以既匹配确切的名字 example.org,又可以匹配一般的通配符名字 *.example.org

4、匹配正则表达式:server {     listen       80;     server_name  ~^(?.+)\.domain\.com$;     }

  Nginx会按照以上1 > 2 > 3 > 4 的顺序对server name进行匹配(而和配置段本身的排版顺序无关),只要有一项匹配以后就会停止搜索,所以在使用这个指令的时候一定要分清楚它的匹配优先级顺序,与location指令类似。

  所以需要注意的是:第一,分清楚匹配优先级顺序;第二,在优先级一样的情况下,需要注意匹配顺序,只要有一项匹配后就会停止搜索的。

二、server_name 应用

  server_name指令一项很实用的功能就是可以在使用正则表达式的捕获功能,这样可以尽量精简配置文件,毕竟太长的配置文件不利于日常的维护工作。下面是2个具体的应用

1、在一个server块中配置多个站点

server {
  listen 80;
  
server_name ~^(www\.)?(.+)$;

  index index.php index.html;
  root /data/wwwsite/$2;
}

  构建类似如下的站点目录结构,这样就可以只使用一个server块来完成多个站点的配置映射关系。如:/data/wwwsite/biying.com、/data/wwwsite/baidu.com、/data/wwwsite/google.com

  可以分析以上server配置段,发现使用了$2,而$2 正是server_name正则表达式【~^(www\.)?(.+)$】的第二个分组。

  正则表达式捕获组创建了变量,普通的正则表达式捕获组可以创建$0、$1、…、$9这10个变量。$0表示原串,$1-$9表示第一到第九个匹配组的内容。

2、在一个server块中为一个站点配置多个二级域名

  实际网站目录结构中通常会为站点的二级域名独立创建一个目录,同样可以使用正则的捕获来实现在一个server块中配置多个二级域名

server{
  listen 80;
  server_name ~^(.+)?\.domain\.com$;
  index index.html;
  if ($host = domain.com){
    rewrite ^ http://www.domain.com permanent;
  }
  root /data/wwwsite/domain.com/$1/;
}

  站点的目录结构应该如下:/data/wwwsite/domain.com/www/、/data/wwwsite/domain.com/blog/、/data/wwwsite/domain.com/bbs/

  访问www.domain.com时,root目录为 /data/wwwsite/domain.com/www/

  blog.domain.com时,为root目录为/data/wwwsite/domain.com/blog/,以此类推。

  上面 root 里的 $1 的匹配就是 server_name 里的正则匹配的第一个分组

  后面if语句的作用是将domain.com的方位重定向到www.domain.com,这样既解决了网站的主目录访问,又可以增加SEO中对www.domain.com的域名权重。另外,server_name 同样支持使用ip进行匹配。

3、多个正则表达式

  如果你在server_name中用了正则,而下面的location字段又使用了正则匹配,这样将无法使用$1,$2这样的引用,解决方法是通过set指令将其赋值给一个命名的变量:

server {
     listen      80;
     server_name ~^(.+)?\.sklinux\.com$;
     set $www_root $1;
     root /data/wwwsite/sklinux.com/$www_root/;
     location ~ .*\.php?$ {
         fastcgi_pass   127.0.0.1:9000;
         fastcgi_index  index.php;
         fastcgi_param  SCRIPT_FILENAME /data/wwwsite/sklinux.com/$fastcgi_script_name;
         include        fastcgi_params;
   }
}

 

posted @ 2017-06-14 20:00  古兰精  阅读(1116)  评论(0编辑  收藏  举报