Nginx系列0:Nginx学习历程

时间:2023-11-12 11:51:20

Nginx学习历程

一、初识Nginx

1.Nginx适用于哪些场景

(1)静态资源服务

  • 通过本地文件系统提供服务

(2)反向代理服务

  • Nginx的强大性能
  • 缓存
  • 负载均衡

(3)API服务

  • OpenResty

2.Nginx出现的历史背景

nginx [engine x]是俄罗斯人Igor Sysoev编写的一个HTTP和反向代理服务器,另外它也可以作为邮件代理服务器。 它已经在众多流量很大的俄罗斯网站上使用了很长时间,这些网站包括Yandex、Mail.Ru、VKontakte,以及Rambler。据Netcraft统计,在2012年8月份,世界上最繁忙的网站中有11.48%使用Nginx作为其服务器或者代理服务器。

http://nginx.org/en/download.html上可以获取当前最新的源代码,并编译安装。

3.Nginx的5个主要优点

  • 高并发,高性能
  • 可扩展性好
  • 高可靠性
  • 热部署
  • BSD许可证

4.Nginx的四个主要组成部分

(1)Nginx二进制可执行文件

  • 由各模块源码编译出的一个文件

(2)Nginx.conf配置文件

  • 控制Nginx的行为

(3)access.log访问日志

  • 记录每一条http其你去信息

(4)error.log错误日志

  • 定位问题

5.选择哪一个Nginx的发行版本

(1)开源免费的Nginx

开源版:nginx.org

(2)商业版Nginx Plus

商业版:nginx.com

(3)阿里巴巴的Tengine

阿里巴巴:Tengine

(1)开源免费的OpenResty

开源版:openresty.org

(2)商业版OpenResty

商业版:openresty.com

6.编译出适合自己的Nginx

参考链接:ubuntu16.04编译出适合自己的nginx服务器

下面是介绍Nginx编译的详细过程,不需要了解的可以跳过。

(1)下载Nginx

Nginx下载:https://nginx.org/en/download.html ,

(2)介绍各目录

Nginx系列0:Nginx学习历程

.
├── auto 自动检测系统环境以及编译相关的脚本
│ ├── cc 关于编译器相关的编译选项的检测脚本
│ ├── lib nginx编译所需要的一些库的检测脚本
│ ├── os 与平台相关的一些系统参数与系统调用相关的检测
│ └── types 与数据类型相关的一些辅助脚本
├── conf 存放默认配置文件,在make install后,会拷贝到安装目录中去
├── contrib 存放一些实用工具,如geo配置生成工具(geo2nginx.pl)
├── html 存放默认的网页文件,在make install后,会拷贝到安装目录中去
├── man nginx的man手册
└── src 存放nginx的源代码
├── core nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数
├── event 对系统事件处理机制的封装,以及定时器的实现相关代码
│ └── modules 不同事件处理方式的模块化,如select、poll、epoll、kqueue等
├── http nginx作为http服务器相关的代码
│ └── modules 包含http的各种功能模块
├── mail nginx作为邮件代理服务器相关的代码
├── misc 一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持
└── os 主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口

(3)Configure

nginx的编译旅程将从configure开始,configure脚本将根据我们输入的选项、系统环境参与来生成所需的文件(包含源文件与Makefile文件)。configure会调用一系列auto脚本来实现编译环境的初始化。

详情:nginx的configure原理

(4)编译

make

nginx模块的顺序很重要,会直接影响到程序的功能。而且,nginx和部分模块,也有着自己特定的顺序要求,比如ngx_http_write_filter_module模块一定要在filter模块的最后一步执行。想查看模块的执行顺序,可以在objs/ngx_modules.c这个文件中找到,这个文件在configure之后生成。

详情:模块编译顺序

(5)安装

make install

7.nginx.conf配置vim语法

Nginx系列0:Nginx学习历程

