Author: haoransun
Wechat: SHR—97
学习来源:极客时间-Nginx核心知识100讲,本人购买课程后依据视频讲解汇总成个人见解。
1 Nginx的三个主要应用场景
流程解析:
一个Web请求从红色的线走下来后,会先经过Nginx,再到应用服务(Tomcat/Django),再去访问Redis/MySQL这样的数据库,提供基本的数据功能,由此产生一个问题:应用服务由于要求开发效率高,所以它的运行效率很低,它的QPS/TPS/并发都是受限的,所以把这样的很多应用服务组成集群,向用户提供高可用性。当应用出现集群后,需要Nginx具有反向代理功能,将动态请求传导给应用服务,而应用服务构成集群,则又出现了两个需求,A:动态扩容。B:容灾。因此,反向代理必须具有负载均衡功能;其次,在这样的一个链路中,Nginx处于企业内网的边缘节点,随着网络链路的增长,用户体验的时延会增加,因此,如果能把一些所有用户看起来在一段时间内不变的动态内容缓存到Nginx中,由Nginx直接向用户提供访问,这样用户时延就会减少很多。反向代理引申出的另一个概念即是 缓存,加速我们的访问。(反向代理)
一些css/js/png等静态资源,是没有必要经由应用服务访问的,只需要通过本地文件 系统上放置的静态资源,直接由Nginx进行访问即可。(静态资源)
如果应用服务本身的性能有很多问题,但是数据库服务要比应用服务好的多,因为它的业务场景比较简单,并发性能/TPS都要远高于应用服务,因此可以使用Nginx直接访问数据库/Redis这样的数据库服务,利用Nginx强大的并发性能,实现Web防火墙这样复杂的业务功能(API服务)
2 Nginx出现的缘由
2.1 互联网的数据量急速增长
互联网的快速普及
全球化
物联网
2.2 摩尔定律:性能提升
2.3 低效的Apache :一个连接对应一个进程
当有百万个连接时,Apache并不会建造出百万个进程,就算生成了,进程间的切换会损耗极大的性能。而Nginx可以轻松应对百万级的连接。
3 Nginx的优点
高并发、高性能
高并发往往需要我们对每个连接所使用的内存尽量的少即可达到,具有高并发的同时又能达到高性能,需要非常好的设计。Nginx可以达到什么样的标准呢?如现在的主流服务器(32核,64G)可以轻松地达到数千万并发连接,如果是处理简单的静态资源请求,可以达到100W的RPS(REQUEST PER SECOND)
可扩展性好
主要体现在模块化设计,非常的稳定。使其的第三方模块-生态圈非常稳定、丰富。甚至是有Tengene(淘宝修改了Nginx的源源码,做了定制化开发)/OpenResty(Lua语言开发)这样的第三方插件在他们之上,又生成了一套生态圈。
高可靠性
Nginx可以在服务器上持续不间断的运行数年。对于Nginx这样的一个高并发、高性能的反向代理服务器而言,往往运行在企业内网的边缘节点上,此时,若企业想提供5个9或更高的服务时,Nginx的宕机可能1年就1s的时间间隙。
热部署
在不停止服务的情况下,升级Nginx,此功能非常重要,因为在Nginx上可能跑了数百万的并发连接。如果是普通服务,则直接kill掉进程再重启即可。但对于Nginx而言,kill掉Nginx进程,会导致操作系统为所有的已建立连接的客户端发送TCP中的reset复位包,然而很多客户端是没有办法,很好的处理复位请求的,在大并发场景下,一些偶然事件就会导致非常恶劣的结果,因此热部署极其重要
BSD许可证
开源且可商用
4 Nginx的组成
4.1 Nginx二进制可执行文件
由Nginx自身的官方模块+我们编译的第三方模块一起构建的文件,相当于汽车本身(有完整的系统,所有的功能都由它提供)
4.2 Nginx.conf配置文件
相当于汽车的驾驶员。
4.3 access.log访问日志
汽车经过所形成的GPS轨迹。
4.4 error.log错误日志
黑匣子:定位问题。
5 Nginx的版本(nginx.org:开源 nginx.com:商业)
单数号:最新按本(新功能有待考验)
偶数号:稳定版本(一般选择此版本)
版本号-feature-bugfix-change
openresty.com openresty.org
6 编译出适合自己的Nginx
nginx.org网址 —–> 选择download
在选中的版本上 —–> 右键选择复制链接地址
在linux系统中 —–> wget 下载地址即可
ps:Nginx依赖一些第三方软件包,如gcc、gcc-c++、openssl、pcre、zlib,详细见0-Nginx安装过程
7 目录解析
解压压缩包: tar -zxvf nginx-xxx.tar.gz
进入解压源码包: cd nginx-xxx
auto: 其中主要有四个子目录(cc:用于编译,lib库、os库对操作系统的判断,types),其他的文件是为了辅助config脚本执行时判定 当前的Nginx支持哪些模块、当前的操作系统有哪些特性供Nginx使用。
CHANGES: Nginx每一个版本提供了哪些 Features、BugFix、Changes这三类特性。
CHANGES.ru: 因为作者是 俄罗斯人,所以提供了一个俄罗斯语言的变更说明书。
conf: 示例文件,将Nginx安装好后,为了方便运维去配置,会将此目录中的示例文件拷贝到安装目录。
configure:这个脚本是用来生成中间文件、执行编译前的一个必备动作。
contrib:提供了两个pl脚本和vim的工具,在没有使用vim工具时去打开nginx配置文件,会发现色彩没有什么变化(nginx语法没有在vim),此时,需要将contrib文件夹下的所有文件拷贝到我们自己的vim目录中,即:
(mac:cp -r contrib/vim/* ~/.vim/ )
( centos:自定义安装vim的话,使用 whereis vim查看vim的安装路径,vimfiles就在 /usr/share/vim/下
所以:cp -r contrib/vim/* /usr/share/vim/vimfiles/
此时再次打开nginx.conf文件,发现语法高亮显示)
html: 提供了两个标准的html文件。如图:
一个是发现500错误的时候重定向到当前指定文件。
一个是默认的Nginx的欢迎页面。
man:Nginx的帮助文件
src:Nginx的源代码。。即Nginx的框架都在这些源代码中。
8开始编译
8.1 编译前首先观察configure都支持哪些参数?
1 | ./configure --help | more |
此处主要分为3大块参数内容:
确定Nginx执行中会去找哪些目录下的文件作为它的辅助文件;如:使用动态模块,则 –modules-path=PATH 就会起作用;确定Nginx.log文件放在那里,则 –lock-path=PATH会起作用;然而,如果没有任何变动的话,只需要指定 –prefix=PATH即可,所有的其他的文件会在prefix目录下建立相应的文件夹。
确定使用那些模块,而不使用那些模块。如 –with 与 –without, –with :需要显示指定的时候,意味着Nginx默认是不会加载此模块的。 –without: 意味着默认会编译到Nginx中,如果加上了,则是显示取消编译的,移出默认的Nginx模块中。
确定Nginx编译时所需要的一些特殊参数。如 –with-cc=Path –with-cpp=Path 就是使用gcc编译时需要加一些什么样的优化参数;–with-debug 打印debug级别的日志,–with-pcre –with-zlib 这是需要加一些第三方的模块等等。
8.2 编译前的依赖包的安装
参看 附件 + 0篇内容,此处省略。。。。
8.3 生成指定目录下的 Makefile,为下一步编译做准备
配置 Nginx的安装目录 /home/geek/nginx
1 | 目标目录不存在,会自动创建 |
在 ./configure 成功后,会生成一些中间文件,存储在 /objs 文件夹下。
最重要的是会生成 ngx_modules.c:它决定了我们执行编译时有哪些模块,会被编译到Nginx中。
所有被编译的模块都会列出来,最后形成一份 ngx_modules[] 数组
8.4 编译
1 | [root@haoransun nginx-1.14.2]# make |
8.5 为什么要知道Nginx的目标文件是放在objs下呢?
如果是做Nginx版本升级,此时不能执行** make install** ,而是需要从这里将目标文件 Nginx
拷贝到安装目录中,
C语言编译时生成的所有重要文件,都会存放在 *objs/src目录 *中。
如果使用了动态模块,则动态模块编译生成的so动态文件,也会放在objs 目录中。
9 安装(首次安装时,可以使用此命令)
1 | [root@haoransun nginx-1.14.2]# make install |
10 安装目录下的目录解析
1 | [root@haoransun nginx-1.14.2]# cd /home/geek/nginx/ |