nginx 如何处理请求系列3-server_name指令
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块时尤其重要。 匹配原则如下
- 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指令相关推荐
- nginx 如何处理请求系列1-Nginx安装
2019独角兽企业重金招聘Python工程师标准>>> 一些准备工作,常见问题 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/PO ...
- nginx怎么处理php,nginx如何处理请求
当请求到达nginx服务器之时 如果我们配置文件如下:server { listen 80; server_name example.org www.example.org; ... } server ...
- nginx匹配规则_Nginx系列之server_name定义与匹配规则
Nginx系列之server_name定义与匹配规则 server_name用来指定请求中的Host头部,在上一节的基于域名的虚拟机中,nginx匹配的规则就是根据server_name的不同,结合请 ...
- nginx学习笔记(7)Nginx如何处理一个请求---转载
如何防止处理未定义主机名的请求 基于域名和IP混合的虚拟主机 一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在 ...
- Nginx中server_name指令介绍
Nginx中server_name指令介绍 用途 根据官方文档说明,用来设置虚拟服务器,对于用IP还是请求头部中的Host字段内容设置这个指令的值,没有明确的分别. 用法 指令后跟特定域名,此时第一个 ...
- nginx的请求接收流程(一)
今年我们组计划写一本nginx模块开发以及原理解析方面的书,整本书是以open book的形式在网上会定时的更新,网址为http://tengine.taobao.org/book/index.htm ...
- nginx实现请求的负载均衡 + keepalived实现nginx的高可用
前言 使用集群是网站解决高并发.海量数据问题的常用手段.当一台服务器的处理能力.存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求.这种 ...
- Nginx技巧:灵活的server_name,Nginx配置一个服务器多个站点 和 一个站点多个二级域名...
http://www.cnblogs.com/buffer/archive/2011/08/17/2143514.html Nginx强大的正则表达式支持,可以使server_name的配置变得很灵活 ...
- nginx限制请求之一:(ngx_http_limit_conn_module)模块
相关文章: <高可用服务设计之二:Rate limiting 限流与降级> <nginx限制请求之一:(ngx_http_limit_conn_module)模块> <n ...
最新文章
- Java学习day010(oop):向上造型
- 信息系统项目管理师为什么不建议自学
- Mastering Android NDK Build System - Part 1: Techniques with ndk-build
- 自己做的一个登录页面,纯代码!
- 网络安全技术之端口隔离
- LinkedList源码阅分析
- Python使用UDP协议实现局域网内屏幕广播
- MySQL的IFNULL解决判空问题
- jQuery方式追加div覆盖
- DataGrid实现单选功能,将DataGrid绑定的单选钮放在一个组里
- Spring Boot 中使用WebJars
- Jenkins+Spring Boot构建部署
- modulenotfounderror python_你所不知道的 【ModuleNotFoundError: No module named ''; '' is not a package】...
- qq等级计算机在线,I'M QQ - QQ官方网站
- 如何分配资源和管理资源
- Matlab滤波器设计示例
- MobPush 创建推送
- JAVA程序设计基础05循环结构
- 正排索引和倒排索引的区别
- 一位35岁技术经理的忠告:在职场多点雷霆手段,少点菩萨心肠!
热门文章
- PhpStrom 配置Xdebug
- 安装Jmeter插件管理器
- java swing 代码_java swing编写gui生命游戏代码,新手上路
- 吃鸡11月15服务器维护,绝地求生11月20日维护到几点 11.20吃鸡更新维护公告
- php异步发送邮件,php通过fsockopen异步发送邮件
- linux 没有windows.h头文件_宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)...
- 前端菜鸟是这样入门学习的,点进来!
- 年薪20万的前端工程师成长线路指南!
- 6个web前端核心技术,你学到哪个了呢?
- QString::number()相关转换