• 大小: 647KB
    文件类型: .gz
    金币: 1
    下载: 0 次
    发布日期: 2023-08-07
  • 语言: 其他
  • 标签: 服务器类  

资源简介

kangle web服务器 是一款跨平台、功能强大、安全稳定、易操作的高性能web服务器和反向代 理服务器软件。简称:kangle
kangle采用基于事件驱动(epoll等)加非阻塞socket及异步IO的方式构架,使其比传统web服务器性能更高;静态网页处理能力达到Apache的8-10倍左右。
kangle支持isapi,fastcgi,cgi,ajp,uwsgi,fcgi,hmux,http等多种扩展接口,是一个非常开放的系统,非常方便的做负载均衡功能;
kangle内置内存/磁盘两级缓存,采用LRU淘汰算法,缓存命中率非常高,有效降低资源占用
可以设置每个虚拟主机独立进程,独立身份运行(虚拟主机商的最爱,安全的实现虚拟主机功能);
企业版还带有独特的防CC攻击和限制虚拟主机cpu的功能,自动监测动态网页的访问频率,一但达到设定的阀值,自动对该网页保护,kangle能区分攻击访问和正常访问。一但某个虚拟主机的cpu超过设置,自动对该虚拟主机降低优先级。从而不影响其它虚拟主机。做到隔离攻击。
独有的命令扩展(虚拟化其它web服务器,使其它web服务器亦具有前述优点,

资源截图

代码片段和文件信息

/*
 * api_child.cpp
 * kangle 以子进程运行时和主进程通信的代码
 *
 *  Created on: 2010-7-9
 *      Author: keengo
 */
#include 
#include 
#include 
#include 
//#include “KApiRedirect.h“
#include “KStream.h“
#include “KFastcgiUtils.h“
#include “KApiFetchobject.h“
#include “KChildListen.h“
//#include “KSelectorManager.h“

#include “KThreadPool.h“
/////////[5]
#include “api_child.h“
#include “KChildApiService.h“
#include “KApiDso.h“
#include “api_child.h“
#include “KListenPipeStream.h“
#include “extworker.h“
std::map processes;
std::map apis;
int api_child_key;
KListenPipeStream ls;
#ifdef _WIN32
HANDLE api_child_token = NULL;
#endif
KMutex processLock;
using namespace std;
KChildListen *cl = NULL;
u_short cur_api_id = 1;
static KMutex lock;
void restart_child_process(pid_t pid)
{
bool process_is_too_short = false;
processLock.Lock();
std::map::iterator it = processes.find(pid);
if (it!=processes.end()) {
if (time(NULL) - (*it).second < 5) {
process_is_too_short = true;
}
processes.erase(it);
}
processLock.Unlock();
#ifdef _WIN32
CloseHandle(pid);
#endif
if (process_is_too_short) {
sleep(1);
}
if(program_quit){
return;
}
if(!::createProcess(&ls NULL argv NULL RDSTD_INPUT)){
                debug(“cann‘t create process\n“);
                return ;
        }
        pid = ls.process.stealPid();
processLock.Lock();
        processes.insert(pair(pidtime(NULL)));
processLock.Unlock();
return;
}
/////////[6]
FUNC_TYPE FUNC_CALL api_listen_thread(void *param) {
KChildListen *cl = (KChildListen *) param;
for (;;) {
cl->canRead();
}
KTHREAD_RETURN;
}
static KApiDso *getApiRedirect(u_short id) {
KApiDso *rd = NULL;
std::map::iterator it;
lock.Lock();
it = apis.find(id);
if (it != apis.end()) {
rd = (*it).second;
//rd->addRef();
}
lock.Unlock();
return rd;
}
static bool loadApiRedirect(const char *pathu_short id) {

KApiDso *rd = new KApiDso;
rd->path = path;
if (!rd->load()) {
delete rd;
return false;
}
lock.Lock();
apis[id] = rd;
lock.Unlock();
return true;
}
static bool api_child_load(KStream *st char *msgu_short id u_short content_len) {

FCGI_Header header;
memset(&header 0 sizeof(header));
if(loadApiRedirect(msgid)){
header.id = 0;
} else {
header.id = 1;
}
header.type = API_CHILD_LOAD_RESULT;
return st->write_all((char *) &header sizeof(header))
== STREAM_WRITE_SUCCESS;
}
#ifndef _WIN32
static bool api_child_setuid(KPoolableStream *st char *msg
u_short content_len) {
if (content_len != sizeof(api_child_t_uidgid)) {
return false;
}
FCGI_Header header;
memset(&header 0 sizeof(header));
api_child_t_uidgid *body = (api_child_t_uidgid *) msg;
// bool result = true;
if (body->gid>0 && setgid(body->gid) != 0) {
header.id |= 2;
}
if (body->uid>0 && setuid(body->uid) != 0) {
header.id |= 1;
}
header.type = API_CHILD_SETUID_RESULT;
if (st->write_all((char *

评论

共有 条评论