mkdir ~/.vim
cp -r contrib/vim/* ~/.vim/
vim conf/nginx.conf

效果图:

Nginx系列0:Nginx学习历程

8.Nginx配置文件的通用语法

  1. 配置文件由指令和指令块构成
  2. 每条指令以;分号结尾,指令与参数间以空格符号分隔
  3. 指令块以{}大括号将多条指令组织在一起
  4. include语句允许组合多个配置文件以提升可维护性
  5. 使用#符合添加注释,提高可读性
  6. 使用$符号使用变量
  7. 部分指令的参数支持正则表达式

  http配置的指令块:http、server、location、upstream

9.Nginx命令行及演示:重载、热部署、日志切割

(1)Nginx命令行

  1. 格式:nginx -s reload(在不停止对客户的服务下使用新的nginx.conf配置文件)
  2. 帮助:-? -h
  3. 使用指定的配置文件:-c
  4. 指定配置命令:-g
  5. 指定运行目录:-p
  6. 发送信号:-s (立刻停止服务:stop,优雅的停止服务:quit,重载配置文件:reload,重新开始记录日志文件:reopen
  7. 测试配置文件是否有语法错误:-t -T
  8. 打印nginx的版本信息、编译信息等:-v -V

(2)重载配置文件

先修改nginx.conf配置文件,修改后执行下列命令。

./nginx -s reload(在不停止对客户的服务下使用新的nginx.conf配置文件)

(3)热部署

  • 查看已经存在的nginx进程,如图9.1所示。先备份原先的nginx二进制文件,拷贝最新版本的nginx二进制文件覆盖原先的nginx文件;
  • 然后给正在运行的master进程发送一个USR2信号,如图9.2所示。告诉它(指nginx)我们已经更新了nginx,做一个热部署升级。
  • 此时会新起一个master进程,老的master进程平滑的过度到新的master进程,老的work进程不再监听80或443等端口了。以后新的请求新的连接只会进入新的nginx进程中;
  • 这个时候我们要向老的nginx进程发送一个WINCH信号,告诉它请优雅的关闭你的所有work进程。
  • 再次查看nginx,发现老的work进程已经全部退出,老的master进程还在,如图9.3所示。
  • 说明所有的work进程都已经转移到新的master进程了。
  • 但是,如果我们发现新版本有问题,想回退到老的nginx版本时,使用“kill -USR1 进程号”把work进程给拉起来,再把新版本关掉就可以了(kill -s quit)。所以,老的master进程不会主动关掉。

Nginx系列0:Nginx学习历程

图9.1

Nginx系列0:Nginx学习历程

图9.2

Nginx系列0:Nginx学习历程

图9.3

使用的命令如下:

ps -ef | grep nginx              #查看nginx进程
cp nginx nginx.old               #备份原先的nginx二进制文件
cp -r nginx /home/zopen/nginx/sbin/ -f #覆盖安装,拷贝最新版本的nginx二进制文件覆盖原先的nginx文件
kill -USR2 14693                #向老的master进程发送USR2信号
kill -WINCH 14693               #向老的master进程发送WINCH信号

(4)日志切割

比如我们要把access.log进行日志切割,先备份access.log为bak.log,再执行reopen命令就可以重新开始记录日志文件了。

这是比较笨的方法,以后每天都要产生大量日志文件,可以把这两条命令写入脚本,定时执行即可。

ll                         #查看文件结构
mv access.log bak.log #备份access.log为bak.log
ll           #查看文件结构
../sbin/nginx -s reopen #重新开始记录日志文件
ll           #查看文件结构

Nginx系列0:Nginx学习历程

10.用Nginx搭建一个可用的静态资源Web服务器

参考链接:https://www.cnblogs.com/zkfopen/p/10126040.html

11.用Nginx搭建一个具备缓存功能的反向代理服务

参考链接:https://www.cnblogs.com/zkfopen/p/10126191.html

12.用GoAccess实现可视化并实时监控access日志

参考链接:https://www.cnblogs.com/zkfopen/p/10126959.html

13.从网络原理来看SSL安全协议

参考链接:https://www.cnblogs.com/zkfopen/p/10261229.html

14.对称加密与非对称加密各自的应用场景

参考链接:https://www.cnblogs.com/zkfopen/p/10261247.html

15.SSL证书的公信力是如何保证的?

参考链接:https://www.cnblogs.com/zkfopen/p/10261888.html

16.用免费SSL证书实现一个HTTPS站点

因为我使用的是华为云,申请的SSL证书也是华为云上的免费证书,

故这里参考华为云官网的教程:https://support.huaweicloud.com/scm_faq/scm_01_0023.html

参考链接:nginx强制使用https访问(http跳转到https)

参考链接:Nginx配置SSL报错 nginx: [emerg] unknown directive "ssl"

17.Nginx实现请求转向--Nginx负载均衡

参考链接:https://blog.csdn.net/elio_liuheng/article/details/79372841

18.Nginx-rtmp流媒体服务器添加权限认证(推流权限和播放权限)

参考链接:https://www.cnblogs.com/zkfopen/p/11764127.html

二、Nginx架构基础

1.Nginx的请求处理流程

参考链接:https://wiki.jikexueyuan.com/project/nginx/request-processing.html

参考链接:https://www.kancloud.cn/kancloud/master-nginx-develop/51858

为了让大家更好的了解 Nginx 中请求处理过程,我们以 HTTP Request 为例,来做一下详细地说明。

从 Nginx 的内部来看,一个 HTTP Request 的处理过程涉及到以下几个阶段。

  • 初始化 HTTP Request(读取来自客户端的数据,生成 HTTP Request 对象,该对象含有该请求所有的信息)。
  • 处理请求头。
  • 处理请求体。
  • 如果有的话,调用与此请求(URL 或者 Location)关联的 handler。
  • 依次调用各 phase handler 进行处理。

2.Nginx进程结构

nginx是多进程结构,多进程结构设计是为了保证nginx的高可用高可靠,包含:

  • master进程:也是父进程,负责worker进程的管理。
  • worker进程:也是子进程,worker进程一般配置成与服务器的CPU核数相同,worker进程用来处理具体的请求的。
  • cache进程:也是子进程,包括cache manager和cache loader进程,主要是反向代理时做缓存使用。

3.Nginx进程管理:信号

Master进程 Worker进程 nginx命令行

监控worker进程

  • CHLD

管理worker进程

接收信号

  • TERM,INT
  • QUIT
  • HUP
  • USR1
  • USR2
  • WINCH

接收信号

  • TERM,INT
  • QUIT
  • USER1
  • WINCH
  • reload:HUP
  • reopen:USR1
  • stop:TERM
  • quit:QUIT

4.reload重载配置文件的真相

reload流程

  1. 向master进程发送HUP信号(reload命令)
  2. master进程检验配置语法是否正确
  3. master进程打开新的监听端口
  4. master进程用新配置启动新的worker子进程
  5. master进程向老worker子进程发送QUIT信号
  6. 老worker进程关闭监听句柄,处理完当前连接后结束进程

Nginx系列0:Nginx学习历程

三、详解HTTP模块

四、反向代理与负载均衡

参考链接:https://www.kancloud.cn/kancloud/master-nginx-develop#/catalog