2019独角兽企业重金招聘Python工程师标准>>>

当Nginx收到请求后,Nginx分成两部分进行,包括server_name和URL,首先Nginx通过server_name匹配来确定使用哪个server块来处理请求。

分 析

当用户的访问通过网络与nginx建立连接后,nginx首先通过http协议里Request Headers中的Host字段来解析成server_name. 这里我们使用curl命令来查看。如果提示无该命令,centos可使用yum -y install curl 来安装。

[root@slave2 ~]# curl localhost -v
* About to connect() to localhost port 80 (#0)
*   Trying ::1... Connection refused
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: localhost
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.12.2
< Date: Mon, 08 Jan 2018 09:43:50 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Tue, 17 Oct 2017 13:25:44 GMT
< Connection: keep-alive
< ETag: "59e604d8-264"
< Accept-Ranges: bytes
< * Connection #0 to host localhost left intact
* Closing connection #0

这里注意

> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: localhost
> Accept: */*
>

nginx解析该请求,得到当前请求的server_name为localhost。当nginx启动时会加载所有的配置文件,并将配置文件中的server指令定义的块中的server_name加入到server_names_hash中,这里注意,如果没有定义 default_server会多加入一个server_name为default_server的server块。

我们来看如下nginx配置文件,省略部分无影响的配置。

server {listen      80;server_name 172.19.23.208;
}server {listen      80;server_name test.com;}server {listen      808;server_name 172.19.23.208;
}

Note 对于test.com,你可能需要通过指定hosts文件来使该域名访问到nginx。

[root@slave2 ~]# curl 172.19.23.208:808 -v
* About to connect() to 172.19.23.208 port 808 (#0)
*   Trying 172.19.23.208... connected
* Connected to 172.19.23.208 (172.19.23.208) port 808 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: 172.19.23.208:808
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Server: nginx/1.12.2
< Date: Mon, 08 Jan 2018 10:03:39 GMT
< Content-Type: text/html
< Content-Length: 169
< Connection: keep-alive
<

注意Host字段变成172.19.23.208:808,nginx解析它,server_name为172.19.23.208,port为808,port在server_name匹配前已使用,所以nginx会使用配置段

server {listen      808;server_name 172.19.23.208;
}

来处理该请求,至于请求后续的处理,后面来看。

这里要知道,nginx的server匹配是有优先级的,官方文档,这在host能匹配多个server块时尤其重要。 匹配原则如下

  1. exact name 精确名(eg "www.test.com","172.19.23.208")
  • longest wildcard name starting with an asterisk, e.g. “*.example.org” 星号开始的最长通配符名
  • longest wildcard name ending with an asterisk, e.g. “mail.*” 星号结束的最长通配符名
  • first matching regular expression (in order of appearance in a configuration file) 最先匹配的正则表达式名(除开星号开始和结束的正则表达式 eg, "~^(?<user>.+).example.net$")

性能优化

Exact names, 星号开始的最长通配符名,星号结束的最长通配符名在三个哈希表中,哈希表的尺寸在configuration phase进行了优化,这里有一点点性能不同, server_name按照域名来搜索的,所以exact names速度最快。注意.example.org储存在星号开始的最长通配符名的哈希表中。 正则表达式是串行测试,所以最慢,且不可扩展。

所以请尽可能使用exact name。example.org和www.example.org被访问得最频繁的,那么将它们明确的定义出来效果就会更好。

server {listen       80;server_name  example.org  www.example.org  *.example.org;...
}

实际书写nginx配置文件时,尽量使用exact name作为server_name 这样一目了然,同时避免新手歧义,也带来性能提升。

这里有两个参数

server_names_hash_max_size server_name哈希表空间最大,等同于为python字典设置了最大key的个数。server_names_hash_bucket_size server_name最大长度,等同于python字典string value的最大长度。

比如:

server {server_name too.long.server.name.example.org;
}

启动(或reload)提示

could not build the server_names_hash,
you should increase server_names_hash_bucket_size: 32

处理:

http {server_names_hash_bucket_size  64;...
}

另一个我们有个托管的虚拟主机,有大量的server_name需要引入时:

could not build the server_names_hash,
you should increase either server_names_hash_max_size: 512
or server_names_hash_bucket_size: 32

先尝试设置server_names_hash_max_size的值差不多等于哈希表key的总数。如果没用,或者服务器启动非常缓慢,再提高server_names_hash_bucket_size的值。

如果只为一个监听端口配置了唯一的主机,那么nginx就完全不会测试虚拟主机名了(也不会为监听端口建立哈希表)。但有一个例外,如果定义的虚拟主机名是一个含有捕获组的正则表达式,这时nginx就不得不执行这个表达式以得到捕获组。

当server_name匹配完成后,便会进行nginx的phase handler,即处理阶段。

转载于:https://my.oschina.net/monkeyzhu/blog/1649580

nginx 如何处理请求系列3-server_name指令相关推荐

  1. nginx 如何处理请求系列1-Nginx安装

    2019独角兽企业重金招聘Python工程师标准>>> 一些准备工作,常见问题 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/PO ...

  2. nginx怎么处理php,nginx如何处理请求

    当请求到达nginx服务器之时 如果我们配置文件如下:server { listen 80; server_name example.org www.example.org; ... } server ...

  3. nginx匹配规则_Nginx系列之server_name定义与匹配规则

    Nginx系列之server_name定义与匹配规则 server_name用来指定请求中的Host头部,在上一节的基于域名的虚拟机中,nginx匹配的规则就是根据server_name的不同,结合请 ...

  4. nginx学习笔记(7)Nginx如何处理一个请求---转载

    如何防止处理未定义主机名的请求 基于域名和IP混合的虚拟主机 一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在 ...

  5. Nginx中server_name指令介绍

    Nginx中server_name指令介绍 用途 根据官方文档说明,用来设置虚拟服务器,对于用IP还是请求头部中的Host字段内容设置这个指令的值,没有明确的分别. 用法 指令后跟特定域名,此时第一个 ...

  6. nginx的请求接收流程(一)

    今年我们组计划写一本nginx模块开发以及原理解析方面的书,整本书是以open book的形式在网上会定时的更新,网址为http://tengine.taobao.org/book/index.htm ...

  7. nginx实现请求的负载均衡 + keepalived实现nginx的高可用

    前言 使用集群是网站解决高并发.海量数据问题的常用手段.当一台服务器的处理能力.存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求.这种 ...

  8. Nginx技巧:灵活的server_name,Nginx配置一个服务器多个站点 和 一个站点多个二级域名...

    http://www.cnblogs.com/buffer/archive/2011/08/17/2143514.html Nginx强大的正则表达式支持,可以使server_name的配置变得很灵活 ...

  9. nginx限制请求之一:(ngx_http_limit_conn_module)模块

    相关文章: <高可用服务设计之二:Rate limiting 限流与降级> <nginx限制请求之一:(ngx_http_limit_conn_module)模块> <n ...

最新文章

  1. Java学习day010(oop):向上造型
  2. 信息系统项目管理师为什么不建议自学
  3. Mastering Android NDK Build System - Part 1: Techniques with ndk-build
  4. 自己做的一个登录页面,纯代码!
  5. 网络安全技术之端口隔离
  6. LinkedList源码阅分析
  7. Python使用UDP协议实现局域网内屏幕广播
  8. MySQL的IFNULL解决判空问题
  9. jQuery方式追加div覆盖
  10. DataGrid实现单选功能,将DataGrid绑定的单选钮放在一个组里
  11. Spring Boot 中使用WebJars
  12. Jenkins+Spring Boot构建部署
  13. modulenotfounderror python_你所不知道的 【ModuleNotFoundError: No module named ''; '' is not a package】...
  14. qq等级计算机在线,I'M QQ - QQ官方网站
  15. 如何分配资源和管理资源
  16. Matlab滤波器设计示例
  17. MobPush 创建推送
  18. JAVA程序设计基础05循环结构
  19. 正排索引和倒排索引的区别
  20. 一位35岁技术经理的忠告:在职场多点雷霆手段,少点菩萨心肠!

热门文章

  1. PhpStrom 配置Xdebug
  2. 安装Jmeter插件管理器
  3. java swing 代码_java swing编写gui生命游戏代码,新手上路
  4. 吃鸡11月15服务器维护,绝地求生11月20日维护到几点 11.20吃鸡更新维护公告
  5. php异步发送邮件,php通过fsockopen异步发送邮件
  6. linux 没有windows.h头文件_宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)...
  7. 前端菜鸟是这样入门学习的,点进来!
  8. 年薪20万的前端工程师成长线路指南!
  9. 6个web前端核心技术,你学到哪个了呢?
  10. QString::number()相关转换