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 15 Servers
解决使用了nginx获取IP地址都是127.0.0.1 的问题
Sep 25 Servers
nginx刷新页面出现404解决方案(亲测有效)
Mar 18 Servers
使用Docker容器部署rocketmq单机的全过程
Apr 03 Servers
Nginx限流和黑名单配置
May 20 Servers
设置IIS Express并发数
Jul 07 Servers
Docker部署Mysql8的实现步骤
Jul 07 Servers
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
Jul 15 Servers
Linux中一对多配置日志服务器的详细步骤
Jul 23 Servers
Apache自带的ab压力测试工具的实现
Jul 23 Servers
Elasticsearch6.2服务器升配后的bug(避坑指南)
Sep 23 Servers
CentOS7 minimal 最小化安装网络设置过程
Dec 24 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 extract 将数组拆分成多个变量的函数
2010/06/30 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
jQuery中click事件的定义和用法
2014/12/20 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
2016/12/30 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
express.js中间件说明详解
2019/03/19 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
vue解决花括号数据绑定不成功的问题
2019/10/30 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日 小组赛A组 TNC VS OpTic
2018/03/30 DOTA
python代码制作configure文件示例
2014/07/28 Python
python实现在windows下操作word的方法
2015/04/28 Python
Python易忽视知识点小结
2015/05/25 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
python实现简单日志记录库glog的使用
2019/12/13 Python
Python实现word2Vec model过程解析
2019/12/16 Python
Python接口测试文件上传实例解析
2020/05/22 Python
挪威手表购物网站:Klokker
2016/09/19 全球购物
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
《最可爱的人》教学反思
2014/02/14 职场文书
疾病捐款倡议书
2014/05/13 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
2014法制宣传日活动总结范文
2014/11/01 职场文书
招商银行工作证明
2015/06/17 职场文书
运动会通讯稿50字
2015/07/20 职场文书
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技