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 比 Apache 更牛逼
Mar 31 Servers
nginx配置proxy_pass中url末尾带/与不带/的区别详解
Mar 31 Servers
Mac环境Nginx配置和访问本地静态资源的实现
Mar 31 Servers
关于nginx 实现jira反向代理的问题
Sep 25 Servers
Rhit高效可视化Nginx日志查看工具
Nov 01 Servers
Kubernetes中Deployment的升级与回滚
Apr 01 Servers
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
Apr 07 Servers
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
Apr 29 Servers
利用Apache Common将java对象池化的问题
Jun 16 Servers
shell进度条追踪指令执行时间的场景分析
Jun 16 Servers
Windows7下FTP搭建图文教程
Aug 05 Servers
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
Aug 05 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+mysql一个名片库程序
2006/10/09 PHP
优化PHP代码的53条建议
2008/03/27 PHP
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
php实现留言板功能(代码详解)
2017/03/28 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
Extjs学习笔记之七 布局
2010/01/08 Javascript
再论Javascript下字符串连接的性能
2011/03/05 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
seajs模块压缩问题与解决方法实例分析
2017/10/10 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
深入理解Python中的super()方法
2017/11/20 Python
详解python3中tkinter知识点
2018/06/21 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
Python中numpy模块常见用法demo实例小结
2019/03/16 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
给面试官的感谢信
2014/02/01 职场文书
洗发露广告词
2014/03/14 职场文书
学校通报表扬范文
2015/05/04 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
vue router 动态路由清除方式
2022/05/25 Vue.js