Nginx(三)

本文详细介绍了Nginx如何处理基于名称的虚拟服务器请求,包括配置多个基于名称的虚拟服务器、防止处理未定义server名称的请求以及混合基于名称和基于IP的虚拟服务器的设置。此外,还讲解了Nginx服务器名称的使用,如通过server_name指令定义服务器名称,并解释了匹配优先级。
摘要由CSDN通过智能技术生成

nginx 处理请求

基于名称的虚拟服务器

  1. 基于名称(指 HTTP 请求头 Host 字段)的虚拟服务器指通过 HTTP 请求头的 Host 来决定客户端请求由哪个 server 进行处理。
    ser

  2. 配置三个虚拟服务器,均侦听80端口

    ver {
        listen      80;
        server_name example.org www.example.org;
        ...
    }
     
    server {
        listen      80;
        server_name example.net www.example.net;
        ...
    }
     
    server {
        listen      80;
        server_name example.com www.example.com;
        ...
    }
    
  3. 上面配置中,nginx 仅测试请求的头字段“Host”以确定应将请求路由到哪个 server

  4. 如果“Host”的值与任何 server 名称都不匹配,或者请求根本不包含“Host”头字段,则 nginx 会将请求路由到此端口的默认 server

  5. 默认 server 是第一个server ,这是 nginx 的标准默认行为

  6. 还可以使用 listen 指令中的 default_server 参数明确设置哪个 server 应该是默认 server:

    server {
        listen      80 default_server;
        server_name example.net www.example.net;
        ...
    }
    

防止处理具有未定义 server 名称的请求

  1. 如果不允许处理没有“Host”头字段的客户端请求(反过来说,只处理带有 Host 头字段的客户端请求),可以定义一个只丢弃请求的 server:

    server {
        listen      80;
        server_name "";
        return      444;
    }
    
  2. server_name 设置为一个空字符串,它将匹配没有“Host”头字段的请求,并返回一个特殊的 nginx 非标准代码 444 来关闭连接。

混合基于名称和基于 IP 的虚拟服务器

  1. 不同的虚拟服务器侦听不同的地址:

    server {
        listen      192.168.1.1:80;
        server_name example.org www.example.org;
        ...
    }
     
    server {
        listen      192.168.1.1:80;
        server_name example.net www.example.net;
        ...
    }
     
    server {
        listen      192.168.1.2:80;
        server_name example.com www.example.com;
        ...
    }
    
  2. 上面配置中,nginx 首先根据 server 块的 listen 指令测试请求的 IP 地址和端口

  3. nginx根据与 IP 地址和端口匹配的 server 块的 server_name 条目测试请求的“Host”标头字段。如果未找到服务器名称,则请求将由默认服务器处理

  4. 在 192.168.1.1:80 端口上收到的 www.example.com 请求将由 192.168.1.1:80 端口的默认服务器处理,即由第一个服务器处理,因为没有 www.example .com 为此端口定义。

  5. 为不同的端口定义不同的默认服务器:

    server {
        listen      192.168.1.1:80;
        server_name example.org www.example.org;
        ...
    }
     
    server {
        # 定义默认服务器
        listen      192.168.1.1:80 default_server;
        server_name example.net www.example.net;
        ...
    }
     
    server {
        # 定义默认服务器
        listen      192.168.1.2:80 default_server;
        server_name example.com www.example.com;
        ...
    }
    

Nginx 服务器名称

  1. 服务器名称使用 server_name 指令定义,并确定给定客户端请求由哪个 server 块进行处理

  2. 服务器名称可以使用确切名称、通配符名称或正则表达式来定义

    server {
        listen       80;
        server_name  example.org  www.example.org;
        ...
    }
     
    server {
        listen       80;
        server_name  *.example.org;
        ...
    }
     
    server {
        listen       80;
        server_name  mail.*;
        ...
    }
     
    server {
        listen       80;
        server_name  ~^(?<user>.+)\.example\.net$;
        ...
    }
    
  3. 按服务器名称搜索虚拟服务器时,如果名称与多个指定变体 server_name 匹配(例如通配符名称和正则表达式都匹配),将按以下优先顺序选择第一个匹配的变体 server_name:

    1. 确切名称,优先级最高
    2. 以星号开头的最长通配符名称,例如 “*.example.org”
    3. 以星号结尾的最长通配符名称,例如 “mail.*”
    4. 第一个匹配的正则表达式(按在配置文件中出现的顺序)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值