下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 84 | 负载均衡哈希算法:ip_hash与hash模块
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

Nginx核心知识100讲

共155讲 · 155课时,约1300分钟
18552
免费
01 | 课程综述
免费
02 | Nginx适用于哪些场景?
免费
03 | Nginx出现的历史背景
免费
04 | 为什么用Nginx:它的 5 ...
免费
05 | Nginx的四个主要组成部分
06 | Nginx的版本发布历史
07 | 选择哪一个Nginx发行版本...
08 | 编译出适合自己的Nginx
09 | Nginx配置文件的通用语法...
10 | Nginx命令行及演示:重载...
11 | 用Nginx搭建一个可用的静...
12 | 用Nginx搭建一个具备缓存...
13 | 用GoAccess实现可视化并实...
14 | 从网络原理来看SSL安全协...
15 | 对称加密与非对称加密各自...
16 | SSL证书的公信力是如何保...
17 | SSL协议握手时Nginx的性能...
18 | 用免费SSL证书实现一个HTT...
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与bucke...
40 | Nginx中最常用的容器:红...
41 | 使用动态模块来提升运维效...
免费
42 | 第三章内容介绍
43 | 冲突的配置指令以谁为准?
44 | Listen指令的用法
免费
45 | 处理HTTP请求头部的流程
46 | Nginx中的正则表达式
47 | 如何找到处理请求的server...
48 | 详解HTTP请求的11个阶段
49 | 11个阶段的顺序处理
50 | postread阶段:获取真实客...
51 | rewrite阶段的rewrite模块...
52 | rewrite阶段的rewrite模块...
53 | rewrite阶段的rewrite模块...
54 | find_config阶段:找到处...
55 | preaccess阶段:对连接做...
56 | preaccess阶段:对请求做...
57 | access阶段:对ip做限制的...
58 | access阶段:对用户名密码...
59 | access阶段:使用第三方做...
60 | access阶段的satisfy指令
61 | precontent阶段:按序访问...
62 | 实时拷贝流量:precontent...
63 | content阶段:详解root和a...
64 | static模块提供的3个变量
65 | static模块对url不以斜杠...
66 | index和autoindex模块的用...
67 | 提升多个小文件性能的conc...
68 | access日志的详细用法
69 | HTTP过滤模块的调用流程
70 | 用过滤模块更改响应中的字...
71 | 用过滤模块在http响应的前...
72 | Nginx变量的运行原理
73 | HTTP框架提供的请求相关的...
74 | HTTP框架提供的其他变量
75 | 使用变量防盗链的referer...
76 | 使用变量实现防盗链功能实...
77 | 为复杂的业务生成新的变量...
78 | 通过变量指定少量用户实现...
79 | 根据IP地址范围的匹配生成...
80 | 使用变量获得用户的地理位...
81 | 对客户端使用keepalive提...
82 | 反向代理与负载均衡原理
83 | 负载均衡策略:round-rob...
84 | 负载均衡哈希算法:ip_has...
85 | 一致性哈希算法:hash模块
86 | 最少连接算法以及如何跨wo...
87 | upstream模块提供的变量
88 | proxy模块处理请求的流程
89 | proxy模块中的proxy_pas...
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协议与r...
114 | 限并发连接、限IP、记日...
115 | stream四层反向代理处理S...
116 | stream_preread模块取出S...
117 | stream proxy四层反向...
118 | UDP反向代理
119 | 透传IP地址的3个方案
120 | 性能优化方法论
121 | 如何高效使用CPU
122 | 多核间的负载均衡
免费
123 | 控制TCP三次握手参数
免费
124 | 建立TCP连接的优化
125 | 滑动窗口与缓冲区
126 | 优化缓冲区与传输效率
127 | 慢启动与拥塞窗口
128 | TCP协议的keepalive功能
129 | 减少关闭连接时的time_wa...
130 | lingering_close延迟关闭...
131 | 应用层协议的优化
免费
132 | 磁盘IO的优化
133 | 减少磁盘读写次数
134 | 零拷贝与gzip_static模...
135 | 用tcmalloc优化内存分配
136 | 使用Google PerfTools分...
137 | 使用stub_status模块监控...
138 | 第三方模块源码的阅读
139 | Nginx的启动流程
140 | HTTP第三方模块的初始化
141 | if指令是邪恶的吗?
142 | 解读Nginx的核心转储文件
143 | 通过debug日志定位问题
144 | OpenResty概述
145 | OpenResty中的Nginx模块...
146 | 如何在Nginx中嵌入Lua代...
147 | OpenResty中Lua与C代码...
148 | 获取、修改请求与响应的S...
149 | 工具类型的SDK
150 | 同步且非阻塞的底层SDK:...
151 | 基于协程的并发编程SDK
152 | 定时器及时间相关的SDK
153 | share.DICT基于共享内存...
154 | 子请求的使用方法
155 | 基于OpenResty的WAF防火...

精选留言(7)

  • 2019-03-27
    老师说即使服务器挂了,也要把请求转到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;

    1
  • 2019-01-25
    老师好,请教一个问题,我们通常为了使用更多的文件描述符在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课。

    1
  • 2019-01-14
    ip_hash 适合有状态的服务

    作者回复: 是的

    1
  • 2019-11-13
    老师,我在 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-10-17
    老师,ip_hash算法中113和6271是什么意思呢

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

  • 2019-06-24
    老师,我的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-05-20
    老师,
    使用ip_hash模式,hash表记录了每个客户端IP和后端服务器的对应关系,客户端每次都访问都是同一个后端服务器响应,是这样的吗

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