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. [数据结构] 快速排序C语言程序

    //由大到小//快速排序(待排序数组,左侧起点,右侧起点) void quickSort(int *array, int l, int r) { if ( l >= r) return; int ...

  2. 2018.我的NOIP补全计划

    code: efzoi.tk @ shleodai noip2011 D1 选择客栈 这道题是一道大水题,冷静分析一会就会发现我们需要维护最后一个不合法点和前缀和. 维护最后一个不合法点只要边扫描边维 ...

  3. luo3372线段树模板的分块做法

    题目大意 请你维护一个有n个元素的整数序列,要求支持区间查询&区间修改 对于100%的数据,\(1<=n<=10^5\) 分析 正常做法是线段树维护区间修改.区间查询,今天我要讲的 ...

  4. python学习:注释、获取用户输入、字符串拼接、运算符、表达式

    注释 #为单行注释'''三个单引号(或者"""三个双引号)为多行注释,例如'''被注释的内容''' '''三个单引号还可以起到多行打印的功能. #ctrl+? 选中的多行 ...

  5. angular.injector()

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. Java try-cath-finally异常

    Java 内置异常类 Java 语言定义了一些异常类在 java.lang 标准包中. 标准运行时异常类的子类是最常见的异常类.由于 java.lang 包是默认加载到所有的 Java 程序的,所以大 ...

  7. Git 经常用到的命令

    1.克隆master分支之外的分支: 首先克隆项目 1>Git clone git@192.168.0.201:frontend/mn.git 然后转换到克隆下来的文件夹 2>cd 文件名 ...

  8. eclipse设置properties文件的字体颜色

    点击Window->preferences->搜素properties ============================ 其它设置字体颜色设置        =========== ...

  9. python语法_集合

    集合:不同的元素(不可hash)组合在一起的就叫做集合,去掉重复的,以空字符返回,无序的 可以分为可变集合和不可变集合(frozenset) 创建: s = set('gm gyx') print(s ...

  10. bootstrap-treeview分级展示列表树的实现

    html页面: 要引用 "/webapp/common/css/bootstrap-treeview.css" "/webapp/common/js/bootstrap- ...