文章过于杂乱,不建议直接阅读,可以直接get知识点
Nginx 学习笔记
Nginx的五大有点
- 高并发、高性能
- 可扩展性好
- 高可靠性
- 热部署
- BSD许可证
Nginx 的组成部分
- Nginx二进制可执行文件 由模块的源码编译出来的一个文件
- Nginx.conf文件 控制行为
- access.log 访问日志 记录每一条http请求信息
- error.log 错误日志 定位问题
Nginx的版本发布
https://nginx.org/ 了解发展史
- 开源免费版本nginx.org
- 商业版:nginx.com
- 阿里巴巴Tengine
- 免费OpenResty 商业版本 OpenResty
编译出适合自己的Nginx
下载 编译 安装
mainline 最新版本
- 解压目录有
源码文件解释
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 配置语法
- 配置文件由指令与指令块构成
- 每天指令以;分号结尾,指令与参数间可以空格符号分割
- 指令块一{}大括号将多条指令组织在一起
- include 语句允许组合多个配置文件以提升可维护性
- 使用#符号添加注释,提高可读性
- 使用$符号 使用变量
- 部分指令的参数支持正则表达式
配置参数:时间的单位
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服务器
- 在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代码
研究学习方向:
- 下载OpenResty
- 分析目录结构
- 编译
- 添加Lua代码
- 运行
下载
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流程:
- 向master进程发送HUP信号(reload命令)
- master 进程校验配置语法是否正确
- master 进程打开新的监听端口
- master 进程用新的配置启动新的worker子进程
- master 进程向老worker子进程发送QUIT信号
- 老的worker进程关闭监听句柄,处理完当前连接后结束进程
热升级流程
- 将旧Nginx文件换成新的Nginx文件(注意备份)
- 向Master进程发送USR2信号
- master 进程修改pid文件名,加后缀.oldbin
- master 进程用新Nginx文件启动新的master进程
- 向老master进程发送quit信号,关闭老的master
- 回滚:向老master发送HUP,向新的master发送QUIT
如何优雅的关闭worker进程
只针对worker进程,优雅的关闭
- 设置定时器 worker_shutdown_timeout
- 关闭监听句柄
- 关闭空闲连接
- 在循环中等待全部连接关闭
- 退出进程
Nginx 的网络收发TCP事件---事件驱动关系
Nginx模块
研究模块:
提前编译进Nginx 提供那些配置项 模块何时被使用
在官网都可以看到
https://nginx.org/en/docs/
- 可以查看看源码
如何拿到客户的真实IP
X-Forward-For 就是真实的IP