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)介绍各目录
.
├── 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脚本来实现编译环境的初始化。
(4)编译
make
nginx模块的顺序很重要,会直接影响到程序的功能。而且,nginx和部分模块,也有着自己特定的顺序要求,比如ngx_http_write_filter_module模块一定要在filter模块的最后一步执行。想查看模块的执行顺序,可以在objs/ngx_modules.c这个文件中找到,这个文件在configure之后生成。
详情:模块编译顺序
(5)安装
make install
7.nginx.conf配置vim语法
mkdir ~/.vim
cp -r contrib/vim/* ~/.vim/
vim conf/nginx.conf
效果图:
8.Nginx配置文件的通用语法
- 配置文件由指令和指令块构成
- 每条指令以;分号结尾,指令与参数间以空格符号分隔
- 指令块以{}大括号将多条指令组织在一起
- include语句允许组合多个配置文件以提升可维护性
- 使用#符合添加注释,提高可读性
- 使用$符号使用变量
- 部分指令的参数支持正则表达式
http配置的指令块:http、server、location、upstream
9.Nginx命令行及演示:重载、热部署、日志切割
(1)Nginx命令行
- 格式:nginx -s reload(在不停止对客户的服务下使用新的nginx.conf配置文件)
- 帮助:-? -h
- 使用指定的配置文件:-c
- 指定配置命令:-g
- 指定运行目录:-p
- 发送信号:-s (立刻停止服务:stop,优雅的停止服务:quit,重载配置文件:reload,重新开始记录日志文件:reopen)
- 测试配置文件是否有语法错误:-t -T
- 打印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进程不会主动关掉。
图9.1
图9.2
图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 #查看文件结构
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进程
管理worker进程 接收信号
|
接收信号
|
|
4.reload重载配置文件的真相
reload流程
- 向master进程发送HUP信号(reload命令)
- master进程检验配置语法是否正确
- master进程打开新的监听端口
- master进程用新配置启动新的worker子进程
- master进程向老worker子进程发送QUIT信号
- 老worker进程关闭监听句柄,处理完当前连接后结束进程
三、详解HTTP模块
四、反向代理与负载均衡
参考链接:https://www.kancloud.cn/kancloud/master-nginx-develop#/catalog