作者回复: 你是说upstream模块顺序吗?顺序是对的,模块顺序其实针对的是初始化顺序,而初始化什么呢?就是upstream模块构成的单链表(参见http filter模块),由于是从链表头插入并初始化新模块,往往执行顺序与初始化顺序是相反的。
作者回复: 可以,比如用if加rewrite指令,或者用map来为proxy_pass提供域名
作者回复: 有,但非常低,它使用自旋锁对共享内存做同步,每次操作红黑树不过十来条指令,可以忽略。
作者回复: 你说的调用链,是指处理模块和过滤模块吧?这两类模块与upstream模块不同,upstream模块间其实差异性很大,比如zone模块功能完全不同,而keepalive模块应在负载均衡算法模块之前,而其他负载均衡算法模块(如hash或者least conn)互相之间有排他性。所以upstream模块的处理方式不是简单的链表关系。我建议你参考一下这两个方法:ngx_http_upstream_keepalive和ngx_http_upstream_zone
作者回复: 是的
作者回复: master不选择worker,由linux kernal选择worker,参见122课
作者回复: 只能我来猜了。保持会话,你这里是指,同一客户端2次请求2个连接,都落在一台服务器上?如果是这个问题,答案是不行。
作者回复: session问题是指?
作者回复: 是。实际上所有负载均衡算法都会在某些条件下出现负载不均衡情况
作者回复: 不需要提前,在upstream{}里的zone里配置时,就会直接创建共享内存,并把相关的负载均衡参数以及服务器状态数据都放在共享内存中,进而对所有worker进程生效。
作者回复: 1、我的示例中,只开启了1个worker进程。
2、没使用zone,则会在内存中会记录访问了1次或者2次,所以功能是正常的。
3、如果开启了多个worker进程,但没有开启zone,那么多个worker是独立的在各自内存中记录,不能分享其他worker进程的访问记录。
作者回复: 不使用zone模块,就会在进程的内容存放内容,用了zone模块,只是把内存改为共享 内存而已。