mongols是C++ 服务器基础设施库,它最近更新提供了反向代理和负载均衡功能。

以下为用mongols代理两个nodejs后端(8888和8889)并与nginx压测对比图:

压测显示mongols已经完全超过nginx。

以下是压测代码。

首先是nodejs:

var http = require('http');
var port = 8888;// http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n');
}).listen(port); console.log('Server running at http://127.0.0.1:'+port+'/');

然后是mongols:

#include <unistd.h>
#include <sys/wait.h>
#include <sys/signal.h>
#include <sys/prctl.h> #include <mongols/util.hpp>
#include <mongols/tcp_proxy_server.hpp> #include <cstring>
#include <iostream>
#include <functional> int main(int, char**) {
// daemon(1, 0);
auto f = [](const mongols::tcp_server::client_t & client) {
return true;
};
int port = ;
const char* host = "127.0.0.1"; mongols::tcp_proxy_server server(host, port, , , /**/); server.set_enable_http_mode(true);
server.set_enable_http_lru_cache(true);
server.set_http_lru_cache_expires();
server.set_default_http_content(); //see example/nodejs
server.set_backend_server(host, );
server.set_backend_server(host, ); // server.run(f); std::function<void(pthread_mutex_t*, size_t*) > ff = [&](pthread_mutex_t* mtx, size_t * data) {
server.run(f);
}; std::function<bool(int) > g = [&](int status) {
std::cout << strsignal(WTERMSIG(status)) << std::endl;
return false;
}; mongols::multi_process main_process;
main_process.run(ff, g);
}

同样的后端,同样多的工作进程,如果比较于nginx的proxy_pass方案,无论是否开启缓存,mongols的并发性能都要强于nginx。

mongols还提供易开发的连接级的安全防护。比如上面的f,可重新写为:

 auto f = [](const mongols::tcp_server::client_t & client) {
if(client.ip=="x.x.x.x"){
return false;
}
if(client.u_size>){
return false;
}
if(client.count/difftime(time(),client.t)>){
return false;
}
return true;
};

该functional以类client_t为参数。开发者可从该参数获取连接的系统唯一标识符sid,连接建立时间t,该连接已经发送数据的次数count,该连接的ip,以及服务器保持在线的连接总数u_size

现在,f表示:如果服务器总连接数超过100000,或者单个连接发送数据的频率超过每秒50次,或者当前连接ip为x.x.x.x,就关闭当前连接。

关闭连接时,对tcp代理返回空字符串,对http代理返回403错误。开发者可通过set_default_content方法设置默认返回值。

仓库:https://github.com/webcpp/mongols

文档:https://mongols.hi-nginx.com/

mongols的反向代理和负载均衡功能的更多相关文章

  1. nginx1.8.1反向代理、负载均衡功能的实现

    nginx1.8.1 proxy 服务器192.168.8.40 web1 centos6.5 httpd2.2.15 web2 centos7.2 httpd2.4.6 1.代理功能的简单实现 ng ...

  2. Nginx反向代理、负载均衡功能

    环境: [root@db02 ~]# uname -a Linux db02 -.el6.x86_64 # SMP Tue Mar :: UTC x86_64 x86_64 x86_64 GNU/Li ...

  3. Linux实战教学笔记30:Nginx反向代理与负载均衡应用实践

    1.1 集群简介 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器.这些服务器之间可 ...

  4. Linux 笔记 - 第二十章 配置 Nginx 反向代理和负载均衡

    一.简介 由于 Nginx 的反向代理和负载均衡功能经常被提及,所以将这两个功能单独提出来进行讲解. Nginx 其实仅仅是作为 Nginx Proxy 反向代理使用的,因为这个反向代理功能表现的效果 ...

  5. Nginx代理与反向代理、负载均衡实

    通过 Nginx 提供的反向代理和负载均衡功能,可以合理的完成业务的分配,提高网站的处理能力:同时利用缓存功能,还可以将不需要实时更新的动态页面输出结果,转化为静态网页形成缓存,从而提高网站的响应速度 ...

  6. Nginx代理与反向代理、负载均衡实践

    通过 Nginx 提供的反向代理和负载均衡功能,可以合理的完成业务的分配,提高网站的处理能力;同时利用缓存功能,还可以将不需要实时更新的动态页面输出结果,转化为静态网页形成缓存,从而提高网站的响应速度 ...

  7. Nginx反向代理与负载均衡应用实践(一)

    Nginx反向代理与负载均衡应用实践(一) 链接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ 提取码:migq 复制这段内容后打开百度网盘手机App ...

  8. Nginx反向代理,负载均衡,redis session共享,keepalived高可用

    相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此 ...

  9. Nginx服务器 之反向代理与负载均衡

    一.反向代理 正向代理: 客户端要获取的资源就在服务器上,客户端请求的资源路径就是最终响应资源的服务器路径,这就是正向代理.正向代理的特点:就是我们明确知道要访问哪个网站地址. 反向代理: 客户端想获 ...

随机推荐

  1. WPF: 共享Grid宽度或高度的方法

    需要两个属性: 1. Grid.IsSharedSizeScope="True" 2. SharedSizeGroup=名称 <StackPanel Margin=" ...

  2. 图论算法之DFS与BFS

    概述(总) DFS是算法中图论部分中最基本的算法之一.对于算法入门者而言,这是一个必须掌握的基本算法.它的算法思想可以运用在很多地方,利用它可以解决很多实际问题,但是深入掌握其原理是我们灵活运用它的关 ...

  3. react_app 项目开发 (5)_前后端分离_后台管理系统_开始

    项目描述 技术选型 react API 接口 接口文档,url,请求方式,参数类型, 根据文档描述的方法,进行 postman 测试,看是否能够得到理想的结果 collections - 创建文件取项 ...

  4. Go九九乘法表

    package main import "fmt" func main(){ ; i < ; i ++ { k ++ ; j ++ { { fmt.Printf(" ...

  5. JMter随记

    线程组( Threads (Users))理解:一个虚拟用户组,线程组内线程数量在运行过程中不会发生改变. 注意事项:线程间变量相互独立. 一个测试计划内可以包含多个线程组. 可定义内容: 取样器错误 ...

  6. [JAVA] TicTacToe实现Socket通信(一)

    先来两张预览,大家可以试试jar包了,有什么问题评论哈,过两天贴代码 jar包这里下载 https://github.com/Andy-ZYA/TicTacToe_JAVA_Socket_Swing

  7. 安装Office2010出现MSXML版本6.10.1129.0错误

      在键盘上按“win+R”组合键出现图图示界面后,输入“regsvr32 /u msxml6.dll”,点击“确定”. 出现图示显示后,点击“确定”,并同时去试试office是否能够安装了. 如果上 ...

  8. input 在 2 和 3 上的区别

    2  和 3 上面 在 input 的区别 1 2 3 name = raw_input('请输入用户名:')#python2.7的用法 name = input('请输入用户名:')#python3 ...

  9. 浏览器保存数据给app读取

    https://www.jianshu.com/p/239bab24d249 https://www.jianshu.com/p/43f8a81dd8ca

  10. wpf 获取Image的图片并保存到本地

    XMAL代码如下: <Image Name="ImageToSave" Source="Images/pic_bg.png" Grid.RowSpan=& ...