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配置并兼容HTTP实现代码解析
Mar 31 Servers
nginx location中多个if里面proxy_pass的方法
Mar 31 Servers
Nginx设置日志打印post请求参数的方法
Mar 31 Servers
Nginx的反向代理实例详解
Mar 31 Servers
nginx+lua单机上万并发的实现
May 31 Servers
解决xampp安装后Apache无法启动
Mar 21 Servers
了解Kubernetes中的Service和Endpoint
Apr 01 Servers
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
Apr 29 Servers
Win10 Anaconda安装python-pcl
Apr 29 Servers
Docker部署Mysql8的实现步骤
Jul 07 Servers
Windows server 2003卸载和安装IIS的图文教程
Jul 15 Servers
Linux中一对多配置日志服务器的详细步骤
Jul 23 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
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
让你的网站可编辑的实现js代码
2009/10/19 Javascript
JavaScript 常见对象类创建代码与优缺点分析
2009/12/07 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
一篇文章掌握RequireJS常用知识
2016/01/26 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
浅谈js中的bind
2019/03/18 Javascript
vue源码nextTick使用及原理解析
2019/08/13 Javascript
python开发之thread实现布朗运动的方法
2015/11/11 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
Python编程之变量赋值操作实例分析
2017/07/24 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
Python zip()函数用法实例分析
2018/03/17 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
python palywright库基本使用
2021/01/21 Python
HTML5 UTF-8 中文乱码的解决方法
2013/11/18 HTML / CSS
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
秸秆管理实施方案
2014/03/15 职场文书
助学感谢信范文
2015/01/21 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
恰同学少年观后感
2015/06/08 职场文书
主婚人致辞精选
2015/07/28 职场文书
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle