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); }
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; }