💥内容参考:【尚硅谷】2022 版 Nginx 教程(nginx 入门到亿级流量)
# 发行版本介绍
🟢Nginx 开源版(反向代理、负载均衡,二次开发难度大)
https://nginx.org/
🔴Nginx Plus 商业版(附加了很多企业特性)(收费 )
https://www.nginx-cn.net/products/nginx/
🟢Openresty(有大量 lua 库)
http://openresty.org/cn/
Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
🟢Tengine(C 语言形式模块化开发增强 Nginx 原始功能)
http://tengine.taobao.org/
Tengine 是由淘宝网发起的 Web 服务器项目。它在 Nginx 的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine 的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的 Web 平台。
以下内容基于 Nginx 开源版进行学习
# Nginx 安装(linux)
首先官网下载压缩包,解压命令😆
1
tar -zxvf nginx-1.20.2.tar.gz
安装必要的环境
1
2
3yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
./configure --prefix=/usr/local/nginx/编译
1
2make
make install运行
1
2cd /usr/local/nginx/sbin/
./nginx访问:
1
curl localhost:80
🤔80 端口是为 HTTP (HyperText Transport Protocol) 即 超文本传输协议开放的
# nginx 运行命令
1 | ./nignx # 启动 |
⚠️注意:如果使用本地虚拟机跑 nginx,需要关闭防火墙(或者开放 80 端口)
1 | 关闭防火墙 |
# nginx 安装成系统服务
创建服务脚本
1
vim /usr/lib/systemd/system/nginx.service
服务脚本内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
wantedBy=multi-user.target😭一定要注意检查内容,不要错字漏字
重新加载系统服务:
$systemctl daemon-reload
启动 nginx 服务:
$systemctl start nginx.service
(可选)设置开机自启动:
$systemctl enable nginx.service
# 目录结构
使用 $tree
命令即可生成目录
没有就安装➡ $yum install tree -y
1 | . |
# Nginx 多进程模型
/sbin/nginx
跑起来之后会:
开启 Master 主进程(收集、分发请求,监控 Worker 状态),读取配置文件并进行一次校验
Master 开启子进程 Worker 等待请求并响应
Worker 解析请求并读取响应目录(根据
conf/nginx.conf
)
为什么 Nginx 使用多进程而不是多线程?
答:
- Nginx 使用多进程不是多线程,Nginx 是异步,非阻塞的,使用了 epoll 和大量的底层代码优化。
- Nginx 采用一个 Master 进程和多个 Worker 进程的模式
- Worker 进程数一般与 cpu 核心数一致,Worker 的处理性能受内存影响
# Nginx 配置文件
# 最小配置文件
将 nginx/conf/nginx.conf
文件中所有注释删掉。剩下基本支撑 nginx 运行的配置:
1 | # 开启1个Worker进程(内核数决定) |
mine[1]
# 虚拟主机配置
# server 匹配规则
- 完美匹配
servername 域名1 域名2 ...;
- 通配符匹配
servername *.com;
- 通配符结束匹配
server_name www.*;
- 正则匹配
server_name ~^[0-9]+\.com$;
# 反向代理
🤔个人理解:
- 正向代理:我(客户)上网需要找个代理服务器来帮我上网
- 反向代理:我(企业)接受请求需要一个代理来帮我分发请求
- 网关:访问网络的入口,所有请求都要经过路由器转发
Nginx 是隧道式代理服务器,请求和响应都需要经过 Nginx
DR 代理:请求经过代理,响应直接响应(跳过代理)->IVS 负载均衡器
传输数据过大(视频、压缩包之类的),nginx 会有一个瓶颈
# location/proxy_pass 值
作用:设置请求转发到哪去
⏸只进行简单了解,详细内容之后展开
使用时会覆盖掉
root
和index
值为 url(带协议的)例如 http://www.windlinxy.top
使用 https 协议会报错,未找到原因
# 负载均衡
负载均衡从字面意思很好理解,就是对于一个服务器集群,每个服务器负载很均衡🤣,意思是每个服务器均摊的请求数差不多,以防止某个服务器过载的现象。‘
常用算法:
轮询(round-robin):
按照时间顺序将请求分发到每个服务器,到最后每个服务器接受到的请求是大致相同的。
加权轮询:
轮询对于性能相近的服务器还好,如果有几个服务器性能比较高,可以使用加权轮询,设置每个服务器的权值,请求按权值的比例分配
权重变量
配置的权重,即在配置文件或初始化时约定好的每个节点的权重
节点的当前权重,初始化是配置的权重,随后会一直变更
有效权重,用于做降权 ,初始值为 weight,通讯过程中发现异常则 -1 ⚠️ ,之后再次选择本节点,调用成功则 +1⚠️,直到恢复到 weight
加权轮询算法
- 轮询所有节点,计算当前状态下所有节点的 effectiveWeight 之和作为 totalWeight
- 更新每个节点的 currentWeight,currentWeight = currentWeight + effectiveWeight 选出所有节点 currentWeight 中最大的一个节点作为选中节点
- 选择中的节点再次更新 currentWeight,currentWeight = currentWeight - totalWeight
IP 哈希
每个请求按访问 ip 的 hash 结果分配
其他算法
# 基本配置
配置一组服务器:
1 | upstream wind{ # 配置别名 |
# 动静分离
所谓动静分离,就是将静态资源从 tomcat 拆分 Nginx,使得访问静态资源不需要再经过 tomcat,相当于少了一步,直接从 nginx 返回静态资源,加快访问
# 配置
将静态资源放入到 nginx 的 html 目录下
在 ./nginx/conf/nginx.conf
下:
1 | 拦截静态资源 |
# URLRewrite
rewrite 是实现 URL 重写的关键指令,根据 regex (正则表达式) 部分内容, 重定向到 replacement,结尾是 flag 标记。
1 | rewrite <regex> <replacement> [flag]; |
rewrite 参数的标签段位置: server
/ location
/ if
flag 标记说明:
last
本条规则匹配完成后,继续向下匹配新的 location URI 规则break
本条规则匹配完成即终止,不再匹配后面的任何规则redirect
返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址permanent
返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址
# 参考博客
- Nginx 如何实现高并发的
(Multipurpose Internet Mail Extensions) 多用途互联网邮件扩展类型,多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。 ↩︎