一、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——配置解析篇的更多相关文章

  1. 初识nginx——内存池篇

    初识nginx——内存池篇 为了自身使用的方便,Nginx封装了很多有用的数据结构,比如ngx_str_t ,ngx_array_t, ngx_pool_t 等等,对于内存池,nginx设计的十分精炼 ...

  2. 003.Nginx配置解析

    一 Nginx配置文件 1.1 Nginx主配置 Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织,通常每一个区块以一对大括号{}来 ...

  3. Nginx 配置解析

    概述:本篇文章主要对Nginx配置文件中一些常用配置进行了讲解,和如何使用Docker进行安装Nginx.因为该文章是回首在工作闲暇之余整理的,还有待完善,如果有疑义和更好的建议的朋友可以留言给我. ...

  4. Nginx配置解析

    #运行用户,默认即是nginx,可不设置 #user nobody; #nginx进程,一般设置为和cpu核数一样 worker_processes 1; #;单个后台worker process进程 ...

  5. nginx配置解析之客户端真实IP的传递

    前后端分离之后,采用nginx作为静态服务器,并通过反向代理的方式实现接口跨域的方式,在降低开发成本的同时也带来了诸多问题,例如客户端真实IP的获取. 在一些特殊场景下,比如风控和支付流程,往往需要获 ...

  6. NGINX(四)配置解析

    前言 nginx配置解析是在初始化ngx_cycle_t数据结构时,首先解析core模块,然后core模块依次解析自己的子模块. 配置解析过程 nginx调用ngx_conf_parse函数进行配置文 ...

  7. php php-fpm安装 nginx配置php

    centos 6.2 linux下安装php5.6.6源码 PHP在 5.3.3 之后已经把php-fpm并入到php的核心代码中了. 所以php-fpm不需要单独的下载安装.要想php支持php-f ...

  8. Nginx入门篇(四)之常用配置解析

    1.Nginx状态信息功能 Nginx的模块当中有一个ngx_http_stub_status_module模块,这个模块主要记录Nginx的基本访问信息,要使用该模块,需要在编译的时候增加http_ ...

  9. Nginx 原理解析和配置摘要

    前言 Nginx 作为高性能的 http 服务器,知名度不必多言,相似产品中无出其右.本篇随笔记录我认为较为重要的原理和配置. 1. 原理解析 1.1 结构 以上是 Nginx 的结构图,其包含一个 ...

随机推荐

  1. Visual Studio 2010 Express for Windows Phone 永久免费序列号

    Visual Studio 2010 Express for Windows Phone 永久免费序列号:YDK44-2WW9W-QV7PM-8P8G8-FTYDF

  2. Python 装饰器笔记

    一.装饰器无参数 1.原函数无参数 def wrap_in_tag_b(fn): # wrap_in_tag_b 是真正的装饰器 def wrapped(): return "<b&g ...

  3. CSS快速入门-鼠标悬浮(hover伪类)

    一.概述 hover伪类:在鼠标移到元素上时向此元素添加特殊的样式.比较普通的就是一个url,当你鼠标放上去后,会变颜色. 在现实的应用场景也非常之多.最常见的是网站的悬浮导航,当鼠标放到导航条上时, ...

  4. Python distribute到底使用package_data还是MANIFEST.in?

    今天看Flask的文档,里面提到如何通过distribute发布你自己的Python包.讲包含文件的时候,提到要用MANIFEST.in并将include_package_data设置为True. 由 ...

  5. Kali Linux菜单中各工具功能大全

    各工具kali官方简介(竖排):https://tools.kali.org/tools-listing 名称 类型 使用模式 功能 功能评价 dmitry 信息收集   whois查询/子域名收集/ ...

  6. 使用MUART0-P-1-2设置无线PM2.5感测环境

    信息搜集–> 处理分析–> 动作执行,这是IoT环境中最基本的组成要素,传感器搜集环境信息后,透过指定的通讯协议传送到至控制中枢,经过处理分析后再将命令送交各device端执行.要实现这样 ...

  7. 12只超酷机器人,在家用3D打印搞定!

    3D打印最吸引人的地方在于它完全无极限!现在的3D打印已经广范应用在我们的生活.以及工业上的各个领域.最棒的是,DIY玩家可以真正从中受益.我们现在已经可以应用3D打印,在家制作自己的机器人了.如果你 ...

  8. TensorFlow Python3.7环境下的源码编译(一)环境准备

    参考: https://blog.csdn.net/yhily2008/article/details/79967118 https://tensorflow.google.cn/install/in ...

  9. [Unity3D]MonoDeveloper快捷键(补全代码补全引用中文乱码tab转空格)

    Hello亲爱的观众朋友们大家好,我是09. vs支持各种插件,一般推荐用vs.不过总有人(例如我)由于各种原因用MonoDeveloper.苦于每次上网找各种设置,此处集中写下我用MonoDevel ...

  10. 如何在多机架(rack)配置环境中部署cassandra节点

    cassandra节点上数据的分布和存储是由系统自动完成的.除了我们要设计好partition key之外,在多机架(rack)配置环境中部署cassandra节点,也需要考虑cassandra分布数 ...