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实现发布静态资源的方法
Mar 31 Servers
Nginx Rewrite使用场景及配置方法解析
Apr 01 Servers
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
Jul 07 Servers
Nginx反向代理至go-fastdfs案例讲解
Aug 02 Servers
学习nginx基础知识
Sep 04 Servers
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
Feb 12 Servers
Kubernetes关键组件与结构组成介绍
Mar 31 Servers
Nginx动静分离配置实现与说明
Apr 07 Servers
阿里云服务器部署RabbitMQ集群的详细教程
Jun 01 Servers
win10搭建配置ftp服务器的方法
Aug 05 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
解决Nginx 配置 proxy_pass 后 返回404问题
nginx配置ssl实现https的方法示例
Mar 31 #Servers
You might like
详解php中空字符串和0之间的关系
2016/10/23 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
Apache站点配置SSL强制跳转443
2021/03/09 Servers
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
JavaScript 大数据相加的问题
2011/08/03 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
Javascript排序算法之计数排序的实例
2014/04/05 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
小程序实现悬浮搜索框
2019/07/12 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
Python实现Linux的find命令实例分享
2017/06/04 Python
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
Python3标准库总结
2019/02/19 Python
详解Python 切片语法
2019/06/10 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
tensorflow 获取checkpoint中的变量列表实例
2020/02/11 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
计算机求职自荐信范文
2014/04/19 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
向女朋友道歉的话
2015/01/20 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript
Docker下安装Oracle19c
2022/04/13 Servers
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android