聊聊、Nginx 参数合法性
我们接着上篇文章来讲讲 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 参数合法性的更多相关文章
- C#检验参数合法性公用方法
#region 检验参数合法性,数值类型不小于0,引用类型不能为null,否则抛出异常 /// <summary> /// 检验参数合法性,数值类型不小于0,引用类型不能为null,否则抛 ...
- Nginx 参数配置相关
Nginx参数配置相关 by:授客 QQ:1033553122 目的: 对Nginx配置的点滴学习总结,主要目的在于分析Nginx与性能相关的一些参数设置,以便性能调优时选择最优配置 环境: $ ...
- Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)
Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性) 前言:由于前段时间忙于写接口,在接口中需要做很多的参数校验,本着简洁.高效的原则,便写了这个小工具供自己使用(内容 ...
- nginx 参数详解
nginx的http web功能 必须使用虚拟机来配置站点:每个虚拟主机使用一个server{}段来配置 非虚拟主机的配置.公共选项,需要定义在server之外,http之内 ...
- Nginx参数调优
(1)nginx运行工作进程个数,一般设置cpu的核心或者核心数x2 如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpuinfo文件 grep ^processor / ...
- .Net Core Web Api使用模型验证验证参数合法性
在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输 ...
- 关于Nginx参数路径问题的问题
本文转载自:https://pureage.info/2013/10/31/130.html 由于工作需要,开始分析nginx的proxy模块,在分析之前,当然要先会用了.于是开始熟悉该模块的一些指令 ...
- nginx 参数记录
log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $reques ...
- nginx参数的详细说明
#开启进程数 <=CPU数 worker_processes 1; #错误日志保存位置 #error_log logs/error.log; #error_log logs/error.log ...
随机推荐
- Windows 8 / win8 拼音输入法/搜狗输入法 visual Studio 2010 / VS2010 不兼容
是visual assist X 的问题,更新到VA_X_Setup 2001 解决问题 老版本处理:Tools-->Extension Manager-->Uninstall
- JavaScript中函数对象和对象的区别
function Test (word) { console.log (word); } Test('哈哈,我是函数'); new Test('哈哈,我是对象'); //将以上的调用方式换种通俗易懂的 ...
- 如何删除 CentOS 6 更新后产生的多余的内核?
第一种方法:通过命令的方式解决多余的内核 1.首先查看当前内核的版本号: [root@jxatei ~]# uname -a Linux jxatei.server2.6.32-573.1.1.el ...
- 一键部署LNMP堆栈Web应用基础架构
https://market.azure.cn/Vhd/Show?vhdId=9852&version=10884 产品详情 产品介绍LEMP/LNMP 是指一组通常一起使用来运行动态网站或者 ...
- POJ Charlie's Change 查理之转换(多重背包,变形)
题意: 给定身上的4种硬币,分别是1 ,5 ,10, 25面额各有多张,要求组成面额p的硬币尽可能多.输出组成p的4种硬币各自的数量. 思路: 多重背包,300+ms.用01背包+二进制的方法.记录下 ...
- 融云SDK触达用户数破20亿 王者风范双倍展现
11月1日,融云SDK触达用户数突破20亿,业务增长速度及用户覆盖量再创即时通讯云领域新高.自去年11月10日公布SDK触达用户数破10亿以来,融云仅用了一年时间,便取得了触达用户数翻倍的成绩,迅猛的 ...
- uoj#300.【CTSC2017】吉夫特
题面:http://uoj.ac/problem/300 一道大水题,然而我并不知道$lucas$定理的推论.. $\binom{n}{m}$为奇数的充要条件是$n&m=n$.那么我们对于每个 ...
- Html5的等学习
看了w3c感觉是说明文档,没有详细的说明,然后就去看其他的 html5其实就是在html的基础上做了一些改变,感觉html5的推广还是需要时间的,因为习惯问题,虽然html5有很多很方便的标签如art ...
- Dede技巧
解决DEDE图集上传图片时跳出302错误 本地上传图集的时候突然提示网页出错,还爆出302错误. 解决办法是在include/userlogin.class.php文件中的第二行session_s ...
- javascript原生方法集锦
1.sort方法sort()方法使数组中的元素按照一定的顺序排列. 语法: arrayObject.sort(方法函数) 参数说明: 1.如果不指定<方法函数>,则按unicode码顺序排 ...