Nginx学习之九-负载均衡(客户端请求与Nginx进程间负载均衡)

本文探讨了Nginx中的负载均衡机制,特别是在多核CPU环境下,如何通过accept_mutex锁和ngx_accept_disabled变量来确保各个worker子进程间的负载均衡,避免部分进程过度负载导致的服务性能下降。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文介绍的负载均衡是针对的客户端请求在多个Nginx进程之间的均衡。注意与客户端请求在多个后端服务器之间的均衡相区别。


负载均衡问题的产生


在nginx中,建立连接的时候,会设计负载均衡问题。在多个子进程争抢处理一个新连接事件时,一定只有一个worker子进程最终会成功建立连接,随后它会一直处理这个连接直到连接关闭。那么,就有可能出现这样的情况:有的子进程建立并处理了大部分连接,而有的子进程只处理了少量连接。这对多核CPU架构下的应用是很不利的。因为子进程之间应该是平等的,每个子进程应该尽量独占一个CPU核心。子进程间负载不均衡,必定会影响整个服务的性能。

如何解决负载均衡问题


与惊群问题的解决方法一样,只有打开了accept_mutex锁,才能实现子进程间的负载均衡。同时post事件机制也是解决负载均衡问题的关键。可以参考前一篇文章 http://blog.youkuaiyun.com/xiajun07061225/article/details/9260535
在ngx_event_accept方法建立新连接的过程中,初始化了一个全局变量ngx_accept_disabled。它就是负载均衡机制实现的关键阈值。其定义(/src/event/ngx_event.c):
ngx_int_t             ngx_accept_disabled;

初始化(sr/event/ngx_event_accept.c)是在函数ngx_event_accept中:
ngx_accept_disabled = ngx_cycle->connection_n / 8  - ngx_cycle->free_connection_n;

这样,在nginx启动的时候其实是个负值: -7/8 * ngx_cycle->connection_n。

依据这个值进行负载均衡的核心代码是在函数ngx_process_events_and_timers中(src/event/ngx.event.c)
         //负载均衡处理
        if (ngx_accept_disabled > 0) {
            ngx_accept_disabled--;
        } else {
            //调用 ngx_trylock_accept_mutex方法,尝试获取accept锁
            if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
                return;
            }

解释一下:
当ngx_accept_disabled 为负数时,不会触发负载均衡操作,正常获取accept锁,试图处理新连接。
ngx_accept_disabled  为正数时,会触发负载均衡操作。nginx此时不再处理新连接事件,取而代之的仅仅是把变量 ngx_accept_disabled  减一,这表示既然经过一轮事件处理,那么负载肯定有所减小,所以要相应调整这个值。

即,当当前使用的连接超过总连接数的7/8的时候才会被触发,值越大,表示负载越重。每次调用process_events的时候只会将  ngx_accept_disabled    减一,直到 ngx_accept_disabled  降到0,即使用的连接数降到总连接数的7/8。这样就减少了该worker进程处理新连接的机会,这样其他较空闲的worker进程就有机会去处理更多的新连接,以达到整个web服务器的均衡效果。

Nginx默认将accept_mutex配置项设置为accept_mutex on。

参考资料

《深入理解Nginx》


### Kali Linux二次注入相关的技术操作 #### 什么是二次注入? 二次注入是一种高级攻击形式,通常发生在应用程序未能正确处理用户输入的情况下。在这种情况下,恶意数据会被存储在数据库或其他持久化介质中,并在稍后的某个时间点被重新解析或执行[^1]。 #### 实现二次注入的技术细节 为了利用二次注入漏洞,渗透测试人员需要遵循以下原则和技术: 1. **识别潜在的二次注入场景** - 应用程序可能将用户的输入存储到数据库中,并在未来将其作为动态内容呈现给其他用户。 - 数据库中的字段可能会被再次解析为SQL语句的一部分,或者通过模板引擎渲染成HTML页面[^3]。 2. **构造有效的载荷** - 使用工具如 `sqlmap` 或手动编写 SQL 注入载荷来验证是否存在未经过滤的数据存储行为。 - 对于 XSS 类型的二次注入,可以尝试嵌套 JavaScript 脚本标签 `<script>` 并观察其是否被执行。 3. **自动化工具的应用** - 利用 Kali Linux 提供的安全评估工具集,例如 Nikto 和 Xsser 来辅助发现和确认这些复杂的注入路径。 ```bash nikto -host http://example.com -output /path/to/output.txt ``` 上述命令用于扫描目标网站并记录结果至指定文件中以便后续分析[^2]。 同样地,在寻找跨站脚本(XSS)可能性方面,可以通过如下方式调用 Xsser 工具: ```bash xsser -u "http://targetsite/page" -g "param=value" --cookie="sessionid=abcde" ``` 4. **实际案例演示——基于 SET 的社会工程学攻击扩展** 当使用 Social Engineering Toolkit (SET) 构建钓鱼网页时,默认生成的 HTML 表单允许自定义提交地址以及参数名称。如果开发者忽略了对 POST 请求数据的有效校验,则可能导致进一步的危害扩散[^4]。 ```html <form action="{{ attacker_controlled_url }}" method="post"> <!-- 用户填写的信息 --> </form> ``` 上述代码片段展示了如何修改默认配置从而引导受害者访问受控资源,进而触发额外逻辑链路下的安全风险暴露。 --- #### 注意事项 尽管掌握此类技能对于合法授权范围内的红队行动至关重要,但在未经授权前提下实施任何类型的入侵活动均属违法行为,请务必严格遵守法律法规!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没有昵称阿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值