Nginx 核心知识 150 讲
陶辉
智链达 CTO,前阿里云 P8 高级技术专家
61678 人已学习
新⼈⾸单¥98
课程目录
已完结/共 155 讲
第三章:详解HTTP模块 (40讲)
第四章:反向代理与负载均衡 (38讲)
Nginx 核心知识 150 讲
登录|注册
留言
9
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 84 | 负载均衡哈希算法:ip_hash与hash模块
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防火墙&结课测试
本节摘要
登录 后留言

全部留言(9)

  • 最新
  • 精选
老师说即使服务器挂了,也要把请求转到8012的服务器上。这样要做什么额外的操作吗?因为在看Nginx文档的时候,写的是: > The method ensures that requests from the same client will always be passed to the same server except when this server is unavailable. In the latter case client requests will be passed to another server. Most probably, it will always be the same server as well. 个人理解是8012的服务不可用了,请求是会被转到其他服务上去。 在`nginx version: nginx/1.14.2`操作的时候,也是发现会被转到其他服务上。

作者回复: 不需要,对于服务器挂了后导致的超时,默认是自动开启next upstream功能的,参见proxy_next_upstream指令的默认值: Default:proxy_next_upstream error timeout;

2019-03-27
2
Panda
ip_hash 适合有状态的服务

作者回复: 是的

2019-01-14
2
liu
老师好,请教一个问题,我们通常为了使用更多的文件描述符在nginx.conf中配置如下: worker_rlimit_nofile 131070; ##注意是65535的2倍! 我centos中/etc/security/limits.conf 文件中有如下的设置: * soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535 这样的话,一个nginx进程最多使用65535个文件描述符, 我在nginx.conf中加入的worker_rlimit_nofile 131070; 有效吗? 莫非真的能超过ulimit -n的限制? 还是为了使得worker_rlimit_nofile 131070; 有效,limits.conf中也要设置的不比该数值小? 谢谢!

作者回复: Linux上设置最大描述符数量,有三个维度:全局、用户、进程,其中自上而下的关系中,进程自然不能超过用户和全局的限制。如果超过了,会以最小的为准。请参见第124课。

2019-01-25
1
明明懂
老师,我在 upstream 所配置的服务器中返回加了 $remote_addr,可是每次返回的值都是 127.0.0.1,我的配置是这样的: server { listen 8011; default_type text/plain; return 200 '8011 server response realip is $remote_addr $realip_remote_addr.\n'; } server { listen 8012; default_type text/plain; return 200 '8012 server response realip is $remote_addr $realip_remote_addr .\n'; } server { listen 80; set_real_ip_from 122.51.137.225; # 结合课程50,设置可信地址 set_real_ip_from 127.0.0.1; real_ip_recursive on; real_ip_header X-Forwarded-For; error_log logs/myiphash.log info; access_log logs/upstream_access.log varups; location / { proxy_pass http://iphashs; proxy_http_version 1.1; proxy_set_header Connection ""; } } 执行路由:curl 127.0.0.1 -H "X-Forwarded-For:4.4.4.4" 返回:8011 server response realip is 127.0.0.1 127.0.0.1. 执行:curl 127.0.0.1:80 -H "X-Forwarded-For:120.88.88.88" 返回:8012 server response realip is 127.0.0.1 127.0.0.1 . 麻烦老师有空帮忙解答下

作者回复: 1、抓包看下,发给upstream的HTTP请求中,X-Forwarded-For:的值是什么,TCP的source ip address是什么; 2、在upstream上的set_real_ip_from必须匹配source ip address,才能把X-Forwarded-For中的IP作为$remote_addr取出来

2019-11-13
烟火里的尘埃
老师,ip_hash算法中113和6271是什么意思呢

作者回复: 联想不出这两个数字的出处,能再详细点吗?

2019-10-17
Carey
老师,我的iphash没有生效: log_format varups '$upstream_addr $upstream_connect_time $upstream_header_time $upstream_response_time' '$upstream_response_length $upstream_bytes_received ' '$upstream_status $upstream_http_server $upstream_cache_status'; upstream iphashups{ ip_hash; server 127.0.0.1:8011 weight=2 max_conns=2 max_fails=2 fail_timeout=5; server 127.0.0.1:8012; } server{ set_real_ip_from 221.239.129.176; #主机ip real_ip_recursive on; real_ip_header X-Forwarded-For; server_name rrups.hiroop.com;#在/etc/hosts有映射:127.0.0.1 rrups.hiroop.com error_log logs/iphash.log debug; access_log logs/upstream_access.log varups; location /{ proxy_buffering off; proxy_pass http://iphashups; proxy_http_version 1.1; proxy_set_header Connection ""; } } 访问效果: [root@linuxprobe conf]# curl -H 'X-Forwarded-For:100.200.200.100' rrups.hiroop.com 8012 server response [root@linuxprobe conf]# curl -H 'X-Forwarded-For:100.200.200.100' rrups.hiroop.com 8011 server response [root@linuxprobe conf]# curl -H 'X-Forwarded-For:100.200.200.100' rrups.hiroop.com 8011 server response [root@linuxprobe conf]# curl -H 'X-Forwarded-For:100.200.200.100' rrups.hiroop.com 8012 server response 看日志文件logs/iphash.log和logs/upstream_access.log,是空的。为什么呢??

作者回复: 如果error和access日志为空,说明server {}块未进入,原因很可能是被其他server {}匹配中了curl请求。除了经验式解决外,你可以尝试打开全部debug日志 (包括http{}下的),看看这条请求被哪个server/location匹配中处理了。

2019-06-24
初音未来
老师, 使用ip_hash模式,hash表记录了每个客户端IP和后端服务器的对应关系,客户端每次都访问都是同一个后端服务器响应,是这样的吗

作者回复: 是的,除非某台后端服务器宕机

2019-05-20
2
jinf666
老师,ip_hash在没有节点宕机时,如何能避免负载不均的问题?实际情况遇到某一个负载已经很高了,而其他节点资源的利用率非常低。
2020-03-26
1
子杨
老师这里面 Nginx 区分 IP 地址是根据网段划分来的吗?因为我测试更改主机地址实际上还是会被负载到同一台机器,而更改网段地址会负载到不同的机器上。
2020-06-15
1
收起评论