nginx之虚拟主机与请求的分发

2023-11-18


由于IP地址有限,因此经常存在多个主机域名对应同一个IP地址的情况,这时nginx.conf中就可以按照server_name(对应用户请求中的主机域名)并通过server块来定义虚拟主机,每个server块就是一个虚拟主机,它只处理与之相对应的主机域名请求。这样,一台服务器上的nginx就能以不同的方式处理访问不同主机域名的http请求了。


相关配置项

(1). 监听端口

语法:listen address:port [default | default_server | ...]
默认:listen 80
配置块:server

listen参数决定Nginx服务如何监听端口。在listen后可以只加IP地址、端口或主机名,例如:

listen 127.0.0.1:8000;
listen 127.0.0.1;#默认监听80端口
listen 8000;#默认是127.0.0.1
listen *:8000;
listen localhost:8000

参数:
default:将所在的server作为整个Web服务的默认server块。如果没有设置这个参数,那么将会以在nginx.conf中找到的第一个server块作为默认server块。为什么需要默认虚拟主机呢?当一个请求无法匹配配置文件中的所有主机域名时,就会选用默认的虚拟主机。
default_server:同上。
其它参数暂时不列举。

(2)主机名称

语法:server_name name [...]
默认:server_name "";
配置块:server

server_name后可以跟多个主机名称,如server_name www.testweb.com、download.testweb.com;

在开始处理一个http请求时,Nginx会取出header头中的Host,与每个server中的server_name进行匹配,以决定到底由哪一个server块来处理这个请求。有可能一个host与多个server块中的 server_name 都匹配,这时就会根据匹配优先级来选择实际处理的server块。server_name与host的匹配优先级如下:
1)首先选择所有字符串都匹配的server_name,如www.testweb.com
2)其次选择通配符在前面server_name,如*.testweb.com
3)再次选择通配符在后面的server_name,如www.textweb.*
4)最后选择使用正则表达式才匹配的server_name,如~^.testweb.com$
如果Host与所有的server_name都不匹配,这时将会按下列顺序选择处理的server块:
1)优先选择在listen配置项后加入[default | default_server]的server块
2)找到匹配listen端口的第一个server块
如果server_name后跟着空字符串(如server_name ”“;),那么表示匹配没有Host这个http头部的请求。
(3)server_names_hash_bucket_size
语法:server_names_hash_bucket_size size;
配置块:http、server、location
为了提高快速找到相应server_name的能力,Nginx使用散列表来存储server_name。server_name_hash_bucket_size设置了每个散列桶占用的内存大小。
(4)server_names_hash_max_size

    语法:server_names_hash_max_size size;
    默认:server_names_hash_max_size 512
    配置块:http、server、location

server_names_hash_max_size会影响散列表的冲突率 。server_names_hash_max_size越大,消耗的内存就越多,但散列key的冲突率则会降低,检索速度也更快。server_names_hash_max_size越小,小号的内存就越少,但散列key嘚瑟冲突率就啃增高。
(5)重定向主机名称的处理
语法:server_name_in_rediect on | off;
默认:server_name_in_redirect on;
配置块:http、server或者location
该配置需要配合server_name使用,在使用on打开时,表示在重定向请求时会使用server_name里配置的第一个主机名代替原先请求的Host头部,而使用off关闭时,表示在重定向请求时使用请求本身的Host头部。
(6)location
语法:location [=|~|~*|@] /uri/ {…}
配置块:server
location会尝试根据用户请求后中的uri来匹配上面的/uri表达式,如果可以匹配,就选择location {}块中的配置来处理用户请求。当然,匹配方式是多样的,下面介绍location匹配规则。
1)= 表示把URI作为字符串,以便与参数中的uri完全匹配。例如:

    location = / {
        #只有当用户请求是 / 时,才会使用location下的配置
    }

2)~表示匹配URI时事字母大小写敏感的。
3)~*表示匹配URI时忽略字母大小写问题。
4)^~表示匹配URI时只需要其前半部分与uri参数匹配即可。例如:

   location ^~ /images/ {
        #以/images/开始的请求都会匹配上
        ...
    }

5)@表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求。
当然,在uri参数里是可以用正则表达式的,例如:

location ~* \.(gif|jpeg|jpg)$ {
    #匹配以.gif .jpeg .jpg 结尾的请求
    ...
}

注意,location是有顺序的,当一个请求有可能匹配多个location时,实际上这个请求会被第一个匹配上的location处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nginx之虚拟主机与请求的分发 的相关文章

