聊聊、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 ...
随机推荐
- elasticsearch dump加过滤条件(--searchBody)出错的解决 Unexpected token ' in JSON at position 0
环境:本文测试在es2.4,win10下进行 es dump导数据可以加过滤条件,只导满足条件的数据.方法是用—searchBody参数,值是查询时的查询条件的json格式,例如 然而按官网和网上的格 ...
- Vmware Player 比较
.wiz-todo, .wiz-todo-img {width: 16px; height: 16px; cursor: default; padding: 0 10px 0 2px; vertica ...
- 有关mybatis的动态sql
一般地,实现动态SQL都是在xml中使用等标签实现的. 我们在这里使用SQL构造器的方式, 即由abstract sql写出sql的过程, 当然感觉本质上还是一个StringBuilder, 来手动生 ...
- UVA 12171 (hdu 2771)sculptrue(离散化)
以前对离散化的理解不够,所以把端点和区间区分来考虑但是做完这题以后有了新的认识: 先来看一个问题:给你以下的网格,你需要多少空间去存储红点区间的信息呢? 只需要图上所示的1,2,3,4个点就足够表示红 ...
- Oracle中ROWID详解
oracle数据库的表中的每一行数据都有一个唯一的标识符,或者称为rowid,在oracle内部通常就是使用它来访问数据的.rowid需要 10个字节的存储空间,并用18个字符来显示.该值表明了该行在 ...
- python处理图片的一些操作
1.把图片分割成一个个竖条: from PIL import Image gap = 20 img_name = '/home/sensetime/000132_11_4.png' im = Imag ...
- matlab启动
直接在命令行输入matlab会报错 用这两个命令没问题 sudo /usr/local/MATLAB/R2013a/bin/matlab sudo /usr/local/MATLAB/R2013a/b ...
- Python 继承、派生、组合、接口、抽象类
继承是一种是的关系,和组合对比,组合是一种有的关系,这两者都是解决代用重用问题的 继承 注意:继承不是遗传,在显示角度中,是通过对象抽象成类,再把这些类抽象成一个,就是父类.是自下而上的过程,在程序中 ...
- LiteIDE 错误: go build xxxxxx: no non-test Go files in xxxx
问题 c:/go/bin/go.exe build [C:/Users/Administrator/Desktop/go] go build _/C_/Users/Administrator/Desk ...
- Framework的简单创建
如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件.然而,这种方法并不是很优雅.它会暴露所有的实现细节,而这些实现你可能并不想开源出来.此外,开发者也可能并不想看到你的所有代码,因为他们可 ...