Nginx 核心知识 150 讲
陶辉
智链达 CTO,前阿里云 P8 高级技术专家
61678 人已学习
新⼈⾸单¥98
课程目录
已完结/共 155 讲
第三章:详解HTTP模块 (40讲)
第四章:反向代理与负载均衡 (38讲)
Nginx 核心知识 150 讲
登录|注册
留言
10
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 87 | upstream模块提供的变量
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程综述
02 | Nginx适用于哪些场景?
03 | Nginx出现的历史背景
04 | 为什么用Nginx:它的 5 个主要优点
05 | Nginx的四个主要组成部分
06 | Nginx的版本发布历史
07 | 选择哪一个Nginx发行版本?
08 | 编译出适合自己的Nginx
09 | Nginx配置文件的通用语法介绍
10 | Nginx命令行及演示:重载、热部署、日志切割
11 | 用Nginx搭建一个可用的静态资源Web服务器
12 | 用Nginx搭建一个具备缓存功能的反向代理服务
13 | 用GoAccess实现可视化并实时监控access日志
14 | 从网络原理来看SSL安全协议
15 | 对称加密与非对称加密各自的应用场景
16 | SSL证书的公信力是如何保证的?
17 | SSL协议握手时Nginx的性能瓶颈在哪里?
18 | 用免费SSL证书实现一个HTTPS站点
19 | 基于OpenResty用Lua语言实现简单服务
20 | Nginx的请求处理流程
21 | Nginx的进程结构
22 | Nginx的进程结构实例演示
23 | 使用信号管理Nginx的父子进程
24 | reload重载配置文件的真相
25 | 热升级的完整流程
26 | 优雅地关闭worker进程
27 | 网络收发与Nginx事件间的对应关系
28 | Nginx网络事件实例演示
29 | Nginx的事件驱动模型
30 | epoll的优劣及原理
31 | Nginx的请求切换
32 | 同步&异步、阻塞&非阻塞之间的区别
33 | Nginx的模块究竟是什么?
34 | Nginx模块的分类
35 | Nginx如何通过连接池处理网络请求
36 | 内存池对性能的影响
37 | 所有worker进程协同工作的关键:共享内存
38 | 用好共享内存的工具:Slab管理器
39 | 哈希表的max_size与bucket_size如何配置
40 | Nginx中最常用的容器:红黑树
41 | 使用动态模块来提升运维效率
42 | 第三章内容介绍
43 | 冲突的配置指令以谁为准?
44 | Listen指令的用法
45 | 处理HTTP请求头部的流程
46 | Nginx中的正则表达式
47 | 如何找到处理请求的server指令块
48 | 详解HTTP请求的11个阶段
49 | 11个阶段的顺序处理
50 | postread阶段:获取真实客户端地址的realip模块
51 | rewrite阶段的rewrite模块:return指令
52 | rewrite阶段的rewrite模块:重写URL
53 | rewrite阶段的rewrite模块:条件判断
54 | find_config阶段:找到处理请求的location指令块
55 | preaccess阶段:对连接做限制的limit_conn模块
56 | preaccess阶段:对请求做限制的limit_req模块
57 | access阶段:对ip做限制的access模块
58 | access阶段:对用户名密码做限制的auth_basic模块
59 | access阶段:使用第三方做权限控制的auth_request模块
60 | access阶段的satisfy指令
61 | precontent阶段:按序访问资源的try_files模块
62 | 实时拷贝流量:precontent阶段的mirror模块
63 | content阶段:详解root和alias指令
64 | static模块提供的3个变量
65 | static模块对url不以斜杠结尾却访问目录的做法
66 | index和autoindex模块的用法
67 | 提升多个小文件性能的concat模块
68 | access日志的详细用法
69 | HTTP过滤模块的调用流程
70 | 用过滤模块更改响应中的字符串:sub模块
71 | 用过滤模块在http响应的前后添加内容:addition模块
72 | Nginx变量的运行原理
73 | HTTP框架提供的请求相关的变量
74 | HTTP框架提供的其他变量
75 | 使用变量防盗链的referer模块
76 | 使用变量实现防盗链功能实践:secure_link模块
77 | 为复杂的业务生成新的变量:map模块
78 | 通过变量指定少量用户实现AB测试:split_client模块
79 | 根据IP地址范围的匹配生成新变量:geo模块
80 | 使用变量获得用户的地理位置:geoip模块
81 | 对客户端使用keepalive提升连接效率
82 | 反向代理与负载均衡原理
83 | 负载均衡策略:round-robin
84 | 负载均衡哈希算法:ip_hash与hash模块
85 | 一致性哈希算法:hash模块
86 | 最少连接算法以及如何跨worker进程生效
87 | upstream模块提供的变量
88 | proxy模块处理请求的流程
89 | proxy模块中的proxy_pass指令
90 | 根据指令修改发往上游的请求
91 | 接收用户请求包体的方式
92 | 与上游服务建立连接
93 | 接收上游的响应
94 | 处理上游的响应头部
95 | 上游出现失败时的容错方案
96 | 对上游使用SSL连接
97 | 用好浏览器的缓存
98 | Nginx决策浏览器过期缓存是否有效
99 | 缓存的基本用法
100 | 对客户端请求的缓存处理流程
101 | 接收上游响应的缓存处理流程
102 | 如何减轻缓存失效时上游服务的压力
103 | 及时清除缓存
104 | uwsgi、fastcgi、scgi指令的对照表
105 | memcached反向代理的用法
106 | 搭建websocket反向代理
107 | 用分片提升缓存效率
108 | open file cache提升系统性能
109 | HTTP/2协议介绍
110 | 搭建HTTP/2服务并推送资源
111 | gRPC反向代理
112 | stream四层反向代理的7个阶段及常用变量
113 | proxy protocol协议与realip模块
114 | 限并发连接、限IP、记日志
115 | stream四层反向代理处理SSL下游流量
116 | stream_preread模块取出SSL关键信息
117 | stream proxy四层反向代理的用法
118 | UDP反向代理
119 | 透传IP地址的3个方案
120 | 性能优化方法论
121 | 如何高效使用CPU
122 | 多核间的负载均衡
123 | 控制TCP三次握手参数
124 | 建立TCP连接的优化
125 | 滑动窗口与缓冲区
126 | 优化缓冲区与传输效率
127 | 慢启动与拥塞窗口
128 | TCP协议的keepalive功能
129 | 减少关闭连接时的time_wait端口数量
130 | lingering_close延迟关闭TCP连接
131 | 应用层协议的优化
132 | 磁盘IO的优化
133 | 减少磁盘读写次数
134 | 零拷贝与gzip_static模块
135 | 用tcmalloc优化内存分配
136 | 使用Google PerfTools分析Nginx
137 | 使用stub_status模块监控Nginx的状态
138 | 第三方模块源码的阅读
139 | Nginx的启动流程
140 | HTTP第三方模块的初始化
141 | if指令是邪恶的吗?
142 | 解读Nginx的核心转储文件
143 | 通过debug日志定位问题
144 | OpenResty概述
145 | OpenResty中的Nginx模块与Lua模块
146 | 如何在Nginx中嵌入Lua代码
147 | OpenResty中Lua与C代码交互的原理
148 | 获取、修改请求与响应的SDK
149 | 工具类型的SDK
150 | 同步且非阻塞的底层SDK:cosocket
151 | 基于协程的并发编程SDK
152 | 定时器及时间相关的SDK
153 | share.DICT基于共享内存的字典
154 | 子请求的使用方法
155 | 基于OpenResty的WAF防火墙&结课测试
本节摘要
登录 后留言

