💥内容参考:【尚硅谷】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)
首先官网下载压缩包,解压命令😆
$tar -zxvf nginx-1.20.2.tar.gz
安装必要的环境
$yum install -y pcre pcre-devel
$yum install -y zlib zlib-devel
$./configure --prefix=/usr/local/nginx/
编译
$make
$make install
运行
$cd /usr/local/nginx/sbin/
$./nginx
访问:
$curl localhost:80
🤔80 端口是为 HTTP (HyperText Transport Protocol) 即 超文本传输协议开放的
# nginx 运行命令
./nignx # 启动 | |
./nginx -s stop # 快速停止 | |
./nginx -s quit # 优雅停止(等待其任务跑完自动停止) | |
./nginx -s reload # 重新加载配置 |
⚠️注意:如果使用本地虚拟机跑 nginx,需要关闭防火墙(或者开放 80 端口)
#关闭防火墙 | |
$systemctl stop firewalld.service | |
#禁止防火墙开机启动 | |
$systemctl disable firewalld.service | |
#放行端口 | |
$firewall-cmd --zone=public --add-port=80/tcp --permanent |
# nginx 安装成系统服务
创建服务脚本
$vim /usr/lib/systemd/system/nginx.service
服务脚本内容
[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
. | |
├── client_body_temp | |
├── conf # 核心配置文件夹(⚠配置文件较多,一部分没有显示) | |
│ └──nginx.conf # 主配置文件 | |
├── fastcgi_temp | |
├── html # 静态资源文件夹(只能放一个站点) | |
│ ├── 50x.html # 错误页 | |
│ └── index.html # 默认页 | |
├── logs # 日志文件夹 | |
│ ├── access.log # 每次访问记录其中(硬盘可能写满) | |
│ ├── error.log # 错误日志 | |
│ └── nginx.pid # 记录主进程 id 号 | |
├── proxy_temp | |
├── sbin | |
│ └── nginx # nginx 主程序 | |
├── scgi_temp | |
└── uwsgi_temp |
# 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 个 Worker 进程(内核数决定) | |
worker_processes 1; | |
# 事件驱动模块 | |
events { | |
# 每个 worker 可以创建多少连接 | |
worker_connections 1024; | |
} | |
# http 模块 | |
http { | |
# 引用配置文件 | |
include mime.types; | |
# 默认的传输类型 | |
default_type application/octet-stream; | |
# 使用 sendfile () 方法,减少一次拷贝 | |
sendfile on; | |
keepalive_timeout 65; | |
# http/server vhost 虚拟主机(可以有多个),一个 server 对应一个主机 | |
server { | |
listen 80; | |
# 主机名(域名或主机名),可以空格隔开多个主机名 | |
server_name localhost; | |
# uri | |
location / { | |
# 根目录 | |
root html; | |
index index.html index.htm; | |
} | |
error_page 500 502 503 504 /50x.html; | |
location = /50x.html { | |
root html; | |
} | |
} | |
} |
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 结果分配
其他算法
# 基本配置
配置一组服务器:
upstream wind{ # 配置别名 | |
# weight 可以配置权重 down 停用服务器 backup 非必要不用 | |
server localhost:9000 (weight=?/down/backup 都不常用); | |
server localhost:80; | |
} | |
server { | |
listen 80; | |
server_name localhost; | |
location / { | |
proxy_pass http://wind; # 使用别名 | |
} | |
error_page 500 502 503 504 /50x.html; | |
location = /50x.html { | |
root html; | |
} | |
} |
# 动静分离
所谓动静分离,就是将静态资源从 tomcat 拆分 Nginx,使得访问静态资源不需要再经过 tomcat,相当于少了一步,直接从 nginx 返回静态资源,加快访问
# 配置
将静态资源放入到 nginx 的 html 目录下
在 ./nginx/conf/nginx.conf
下:
# 拦截静态资源 | |
location ~.*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ { | |
root static; | |
expires 30d; | |
} |
# URLRewrite
rewrite 是实现 URL 重写的关键指令,根据 regex (正则表达式) 部分内容, 重定向到 replacement,结尾是 flag 标记。
rewrite <regex> <replacement> [flag]; | |
关键字 正则 替代内容 flag标记 |
rewrite 参数的标签段位置: server
/ location
/ if
flag 标记说明:
last
本条规则匹配完成后,继续向下匹配新的 location URI 规则break
本条规则匹配完成即终止,不再匹配后面的任何规则redirect
返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址permanent
返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址
# 参考博客
- Nginx 如何实现高并发的
(Multipurpose Internet Mail Extensions) 多用途互联网邮件扩展类型,多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。 ↩︎