聊聊、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 ...
随机推荐
- UI设计中蕴涵着系统重要的数据结构与功能设计
UI设计中蕴涵着系统重要的数据结构与功能设计 UI设计中的用户需求,事件(用例)驱动
- 内容导出成word
private void 导出word(string 内容) { string tit = "<html xmlns:v=\"urn:schemas-microsoft-co ...
- MovieReview—Wile Hunter(荒野猎人)
Faith is Power Faith is power, this sentence is not wrong. Find your own beliefs, and strug ...
- 干净卸载 Cloudera CDH 5 beta2
Cloudera 的官方介绍: http://www.cloudera.com/content/cloudera-content/cloudera-docs/CM4Ent/4.8.1/Cloudera ...
- C语言中math.h中常用的函数
1.绝对值 ①函数原型: int abs(int x); 函数功能: 求整数x的绝对值 int number=-1234; abs(number); ②函数原型:double fabs(double ...
- Python 生成器和协程
Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访 ...
- 主成分分析法(PCA)答疑
问:为什么要去均值? 1.我认为归一化的表述并不太准确,按统计的一般说法,叫标准化.数据的标准化过程是减去均值并除以标准差.而归一化仅包含除以标准差的意思或者类似做法.2.做标准化的原因是:减去均值等 ...
- Linux curl命令中,HTTP 302处理
在Linux中使用curl命令时,偶尔会遇到一些URL跳转到新的URL,即HTTP中的3XX(redirection,重定向 ). $curl -s -I $URL > log 这时在返回的报文 ...
- d3.js--04(enter和exit)
enter() 当DOM数量少于data的数量,或者压根一个都没有的时候,我们一般会希望让程序帮忙创建. <!DOCTYPE html> <html> <head> ...
- 【数位dp】bzoj3131: [Sdoi2013]淘金
思路比较自然,但我要是考场上写估计会写挂:好像被什么不得了的细节苟住了?…… Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1. ...