Nginx的发展以及研究,随笔

文章过于杂乱,不建议直接阅读,可以直接get知识点

Nginx 学习笔记

Nginx的五大有点

  1. 高并发、高性能
  2. 可扩展性好
  3. 高可靠性
  4. 热部署
  5. BSD许可证

Nginx 的组成部分

  1. Nginx二进制可执行文件 由模块的源码编译出来的一个文件
  2. Nginx.conf文件 控制行为
  3. access.log 访问日志 记录每一条http请求信息
  4. error.log 错误日志 定位问题

Nginx的版本发布

https://nginx.org/ 了解发展史

  1. 开源免费版本nginx.org
  2. 商业版:nginx.com
  3. 阿里巴巴Tengine
  4. 免费OpenResty 商业版本 OpenResty

编译出适合自己的Nginx

下载 编译 安装
mainline 最新版本

  1. 解压目录有
源码文件解释
auto里面有
    cc为编译的模块lib
    os判断操作系统 
CHANGE 提供的是每个版本的问题,和特性
CHANGE.ru 作者为俄罗斯人 这里是俄罗斯语言
conf 文件是一个示例文件,主要是安装的时候直接拷贝过去
configure 脚本是生成中间文件,编译前的必背动作
contrib 提供两个脚本,和两个工具,vim的不显示在nginx配置中
需要把 contrib所有文件拷贝到自己的目录中
cp -r contrib/vim/* ~/.vim/
html 文件目录 提供了 500错误 和欢迎页面
man 文件 是帮助文件,基本的帮助和配置
src 源代码目录 
    core ......
------------
开始编译 查看configure支持哪些目录下的文件作为辅助文件
configure --help | more
前缀为--with--http 默认不会编译进来
前缀为--without--默认会添加该模块 加上的话就会移出
编译:第一步
./configure --prefix=/home/usr/local/nginx
编译后没有报错即可
编译后会生产一个中间文件 叫 objs
里面重要的文件叫ngx_modules.c 他决定了哪些模块会被编译进去,所有的别编译进来的都在这里
第二步:
make 编译
编译完成 没有任何错误,这个时候又生成了很多中间文件 还是在objs里面 
所有文件都会放在src目录,如果使用了动态模块,或者以后升级会用到这个objs
然后第三步
make install

安装完成以后 决定配置的在 conf 下 日志 log下 sbin控制文件

Nginx 配置语法

  1. 配置文件由指令与指令块构成
  2. 每天指令以;分号结尾,指令与参数间可以空格符号分割
  3. 指令块一{}大括号将多条指令组织在一起
  4. include 语句允许组合多个配置文件以提升可维护性
  5. 使用#符号添加注释,提高可读性
  6. 使用$符号 使用变量
  7. 部分指令的参数支持正则表达式

配置参数:时间的单位

ms milliseconds 
s  seconds 
m  minutes
h  hours
d  days
w  weeks
M  months,30 days
y  years , 365 days

配置参数:空间的单位

k/K kilobytes
m/M megabytes
g/G gigabytes
    bytes

http 配置的指令块

hhtp   所有都是http解析的
server  对应的域名
upstream    上游服务
location    表达式

** Nginx的命令行**

格式 Nginx -s reload
帮助 -? -h
使用指定的配置文件 -c
指定配置命令 -g
指定运行目录 -p
发送信号 -s
    -s stop 立即停止服务
    -s quit 优雅的停止服务
    -s reload 重载配置文件
    -s reopen 重新开始记录日志文件
测试配置文件是都有语法错误 -t -T
打印nginx 的版本信息 编译信息等 -v -V

重载配置文件

./nginx -s reload

Nginx的热部署

先备份正在运行的nginx文件,然后直接替换正在运行的文件
cp -r nginx /xxs/xs/xs/sbin/ -f
reopen  
告诉Nginx的Master一个信号
Kill -USR2 pid
告诉老的进程优雅的关闭,平滑得过渡,此时老的进程还在
Kill -WINCH pid
这时候老的就退出了
发现问题可以回退

日志切割

正常运行的log,切割
首先, 备份出来一份
执行 nginx -s reopen
新的日志就出来了 
还有很多方法 例如下一个脚本 定时执行

搭建一个静态资源服务器

dlib库是个不错的东西

listen 监听的端口
location 
两种方法 root 和 alias /dist
一般开启
gzip on;会对资源压缩
gzip_min_length 1;  小于1字节就不在压缩
gzip_comp_level 1;  压缩级别
gzip_types ;类别
共享静态资源
location / {
    antoindex on;
}

访问大文件限制带宽 ,限制访问速度
location / {
set $limit-rate 1m;
}

记录日志格式
location {
设定日志记录在哪里
access_log /logs/access.log main;

}

http {
log_format main "$remote_addr ......."
}
参考
https://nginx.org/en/docs/http/ngx_http_access_module.html

搭建一个具有缓存功能nginx服务器

  1. 在listen 加上ip地址
    listen 127.0.0.1:8080;

这样操作的话只能本机的进程才能访问8080端口

** 反向代理:**
需要一个upstream上游

local为命名
upstream local {
    server 127.0.0.1 :8080;
    .......可以有很多
server{
    server_name yuming.com
    listen 80;
location / {
    .......
......
.......
proxy_pass http://loca;
反向代理到 这里
}
}
}

配置缓存服务器

proxy_cache_path /tmp/xxxx
如何使用缓存

使用GoAccess实时可视化监控
参考:
https://goaccess.io/get-started
下载源码安装

goaccess access.log -c
goaccess access.log -o report.html --log-format=COMBINED
goaccess access.log -o /var/www/html/report.html --log-format=COMBINED --real-time-html

同时需要配置

location /report.html {
    alias /usr/local/openreset/html/report.html;
}

访问即可看到统计

** SSL 安全协议**

SSL (Secure Sockets Layer)
TLS (Transport layer Secure)
RAS 算法 和 AES 算法
PKI公钥基础设施
证书的类型
DV 证书验证证书
OV 组织验证证书
EV 扩展验证证书

实操:

yum install  python2-certbot-nginx
安装后 就有了 certbot
certbot --nginx --nginx-sercer-root=/usr/x/x/x/x
可以nginx.conf 最下面新增了5行

基于OpenResty安装实践 Lua代码
研究学习方向:

  1. 下载OpenResty
  2. 分析目录结构
  3. 编译
  4. 添加Lua代码
  5. 运行
下载
wget https://openresty.org/cn/download.html
解压
进入源代码
    build
    bundel 1.13.6  好多模块都在这里 主要是在编译c模块
    util
    configure --help文件基本和nginx一样,但是多处需要模块,内置在了OpenResty里面
     

研究方向
Nginx的架构基础,请求的处理
Nginx的进程结构

1.单进程结构  
2.多进程结构   默认都是多进程
多进程: 信号管理
MASTER PROCESS 保持健壮 高可用性
master  管理 worker -->caheManage ---> cache loader
worker 配置和CPU 核数一直
ps -ef | grep nginx
reload 后 master进行还在 优雅的退出了
worker进程号改变
ngixn的父子进程管理
信号
TERM INT 立刻停止  ==stop
QUIT 优雅的退出   =-=reload
HUP  重载
USR1 重新打开日子文件  ==reopen
后两个需要用kill  发送信号
USR2
WINCH

reload配置研究:
reload流程:

  1. 向master进程发送HUP信号(reload命令)
  2. master 进程校验配置语法是否正确
  3. master 进程打开新的监听端口
  4. master 进程用新的配置启动新的worker子进程
  5. master 进程向老worker子进程发送QUIT信号
  6. 老的worker进程关闭监听句柄,处理完当前连接后结束进程

热升级流程

  1. 将旧Nginx文件换成新的Nginx文件(注意备份)
  2. 向Master进程发送USR2信号
  3. master 进程修改pid文件名,加后缀.oldbin
  4. master 进程用新Nginx文件启动新的master进程
  5. 向老master进程发送quit信号,关闭老的master
  6. 回滚:向老master发送HUP,向新的master发送QUIT

如何优雅的关闭worker进程
只针对worker进程,优雅的关闭

  1. 设置定时器 worker_shutdown_timeout
  2. 关闭监听句柄
  3. 关闭空闲连接
  4. 在循环中等待全部连接关闭
  5. 退出进程

Nginx 的网络收发TCP事件---事件驱动关系

Nginx模块
研究模块:
提前编译进Nginx 提供那些配置项 模块何时被使用
在官网都可以看到
https://nginx.org/en/docs/

  1. 可以查看看源码

如何拿到客户的真实IP
X-Forward-For 就是真实的IP

上一篇:docker常用命令


下一篇:git学习教程