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

Nginx配置解析篇

436次阅读
没有评论

共计 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、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7961520
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...
免费领取huggingface的2核16G云服务器,超简单教程

免费领取huggingface的2核16G云服务器,超简单教程

免费领取 huggingface 的 2 核 16G 云服务器,超简单教程 前言 HuggingFace.co...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...