初识nginx——配置解析篇
一、nginx的介绍
nginx是由俄罗斯人开发的一款高性能的http和反向代理服务器,也可以用来作为邮件代理。相比较于其他的服务器,具有占用内存少,稳定性高等优势
二、nginx的配置
nginx的安装时配置文件默认在nginx程序安装目录的conf目录下,启动主配置文件默认为为nginx.conf
安装的时候可以通过—conf-path来指定配置文件的放置路径,同时启动的时候可以通过 -c指令来另行指定启动的配置文件
在修改配置后可以通过使用./nginx -t来检查配置文件是否正确,使用./nginx -s reload 或是kill -s SHGHUP <nginx master pid>让nginx在不停止服务的时候,重新读取配置文件并生效
三、nginx的配置介绍
nginx的配置可以分为简单配置和复杂配置(块配置)
其中简单配置包括配置名和配置值,如daemon on
而复杂配置则由一个配置名 一对大括号组成和括号里面的内容组成,括号里面的内容可以是简单配置也可以继续嵌套复杂配置
如 upstream backend{
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
}
简单配置项和复杂配置项的区分在于简单配置可以直接解析和赋值,而复杂配置项nginx一般只是申请对应的内存空间,切换解析状态,然后递归调用解析函数
nginx的配置存在继承关系,内层的配置可以继承外层的配置,当内外层中的配置发生冲突是,以内层为主还是以外层为主 取决于解析这个配置项的模块
include命令可以用在nginx配置文件的任何地方,来载入其他的配置文件,以增强配置文件的可读性,并且include支持通配符,inlucde文件的路径默认是nginx.conf文件的所作目录
一些全局配置介绍:
daemon on | off 默认on
是否以守护进程的方式运行nginx,守护进程是指脱离终端并且在后头运行的进程,关闭守护进程执行的方式可以让我们方便调试nginx
master_process on | of 默认on
是否以master/worker方式进行工作,在实际的环境中 nginx是以一个master进程管理多个worker进程的方式运行的,关闭后 nginx就不会fork出worker子进程来处理请求,
而是用master进程自身来处理请求
worker_processes number; 默认1
在master/worker运行方式下 worker进程的数目,一般情况下用户要配置与CPU内核数相等的worker进程
worker_cpu_affinity cpumask[cpumask…]
示例:worker_cpu_affinity 1000 0100 0010 0001;
绑定worker进程到指定的cpu内核,每一个worker进程都独享一个CPU,可以在内核的调度策略上实现完全的并发
worker_limit_nofile,默认为操作系统的限制
该值为worker进程可以打开的最大文件描述符的数量
events模块
events模块包含了nginx了有关连接处理的配置
worker_connections
设置一个worker能够同时打开的最大连接数,该值最大为worker_rlimit_nofile的值
在nginx作为http服务器的时候,最大连接数为worker_processes * worker_connctions
在nginx作为反向代理服务器的时候,最大连接数为worker_processes * worker_connections / 2
use
示例 use epoll
设置用于客户端线程的轮询方式,默认nginx会选择一个最适合你操作系统的
http模块
http模块下配置有server location upstream等不同的内容
log_format
log_format指令用于设置日志的记录格式
当nginx位于负载均衡设备,反向代理服务器之后的时候,无法直接获得客户端真实的ip,但是反向代理服务器转发的http头信息中,可以增加X-Forwarded-For信息,记录原有的客户端ip地址
和原来客户端请求的服务器地址,这个时候可以通过log_format指令来设置日志格式,将X-Forwarded-For信息打入日志中
server_name
由于IP地址的数量有限,因此经常存在多个主机域名对应同一个ip的情况,这个时候可以按照server_name通过server块来定义虚拟主机,每个server块是一个虚拟主机,处理满足相应listen端口
和server_name的请求
server_name与host的匹配优先级如下
首先选中所有字符串完全匹配的server_name,如www.nginx.org
其次选中通配符在前面的server_name,如*.nginx.org
再次选择通配符在后面的server_name,如www.nginx.*
最后选择使用正则表达式才匹配的server_name,如~^\.testweb\.com$
location
location会尝试根据用户请求中的URI来匹配设置的表达式 并选中最终结果中的配置来处理用户的请求
location [=|~|~*|^~|@] / uri / { … }
=表示把uri作为字符串,与参数中的URI作完全匹配
~进行正则表达式匹配的时候,区分大小写
~*进行正则表达式匹配的时候,不区分大小写
^~表示匹配URI的时候,如果该location是最佳匹配,那么对于匹配这个location的字符串不在进行正则表达式的匹配检测
前面什么都没有的时候例如 location /test/my 相等于是普通字符串匹配,按照最大前置的原则匹配
@表示仅用于nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求
匹配的优先级如下
1、如果查询精确的命中了一个使用=前缀的location,那个它将被使用,并结束匹配
2、在剩下普通字符串中,将按照最大前缀匹配的原则进行匹配,将结果最后候选结果,如果最终命中的结果使用了^~前缀表示或者它是一个完全匹配,那么它将被使用,并结束匹配
3、正则表达式匹配时,按照正则表达式在配置文件中出现的顺序,并且只有匹配到了一条正则local,就不在匹配下面的local了
4、如果步骤3命中了一个匹配,那个它将被使用,否则将使用步骤2的候选结果
(普通字符串和正则字符串的区别 ~和~*前缀表示location是正则字符串,其他前缀和无前缀表示location是普通字符串)
upstream
Upstream模块是与反向代理,负载均衡相关的模块
示例: upstream backend{
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
}
指定了一个叫backend的代理服务器,可以在proxy_pass和fastcgi_pass中使用,默认的负载均衡方式为加权轮询,可以在配置项使用使用ip_hash来使用ip哈希
weight指定了每个server的权重默认是1
max_fails指定了在fail_timeout(默认是60s)内对后端服务器请求失败的次数,达到次数后会在fail_timeout时间内不再去查询它
四、nginx配置的解析
nginx在配置解析的处理上可以分成3个步骤
1、create_conf
2、handle_conf
3、init_conf
1、create_conf
src/core/ngx_cycle.c

