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的rewrite模块详解
Mar 31 Servers
Nginx搭建rtmp直播服务器实现代码
Mar 31 Servers
Nginx 过滤静态资源文件的访问日志的实现
Mar 31 Servers
nginx请求限制配置方法
Jul 09 Servers
nginx服务器的下载安装与使用详解
Aug 02 Servers
图文详解Nginx版本平滑升级方案
Sep 15 Servers
nginx日志格式分析和修改
Apr 28 Servers
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
May 11 Servers
nginx lua 操作 mysql
May 15 Servers
Apache POI操作批量导入MySQL数据库
Jun 21 Servers
windows server2016安装oracle 11g的图文教程
Jul 15 Servers
Fluentd搭建日志收集服务
Sep 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
咖啡语言
2021/03/03 咖啡文化
模仿OSO的论坛(五)
2006/10/09 PHP
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
javascript之学会吝啬 精简代码
2010/04/25 Javascript
JQuery UI的拖拽功能实现方法小结
2012/03/14 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
详解在Python程序中解析并修改XML内容的方法
2015/11/16 Python
python实现汉诺塔方法汇总
2016/07/25 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
python django下载大的csv文件实现方法分析
2019/07/19 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
python使用自定义钉钉机器人的示例代码
2020/06/24 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
Django跨域请求原理及实现代码
2020/11/14 Python
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
小学生家长评语大全
2014/02/10 职场文书
《九色鹿》教学反思
2014/02/27 职场文书
《祁黄羊》教学反思
2014/04/22 职场文书
中药学自荐信
2014/06/15 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
python 模块重载的五种方法
2021/04/24 Python
Python标准库之typing的用法(类型标注)
2021/06/02 Python
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android
SQL Server数据库的三种创建方法汇总
2023/05/08 MySQL