随机推荐

  • Linux下的代码编辑器

    2023年5月16日 周二早上 昨天晚上和今天早上捣鼓了一行Linux下的代码编辑器 踩了几个坑 现在写篇博客记录一下 我使用的是Centos Linux下的代码编辑器有哪些 在Linux中 有很多代码编辑器可以供选择 以下是其中一些主要的
  • (二)Java 虚拟机具体是怎样运行 Java 字节码的?

    Write Once Run Anywhere Java 祖师爷就是由于发现用 C 开发的过程中会花大量的时间处理内存 不同的指令架构等的问题 所以才有高 移植性 的Java 诞生 采访Java 祖师爷的报道链接 And there are
  • sql 优化

    sql 优化 1 mysql 基础架构 1 1 mysql 的组成 2 mysql 存储引擎 2 1MyISAM 2 2 InnoDB 2 3 MyISAM 和 InnoDB 的对比 3 mysql 索引 3 1 Hash 索引 3 2 B
  • QT 中的延时函数和精准定时器的用法

    一 QT中的延时函数比较常用的三种方法 第一种 void MainWindow Delay int msec 这个最准 非阻塞方式延时 现在很多人推荐的方法 QEventLoop loop QTimer singleShot msec lo
  • 知识点——初识java中File类

    1 1 什么是File类 SUN公司提供给开发者操作文件和文件夹的一个类对象 Java中万物皆对象 计算机中万物皆文件 获取File类有三种方式 Constructor 构造方法 File String pathName 根据对应的文件路径
  • 95-31-020-ChannelGroup-DefaultChannelGroup

    1 拓扑图
  • HT1621B液晶驱动(附电路图)

    最近做了一个项目用到了HT1621 电路图 datasheet code HT1621B datasheet include ht1621 h void ht1621 send high order data UCHAR data UCHA
  • JS实现数组扁平化的 5 种方式

    一 普通递归的思路很容易理解 就是通过for循环的方式 逐层逐个元素地去展平 如果当前元素是一个数组 那么就对它进行递归处理 再将递归处理的结果拼接到结果数组上 let arr 1 2 3 4 5 function flatten arr
  • 【简易广告机】利用树莓派制作一个简易的广告机(1)

    利用树莓派做一个简单的广告机 废话不多说开始 1 安装 omxplayer omxplayer 简易介绍 omxplayer是专门针对树莓派的GPU的播放器 支持硬件解码 最高支持分辨率是1080P omxplayer这个命令行播放器 是专
  • 怎么修改vue项目图标和标题

    要修改 Vue 项目的图标和标题 需要在 Vue 项目的 public 目录下添加 favicon ico 文件作为图标 并在 index html 中通过标签修改标题 具体步骤如下 在 public 目录下添加图标 favicon ico
  • 【环境配置】Collecting package metadata (current_repodata.json): failed的问题解决

    在使用conda创建新环境时 出现Collecting package metadata current repodata json failed的问题 尝试了很多方法都没有解决 最后解决了 解决链接 https download csdn
  • JPEG编码过程详解

    JPEG编码过程详解 本文旨在对JPEG编码过程中的细节步骤进行说明 具体原理部分请参照Wikipedia 色彩空间转换 原始图像的像素点是以RGB形式存储的 即每个像素点由3个字节的数据组成 分别为Red通道 Green通道和Blue通道
  • sqlite数据库查看里面数据库版本号

    在android sqlite数据库开发中 常会把手机上的具体数据库拷贝到电脑上进行查看 而数据库升级也比较多 升级也容易出问题 如果有时候某个用户报了一个bug或者测试测出一个bug 然后把他的数据库 db文件拷贝给你 这时候你需要先确定
  • 多线程:多个线程共享数据

    在 Java 传统线程机制中的共享数据方式 大致可以简单分两种情况 多个线程行为一致 共同操作一个数据源 也就是每个线程执行的代码相同 可以使用同一个 Runnable 对象 这个 Runnable 对象中有那个共享数据 例如 卖票系统就可
  • 更进一步!可视化一切递归算法!

    学算法认准 labuladong 后台回复课程查看精品课 点击卡片可搜索文章 在线学习网站 https labuladong gitee io algo 上次我发布了算法代码可视化功能 适配了我的网站和我的系列插件 最近我修复了一些 bug
  • 有测试辐射的软件,装个可以查看辐射的APP应用,测测你的手机辐射有多大

    近日关于一款检测手机辐射量的应用Tawkon开始受到媒体和用户关注 这款软件早在去年就已经准备推出iOS版本 最终因为苹果API限制被帮主拒绝 随后他们又开始准备Android版本 并于近日正式发布 手机辐射到现在依然是一个争议性话题 没有
  • 使用指针实现: 输入两个字符串,将这两个字符串连接后输出。

    使用指针实现 输入两个字符串 将这两个字符串连接后输出 include
  • SpringSecurity解决跨域问题的方法

    跨域问题产生原因 现在越来越多的项目都采用前后端分离的开发模式 以实现前后端代码解耦的目的 处于安全考虑 后端服务器对收到的请求进行了限制和区分 因此出现跨域访问不到数据的情况 什么是跨域 当协议 域名 端口号 有一个或多个不同时 前端请求
  • Jira、Redmine横向对比:哪个更适合做研发项目管理

    如果你是一个软件开发团队的成员或者负责人 你可能会遇到这样的问题 该选择哪种项目管理和协作工具来提高工作效率和质量 市面上有很多这样的工具 比如 Redmine 和 Jira 它们都有各自的优缺点 适合不同的场景和需求 本文将从以下几个方面
  • nginx之虚拟主机与请求的分发

    由于IP地址有限 因此经常存在多个主机域名对应同一个IP地址的情况 这时nginx conf中就可以按照server name 对应用户请求中的主机域名 并通过server块来定义虚拟主机 每个server块就是一个虚拟主机 它只处理与之相