⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nginx.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) Igor Sysoev */#include <ngx_config.h>#include <ngx_core.h>#include <ngx_event.h>#include <nginx.h>static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle);static ngx_int_t ngx_getopt(ngx_cycle_t *cycle, int argc, char *const *argv);static ngx_int_t ngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv);static void *ngx_core_module_create_conf(ngx_cycle_t *cycle);static char *ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf);static char *ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);static char *ngx_set_env(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);static char *ngx_set_priority(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);static char *ngx_set_cpu_affinity(ngx_conf_t *cf, ngx_command_t *cmd,    void *conf);static ngx_conf_enum_t  ngx_debug_points[] = {    { ngx_string("stop"), NGX_DEBUG_POINTS_STOP },    { ngx_string("abort"), NGX_DEBUG_POINTS_ABORT },    { ngx_null_string, 0 }};static ngx_command_t  ngx_core_commands[] = {    { ngx_string("daemon"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,      ngx_conf_set_flag_slot,      0,      offsetof(ngx_core_conf_t, daemon),      NULL },    { ngx_string("master_process"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,      ngx_conf_set_flag_slot,      0,      offsetof(ngx_core_conf_t, master),      NULL },    { ngx_string("timer_resolution"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_conf_set_msec_slot,      0,      offsetof(ngx_core_conf_t, timer_resolution),      NULL },    { ngx_string("pid"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_conf_set_str_slot,      0,      offsetof(ngx_core_conf_t, pid),      NULL },    { ngx_string("lock_file"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_conf_set_str_slot,      0,      offsetof(ngx_core_conf_t, lock_file),      NULL },    { ngx_string("worker_processes"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_conf_set_num_slot,      0,      offsetof(ngx_core_conf_t, worker_processes),      NULL },    { ngx_string("debug_points"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_conf_set_enum_slot,      0,      offsetof(ngx_core_conf_t, debug_points),      &ngx_debug_points },    { ngx_string("user"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE12,      ngx_set_user,      0,      0,      NULL },    { ngx_string("worker_priority"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_set_priority,      0,      0,      NULL },    { ngx_string("worker_cpu_affinity"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_1MORE,      ngx_set_cpu_affinity,      0,      0,      NULL },    { ngx_string("worker_rlimit_nofile"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_conf_set_num_slot,      0,      offsetof(ngx_core_conf_t, rlimit_nofile),      NULL },    { ngx_string("worker_rlimit_core"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_conf_set_size_slot,      0,      offsetof(ngx_core_conf_t, rlimit_core),      NULL },    { ngx_string("worker_rlimit_sigpending"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_conf_set_num_slot,      0,      offsetof(ngx_core_conf_t, rlimit_sigpending),      NULL },    { ngx_string("working_directory"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_conf_set_str_slot,      0,      offsetof(ngx_core_conf_t, working_directory),      NULL },    { ngx_string("env"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_set_env,      0,      0,      NULL },#if (NGX_THREADS)    { ngx_string("worker_threads"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_conf_set_num_slot,      0,      offsetof(ngx_core_conf_t, worker_threads),      NULL },    { ngx_string("thread_stack_size"),      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,      ngx_conf_set_size_slot,      0,      offsetof(ngx_core_conf_t, thread_stack_size),      NULL },#endif      ngx_null_command};static ngx_core_module_t  ngx_core_module_ctx = {    ngx_string("core"),    ngx_core_module_create_conf,    ngx_core_module_init_conf};ngx_module_t  ngx_core_module = {    NGX_MODULE_V1,    &ngx_core_module_ctx,                  /* module context */    ngx_core_commands,                     /* module directives */    NGX_CORE_MODULE,                       /* module type */    NULL,                                  /* init master */    NULL,                                  /* init module */    NULL,                                  /* init process */    NULL,                                  /* init thread */    NULL,                                  /* exit thread */    NULL,                                  /* exit process */    NULL,                                  /* exit master */    NGX_MODULE_V1_PADDING};ngx_uint_t  ngx_max_module;static ngx_uint_t  ngx_show_version;static ngx_uint_t  ngx_show_configure;static char **ngx_os_environ;int ngx_cdeclmain(int argc, char *const *argv){    ngx_int_t         i;    ngx_log_t        *log;    ngx_cycle_t      *cycle, init_cycle;    ngx_core_conf_t  *ccf;#if (NGX_FREEBSD)    ngx_debug_init();#endif    /* TODO */ ngx_max_sockets = -1;    ngx_time_init();#if (NGX_PCRE)    ngx_regex_init();#endif    ngx_pid = ngx_getpid();    log = ngx_log_init();    if (log == NULL) {        return 1;    }    /* STUB */#if (NGX_OPENSSL)    ngx_ssl_init(log);#endif    /* init_cycle->log is required for signal handlers and ngx_getopt() */    ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));    init_cycle.log = log;    ngx_cycle = &init_cycle;    init_cycle.pool = ngx_create_pool(1024, log);    if (init_cycle.pool == NULL) {        return 1;    }    if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) {        return 1;    }    if (ngx_getopt(&init_cycle, argc, ngx_argv) != NGX_OK) {        return 1;    }    if (ngx_show_version) {        ngx_write_fd(ngx_stderr_fileno, "nginx version: " NGINX_VER CRLF,                     sizeof("nginx version: " NGINX_VER CRLF) - 1);        if (ngx_show_configure) {#ifdef NGX_COMPILER            ngx_write_fd(ngx_stderr_fileno, "built by " NGX_COMPILER CRLF,                         sizeof("built by " NGX_COMPILER CRLF) - 1);#endif#ifndef __WATCOMC__            /* OpenWatcomC could not build the long NGX_CONFIGURE string */            ngx_write_fd(ngx_stderr_fileno,                        "configure arguments: " NGX_CONFIGURE CRLF,                        sizeof("configure arguments :" NGX_CONFIGURE CRLF) - 1);#endif        }        if (!ngx_test_config) {            return 0;        }    }    if (ngx_test_config) {        log->log_level = NGX_LOG_INFO;    }    if (ngx_os_init(log) != NGX_OK) {        return 1;    }    /*     * ngx_crc32_table_init() requires ngx_cacheline_size set in ngx_os_init()     */    if (ngx_crc32_table_init() != NGX_OK) {        return 1;    }    if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {        return 1;    }    ngx_max_module = 0;    for (i = 0; ngx_modules[i]; i++) {        ngx_modules[i]->index = ngx_max_module++;    }    cycle = ngx_init_cycle(&init_cycle);    if (cycle == NULL) {        if (ngx_test_config) {            ngx_log_error(NGX_LOG_EMERG, log, 0,                          "the configuration file %s test failed",                          init_cycle.conf_file.data);        }        return 1;    }    if (ngx_test_config) {        ngx_log_error(NGX_LOG_INFO, log, 0,                      "the configuration file %s was tested successfully",                      cycle->conf_file.data);        return 0;    }    ngx_os_status(cycle->log);    ngx_cycle = cycle;    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);    ngx_process = ccf->master ? NGX_PROCESS_MASTER : NGX_PROCESS_SINGLE;#if (NGX_WIN32)#if 0    TODO:    if (ccf->run_as_service) {        if (ngx_service(cycle->log) != NGX_OK) {            return 1;        }        return 0;    }#endif#else    if (ngx_init_signals(cycle->log) != NGX_OK) {        return 1;    }    if (!ngx_inherited && ccf->daemon) {        if (ngx_daemon(cycle->log) != NGX_OK) {            return 1;        }        ngx_daemonized = 1;    }    if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) {        return 1;    }#endif    if (ngx_process == NGX_PROCESS_MASTER) {        ngx_master_process_cycle(cycle);    } else {        ngx_single_process_cycle(cycle);    }    return 0;}static ngx_int_tngx_add_inherited_sockets(ngx_cycle_t *cycle){    u_char           *p, *v, *inherited;    ngx_int_t         s;    ngx_listening_t  *ls;    inherited = (u_char *) getenv(NGINX_VAR);    if (inherited == NULL) {        return NGX_OK;    }    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,                  "using inherited sockets from \"%s\"", inherited);    if (ngx_array_init(&cycle->listening, cycle->pool, 10,                       sizeof(ngx_listening_t))        == NGX_ERROR)    {        return NGX_ERROR;    }    for (p = inherited, v = p; *p; p++) {        if (*p == ':' || *p == ';') {            s = ngx_atoi(v, p - v);            if (s == NGX_ERROR) {                ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,                              "invalid socket number \"%s\" in " NGINX_VAR                              " environment variable, ignoring the rest"                              " of the variable", v);                break;            }            v = p + 1;            ls = ngx_array_push(&cycle->listening);            if (ls == NULL) {                return NGX_ERROR;            }            ngx_memzero(ls, sizeof(ngx_listening_t));            ls->fd = (ngx_socket_t) s;        }    }    ngx_inherited = 1;    return ngx_set_inherited_sockets(cycle);}char **ngx_set_environment(ngx_cycle_t *cycle, ngx_uint_t *last){    char             **p, **env;    ngx_str_t         *var;    ngx_uint_t         i, n;    ngx_core_conf_t   *ccf;    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);    if (last == NULL && ccf->environment) {        return ccf->environment;    }    var = ccf->env.elts;    for (i = 0; i < ccf->env.nelts; i++) {        if (ngx_strcmp(var[i].data, "TZ") == 0            || ngx_strncmp(var[i].data, "TZ=", 3) == 0)        {            goto tz_found;        }    }    var = ngx_array_push(&ccf->env);    if (var == NULL) {        return NULL;    }    var->len = 2;    var->data = (u_char *) "TZ";    var = ccf->env.elts;tz_found:    n = 0;    for (i = 0; i < ccf->env.nelts; i++) {        if (var[i].data[var[i].len] == '=') {            n++;            continue;        }        for (p = ngx_os_environ; *p; p++) {            if (ngx_strncmp(*p, var[i].data, var[i].len) == 0                && (*p)[var[i].len] == '=')            {                n++;                break;            }        }    }    if (last) {        env = ngx_alloc((*last + n + 1) * sizeof(char *), cycle->log);        *last = n;    } else {        env = ngx_palloc(cycle->pool, (n + 1) * sizeof(char *));    }    if (env == NULL) {        return NULL;    }    n = 0;    for (i = 0; i < ccf->env.nelts; i++) {        if (var[i].data[var[i].len] == '=') {            env[n++] = (char *) var[i].data;            continue;        }        for (p = ngx_os_environ; *p; p++) {            if (ngx_strncmp(*p, var[i].data, var[i].len) == 0                && (*p)[var[i].len] == '=')            {                env[n++] = *p;                break;            }        }    }    env[n] = NULL;    if (last == NULL) {        ccf->environment = env;        environ = env;    }    return env;}ngx_pid_tngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv){    char             **env, *var;    u_char            *p;    ngx_uint_t         i, n;    ngx_pid_t          pid;    ngx_exec_ctx_t     ctx;    ngx_core_conf_t   *ccf;    ngx_listening_t   *ls;    ctx.path = argv[0];    ctx.name = "new binary process";    ctx.argv = argv;    n = 2;    env = ngx_set_environment(cycle, &n);    if (env == NULL) {        return NGX_INVALID_PID;    }    var = ngx_alloc(sizeof(NGINX_VAR)                    + cycle->listening.nelts * (NGX_INT32_LEN + 1) + 2,                    cycle->log);    p = ngx_cpymem(var, NGINX_VAR "=", sizeof(NGINX_VAR));    ls = cycle->listening.elts;    for (i = 0; i < cycle->listening.nelts; i++) {        p = ngx_sprintf(p, "%ud;", ls[i].fd);    }    *p = '\0';    env[n++] = var;#if (NGX_SETPROCTITLE_USES_ENV)    /* allocate the spare 300 bytes for the new binary process title */    env[n++] = "SPARE=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -