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

📄 nginx.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 2 页
字号:
               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"               "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";#endif    env[n] = NULL;#if (NGX_DEBUG)    {    char  **e;    for (e = env; *e; e++) {        ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, "env: %s", *e);    }    }#endif    ctx.envp = (char *const *) env;    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);    if (ngx_rename_file(ccf->pid.data, ccf->oldpid.data) != NGX_OK) {        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                      ngx_rename_file_n " %s to %s failed "                      "before executing new binary process \"%s\"",                      ccf->pid.data, ccf->oldpid.data, argv[0]);        ngx_free(env);        ngx_free(var);        return NGX_INVALID_PID;    }    pid = ngx_execute(cycle, &ctx);    if (pid == NGX_INVALID_PID) {        if (ngx_rename_file(ccf->oldpid.data, ccf->pid.data) != NGX_OK) {            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                          ngx_rename_file_n " %s back to %s failed after "                          "the try to execute the new binary process \"%s\"",                          ccf->oldpid.data, ccf->pid.data, argv[0]);        }    }    ngx_free(env);    ngx_free(var);    return pid;}static ngx_int_tngx_getopt(ngx_cycle_t *cycle, int argc, char *const *argv){    ngx_int_t  i;    for (i = 1; i < argc; i++) {        if (argv[i][0] != '-') {            ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,                          "invalid option: \"%s\"", argv[i]);            return NGX_ERROR;        }        switch (argv[i][1]) {        case 'v':            ngx_show_version = 1;            break;        case 'V':            ngx_show_version = 1;            ngx_show_configure = 1;            break;        case 't':            ngx_test_config = 1;            break;        case 'c':            if (argv[i + 1] == NULL) {                ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,                              "the option: \"%s\" requires file name",                              argv[i]);                return NGX_ERROR;            }            cycle->conf_file.data = (u_char *) argv[++i];            cycle->conf_file.len = ngx_strlen(cycle->conf_file.data);            break;        default:            ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,                          "invalid option: \"%s\"", argv[i]);            return NGX_ERROR;        }    }    if (cycle->conf_file.data == NULL) {        cycle->conf_file.len = sizeof(NGX_CONF_PATH) - 1;        cycle->conf_file.data = (u_char *) NGX_CONF_PATH;    }    return NGX_OK;}static ngx_int_tngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv){#if (NGX_FREEBSD)    ngx_os_argv = (char **) argv;    ngx_argc = argc;    ngx_argv = (char **) argv;#else    size_t     len;    ngx_int_t  i;    ngx_os_argv = (char **) argv;    ngx_argc = argc;    ngx_argv = ngx_alloc((argc + 1) * sizeof(char *), cycle->log);    if (ngx_argv == NULL) {        return NGX_ERROR;    }    for (i = 0; i < argc; i++) {        len = ngx_strlen(argv[i]) + 1;        ngx_argv[i] = ngx_alloc(len, cycle->log);        if (ngx_argv[i] == NULL) {            return NGX_ERROR;        }        (void) ngx_cpystrn((u_char *) ngx_argv[i], (u_char *) argv[i], len);    }    ngx_argv[i] = NULL;#endif    ngx_os_environ = environ;    return NGX_OK;}static void *ngx_core_module_create_conf(ngx_cycle_t *cycle){    ngx_core_conf_t  *ccf;    ccf = ngx_pcalloc(cycle->pool, sizeof(ngx_core_conf_t));    if (ccf == NULL) {        return NULL;    }    /*     * set by pcalloc()     *     *     ccf->pid = NULL;     *     ccf->oldpid = NULL;     *     ccf->priority = 0;     *     ccf->cpu_affinity_n = 0;     *     ccf->cpu_affinity = NULL;     */    ccf->daemon = NGX_CONF_UNSET;    ccf->master = NGX_CONF_UNSET;    ccf->timer_resolution = NGX_CONF_UNSET_MSEC;    ccf->worker_processes = NGX_CONF_UNSET;    ccf->debug_points = NGX_CONF_UNSET;    ccf->rlimit_nofile = NGX_CONF_UNSET;    ccf->rlimit_core = NGX_CONF_UNSET_SIZE;    ccf->rlimit_sigpending = NGX_CONF_UNSET;    ccf->user = (ngx_uid_t) NGX_CONF_UNSET_UINT;    ccf->group = (ngx_gid_t) NGX_CONF_UNSET_UINT;#if (NGX_THREADS)    ccf->worker_threads = NGX_CONF_UNSET;    ccf->thread_stack_size = NGX_CONF_UNSET_SIZE;#endif    if (ngx_array_init(&ccf->env, cycle->pool, 1, sizeof(ngx_str_t))        != NGX_OK)    {        return NULL;    }    return ccf;}static char *ngx_core_module_init_conf(ngx_cycle_t *cycle, void *conf){    ngx_core_conf_t  *ccf = conf;    ngx_conf_init_value(ccf->daemon, 1);    ngx_conf_init_value(ccf->master, 1);    ngx_conf_init_msec_value(ccf->timer_resolution, 0);    ngx_conf_init_value(ccf->worker_processes, 1);    ngx_conf_init_value(ccf->debug_points, 0);#if (NGX_HAVE_SCHED_SETAFFINITY)    if (ccf->cpu_affinity_n        && ccf->cpu_affinity_n != 1        && ccf->cpu_affinity_n != (ngx_uint_t) ccf->worker_processes)    {        ngx_log_error(NGX_LOG_WARN, cycle->log, 0,                      "number of the \"worker_processes\" is not equal to "                      "the number of the \"worker_cpu_affinity\" mask, "                      "using last mask for remaining worker processes");    }#endif#if (NGX_THREADS)    ngx_conf_init_value(ccf->worker_threads, 0);    ngx_threads_n = ccf->worker_threads;    ngx_conf_init_size_value(ccf->thread_stack_size, 2 * 1024 * 1024);#endif#if !(NGX_WIN32)    if (ccf->user == (uid_t) NGX_CONF_UNSET_UINT && geteuid() == 0) {        struct group   *grp;        struct passwd  *pwd;        ngx_set_errno(0);        pwd = getpwnam(NGX_USER);        if (pwd == NULL) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                          "getpwnam(\"" NGX_USER "\") failed");            return NGX_CONF_ERROR;        }        ccf->username = NGX_USER;        ccf->user = pwd->pw_uid;        ngx_set_errno(0);        grp = getgrnam(NGX_GROUP);        if (grp == NULL) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                          "getgrnam(\"" NGX_GROUP "\") failed");            return NGX_CONF_ERROR;        }        ccf->group = grp->gr_gid;    }    if (ccf->pid.len == 0) {        ccf->pid.len = sizeof(NGX_PID_PATH) - 1;        ccf->pid.data = (u_char *) NGX_PID_PATH;    }    if (ngx_conf_full_name(cycle, &ccf->pid, 0) == NGX_ERROR) {        return NGX_CONF_ERROR;    }    ccf->oldpid.len = ccf->pid.len + sizeof(NGX_OLDPID_EXT);    ccf->oldpid.data = ngx_palloc(cycle->pool, ccf->oldpid.len);    if (ccf->oldpid.data == NULL) {        return NGX_CONF_ERROR;    }    ngx_memcpy(ngx_cpymem(ccf->oldpid.data, ccf->pid.data, ccf->pid.len),               NGX_OLDPID_EXT, sizeof(NGX_OLDPID_EXT));    if (ccf->lock_file.len == 0) {        ccf->lock_file.len = sizeof(NGX_LOCK_PATH) - 1;        ccf->lock_file.data = (u_char *) NGX_LOCK_PATH;    }    if (ngx_conf_full_name(cycle, &ccf->lock_file, 0) == NGX_ERROR) {        return NGX_CONF_ERROR;    }    {    ngx_str_t  lock_file;    lock_file = cycle->old_cycle->lock_file;    if (lock_file.len) {        lock_file.len--;        if (ccf->lock_file.len != lock_file.len            || ngx_strncmp(ccf->lock_file.data, lock_file.data, lock_file.len)               != 0)        {            ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,                          "\"lock_file\" could not be changed, ignored");        }        cycle->lock_file.len = lock_file.len + 1;        lock_file.len += sizeof(".accept");        cycle->lock_file.data = ngx_pstrdup(cycle->pool, &lock_file);        if (cycle->lock_file.data == NULL) {            return NGX_CONF_ERROR;        }    } else {        cycle->lock_file.len = ccf->lock_file.len + 1;        cycle->lock_file.data = ngx_palloc(cycle->pool,                                      ccf->lock_file.len + sizeof(".accept"));        if (cycle->lock_file.data == NULL) {            return NGX_CONF_ERROR;        }        ngx_memcpy(ngx_cpymem(cycle->lock_file.data, ccf->lock_file.data,                              ccf->lock_file.len),                   ".accept", sizeof(".accept"));    }    }#endif    return NGX_CONF_OK;}static char *ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){#if (NGX_WIN32)    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,                       "\"user\" is not supported, ignored");    return NGX_CONF_OK;#else    ngx_core_conf_t  *ccf = conf;    char             *group;    struct passwd    *pwd;    struct group     *grp;    ngx_str_t        *value;    if (ccf->user != (uid_t) NGX_CONF_UNSET_UINT) {        return "is duplicate";    }    if (geteuid() != 0) {        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,                           "the \"user\" directive makes sense only "                           "if the master process runs "                           "with super-user privileges, ignored");        return NGX_CONF_OK;    }    value = (ngx_str_t *) cf->args->elts;    ccf->username = (char *) value[1].data;    ngx_set_errno(0);    pwd = getpwnam((const char *) value[1].data);    if (pwd == NULL) {        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,                           "getpwnam(\"%s\") failed", value[1].data);        return NGX_CONF_ERROR;    }    ccf->user = pwd->pw_uid;    group = (char *) ((cf->args->nelts == 2) ? value[1].data : value[2].data);    ngx_set_errno(0);    grp = getgrnam(group);    if (grp == NULL) {        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno,                           "getgrnam(\"%s\") failed", group);        return NGX_CONF_ERROR;    }    ccf->group = grp->gr_gid;    return NGX_CONF_OK;#endif}static char *ngx_set_env(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){    ngx_core_conf_t  *ccf = conf;    ngx_str_t   *value, *var;    ngx_uint_t   i;    var = ngx_array_push(&ccf->env);    if (var == NULL) {        return NGX_CONF_ERROR;    }    value = cf->args->elts;    *var = value[1];    for (i = 0; i < value[1].len; i++) {        if (value[1].data[i] == '=') {            var->len = i;            return NGX_CONF_OK;        }    }    return NGX_CONF_OK;}static char *ngx_set_priority(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){    ngx_core_conf_t  *ccf = conf;    ngx_str_t        *value;    ngx_uint_t        n, minus;    if (ccf->priority != 0) {        return "is duplicate";    }    value = cf->args->elts;    if (value[1].data[0] == '-') {        n = 1;        minus = 1;    } else if (value[1].data[0] == '+') {        n = 1;        minus = 0;    } else {        n = 0;        minus = 0;    }    ccf->priority = ngx_atoi(&value[1].data[n], value[1].len - n);    if (ccf->priority == NGX_ERROR) {        return "invalid number";    }    if (minus) {        ccf->priority = -ccf->priority;    }    return NGX_CONF_OK;}static char *ngx_set_cpu_affinity(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){#if (NGX_HAVE_SCHED_SETAFFINITY)    ngx_core_conf_t  *ccf = conf;    u_char            ch;    u_long           *mask;    ngx_str_t        *value;    ngx_uint_t        i, n;    if (ccf->cpu_affinity) {        return "is duplicate";    }    mask = ngx_palloc(cf->pool, (cf->args->nelts - 1) * sizeof(long));    if (mask == NULL) {        return NGX_CONF_ERROR;    }    ccf->cpu_affinity_n = cf->args->nelts - 1;    ccf->cpu_affinity = mask;    value = cf->args->elts;    for (n = 1; n < cf->args->nelts; n++) {        if (value[n].len > 32) {            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                         "\"worker_cpu_affinity\" supports up to 32 CPU only");            return NGX_CONF_ERROR;        }        mask[n - 1] = 0;        for (i = 0; i < value[n].len; i++) {            ch = value[n].data[i];            if (ch == ' ') {                continue;            }            mask[n - 1] <<= 1;            if (ch == '0') {                continue;            }            if (ch == '1') {                mask[n - 1] |= 1;                continue;            }            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                          "invalid character \"%c\" in \"worker_cpu_affinity\"",                          ch);            return NGX_CONF_ERROR ;        }    }#else    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,                       "\"worker_cpu_affinity\" is not supported "                       "on this platform, ignored");#endif    return NGX_CONF_OK;}u_longngx_get_cpu_affinity(ngx_uint_t n){    ngx_core_conf_t  *ccf;    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,                                           ngx_core_module);    if (ccf->cpu_affinity == NULL) {        return 0;    }    if (ccf->cpu_affinity_n > n) {        return ccf->cpu_affinity[n];    }    return ccf->cpu_affinity[ccf->cpu_affinity_n - 1];}

⌨️ 快捷键说明

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