Nginx学习笔记一:初识Nginx

 

1、Nginx的三个主要应用场景:

  • 静态资源服务:通过本地文件系统提供服务
  • 反向代理服务:Nginx的强大性能、缓存、负载均衡
  • API服务:OpenResty

Nginx学习笔记一:初识Nginx_第1张图片


2、Nginx出现的历史背景

  • 互联网的数据量快速增长:互联网的快速普及、全球化、物联网
  • 摩尔定律:性能提升
  • 低效的Apache:一个连接对应一个进程

3、Nginx的主要优点

  • 高并发,高性能:往往高并发对每个连接所使用的内存尽量的小就能达到,而高性能的实现需要有一个好的设计。
  • 可扩展性好:模块化设计非常稳定,使得Nginx的第三方模块生态圈非常丰富。
  • 高可靠性:Nginx可以在服务器上持续不间断地运行数年。
  • 热部署:可以在不停止服务的情况下升级Nginx。
  • BSD许可证:Nginx不止是开源的,免费的,我们也可以在定制条件下去修改源码,使其应用在一定商业场景下。

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

  • Nginx 二进制可执行文件:由各模块源码编译出的一个文件
  • Nginx.conf 配置文件:控制Nginx的行为
  • access.log 访问日志:记录每一条 http 请求信息与响应信息
  • error.log 错误日志:定位问题

5、编译Nginx的过程

  • 下载Nginx-->介绍各目录-->Configure-->中间文件介绍-->编译-->安装

1、Nginx源代码的目录结构

  • auto:cc子文件用于编译,lib库,os子文件用于对所有操作系统的判断,其他所有文件都是辅助conf脚本执行的时候去判定nginx支持哪些模块,当前操作系统有什么特性可供ngxin使用
  • CHANGES:Nginx每个版本中提供了哪些特性和Bugfix
  • CHANGES.ru:俄罗斯版本语言的change文件
  • conf:一个示例文件
  • configure:用来生成中间文件,执行编译前的必备动作
  • contrib:提供了脚本和vim
  • html:提供了两个标准的html文件,默认的欢迎界面和错误界面
  • LICENSE:
  • man:帮助文件
  • README:
  • src:源文件

2、编译

  • 命令:./configure
  • configure执行后会生成中间文件,中间文件放置在objs文件夹下,里面的ngx_modules.c决定了接下来我们执行编译时有哪些模块会被编译进Nginx
  • 接下来执行make编译,无错误时会生成大量中间文件,可在objs文件下看到
  • 执行make install

6、Nginx配置文件的通用语法

  • 时间单位:ms、s、m、h、d、w、M、y
  • 空间单位:默认bytes、k/K、m/M、g/G
  • 配置文件由指令与指令块构成
  • 每条指令以;分号结尾,指令与参数间以空格符分开
  • 指令块以{}大括号将多条指令组织在一起
  • include语句允许组合多个配置文件以提升可维护性
  • 使用#符号添加注释,提高可读性
  • 使用$符号使用变量
  • 部分指令的参数支持正则表达式
  • http大括号里面表示所有的指令都是由http模块去解析去执行的,一个非http模块是没有办法去解析指令的。upstream则表示上游服务,当Nginx需要与Tomcat等企业内网服务交互时,我们可以定义一个upstream。server对应一个域名或一组域名。location只是一个url表达式。

7、Nginx命令行操作

  • sbin目录下 ./nginx  -s reload   重载nginx配置文件
  • Nginx 热部署
  1. cp nginx nginx.old
  2. kill -USR2 进程号   相当于reload
  3. kill -WINCH 进程号  相当于 kill -9
  4. 回滚 kill -HUP 进程号
  • 日志切割:
  1. mv  taohui_access.log  bak.log 
  2. ../sbin/nginx -s reopen

8、用GoAccess实现可视化并实时监控

goaccess ..路径/access.log -o ../html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED
  • 接下来还需要在conf文件中添加一个location

Nginx学习笔记一:初识Nginx_第2张图片


9、从网络原理看SSL安全协议

Nginx学习笔记一:初识Nginx_第3张图片

Nginx学习笔记一:初识Nginx_第4张图片


10、SSL协议握手时Nginx的性能瓶颈在哪儿

Nginx学习笔记一:初识Nginx_第5张图片

  1. 第一步中由浏览器向服务器发送Client Hello,因为浏览器是多样化的,而且浏览器版本在不断变更,所有不同的浏览器支持的安全套件,加密算法是不同的,因此第一步主要告诉服务器浏览器支持哪些加密算法。
  2. 第二步中我们的Nginx会有自己支持的加密算法列表,以及倾向于使用的加密算法套件,Nginx会选择一套它最喜欢的加密算法套件发送给客户端,如果我们想复用Session,也就是Nginx打开了SessionCache,希望在一天内断开连接的客户端不用再重新协商密钥,那么在这一步它可以直接复用Session。这一步主要发送Nginx使用哪一套加密算法套件。
  3. 第三步中Nginx会把自己的公用证书发送给浏览器,这个公用证书包含证书链,因此浏览器可以找到自己的根证书库,去验证证书是否是有效的。
  4. 如果之前协商的安全套件,比如椭圆曲线算法,服务端需要在第三步第四步中将算法的相关参数发送给客户端,以方便在第六步中生成最终进行加密的密钥。
  5. 第五步中客户端也需要根据椭圆曲线的公共参数生成自己的私钥以后,再把公钥发送给服务器,这样服务器有了自己的私钥,把公钥发送给客户端,可以根据自己的私钥和客户端的公钥共同生成双方加密的密钥,也就是第六步中的Key generation。
  6. 而客户端呢,根据服务器发过来的公钥和它自己生成的私钥也可以生成秘钥。而他们各自生成的秘钥是相同的,这是由非对称加密算法保证的。
  7. 接下来我们可以使用之前生成的秘钥进行通信。
  • 这个过程中,我们可以看到,TLS通讯主要在做两件事:一个是交换秘钥,一个是加密数据。最消耗性能的也是这两点。
  • Nginx优化该性能的做法是:
  1. Nginx在握手的时候主要是看它的椭圆加密算法和RSA非对称加密算法的性能。
  2. 对于大文件而言,考虑对称加密算法性能,比如AES。
  3. 当以小文件为主时,考虑的是非对称加密算法性能,比如RSA。
  4. 比如说当我们面对的场景是小文件比较多时,我们可能重点优化椭圆曲线算法的密码强度;当面对大文件处理时,把密码强度调到更小一些,或者考虑将AES算法是不是可能替换为更有效的算法。

 

你可能感兴趣的:(Nginx)