这一步的目的是调用核心函数模块的create_conf函数,为配置信息分配内存空间,并且对一些配置变量进行NGX_CONF_UNSET的初始化
这里我们看到222行有对是否有create_conf函数的判断,因为不是所有的核心模块都有create_conf函数的,比如ngx_http_module,这个模块是否使用取决于具体的配置文件,因此分配
内存空间放到了自己的回调函数中了。
2、handle_conf
src/core/ngx_cycle.c

这一步主要用于解析配置文件
nginx在ngx_init_cycle中会调用ngx_conf_param 和ngx_conf_parse进行配置文件的解析,其中ngx_conf_param是基于ngx_conf_parse实现的
ngx_conf_param负责解析nginx命令行参数’-g’加入的配置。ngx_conf_parse负责解析nginx配置文件
为了进行配置的解析,nginx利用ngx_command_s数据类型对有的nginx配置进行了统一的描述
typedef struct ngx_command_s ngx_command_t;
struct ngx_command_s {
ngx_str_t name;
ngx_uint_t type;
char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
ngx_uint_t conf;
ngx_uint_t offset;
void *post;
};
字段name表示配置项的名称,如damon
字段type可以指定该配置相关的多种信息,配置的类型bool,块配置(复杂配置项);该配置项目的token个数(token是只一个被空格,引号,分号等分开的字符串);该配置项可以出现的上下文
字段set的解析出name配置项后,处理该配置项的回调函数
字段conf用于指定当前配置项所作的大致位置
字段offset用于指定该配置项值的精确存放位置,一般为某一个结构体变量的字段偏移
字段post配置项处理后的回调方法,在大多数情况下为NULL
ngx_conf_read_token函数用于读取配置文件 并进行词法分析
ngx_conf_handleh函数用于查找配置名属于那个模块,并调用回调函数set方法,进行每个配置项具体的处理


3、init_conf

用户如果在配置文件中没有对一些字段进行设置,那个在这个函数中就会进行设置,并进行最后的初始化工作
同样不是所有的核心模块都用自己的create_conf函数
五、一个示例
这里拿配置daemon的解析进行一个讲解
daemon属于ngx_core_module的配置
1、create_conf

ngx_pcaloc用于对ngx_core_moduel内的配置分配内存
将daemo初始化为NGX_CONF_UNSET
2、handle_conf

daemon对应的回调函数是ngx_conf_set_flag_slot,解析时发现配置名是daemon,就会通过set调用该回调函数

通过offset变量,将配置中的内容赋值给nginx中相应的变量 on=>1,off=>0
3、init_conf


