阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx配置解析篇

134次阅读
没有评论

共计 5371 个字符,预计需要花费 14 分钟才能阅读完成。

一、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 的字符串不在进行正则表达式的匹配检测

@表示仅用于 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

Nginx 配置解析篇

这一步的目的是调用核心函数模块的 create_conf 函数,为配置信息分配内存空间,并且对一些配置变量进行 NGX_CONF_UNSET 的初始化

这里我们看到 222 行有对是否有 create_conf 函数的判断,因为不是所有的核心模块都有 create_conf 函数的,比如 ngx_http_module,这个模块是否使用取决于具体的配置文件,因此分配

内存空间放到了自己的回调函数中了。

2、handle_conf

src/core/ngx_cycle.c

Nginx 配置解析篇

这一步主要用于解析配置文件

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 方法,进行每个配置项具体的处理

Nginx 配置解析篇

Nginx 配置解析篇

3、init_conf

Nginx 配置解析篇

用户如果在配置文件中没有对一些字段进行设置,那个在这个函数中就会进行设置, 并进行最后的初始化工作

同样不是所有的核心模块都用自己的 create_conf 函数

五、一个示例

这里拿配置 daemon 的解析进行一个讲解

daemon 属于 ngx_core_module 的配置

1、create_conf

Nginx 配置解析篇

ngx_pcaloc 用于对 ngx_core_moduel 内的配置分配内存

将 daemo 初始化为 NGX_CONF_UNSET

2、handle_conf

Nginx 配置解析篇

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

Nginx 配置解析篇

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

3、init_conf

Nginx 配置解析篇

Nginx 配置解析篇

这里发现 daemo 的值还是 NGX_CONF_UNSET 的话,就会将它赋值成 1

————————————– 分割线 ————————————–

Nginx 负载均衡配置实战  http://www.linuxidc.com/Linux/2014-12/110036.htm

CentOS 6.2 实战部署 Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm

使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm

搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm

Nginx 安装配置使用详细笔记 http://www.linuxidc.com/Linux/2014-07/104499.htm

Nginx 日志过滤 使用 ngx_log_if 不记录特定日志 http://www.linuxidc.com/Linux/2014-07/104686.htm

————————————– 分割线 ————————————–

Nginx 的详细介绍 :请点这里
Nginx 的下载地址 :请点这里

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-08/134748.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计5371字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中