我们接着上篇文章来讲讲 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. Windows 8 / win8 拼音输入法/搜狗输入法 visual Studio 2010 / VS2010 不兼容

    是visual assist X 的问题,更新到VA_X_Setup 2001 解决问题 老版本处理:Tools-->Extension Manager-->Uninstall

  2. JavaScript中函数对象和对象的区别

    function Test (word) { console.log (word); } Test('哈哈,我是函数'); new Test('哈哈,我是对象'); //将以上的调用方式换种通俗易懂的 ...

  3. 如何删除 CentOS 6 更新后产生的多余的内核?

    第一种方法:通过命令的方式解决多余的内核 1.首先查看当前内核的版本号: [root@jxatei ~]# uname  -a Linux jxatei.server2.6.32-573.1.1.el ...

  4. 一键部署LNMP堆栈Web应用基础架构

    https://market.azure.cn/Vhd/Show?vhdId=9852&version=10884 产品详情 产品介绍LEMP/LNMP 是指一组通常一起使用来运行动态网站或者 ...

  5. POJ Charlie's Change 查理之转换(多重背包,变形)

    题意: 给定身上的4种硬币,分别是1 ,5 ,10, 25面额各有多张,要求组成面额p的硬币尽可能多.输出组成p的4种硬币各自的数量. 思路: 多重背包,300+ms.用01背包+二进制的方法.记录下 ...

  6. 融云SDK触达用户数破20亿 王者风范双倍展现

    11月1日,融云SDK触达用户数突破20亿,业务增长速度及用户覆盖量再创即时通讯云领域新高.自去年11月10日公布SDK触达用户数破10亿以来,融云仅用了一年时间,便取得了触达用户数翻倍的成绩,迅猛的 ...

  7. uoj#300.【CTSC2017】吉夫特

    题面:http://uoj.ac/problem/300 一道大水题,然而我并不知道$lucas$定理的推论.. $\binom{n}{m}$为奇数的充要条件是$n&m=n$.那么我们对于每个 ...

  8. Html5的等学习

    看了w3c感觉是说明文档,没有详细的说明,然后就去看其他的 html5其实就是在html的基础上做了一些改变,感觉html5的推广还是需要时间的,因为习惯问题,虽然html5有很多很方便的标签如art ...

  9. Dede技巧

    解决DEDE图集上传图片时跳出302错误   本地上传图集的时候突然提示网页出错,还爆出302错误. 解决办法是在include/userlogin.class.php文件中的第二行session_s ...

  10. javascript原生方法集锦

    1.sort方法sort()方法使数组中的元素按照一定的顺序排列. 语法: arrayObject.sort(方法函数) 参数说明: 1.如果不指定<方法函数>,则按unicode码顺序排 ...