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反向代理及负载均衡如何实现(基于linux)
Mar 31 Servers
制作能在nginx和IIS中使用的ssl证书
Jun 21 Servers
Nginx配置https的实现
Nov 27 Servers
图文详解nginx日志切割的实现
Jan 18 Servers
Nginx 反向代理解决跨域问题多种情况分析
Jan 18 Servers
Nginx图片服务器配置之后图片访问404的问题解决
Mar 21 Servers
Windows Server 2019 域控制器安装图文教程
Apr 28 Servers
Ubuntu Server 安装Tomcat并配置systemctl
Apr 28 Servers
Docker与K8s关系介绍不会Docker也可以使用K8s
Jun 25 Servers
Nginx报404错误的详细解决方法
Jul 23 Servers
ubuntu端向日葵键盘输入卡顿问题及解决
Dec 24 Servers
ubuntu开机后ROS程序自启动问题
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
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
jQuery使用经验小技巧(推荐)
2016/05/31 Javascript
用AngularJS来实现监察表单按钮的禁用效果
2016/11/02 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
Vuejs+vue-router打包+Nginx配置的实例
2018/09/20 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
python实现监控windows服务并自动启动服务示例
2014/04/17 Python
Python计算三维矢量幅度的方法
2015/06/15 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
Python读取properties配置文件操作示例
2018/03/29 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
Python 获取项目根路径的代码
2019/09/27 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
pycharm2020.1.2永久破解激活教程,实测有效
2020/10/29 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
遗产继承公证书
2014/04/09 职场文书
留学推荐信范文
2014/05/10 职场文书
财务人员个人工作总结
2015/02/27 职场文书
2016年公司新年寄语
2015/08/17 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书