1 学习资料
- 极客时间nginx100讲
2 学习总结
2.1-2.4:总结基本使用和nginx处理流量流程
2.5 -...:类比和调优
2.1 nginx处理请求流程和架构模型
- nginx简介、特性、基础使用、热部署、重载、日志切割、ssl、日志分析工具goaccess、https站点、lua语言实现openresty。
- nginx请求处理流程、nginx进程机构、网络收发与nginx事件的关系、epoll事件驱动模型、用户态请求切换、同步异步阻塞非阻塞概念、模块分类、连接池、内存池、共享内存、slab管理器、哈希表、红黑树、动态模块。
2.1.0 nginx基础
nginx作为边缘服务器,提供对外访问的静态资源服务器。
-
nginx诞生背景、优点
- 互联网数据增长、多核架构模型、低效Apache
- 可靠、热部署、高并发、扩展性(大量三方模块)
-
应用程序组成
- 二进制文件,提供功能。
- 访问日志,记录请求。
- 错误日志,定位问题。
- 配置文件,控制nginx行为,模块的开关。
-
版本发布特性:
- feature:新功能
- bugfix:bug修复
- change:重构
-
版本特性:
- mainline、stable、legacy
-
可用的nginx发行商程序:
- 开源免费nginx.org、商业版nginx.com(整合三方模块、提供技术支持和运营监控)、阿里巴巴tengine(修改了主干代码)、openresty(openresty.{org,com} 支持lua)
-
编译安装参数:
--without-...:默认编译进nginx --with-...: 默认不编译进nginx
-
编译安装过程:
./configure -OPTION make && make install
-
热部署:
- 编译指定程序位置必须一致,不用make install
- 升级前先备份原程序
- USR2、WINCH、USR1、HUP、QUIT
-
nginx.conf语法(控制nginx的行为):
- ; {} 1个指令0参数/多参数
include
#、$ set
-
优雅关闭:
- 关闭开始定时器、关闭监听句柄、关闭空链接、循环检查是否完全关闭、超出worker_shutdown_timeout,关闭http连接,退出进程。
-
reload:
- HUP、校验conf、打开port、启动新worker、向老的worker进程发送quit
-
nginx处理事件的epoll模型
- 用户态进程间切换,非阻塞
-
同步异步阻塞非阻塞
-
模块是否编译进nginx、模块提供的配置项、模块什么时候被使用、提供的变量
-
证书相关:
- ssl和tls协议(表示层)、对称、非对称加密
- 证书共信力、证书订阅和校验(浏览器验证证书是否过期或有效是在验证二级证书指向的根证书是否有效)
- 证书分类(dv、ov、ev)
- 浏览器证书校验:有效性、合法性,OCSP响应程序
- SSL具体过程
- client Hello(告诉服务器我支持的算法) ->
- <- Server Hello(选择一套加密套件发送给客户端)
- <- Server Certificates 公钥证书发送给浏览器
- <- Server Hello Done(发送加密算法的参数发送给客户端)
- ClientKey Exchange Message(生成密钥对,将公钥发送到server端)
- Server generation (使用client公钥和server端私钥生成密钥)
- client generation (使用服务端的公钥和客户端的私钥)
- 使用密钥进行加密和通讯
- letsencrypt颁发证书
-
日志分析工具:
- goaccess(实时或定时生成html的图形报告,统计的信息如下)
- 总请求数、每天的独立游客、请求的静态地址、传输流量
- 访问来源(ip分布和从哪个连接跳转)
- 状态码
- 使用的浏览器、操作系统
- 访问的时间分布
- 200和404rul资源统计
- goaccess(实时或定时生成html的图形报告,统计的信息如下)
goaccess access.log -o report.html --log-format=COMBINED #--log-format=COMBINED表示nginx配置的log格式,COMBINED是表示默认格式。
#### 2.1.1 nginx架构基础
#### 2.1.2 nginx 处理http请求流程
同个阶段的模块不一定都执行。每个阶段和模块都有执行顺序。
- 获取HOST
- server_name
- 处理11个阶段的http请求前决定哪个server被使用。
- 泛域名、~正则表达 ""、_、. (精准、*、正则、default_server)
- server_name_in_redirect
- 当配置多个sever_name时指定返回给客户端的server
- POST_READ
- realip模块-
- set_real_ip_from
- real_ip_header
- real_ip_recursive
- SERVER_REWRITE
- rewrite模块
- return
- 默认302(http1.0 302临时client不会缓存 301永久 http1.1 303临时改变方法 307临时不改变方法 308永久不改变方法)
- error_page
- FIND_CONFIG
- 做location的匹配。
- location(@)
- 匹配全部前缀字符串
- =精准,匹配后不进行正则匹配
- ^~:匹配上后不进行正则匹配
- ~/~*:按序正则匹配(选择最长匹配)
- REWRITE
- rewrite
- rewrite regex replacement [falg];(last|break|redirect|permanent)
- POST_REWRITE
- PREACCESS
- limit_conn根据并发连接限制;limit_req每秒钟的请求数(基于共享内存)。
- ACCESS
- auth_basic用户密码,access用户IP,auth_request根据三方服务。
- satisfy any|all(默认)
- POST_ACCESS
- 在access之后做的哪些事情。
- PRECONTENT
- 让一个请求变成多个子请求。
- 若多个文件都不存在,则返回最后一个文件的内容或状态码。
- mirror镜像流量,多个环境处理同一个用户请求。
- mirror /location;(location @location{...})
- mirror mirror_request_body off|on;
- CONTENT
- index,autoindex,concat,proxy_pass,alias,root(以非目录方式访问目录会返回301)
- concat阿里提供,将小文件合并为一次http响应中返回。
- static模块
- 根据扩展名将文件映射,放在hash表中,加快访问速度
- http过滤模块
- header/body image_filter过滤模块(图片压缩)
-
- LOG
- access_log
### 2.2 反向代理、负载均衡、缓存
#### 2.2.1 七层代理
#### 2.2.2 四层代理
## fastcgi反向代理优化
```nginx
--with-http_realip_module
set_real_ip_from
real_ip_header
real_ip_recursive
# 连接池
# 请求池
#