这里发现daemo的值还是NGX_CONF_UNSET的话,就会将它赋值成1
六、参考文献
1、《实战nginx》
2、《深入理解nginx》
3、nginx开发从入门到精通 http://tengine.taobao.org/book/
4、Nginx源码学习,配置文件的加载与初始化 http://blog.sina.com.cn/s/blog_8755c64501011jcd.html
初识nginx——配置解析篇的更多相关文章
- 初识nginx——内存池篇
初识nginx——内存池篇 为了自身使用的方便,Nginx封装了很多有用的数据结构,比如ngx_str_t ,ngx_array_t, ngx_pool_t 等等,对于内存池,nginx设计的十分精炼 ...
- 003.Nginx配置解析
一 Nginx配置文件 1.1 Nginx主配置 Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织,通常每一个区块以一对大括号{}来 ...
- Nginx 配置解析
概述:本篇文章主要对Nginx配置文件中一些常用配置进行了讲解,和如何使用Docker进行安装Nginx.因为该文章是回首在工作闲暇之余整理的,还有待完善,如果有疑义和更好的建议的朋友可以留言给我. ...
- Nginx配置解析
#运行用户,默认即是nginx,可不设置 #user nobody; #nginx进程,一般设置为和cpu核数一样 worker_processes 1; #;单个后台worker process进程 ...
- nginx配置解析之客户端真实IP的传递
前后端分离之后,采用nginx作为静态服务器,并通过反向代理的方式实现接口跨域的方式,在降低开发成本的同时也带来了诸多问题,例如客户端真实IP的获取. 在一些特殊场景下,比如风控和支付流程,往往需要获 ...
- NGINX(四)配置解析
前言 nginx配置解析是在初始化ngx_cycle_t数据结构时,首先解析core模块,然后core模块依次解析自己的子模块. 配置解析过程 nginx调用ngx_conf_parse函数进行配置文 ...
- php php-fpm安装 nginx配置php
centos 6.2 linux下安装php5.6.6源码 PHP在 5.3.3 之后已经把php-fpm并入到php的核心代码中了. 所以php-fpm不需要单独的下载安装.要想php支持php-f ...
- Nginx入门篇(四)之常用配置解析
1.Nginx状态信息功能 Nginx的模块当中有一个ngx_http_stub_status_module模块,这个模块主要记录Nginx的基本访问信息,要使用该模块,需要在编译的时候增加http_ ...
- Nginx 原理解析和配置摘要
前言 Nginx 作为高性能的 http 服务器,知名度不必多言,相似产品中无出其右.本篇随笔记录我认为较为重要的原理和配置. 1. 原理解析 1.1 结构 以上是 Nginx 的结构图,其包含一个 ...
随机推荐
- vba 语法
VBA语言基础 第一节 标识符 一.定义 标识符是一种标识变量.常量.过程.函数.类等语言构成单位的符号,利用它可以完成对变量.常量.过程.函数.类等的引用. 二.命名规则 1) 字母打头,由字母.数 ...
- 如何用 Python 爬取需要登录的网站
[原文地址:]http://python.jobbole.com/83588/ import requests from lxml import html # 创建 session 对象.这个对象会保 ...
- COGS1871 [国家集训队2011]排队(魏铭)
bzoj:http://www.lydsy.com/JudgeOnline/problem.php?id=2141 cogs:http://cogs.pro:8080/cogs/problem/pro ...
- 为什么java代码中要避免多层深度for循环嵌套
在开发中,一直强调代码的整洁和可读性.之前对于使用多层嵌套for循环,一直以为只是对代码可读性和逻辑梳理有影响.可能对性能也有影响,但是一直不知道对性能影响在哪.最近在看虚拟机方面的书,感觉有一个点应 ...
- 微信小程序——手把手教你写一个微信小程序
前言 微信小程序年前的跳一跳确实是火了一把,然后呢一直没有时间去实践项目,一直想搞但是工作上不需要所以,嗯嗯嗯嗯嗯emmmmm..... 需求 小程序语音识别,全景图片观看,登录授权,获取个人基本信息 ...
- python应用:生成简单二维码
概述 \(\quad\)第一篇python的应用就打算写一写用python生成简单的二维码啦.因为二维码在日常生活中越来越常用了,部分博客也用二维码来用作打赏的工具.但是要提醒大家的是,千万不要乱扫街 ...
- C#/VB.NET与西门子PLC进行ModbusTcp通信
进入自动化行业半年多了,每天都与机器打交道. 前段时间接手一个任务,需要将我们机台与下站机台进行通讯,我们机台是PC,下站机台为西门子S7-1200. 想想完成这个任务,领导就会对我这个新人刮目相看, ...
- Docker创建容器
容器是镜像的一个运行实例,是基于镜像运行的轻量级环境,是一个或者一组应用. 怎样创建容器?将容器所基于的镜像名称传入即可,Docker会从本地仓库中寻找该镜像,如果本地仓库没有,则会自动从远程仓库中拉 ...
- CSS清浮动办法
骨灰级解决办法: .clear{clear:both;height:0;overflow:hidden;} 上诉办法是在需要清除浮动的地方加个div.clear或者br.clear,我们知道这样能解决 ...
- 如何通过阿里云APP进行域名备案?阿里云备案流程需要多久?
如何通过阿里云APP进行域名备案? 1.准备备案材料(很多初次使用阿里云APP进行备案的同学会问备案需要准备哪些资料,不二版本下面就给大家一一列举出来) 个人备案需要材料: ⑴<用户网站备案授权 ...