nginx处理http请求实现过程解析


Posted in Servers onMarch 31, 2021

nginx首先决定要用配置文件里的哪个server{}块来处理,假设有下面的server{}配置

server {
  listen   80;
  server_name aaa;
  ...
}

server {
  listen   80;
  server_name bbb;
  ...
}

nginx会根据过来的http请求头里的Host字段里的值,来判断使用哪个server{}。

如果请求头里没有Host字段,或者Host字段里的值,和Nginx配置文件里的server{}里的{server_name}都不匹配,则使用第一个server{},来处理这个请求。

如果请求头里的Host字段里的值和Nginx配置文件里的某个server{}里的{server_name},匹配上了,则使用这个server{},来处理这个请求。

可以使用curl工具来方便的做实验,curl可以设置http请求的请求头,所以可以任意设置Host字段,用【-H】来设置。下面的10.210.65.73是安装了nginx的机器的IP地址。

所以用下面的命令,发送了http请求后,nginx就会使用server{server_name aaa}来处理这个请求。

curl.exe -H "Host: aaa" 10.210.65.73

非常重要的结论:server_name对应的是http请求头里的Host字段的值,有了上面的理论支撑,就可以很容易的设置反向代理和负载均衡:

当过来的http请求头里的Host字段为aaa时,storage.test来处理。

当过来的http请求头里的Host字段为bbb时,tracker.test来处理。

#负载均衡配置,IP为129的机器配置高,所以给他的数字的27,就是让它多处理
  upstream storage.test {
   server 10.210.65.129:80 weight=27;
   server 10.210.65.130:80 weight=1;
  }

  #负载均衡配置
  upstream tracker.test {
   server 10.210.65.52:80 weight=7;
   server 10.210.65.53:80 weight=2;
  }

  #文件的存储
  server {
    listen    80;
    server_name aaa;
    location / {
      #http:://后面的内容是自己定义,对应上面upstream的名字
      proxy_pass http://storage.test;
    }
  }

  #文件服务器tracker
  server {
    listen    80;
    server_name bbb;

    location / {
      #http:://后面的内容是自己定义的,对应上面upstream的名字
      proxy_pass http://tracker.test;
    }

  }

server{}里的listen监听的是谁的端口?

监听的是:发送过来http请求的进程(大部分是浏览器)的端口(如果是http请求,则为端口为80),不是nginx服务器自己进程的端口。

nginx根据http请求头的Host字段里的值,和发送过来http请求的进程(大部分是浏览器)的端口,来决定使用哪个server{}来处理http请求。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Servers 相关文章推荐
Nginx实现反向代理
Sep 20 Servers
nginx 多个location转发任意请求或访问静态资源文件的实现
Mar 31 Servers
Nginx反爬虫策略,防止UA抓取网站
Mar 31 Servers
uwsgi+nginx代理Django无法访问静态资源的解决
May 10 Servers
使用nginx配置访问wgcloud的方法
Jun 26 Servers
nginx反向代理配置去除前缀案例教程
Jul 26 Servers
学习nginx基础知识
Sep 04 Servers
Nginx 反向代理解决跨域问题多种情况分析
Jan 18 Servers
Nginx实现会话保持的两种方式
Mar 18 Servers
nginx容器方式反向代理实战
Apr 18 Servers
docker 制作mysql镜像并自动安装
May 20 Servers
nginx rewrite功能使用场景分析
May 30 Servers
Nginx服务器添加Systemd自定义服务过程解析
Mar 31 #Servers
nginx处理http请求实现过程解析
Mar 31 #Servers
Nginx开启Brotli压缩算法实现过程详解
Nginx配置SSL证书出错解决方案
Mar 31 #Servers
Nginx配置并兼容HTTP实现代码解析
Mar 31 #Servers
基于Nginx实现限制某IP短时间访问次数
Mar 31 #Servers
Nginx tp3.2.3 404问题解决方案
Mar 31 #Servers
You might like
php设计模式 State (状态模式)
2011/06/26 PHP
php根据日期判断星座的函数分享
2014/02/13 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
PHP开发者必须掌握的6个关键字
2014/04/14 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
2017/02/13 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
微信小程序实现同一页面取值的方法分析
2019/04/30 Javascript
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
[04:41]2014DOTA2国际邀请赛 Liquid顺利突围晋级正赛
2014/07/09 DOTA
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
Python functools模块学习总结
2015/05/09 Python
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
Python六大开源框架对比
2015/10/19 Python
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
Python中的函数作用域
2018/05/07 Python
python实现简单http服务器功能
2018/09/17 Python
python 中如何获取列表的索引
2019/07/02 Python
python实现连连看辅助(图像识别)
2020/03/25 Python
举例详解HTML5中使用JSON格式提交表单
2015/06/16 HTML / CSS
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
私有程序集与共享程序集有什么区别
2013/04/05 面试题
木马的传播途径主要有哪些
2016/04/08 面试题
应用电子技术专业个人求职信
2013/09/21 职场文书
上学迟到的检讨书
2014/01/11 职场文书
集中采购方案
2014/06/10 职场文书
销售人员工作自我评价
2014/09/21 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS