Пример #1
0
void wbt_worker_process() {
    /* 设置进程标题 */
    if( !wbt_conf.run_mode ) {
        wbt_set_proc_title("webit: worker process");
    }

    /* 设置需要监听的信号(后台模式) */
    struct sigaction act;
    sigset_t set;

    act.sa_sigaction = wbt_signal;
    sigemptyset(&act.sa_mask);
    act.sa_flags = SA_SIGINFO;

    sigemptyset(&set);
    sigaddset(&set, SIGCHLD);
    sigaddset(&set, SIGTERM);
    sigaddset(&set, SIGPIPE);

    if (sigprocmask(SIG_UNBLOCK, &set, NULL) == -1) {
        wbt_log_add("sigprocmask() failed\n");
    }

    sigaction(SIGINT, &act, NULL); /* 退出信号 */
    sigaction(SIGTERM, &act, NULL); /* 退出信号 */
    sigaction(SIGPIPE, &act, NULL); /* 忽略 */
    
    wbt_log_add("Webit startup (pid: %d)\n", getpid());

    /* 降低 worker 进程的权限 */
    const char * user = wbt_conf_get("user");
    if ( user != NULL && geteuid() == 0 ) {
        // 根据用户名查询
        // TODO getpwnam 应当在更早的时候调用。以免调用 getpwnam 失败的时候,工作进程被不断重启。 
        struct passwd * pw = getpwnam(user);
        if( pw == NULL ) {
            wbt_log_add("user %s not exists\n", user);
            return;
        }
        
        if (setgid(pw->pw_gid) == -1) {
            wbt_log_add("setgid(%d) failed", pw->pw_gid);
            return;
        }

        if (initgroups(user, pw->pw_gid) == -1) {
            wbt_log_add("initgroups(%s, %d) failed", user, pw->pw_gid);
            return;
        }

        if (setuid(pw->pw_uid) == -1) {
            wbt_log_add("setuid(%d) failed", pw->pw_uid);
            return;
        }
    }

    /* 进入事件循环 */
    wbt_event_dispatch();
    
    wbt_exit(0);
}
Пример #2
0
wbt_status wbt_conf_init() {
    wbt_rb_init(&wbt_config_rbtree, WBT_RB_KEY_STRING);
    
    wbt_config_file_path.len = 64;
    wbt_config_file_path.str = wbt_malloc( wbt_config_file_path.len );
    if( wbt_config_file_path.str == NULL ) {
        return WBT_ERROR;
    }
    
    if( wbt_conf_reload() != WBT_OK ) {
        return WBT_ERROR;
    }
    
    /* 初始化 wbt_conf */
    const char * value;
    wbt_str_t * m_value;
    
    wbt_conf.listen_port = 80;
    if( ( value = wbt_conf_get("listen") ) != NULL ) {
        wbt_conf.listen_port = atoi(value);
        if( wbt_conf.listen_port < 0 || wbt_conf.listen_port > 65535  ) {
            wbt_log_print("listen port out of range ( expect 0 - 65535 )\n");
            return WBT_ERROR;
        }
    }
    
    wbt_conf.process = 1;
    if( ( value = wbt_conf_get("process") ) != NULL ) {
        wbt_conf.process = atoi(value);
        if( wbt_conf.process < 1 || wbt_conf.process > 128 ) {
            wbt_log_print("worker process number out of range ( expect 1 - 128 )\n");
            return WBT_ERROR;
        }
    }
    
    wbt_conf.secure = 0;
    if( ( m_value = wbt_conf_get_v("secure") ) != NULL ) {
        if( wbt_strcmp( m_value, &wbt_conf_option_on ) == 0 ) {
            wbt_conf.secure = 1;
        }
    }
    
    wbt_conf.secure_port = 443;
    if( ( value = wbt_conf_get("secure_port") ) != NULL ) {
        wbt_conf.secure_port = atoi(value);
        if( wbt_conf.secure_port < 0 || wbt_conf.secure_port > 65535  ) {
            wbt_log_print("secure port out of range ( expect 0 - 65535 )\n");
            return WBT_ERROR;
        }
    }

    wbt_str_set_null(wbt_conf.secure_key);
    wbt_str_set_null(wbt_conf.secure_crt);
    if( wbt_conf.secure ) {
        if( ( m_value = wbt_conf_get_v("secure_key") ) != NULL ) {
            wbt_conf.secure_key = *m_value;
        } else {
            wbt_log_print("option secure_key is required\n");
            return WBT_ERROR;
        }
        
        if( ( m_value = wbt_conf_get_v("secure_crt") ) != NULL ) {
            wbt_conf.secure_crt = *m_value;
        } else {
            wbt_log_print("option secure_crt is required\n");
            return WBT_ERROR;
        }
    }

    wbt_conf.sendfile = 0;
    if( !wbt_conf.secure ) {
        if( ( m_value = wbt_conf_get_v("sendfile") ) != NULL ) {
            if( wbt_strcmp( (wbt_str_t *)m_value, &wbt_conf_option_on ) == 0 ) {
                wbt_conf.sendfile = 1;
            }
        }
    }

    wbt_conf.gzip = 0;
    if( ( m_value = wbt_conf_get_v("gzip") ) != NULL ) {
        if( wbt_strcmp( (wbt_str_t *)m_value, &wbt_conf_option_on ) == 0 ) {
            wbt_conf.gzip = 1;
        }
    }

    wbt_conf.aof = 1;
    if( ( m_value = wbt_conf_get_v("aof") ) != NULL ) {
        if( wbt_strcmp( (wbt_str_t *)m_value, &wbt_conf_option_off ) == 0 ) {
            wbt_conf.aof = 0;
        }
    }

    wbt_conf.aof_crc = 0;
    if( ( m_value = wbt_conf_get_v("aof_crc") ) != NULL ) {
        if( wbt_strcmp( (wbt_str_t *)m_value, &wbt_conf_option_on ) == 0 ) {
            wbt_conf.aof_crc = 1;
        }
    }

    wbt_conf.aof_fsync = AOF_FSYNC_EVERYSEC;
    if( ( m_value = wbt_conf_get_v("aof_fsync") ) != NULL ) {
        if( wbt_strcmp( (wbt_str_t *)m_value, &wbt_conf_option_off ) == 0 ) {
            wbt_conf.aof_fsync = AOF_FSYNC_NO;
        } else if( wbt_strcmp( (wbt_str_t *)m_value, &wbt_conf_option_always ) == 0 ) {
            wbt_conf.aof_fsync = AOF_FSYNC_ALWAYS;
        } else if( wbt_strcmp( (wbt_str_t *)m_value, &wbt_conf_option_everysec ) == 0 ) {
            wbt_conf.aof_fsync = AOF_FSYNC_EVERYSEC;
        } else {
            wbt_log_print("option aof_fsync is illegal ( expect off / always / everysec )\n");
            return WBT_ERROR;
        }
    }

    wbt_conf.aof_fast_boot = 1;
    if( ( m_value = wbt_conf_get_v("aof_fast_boot") ) != NULL ) {
        if( wbt_strcmp( (wbt_str_t *)m_value, &wbt_conf_option_off ) == 0 ) {
            wbt_conf.aof_fast_boot = 0;
        }
    }

    wbt_conf.auth = 0;
    if( ( m_value = wbt_conf_get_v("auth") ) != NULL ) {
        if( wbt_strcmp( (wbt_str_t *)m_value, &wbt_conf_option_none ) == 0 ) {
            wbt_conf.auth = 0;
        } else if( wbt_strcmp( (wbt_str_t *)m_value, &wbt_conf_option_basic ) == 0 ) {
            wbt_conf.auth = 1;
        } else if( wbt_strcmp( (wbt_str_t *)m_value, &wbt_conf_option_standard ) == 0 ) {
            wbt_conf.auth = 2;
        } else {
            wbt_log_print("option auth is illegal ( expect none / baisc / standard )\n");
            return WBT_ERROR;
        }
    }
    
    if( wbt_conf.auth == 1 ) {
        wbt_str_set_null(wbt_conf.auth_password);
        if( ( m_value = wbt_conf_get_v("auth_password") ) != NULL ) {
            wbt_conf.auth_key = *m_value;
        } else {
            wbt_log_print("option auth_password is required\n");
            return WBT_ERROR;
        }
    } else if( wbt_conf.auth == 2 ) {
        wbt_str_set_null(wbt_conf.auth_key);
        if( ( m_value = wbt_conf_get_v("auth_key") ) != NULL ) {
            wbt_conf.auth_key = *m_value;
        } else {
            wbt_log_print("option auth_key is required\n");
            return WBT_ERROR;
        }
    }
    
    wbt_str_set_null(wbt_conf.auth_anonymous);
    if( ( m_value = wbt_conf_get_v("auth_anonymous") ) != NULL ) {
        wbt_conf.auth_anonymous = *m_value;
    }

    wbt_conf.keep_alive_timeout = 600000;
    if( ( value = wbt_conf_get("keep_alive_timeout") ) != NULL ) {
        wbt_conf.keep_alive_timeout = atoi(value);
    }
    
    wbt_conf.event_timeout = 150000;
    if( ( value = wbt_conf_get("event_timeout") ) != NULL ) {
        wbt_conf.event_timeout = atoi(value);
    }

    wbt_conf.max_open_files = 65535;
    if( ( value = wbt_conf_get("max_open_files") ) != NULL ) {
        wbt_conf.max_open_files = atoi(value);
    }
    
    wbt_conf.max_core_file_size = 0;
    if( ( value = wbt_conf_get("max_core_file_size") ) != NULL ) {
        wbt_conf.max_core_file_size = atoi(value);
    }
    
    wbt_conf.max_memory_usage = 0;
    if( ( value = wbt_conf_get("max_memory_usage") ) != NULL ) {
        wbt_conf.max_memory_usage = 1024*1024*atoll(value);
    }

    wbt_conf.master_port = 1039;
    if( ( value = wbt_conf_get("master_port") ) != NULL ) {
        wbt_conf.master_port = atoi(value);
    }
    
    wbt_str_set_null(wbt_conf.root); 
    if( ( m_value = wbt_conf_get_v("root") ) != NULL ) {
        wbt_conf.root = *m_value;
        // TODO 检查 root 是否存在
    } else {
        wbt_log_print("option root is required\n");
        return WBT_ERROR;
    }
    
    wbt_str_set_null(wbt_conf.index);
    if( ( m_value = wbt_conf_get_v("default") ) != NULL ) {
        wbt_conf.index = *m_value;
    }

    wbt_str_set_null(wbt_conf.admin);
    if( ( m_value = wbt_conf_get_v("server_admin") ) != NULL ) {
        wbt_conf.admin = *m_value;
    }

    wbt_str_set_null(wbt_conf.user);
    if( ( m_value = wbt_conf_get_v("user") ) != NULL ) {
        wbt_conf.user = *m_value;
    }

    wbt_str_set_null(wbt_conf.data);
    if( ( m_value = wbt_conf_get_v("data") ) != NULL ) {
        wbt_conf.data = *m_value;
    } else {
        wbt_log_print("option data is required\n");
        return WBT_ERROR;
    }

    wbt_str_set_null(wbt_conf.logs);
    if( ( m_value = wbt_conf_get_v("logs") ) != NULL ) {
        wbt_conf.logs = *m_value;
    } else {
        wbt_log_print("option logs is required\n");
        return WBT_ERROR;
    }

    wbt_str_set_null(wbt_conf.master_host);
    if( ( m_value = wbt_conf_get_v("master_host") ) != NULL ) {
        wbt_conf.master_host = *m_value;
    }

    wbt_conf.worker_id = 0;
    if( ( value = wbt_conf_get("worker_id") ) != NULL ) {
        wbt_conf.worker_id = atoi(value);
        if( wbt_conf.worker_id < 0 || wbt_conf.worker_id > SF_MAX_WORKER_ID ) {
            wbt_log_print("worker_id out of range ( expect 0 - %d )\n", SF_MAX_WORKER_ID);
            return WBT_ERROR;
        }
    }
    
    return WBT_OK;
}