设为首页 收藏本站
查看: 625|回复: 0

[经验分享] Nginx服务器是如何处理请求的

[复制链接]

尚未签到

发表于 2016-12-26 08:26:17 | 显示全部楼层 |阅读模式
  版权信息:可以任意转载, 转载时请务必以超链接形式标明文章原文出处,谢谢
原文出处: http://libiao.appspot.com/2010/01/nginx_processes_requests.html

Nginx是如何处理请求的?
 
1.       基于命名的虚拟服务器(Name-basedvirtual servers)
 
Nginx首先要确定由哪个服务器(server)来处理这个请求,如下面的简单的例子中,一共有3个虚拟主机,分别是:
server {
      listen80;
      server_namenginx.org www.nginx.org;
      …
}
server {
      listen80;
      server_namenginx.net www.nginx.net;
      …
}
server {
      listen80;
      server_namenginx.com www.nginx.com;
      …
}
 
在上面的简单的配置中,nginx只需要简单的匹配下HTTP RequestHeader的Host字段就可以决定由那个虚拟服务器来处理该请求了。如果Host字段没有匹配上所有的虚拟服务器的名称,那么nginx就将其转到默认的服务器上进行处理。一般情况下,第一个虚拟服务器为默认的服务器。如上面配置中的为nginx.org为默认的虚拟服务器。如果你不想让第一个服务器作为默认的服务器,那么可以对上述的服务器配置上进行更改,如将nginx.net作为默认的服务器,则只需要在listen80后加default_server即可。
server {
      listen80 default_server;
      server_namenginx.net www.nginx.net;
      …
}
注意,default_server是在版本0.8.21才引入的,如果之前的版本的话,请使用default,而不是default_server。
 
2.       怎么阻止一个没有定义服务器名称的请求
如在我的nginx里面没有定义这个虚拟服务器名称,但是有请求过来了,该怎么去阻止这个没有定义的服务器名称的请求呢?
只需要定义如下的server
server {
      listen80 default_server;
      server_name_;
      return444;
}
选择一个不存在的域名_作为服务器名称,然后返回nginx特有的(非标准化的)的code 444来终止该连接。
 
3.       综合了基于命名的和基于IP的虚拟服务器
让我们来看看更加复杂一点的nginx的配置, 其监听了不同的地址
server {
      listen192.168.1.1: 80;
      server_namenginx.org www.nginx.org;
      …
}
server {
      listen192.168.1.1:80;
      server_namenginx.net www.nginx.net;
      …
}
server {
      listen192.168.1.2:80;
      server_namenginx.com www.nginx.com;
      …
}
在上面的配置中,nginx首先根据请求的ip地址和端口来检查listen项。然后根据HTTP请求中的HOST来检查server_name值,如果没有找到对应的server_name,那么将请求转向给默认的服务器。如在192.168.1.1:80上接收到一个www.nginx.com的请求,但是因为在192.168.1.1:80上没有定义nginx.com这个服务器名称,因此,有nginx.org来处理该请求。
同时上面也说了,默认的服务器是跟绑定的端口绑定在一起的,因此,如果不同的绑定端口下可以设置不同的默认服务器的,如下面的例子:
server {
      listen192.168.1.1: 80;
      server_namenginx.org www.nginx.org;
      …
}
server {
      listen192.168.1.1:80 default_server;
      server_namenginx.net www.nginx.net;
      …
}
server {
      listen192.168.1.2:80 default_server;
      server_namenginx.com www.nginx.com;
      …
}
即在192.168.1.1:80下设置默认的虚拟服务器为nginx.net,而在192.168.1.2:80下默认的为nginx.com。
 
4.       一个简单的PHP站点的配置
下面来看看如何给一个简单的PHP站点来设置location信息
server {
      listen80;
      server_namenginx.org www.nginx.org;
      root/data/www;
 
      location/ {
           indexindex.html index.php;
}
 
location ~*\.(gif|jpg|png)$ {
  expires 30d;
}
 
location ~\.php${
  fastcgi_pass localhost:9000;
  fastcgi_param SCRIPT_FILENAME
             $document_root$fastcgi_script_name;
  include       fastcgi_params;
}
}
Nginx不是按照顺序来搜索当前的location的,而是找最接近的location,如上面配置了3个location,但是只有万不得已的情况下,才会将请求转到第一个location,即/这个目录下。然后按照配置文件中定义的正则表达式来批判locations,如果找到对应的表达式,则停止搜索,使用搜索到的location。如果没有找到对应的正则表达式的搜索结果,则使用最接近的文本匹配的location。
需要注意的一点是,上面所有的location信息都是没有包含查询字符串(query string)的。因为查询字符串中包括了很多的显示方式,如:
/index.php?user=john&page=1
/index.php?page=1&user=john
同时也可能有其他的字符串在查询字符串中,如:
/index.php?page=1&something+else&user=john
 
下面我们来看看上面的配置如何来处理一个请求
l        /logo.gif的请求。当用户请求/logo.gif过来的时候,首先被/这个location匹配上,然后由正则表达式\.(gif|png|jpg)$匹配上,因此使用后者。然后因为使用了root/data/www,那么/logo.gif请求就映射到文件/data/www/logo.gif上,并且将文件返回给用户。
l        /index.php的请求。首先/index.php也是被/匹配上,然后被正则表达式\.php$匹配上。因此需要选择后者,将请求转发到location为\.php$上去。而在\.php$上其为一个fastcgi服务器,地址为localhost:9000。fastcgi_param设置FastCGI的参数SCRIPT_FILENAME为/data/www/index.php,然后FastCGI服务器执行该脚本。注意:$document_root等于上面root设定的值,即/data/www,而$fastcgi_script_name为请求的URI,即/index.php。
l        /about.html的请求,因为该请求只是匹配上/这一项,因此,由location /来直接接受该请求,即将文件映射到/data/www/about.html,然后将结果返回给用户。
l        /的请求。上述的三个location中,/的请求是最复杂的。如果一个请求只是匹配上/这一项,那么就由location /来处理该请求。Index指令就是告诉该location,如果在设定的root下(如上面为/data/www)下有index下的文件,即index.html或者index.php存在的话,则在内部需要做一次重定向。即如果在/data/www下有index.php,则重定向给/index.php,参考上面的/index.php的请求来处理。
 
备注:location的语法
location [=|~|~*|^~] /uri {}
其中~是区分大小写的正则表达式
~*为不区分大小写的正则表达式
= 为了提高效率,实行严格匹配,如果找到,停止搜索,执行该location的内容
^~ 是如果匹配上路径之后,不测试正则表达式了,停止搜索

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-319377-1-1.html 上篇帖子: Nginx负载均衡、页面缓存、读写分离等详解(转) 下篇帖子: web服务器nginx和apache的对比分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表