我们接着上篇文章来讲讲 ngx_get_options 函数。

这个函数就在 nginx.c 文件中,我们来看看。

参数 argc,argv 我们在前面的文章中都已经提到了,在这里我们看 ngx_get_options 里面的 for 循环。它的作用就是把所有的运行时参数循环一遍,判断是不是合法。例如 nginx -s stop,nginx -s reload 等,如果你只输入 nginx 或者 nginx -s,则会报错。如果是nginx -h 或者 -?则是请求帮助信息。nginx -v 则是输出版本信息。 好的,我们看 main 方法里面接下来的函数 ngx_show_version_info。同样在nginx.c文件中找到该函数。

这个函数就不多说了,当 ngx_show_help = 1 的时候就输出帮助信息。 接下来,ngx_time_init()。 看函数名字也知道是初始化时间。ngx_time_init () at src/core/ngx_times.c:65,我们到 ngx_times.c 里面看看。

前面几行很简单,初始化不同缓存时间长度。Nginx 获取当前时间是通过 gettimeofday 函数获取,gettimeofday 是 C 库提供的函数(不是系统调用),它封装了内核里的 sys_gettimeofday 系统调用。为避免每次都调用 OS 的 gettimeofday,Nginx 采用时间缓存,每个worker 进程都能自行维护。为控制并发访问,每次更新时间缓存前需申请锁,而读时间缓存无须加锁。为避免分裂读,即某 worker 进程读时间缓存过程中接受中断请求,期间时间缓存被其他 worker 更新,导致前后读取时间不一致。Nginx 引入时间缓存数组(共64个成员),每次都更新数组中的下一个元素。 我们重点看看 ngx_time_update。

ngx_trylock(&ngx_time_lock),更新缓存前需获取 ngx_time_lock。 ngx_gettimeofday(&tv),获取系统时间。

sec = tv.tv_sec; msec = tv.tv_usec / 1000;

ngx_current_msec = (ngx_msec_t) sec * 1000 + msec;

tp = &cached_time[slot]; –读当前时间缓存 如果缓存的时间秒=当前时间秒,直接更新当前slot元素的msec并返回,否则更新下一个slot数组元素。

if (tp->sec == sec) {

tp->msec = msec;

ngx_unlock(&ngx_time_lock);

return;

}

if (slot == NGX_TIME_SLOTS - 1) {

slot = 0;

} else {

slot++;

}

tp = &cached_time[slot];

tp->sec = sec;

tp->msec = msec;

ngx_gmtime(sec, &gmt);

p0 = &cached_http_time[slot][0];

(void) ngx_sprintf(p0, “%s, %02d %s %4d %02d:%02d:%02d GMT”, week[gmt.ngx_tm_wday], gmt.ngx_tm_mday,

months[gmt.ngx_tm_mon - 1], gmt.ngx_tm_year, gmt.ngx_tm_hour, gmt.ngx_tm_min, gmt.ngx_tm_sec);

ngx_sprintf 读取所有参数并调用 ngx_vslprintf,将后续参数以第二个参数的格式复制到 P0 开始的内存区,即给cached_http_time[slot] 赋值。 后面的 cached_err_log_time[slot] & cached_http_log_time[slot] & cached_http_log_iso8601[slot] & cached_syslog_time[slot] 也一样。

我们来看看 ngx_memory_barrier(),禁止编译器对后面的语句优化。它的作用实际上还是和防止读操作混乱有关,它告诉编译器不要将其后面的语句进行优化,不要打乱其执行顺序。目的是保证缓存时间一致性。

关于时间初始化就到这里,这里面还有很多的细节,这里不进行深入讨论。大家可以自己去了解。

聊聊、Nginx 参数合法性的更多相关文章

  1. C#检验参数合法性公用方法

    #region 检验参数合法性,数值类型不小于0,引用类型不能为null,否则抛出异常 /// <summary> /// 检验参数合法性,数值类型不小于0,引用类型不能为null,否则抛 ...

  2. Nginx 参数配置相关

    Nginx参数配置相关 by:授客 QQ:1033553122 目的: 对Nginx配置的点滴学习总结,主要目的在于分析Nginx与性能相关的一些参数设置,以便性能调优时选择最优配置   环境: $ ...

  3. Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性) 前言:由于前段时间忙于写接口,在接口中需要做很多的参数校验,本着简洁.高效的原则,便写了这个小工具供自己使用(内容 ...

  4. nginx 参数详解

    nginx的http web功能     必须使用虚拟机来配置站点:每个虚拟主机使用一个server{}段来配置     非虚拟主机的配置.公共选项,需要定义在server之外,http之内      ...

  5. Nginx参数调优

    (1)nginx运行工作进程个数,一般设置cpu的核心或者核心数x2 如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 grep ^processor / ...

  6. .Net Core Web Api使用模型验证验证参数合法性

    在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输 ...

  7. 关于Nginx参数路径问题的问题

    本文转载自:https://pureage.info/2013/10/31/130.html 由于工作需要,开始分析nginx的proxy模块,在分析之前,当然要先会用了.于是开始熟悉该模块的一些指令 ...

  8. nginx 参数记录

    log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $reques ...

  9. nginx参数的详细说明

    #开启进程数 <=CPU数 worker_processes 1; #错误日志保存位置 #error_log logs/error.log; #error_log logs/error.log ...

随机推荐

  1. cssText在js中写样式表兼容全部

    oDiv.style.cssText="width:100px;height:200px;";是前面的升级版(oDiv.style.width='200px';) <styl ...

  2. 内容导出成word

    private void 导出word(string 内容) { string tit = "<html xmlns:v=\"urn:schemas-microsoft-co ...

  3. 微软分布式机器学习工具包DMTK——初窥门径

    在现在机器学习如日中天的大背景下,微软亚洲研究院的实习岗位中,机器学习组的工作也是维护DMTK,参与算法改进,那么在此之前我们得了解DMTK是个啥. DMTK由一个服务于分布式机器学习的框架和一组分布 ...

  4. Intel 快速存储蓝屏

    今天电脑蓝屏,DPC Watchdog Violation 很烦.开bluescreen说是NT内核的问题 开windbg说是Intel快速存储的问题,顺手卸载快速存储 卸载前 卸载后 另外我看Int ...

  5. Dungeon Master的两种方法

    Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is co ...

  6. mybatis association嵌套association的两级嵌套问题

    今天遇到了一个双表连接查询以及自关联的问题,由于第一次遇到,所以在这记下,日后好查阅 针对一个表的关联属性本身也有自关联的情况下,可以用association嵌套association的方法来处理. ...

  7. javaweb基础(12)_session详解

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  8. C# 数据结构 - 单链表 双链表 环形链表

    链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...

  9. c++ json字符串转换成map管理

    在cocos2dx for lua中,我们经常通过lua的table传入c++使用,然后早c++层操作数据. 实现步骤大致如下: table->string->c++层->通过rap ...

  10. cocos2x (c++/lua) spine 文件的预加载

    在之前,笔者写过一编博客,通过lua在加载场景加载spineAnimation动画精灵,保存在table中,然后在游戏中创建动画精灵时,提取加载好的spineAnimaiton中的 spSkeleto ...