全部留言(10)

  • 最新
  • 精选
高枕
老师您好昨天这个问题我没有表述清楚: 之前的upstream并未使用zone模块,为什么也能正常运行呢?比如权重为2的话,会记录下已经访问了1次或者2次? 我想问您的是,您是不是在您的nginx中只开启了一个work进程?不然的话,您若不使用zone模块,访问次数无法记录在共享内存,多个work无法判断上次访的客户端访问是分配到了哪个上游服务

作者回复: 1、没使用zone,则会在内存中会记录访问了1次或者2次,所以功能是正常的。 2、如果开启了多个worker进程,但没有开启zone,那么多个worker是独立的在各自内存中记录访问次数,不能共享其他worker进程的数据。

2018-12-28
2
6
vodaka
老师,您好,upstream的名称为什么不区分大小写。如果配置了upstream backend 还有一个是upstream Backend。语法检查会报duplicated upstream

作者回复: 是的,nginx的upstream模块就是这么设计的,它使用ngx_strncasecmp方法来比较upstream的名称,这个方法特意的把大小写忽略了。

2019-11-20
4
未完成
老师有个问题 location /api { proxy_next_upstream http_504 error timeout; proxy_pass http://api; } upstream api { server 1.1.1.1 max_fails=2 fail_timeout=30s; server 1.1.1.2 max_fails=2 fail_timeout=30s; } 这种如果访问 http://domain/api/xxx 这个一直有问题的话504会导致 api这个loacation有问题然后 http://domain/api/yyy http://domain:api/zzz 这些都访问不了 请问有什么第三方模块可以解决或者有其他处理方式吗

作者回复: 从你的提问,我感觉这个问题是不是上游服务导致的?问题不在Nginx上?

2019-09-29
小小鸟
老师咨询一个问题 系统压测过程 nginx有错误显示110connected upstream timeout 和no live upstreams while connecting to upstream 后端tomcat没有错误 ,老师能提供一个分析思路吗

作者回复: 信息量不足,简单谈下我的看法: 1、貌似nginx建立TCP连接超时; 2、TCP连接是由操作系统来维护的; 3、操作系统为每个监听端口提供backlog队列,如果长期tomcat不去调用accept,而backlog队列满,这样tomcat是看不到错误的。 因此,建议你在tomcat所在机器的操作系统层看下统计,应该相关端口大量在丢弃SYN包才对

2019-04-27
2
ShindouHikaru
老师,您好: 我用upstream模块进行https反向代理实验,配置两个不一样的IP以及不同服务,发现upstream其中一个无法正常访问。 172.25.128.50:443 输入后换跳转至https://172.25.128.50/owa/auth/logon.aspx?replaceCurrent=1&url=https%3a%2f%2f172.25.128.50%2fowa%2f 该URL是exchange邮箱的服务界面 172.25.128.52:443 输入后换跳转至https://172.25.128.52/,该URL是nginx的安装后默认展示界面 ------------------------------ 现象:反向代理跳转172.25.128.52:443的时候会出现以下报错,而跳转exchange时候则正常。 nginx error! The page you are looking for is not found. Website Administrator Something has triggered missing webpage on your website. This is the default 404 error page for nginx that is distributed with Fedora. It is located /usr/share/nginx/html/404.html You should customize this error page for your own site or edit the error_page directive in the nginx configuration file /etc/nginx/nginx.conf. ------------------------------ 提问: [1] 是否必须要求两个IP提供服务要求一致? [2] 是否有解决方案可以轮询跳转不同服务? ------------------------------ 核心配置文件部分如下 ……省略…… upstream apps { server 172.25.128.50:443; server 172.25.128.52:443; } ……省略…… server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name _; ssl_certificate "/etc/ssl/private/nginx_private.crt"; ssl_certificate_key "/etc/ssl/certs/nginx_public.key"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; include /etc/nginx/default.d/*.conf; location / { proxy_pass https://apps; proxy_redirect default; } } ……省略……
2021-12-15
烟灰小子
接上一条留言,我困惑的是 nginx upstream 时间相关的这几个参数 我在实际(内网)环境中遇到过,就是 nginx request_time 时间长,upstream_response_time 时间长,upstream_header_time 时间不长,upstream_header_time 时间长,不过上游服务器(tomcat)处理完记录处理时间很短,处理结束打日志的时间和nginx 记录处理日志的时间接近 我的nginx日志格式: '$remote_addr - $remote_user [$time_iso8601] ' ' "$request" $status $body_bytes_sent $bytes_sent ' ' $request_trace_id ' ' ["$upstream_addr" "$upstream_status" "$upstream_bytes_received" "$upstream_response_length" "$upstream_cache_status" ' ' "$upstream_response_time" "$upstream_connect_time" "$upstream_header_time"] ' ' "$request_time" "$http_referer" "$http_user_agent" "$http_x_forwarded_for" "$ssl_protocol"'; request_trace_id 变量的自定义: #trace.setting set $request_trace_id $http_x_request_id; if ( $request_trace_id = '' ) { set $request_trace_id $pid-$connection-$bytes_sent-$msec; } 我的tomcat日志格式: "[%{Y-M-d H:m:s.S+z}t] real_ip:%{X-Real-IP}i remote:%h requestid:%{X-Request-ID}i first_line:"%r" status:%s bytes:%b cost:%Dms commit_time:%Fms Agent:"%{User-Agent}i" %{Connection}i %{Connection}o %{Keep-Alive}i %{Keep-Alive}o" nginx日志: 192.168.26.73 [2021-09-09T09:58:23+08:00] POST /cgp2-oauth/oauth/check_token HTTP/1.1 200 12983 13364 6462-1025729-0-1631152697.976 [ 127.0.0.1:8801 200 12991 - 5.026 0.000 5.026 ] 5.026 2021-09-09 09:58:17.976 对应tomcat日志(根据自定义的 $request_trace_id 匹配的): [2021-9-9 9:58:17.993+CST] real_ip:192.168.26.73 remote:127.0.0.1 requestid:6462-1025729-0-1631152697.976 first_line:" POST /cgp2-oauth/oauth/check_token HTTP/1.1" status:200 bytes:12991 cost:17ms commit_time:16ms Agent:"Java/1.8.0_144" - - - - 也想听听老师的意见,我目前是换 SSD 替换 HDD 解决了问题,不过内部测试的压力并不大。比较困惑,谢谢!
2021-09-14
烟灰小子
陶辉老师好: 关于 nginx upstream 的这几个时间相关的变量,想确认一下具体哪一个对或者还是自己理解错了 参考之前nginx的blog发的一篇文章,以及nginx.org官网的 ngx_http_upstream_module 的文档 https://www.nginx.com/blog/using-nginx-logging-for-application-performance-monitoring/ http://nginx.org/en/docs/http/ngx_http_upstream_module.html#variables 官网说的是这样: $upstream_response_time keeps time spent on receiving the response from the upstream server; $upstream_header_time keeps time spent on receiving the response header from the upstream server (1.7.10); $upstream_connect_time keeps time spent on establishing a connection with the upstream server (1.9.1); nginx blog 有篇文档说的是这样: $request_time Full request time, starting when NGINX reads the first byte from the client and ending when NGINX sends the last byte of the response body $upstream_connect_time Time spent establishing a connection with an upstream server $upstream_header_time Time between establishing a connection to an upstream server and receiving the first byte of the response header $upstream_response_time Time between establishing a connection to an upstream server and receiving the last byte of the response body 官方的这个文档解释让我误解,之前学习过老师这部分的视频,后来结合我自己遇到的问题加上看了一些网上的文章, 我理解 $upstream_response_time 是nginx与上游整个处理的流程耗时时长(从nginx向upstream server发连接开始到nginx 收到上游响应报文的最后一个字节的数据) 它是包括 $upstream_header_time 和 $upstream_connect_time 的 我主要迷惑的是 $upstream_header_time, 它有包含 $upstream_connect_time 的连接时长,我理解的是这个时间是 nginx 与 upstream server 连接开始到 upstream server 处理,然后到返回,nginx 收到 upstream server 的http 内容的第一个字节截至, 之间的时间(我理解就是这个变量不包含nginx读取upstream server的完整的 响应报文的http header 数据) 由于篇幅问题,我另一个留言附上我的实际日志。
2021-09-14
海东青
老师您好: 我这里遇到一个问题nginx 版本1.12.2 并使用了upstream_check模块用来作主动热检测,偶尔有接口返回502,而ngx日志中出现no live upstreams 请问老师这问题怎么查?
2021-01-27
深海极光
Nginx出现no live upstream但是后端服务正常的情况基本是nginx的failmaxs 和failtimeout默认配置造成的,默认失败一次,就禁用failtimeout的时间,默认是10秒,当多个服务都出现超时时就502了,简单的话把failmax设置为0即可
2019-07-05
Panda
NGINX内置变量很丰富
2019-01-14
收起评论