nginx是个c语言写的提供web和反向代理服务的开源软件
特性
高可靠 部署后常年稳定运行
高并发 高性能 c语言 nio+slab
高可扩展性 丰富的功能模块
热加载 热部署 无需启动更新配置文件 nginx主要就是玩配置
开源BSD 最开放的协议自由度高 虽然高大上 不过咱基本用不上啊
主要功能
静态资源服务 动静分离 依赖系统功能
反向代理 缓存 负载均衡 代理
api服务
结构
核心模块 内核 核心服务
扩展模块 基础服务 功能服务
第三方模块 功能服务 可有可无
进程
master进程 强有里的管家 接受信号 管理监控worker进程
worker进程 负责处理具体的http请求 配置为0个work进程时将停止处理客户端请求
安装
二进制安装 更新源 添加nginx源 yum安装
源码编译安装 安装依赖 config make make install
命令
nginx -h 帮助
nginx -c $configPath 指定配置文件启动
nginx -t 测试配置文件是否正确
nginx -s reload 配置热加载
nginx -s stop 强制停止
nginx -s quit 安全停止
nginx -s reopen 打开新的日志文件
nginx -v 版本信息
nginx -V 版本和配置信息
-s为发送信号量到master
热加载流程 配置变更 需要刷新配置
master 接受到HUP信号 测试配置文件是否正确
正确 尝试使用新配置(如端口 worker等) 尝试失败 仍然使用旧配置(通过旧配置回滚?)
worker进程平滑过滤流程
master通过当前已加载配置(新配置)fork worker进程 成功后给老的worker发送QUIT信号
老worker接受到QUIT信号后停止监听新请求 当请求全部处理完毕后 结束进程
[root@ip-172-31-31-182 ~]# ps -ef|grep nginx
nginx 3027 23169 0 22:11 ? 00:00:00 nginx: worker process
nginx 3028 23169 0 22:11 ? 00:00:00 nginx: worker process
nginx 3029 23169 0 22:11 ? 00:00:00 nginx: worker process
root 3360 2933 0 22:12 pts/2 00:00:00 grep --color=auto nginx
root 23169 1 0 17:44 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
[root@ip-172-31-31-182 ~]# nginx -s reload
[root@ip-172-31-31-182 ~]# ps -ef|grep nginx
nginx 3027 23169 0 22:11 ? 00:00:00 nginx: worker process is shutting down
nginx 3028 23169 0 22:11 ? 00:00:00 nginx: worker process is shutting down
nginx 3029 23169 0 22:11 ? 00:00:00 nginx: worker process is shutting down
nginx 3363 23169 0 22:13 ? 00:00:00 nginx: worker process
nginx 3364 23169 0 22:13 ? 00:00:00 nginx: worker process
nginx 3365 23169 0 22:13 ? 00:00:00 nginx: worker process
root 3367 2933 0 22:13 pts/2 00:00:00 grep --color=auto nginx
root 23169 1 0 17:44 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
reload后一下把所有的worker都启动起来了 并没有分批启动 有可能是老的worker很快就会死没必要 或者我的worker数量有点少
自动刷新 觉得没必要
写个watch sh 监听配置文件的修改时间是否发生变化 发生变化后给master发送HUP信号
热启动 插件变更时 需要要重启进程
给master发送USR2信号 master会根据新配置fork个新master
给旧master发送WINCH信号 会关闭所有的老worker
观察一段时间是是否有异常
无异常 提交 给老master发送quit信号
有异常 回滚 方式一 给老master发送HUP信号 已当前配置(老配置)启动work 给新master发送quit信号 方式二给新master发送TERM信号
灰度发布
为配置创建副本 修改配置的端口或worker数量(可以结合cpu_affinity)
给master发送USR2信号
观察一段时间是否有异常(可以通过给老worker发送quit信号来修改比例 最终达到100%) 无异常提交 有异常回滚
配置文件
上下文 作用范围 可以嵌套 由简单指令和快指令构成 空文档由主上下文构成
指令 由某块提供 perl语法
简单指令 名称和参数构成 空格分开 分号结尾 可以继承或覆盖
快指令 名称与[参数]和一对大括号构成 括号内为上下文即作用范围
有层级关系 http和event在全局上下文中 server在http中 location在server中
核心指令
user worker进程工作在哪个用户下
use 指定处理网络io的事件模型 select kqueue poll epool 在events下
worker_processes 指定运行多少个工作进程 非auto nginx启动后master fork出所有工作进程 在events下
events 连接相关配置
worker_connections worker进程能处理的最大连接数
worker_cpu_affinity 配合worker_connections使用 work进程和cpu内核关系
worker_cpu_affinity指令
cpu用二进制数表示 几个worker进程 就有几个二进制数 一位数字代表一个内核 1为绑定 实例如下
2核2线程 worker_connections 2 worker_cpu_affinity 01 10
2个工作进程 进程1绑定到内核1 进程2绑定到内核2
2核4线程 假如内核1和内核3在一物理核心上 worker_connections 2 worker_cpu_affinity 0101 1010
2个工作进程 进程1绑定内核1内核3 进程2绑定到内核2内核4
ab压测 通过top -> 1查看核心负载情况和使用率
http核心指令
http 协议
server 虚拟主机
listen 监听端口
location url路由 有参数
location参数格式
完全匹配 最高优先级
=/monitor /monitor 完全匹配
前缀匹配 选出匹配度最高的 最优的
/monitor /monitor开头 命中后还会继续正则匹配
^~/monitor /monitor开头 命中后不会继续正则匹配 不允许出现逻辑一样的参数 如/a ^~/a 会报错
正则匹配 按顺序匹配 命中则采用 没命中采用前缀匹配中最长前缀匹配配置
~^/(monitor|config) /monitor或/config开头
~*.(json|xml) .json或.xml结尾 且不区分大小写
最强备胎 万金油 接盘侠
/ 前缀匹配和正则匹配都没有命中采用
非常规请求 用于重定向
@
location指令
proxy_http_version http协议版本 结合keepalive
proxy_set_header 当前事务结束后是否完毕网络连接 结合keepalive
http代理指令
proxy_pass 代理地址
代理类型
正向代理:客户端知道服务端地址 但是不想让服务端知道客户端真实地址
反向代理: 服务端想知道客户端的地址 但是不想让客户端知道服务端的真实地址
http负载均衡指令
server 服务器
hash|ip_hash|least_conn|least_time|random
keepalive ngin到服务器的最大空闲连接数 QPS/1000/请求耗时毫秒/(10-30)
keepalive_requests 一个keepalive连接允许的最大请求数 参考QPS
keepalive_timeout keepalive连接超时时间 参考QPS
负载算法
weight 加权轮询 默认算法 参考for循环
ip_hash ip进行hash运算 一定程度解决服务器状态问题
hash 参数进行hash运算 可以用来做缓存 提高缓存命中率 减少内存使用率 需安装第三方插件
fair 智能调整调度算法 根据请求的相应时间进行均衡分配 需安装第三方插件
least_conn 最少活动连接 考虑权重
least_time 最小平均响应时间和最少活动连接 考虑权重