nginx小记

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 最小平均响应时间和最少活动连接 考虑权重

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章