您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

t如何找到服务器块 <免费源码>

  • 时间:2022-09-03 00:37 编辑: 来源: 阅读:293
  • 扫一扫,手机访问
摘要:t如何找到服务器块 <免费源码>
本文的目标读者是研究开发teen engine/Nginx或运营商运维的学生。如果你很清楚这个逻辑,可以跳过。如果你在配置或开发Teengine/Nginx的过程中有以下疑问,这篇文章或许可以解答你多年的疑惑:匹配请求是哪个服务器块?为什么服务器块明明配置好了,还是不生效?此域名没有服务器块。请求使用了哪个服务器块?如果要自己匹配服务器块,应该从哪里入手?......诸如此类。使用Teengine时,可能会经常遇到与这种服务器块相关的问题。当配置的服务器块较少时,就更容易识别它们。但是在CDN或者互联网接入层的场景下,通常会有很多配置的服务器块,少则几十块,多则几百块,多则上万块。所以了解Teengine是如何搜索服务器块的,对日常故障排除很有帮助。 配置我们先来看看几个配置:server { listen 10 . 101 . 192 . 91:80 default _ server;监听80 default _ server监听8080 default _ server服务器名www.aa.com;default _ type text/plain;location/{ return 200 " default-server:$ server _ name,host:$ host ";} }服务器{ listen 10 . 101 . 192 . 91:80;服务器名www.bb.com;default _ type text/plain;location/{ return 200 " 80 server:$ server _ name,host:$ host ";} }服务器{ listen 10 . 101 . 192 . 91:8080;server _ name * . bb . com;default _ type text/plain;location/{ return 200 " 8080 server:$ server _ name,host:$ host ";} }服务器{ listen 10 . 101 . 192 . 91:8080;服务器名www.bb.com;default _ type text/plain;location/{ return 200 " 8080 server:$ server _ name,host:$ host ";}}上面配置了四个服务器块,配置也很简单。第一个服务器块配置了default_server参数,表示这是默认的服务器块(准确的说是这个listen的IP:Port进来请求默认的服务器块),监听两个端口80和8080,匹配域名是www.aa.com,第二个监听匹配域名是10.101.192.91:80和*.bb.com的服务器块,第三个监听匹配域名是10.101.192.91:的服务器块 我们来验证一下:可以看到第一个服务器块是在127.0.0.1:80和127.0.0.1:8080被访问的。这是因为第一个服务器侦听端口*:80和*:8080,而其余服务器块不侦听127.0.0.1、127.7的相应端口。 10.101.192.91:80访问,当域名与服务器块匹配时,使用对应的服务器块;当IP:端口匹配时,使用第一个默认服务器块;当域名与服务器块不匹配时,将匹配默认服务器块。 10.101.192.91:8080,域名先精确匹配到www.bb.com的服务器块,再匹配到泛域名* .bb.com的服务器块,不匹配时使用第三个隐式默认服务器块。这涉及到pan域名和隐式默认服务器块,pan域名匹配在准确域名之后。这也很好理解。隐式默认服务器块是在listen之后没有指定default_server参数的服务器块。当Tengine/Nginx解析配置时,每个IP:Port都有一个默认的服务器块。如果在listen之后显式指定default_server参数,则listen所在的服务器是该IP:Port的默认服务器块。如果未显式指定default_server参数,则此IP:Port的第一个服务器块是隐式默认服务器块。 以上配置可以衍生出少量的调试技巧:if($ http _ x _ alicdn _ debug _ get _ server = " on "){ return 200 " $ server _ addr:$ server _ port,server _ name:$ server _ name ";}只需带上请求头X-Alicdn-Debug-Get-Server: on就可以知道请求命中了哪个服务器块。这种配置对于具有大量服务器块的系统调试非常有用。需要注意的是,这个配置需要放到一个配置文件中,用server_auto_include加载,然后tengine会在所有服务器块中自动生效(nginx没有类似的配置命令) 数据结构我们来看看http核心模块服务器块的配置在数据结构中是如何关联的。其数据结构为:NGX _ http _ server _ name _ t的typedef struct {/* array," server _ name "指令*/NGX _ array _ tserver _ names;/* server CTX */ngx _ http _ conf _ CTX _ t * CTX;u _ char *文件名;ngx_uint_t线;ngx_str_t服务器名称;# if(T _ NGX _ SERVER _ INFO)NGX _ str _ T SERVER _ admin;#endif size_t连接池大小;size_t请求池大小;size _ t client _ header _ buffer _ size;ngx _ bufs _ t large _ client _ header _ buffers;ngx_msec_t客户端标题超时;ngx _ flag _ t ignore _ invalid _ headers;ngx _ flag _ t merge _ slashesngx_flag_t下划线_ in _ headers未签名收听:1;#if (NGX_PCRE)无符号捕获:1;# endif ngx _ http _ core _ loc _ conf _ t * * named _ locations;} ngx _ http _ core _ SRV _ conf _ t;这里不详细说明这些字段的用途。主要看ngx_http_core_srv_conf_t和其他数据结构的关系如何。从上面的配置中,我们可以知道server与IP:Port相关。tengine/nginx中的关系如下:typedef struct { NGX _ http _ listen _ opt _ t opt;ngx _ hash _ t hashngx _ hash _通配符_ t * wc _ headngx _ hash _通配符_ t * wc _ tail# if(NGX _ PCRE)NGX _ uint _ t nregex;ngx _ http _ server _ name _ t * regex#endif /*该地址的默认服务器配置:port */ngx _ http _ core _ SRV _ conf _ t * default _ server;ngx_array_t服务器;/* ngx _ http _ core _ SRV _ conf _ t */} ngx _ http _ conf _ addr _ t的数组;可以看到IP:Port的核心数据结构ngx_http_conf_addr_t包含了默认的服务器块default_server以及所有与这个IP:Port相关联的服务器块数组服务器,其余字段不赘述。 Tengine将所有IP:port按端口拆分,将ngx_http_conf_addr_t放入ngx _ http _ conf _ port _ t:typedef struct { ngx _ int _ t family;in_port_t端口;ngx _ array _ t addrs/* ngx _ http _ conf _ addr _ t */} ngx _ http _ conf _ port _ t的数组;为什么要拆分IP:Port?这是因为如果在监听端口中没有指定IP,例如监听80;,那么创建监听套接字时tengine/nginx的地址是0.0.0,如果有其他配置监听确切的ip和端口,比如监听10 . 101 . 192 . 91:80;没有办法在内核中创建这个套接字。Section 2配置中的几个监听程序在内核中是这样被监听的:虽然监听程序是80和10.101.192.91:80,但是在内核中都是0.0.0: 80,所以tengine需要使用ngx_http_conf_port_t来记录这个端口的所有准确地址。 但这个结构只在配置阶段使用,在监听socket时转换成结构ngx_http_port_t和ngx_http_in_addr_t(这是因为ip:port和server块是多对多的关系,需要重新组织优化):typedef struct {/* ngx _ http _ in _ addr _ t或ngx _ http _ in6 _ addr _ t */void * addrs;ngx _ uint _ t naddrs} ngx _ http _ port _ t;typedef结构{ in _ addr _ t addrngx _ http _ addr _ conf _ t conf} ngx _ http _ in _ addr _ t;typdef ngx _ http _ addr _ conf _ s ngx _ http _ addr _ conf _ t;struct ngx_http_addr_conf_s { /*此地址的默认服务器配置:port */ngx _ http _ core _ SRV _ conf _ t * default _ server;ngx _ http _虚拟名称_ t *虚拟名称;未签名的SSL:1;未签名的http 2:1;未签名的proxy _ protocol:1;};其中ngx_http_port_t记录了该端口的所有确切地址和对应的服务器块。 而ngx_http_port_t放在socket核心结构ngx _ listening _ t:typedef struct ngx _ listening _ sngx _ listening _ t;struct ngx _ listening _ s { ngx _ socket _ t FD;struct sockaddr * sockaddrsocklen _ t socklen/* sockaddr的大小*/size _ t addr _ text _ max _ len;ngx _ str _ t addr _ text//省略.../*已接受连接的处理程序*/NGX _ Connection _ Handler _ pt Handler;void *服务器;/* NGX _ http _ in _ addr _ t的数组,例如*///省略……};strut ngx _ connection _ s {//省略……ngx _ listening _ t * listening;//省略……};因此,可以从C->: listening->服务器来查找匹配的服务器块。 tengine中ip:port和server的大致关系如下:(通过这个图可以了解到tengine是如何找到server块的。)从请求到服务器块,上面讨论了ip:port和server的少量关系和核心数据结构。这一节讲的是tengine从解决请求到匹配服务器的逻辑。 Ngx_http_init_connection是初始化连接的函数。在这个函数中,我们可以看到有这样的逻辑:void NGX _ http _ init _ connection(NGX _ connection _ t * c){//省略……NGX _ http _ port _ t * port;ngx _ http _ in _ addr _ t * addrngx _ http _ connection _ t * hc//省略.../*查找地址的服务器配置:port */port = c-->;听力-& gt;服务器;如果(端口->naddrs & gt1){//omit…sin =(structsockaddr _ in *)c-->;local _ sockaddraddr = port-& gt;addrs/*最后一个地址是“*”*/for(I = 0;我& lt端口->;nad DRS-1;i++) { if (addr[i]。addr = = sin-& gt;sin _ addr . s _ addr){ break;} } HC-& gt;addr _ conf = & amp地址[i]。conf//省略...} else {//省略...addr = port-->;addrsHC->;addr _ conf = & amp地址[0]。conf//省略…}/*地址的默认服务器配置:port */HC->;conf _ CTX = HC-& gt;addr _ conf-& gt;default _ server->;ctx//省略...}可以看到初始化的时候,得到socket的ip:port后,匹配最合适的配置,保存在HC->;在addr_conf指针中,这是上面提到的数据结构ngx_HTTP_addr_conf_t指针,它存储了与这个ip:port关联的服务器块的所有核心配置。收到http请求头解析请求行或主机头后,根据域名进入HC->中。addr_conf匹配真实服务器块:static NGX _ int _ TNGX _ http _ set _ virtual _ server(NGX _ http _ request _ t * r,NGX _ str _ t * host){//省略……NGX _ http _ connection _ t * HC;ngx _ http _ core _ srv _ conf _ t * cscf//省略...HC = r-->;http _ connection//省略...RC = NGX _ http _ find _ virtual _ server(r-->;连接,HC-& gt;addr _ conf-& gt;虚拟名字,主机,r,和ampcscf);//当R成立时,R->;Srv_conf和r->: loc_conf为HC->:conf _ CTX的默认配置//如果没有找到匹配的服务器块,则不需要设置R->: Srv_conf和R->:loc _ conf If(RC = = NGX _ DECLINED){ return NGX _ OK;}//找到匹配的服务器,使用真实服务器块的配置r->:SRV _ conf = cscf-& gt;CTX->;srv _ confr-& gt;loc _ conf = cscf-& gt;CTX->;loc _ conf//省略…}函数ngx_http_find_virtual_server是查找域名对应的服务器块的接口(这个函数在SSL握手中解SNI的时候在另一个地方调用,因为握手的时候也需要查找匹配服务器块中配置的证书) 至此,服务器块配置的搜索逻辑完成,后续模块的r->,可以从r->: Srv_conf和r->: Loc_conf找到自己模块的服务器/位置块配置。 作者:金九阅读参考本文为云起社区原创内容,未经允许不得转载。


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【域名/主机/服务器|】qq邮箱提醒在哪里打开(2024-06-04 18:58)
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部