Ngin笔记
# Nginx笔记
>Nginx:是一款[轻量级](https://baike.baidu.com/item/轻量级/10002835)的[Web](https://baike.baidu.com/item/Web/150564) 服务器/[反向代理](https://baike.baidu.com/item/反向代理/7793488)服务器及[电子邮件](https://baike.baidu.com/item/电子邮件/111106)(IMAP/POP3)代理服务器,在BSD-like 协议下发行,由俄罗斯人为应对Ramble而研发的
## Nginx的特点:
- 稳定性强,提供了丰富的配置实例,占用内存小,并发能力强
> Nginx的配置文件
```xml
1.docker 创建Nginx的容器运行
2.
version: "3.1"
services:
nginx:
restart: always
image: daocloud.io/library/nginx:latest
container_name:nginx
ports:
- 80:80
volumes:
-/docker_nginx/conf.d/:/etc/nginx/conf.d
```
## 正向代理
客户端通过代理服务器访问到想要访问的网站(客户端设立:客户端了解代理服务器和目标服务器,正向代理可以突破访问权限,对目标服务器隐藏ip)
```
客户端---(直接访问 ×) -->目标服务器 ×
客户端--->代理服务器---->目标服务器 √
```
## 反向代理:
- 反向代理是配置在服务器端的
- 客户端不知道访问的是哪一台服务器
- 达到负债均衡,隐藏服务器的真正地址
```
客户端----->(反向代理服务器 解析)----->目标服务器
```
>Nginx如何实现反向代理
- 启动一个目标服务器
- 编写Nginx的配置文件:通过Nginx访问到tomcat服务器
```xml
Nginx的配置文件信息解释
server{
listen 80:
server_name localhost:
localtion/{
proxy_pass http://(目标服务器端口) //动态资源转发的目标
}
}
```
## Nginx 的路径映射location
```json
1. # = 匹配
location /{
#精准匹配,主机名后面不能带任何字符串
}
2. 通用匹配
location /xxx{
匹配所有以/xxx开头的路径
}
3. 正则匹配
location ~ /xxx{
匹配所有以/xxx开头的路径 //优先级大于第二种
}
4. 匹配开头路径
location ~/images/{
匹配所有以/images开头的路径
}
5. 匹配结尾的路径
location ~* \.(gif|jpg|png){
匹配以gifjpgpng结尾的路径
}
```
## location的优先级关系
>1. 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
>2. ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
>3. 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
>4. 常规字符串匹配类型。按前缀匹配。
## Nginx的负载均衡策略
- 1.轮循方式:平均将请求发给服务器
- 2.权重方式:根据服务器的权重值不同进行分配请求
- 3.ip_hash:基于请求发起请客户端ip不同,会将请求发到指定的服务器上
## Nginx负负载均衡配置
- 1.实现轮训方式负债均衡
```yml
在Nginx配置文件中声明加入
upstream my-server{
server ip:端口
server 139.4.104.39:8080; #我自己的服务器
server 139.4.104.39:8081;
}
server{
listen: 80
server_name localhost;
location / {
proxy_pass http://my-server/;
}
}
加入后重启
第一次访问 139.4.104.39:8080 第二次访问: 139.4.104.39:8081
但是并不是 010101进行响应 而是在这两个端口随机产生
```
- 2.实现权重的负债均衡
```xml
在轮训的配置文件中加入weight 权重比列
upstream my-server{
server ip:端口
server 139.4.104.39:8080 weight=10; #我自己的服务器
server 139.4.104.39:8081 weight=2;
}
server{
listen: 80
server_name localhost;
location / {
proxy_pass http://my-server/;
}
}
权重比值为5:1
代表每6个请求5个访问server 139.4.104.39:8080 ,一个访问server 139.4.104.39:8081
注意:请求少可能会没有差异,请求量大时就会很明显
```
- 3.ip_hash负债均衡策略
```
直接加入ip_hash
upstream my-server{
ip_hash;
server ip:端口
server 139.4.104.39:8080 weight=10; #我自己的服务器
server 139.4.104.39:8081 weight=2;
}
server{
listen: 80
server_name localhost;
location / {
proxy_pass http://my-server/;
}
}
第一次访问的就是之后一直访问的服务器地址
```
## Nginx并发能力强的原因
> 多进程模型
nginx服务启动时,会自动创建一个master进程和多个worker进程,worder进程的数量依赖与nginx的配置,一般是cpu的核数,过 多的worker进程带来cpu的资源竞争和上下文切换。master进程负责创建和管理worker进程,除此之外master进程还负责nginx配 置解析、信号管理、模块注册等工作。worker进程负责接收和处理客户端的请求,worker进程才是nginx服务的主体。
> 异步非阻塞
worker进程采用异步非阻塞的方式对外提供服务。具体来说就是,workder进程在处理客户端请求时会进行IO调用,如果调用不能立即 得到响应,worker进程也不会一直等待,而是转去处理其他客户端请求。当IO调用有结果时会主动通知worker进程,worker进程得到通知便会 暂停手上的工作,来处理IO调用的返回结果。
> 事件驱动模型
IO调用完成后如何主动通知worker进程,靠的就是事件驱动模型,事件驱动模型提供了一种机制,使得worker进程不用关心IO调用的状态,IO调 用完全由事件驱动模型来管理,事件准备好后就通知worker进程事件已经就绪。事件驱动模型由事件收集器、事件发送器、事件处理器构成。事件发送器每发 送一个请求,目标对象就将其放入待处理的事件列表,然后使用非阻塞IO方式调用事件处理器来对该事件进行处理。 这个过程离不开事件驱动处理库,也叫多路IO复用方法,常见的有select模型、poll模型、epoll模型。
## Nginx动静分离
>Nginx的并发能力公式
>
>worker_processes*worker_connection/4 | 2 =Nginx 最终并发能力
>
>动态需要/4 静态资源在Nginx里 /2
- Nginx动态资源代理
```
location / {
proxy_pass 路径;
}
```
- 静态资源代理
```json
location / {
proxy_pass 静态资源路径;
index 默认访问路径下的什么资源;
autoindex on:代表静态资源的全部内容,以列表的形式展开
}
#首先要修改docker ,添加一个数据卷,映射到nginx服务器的一个目录内容如下
volumes:
-/docker_nginx/conf.d/:/etc/nginx/conf.d
-/docker_nginx/img/:/etc/nginx/img 映射图片
-/docker_nginx/html/:/etc/nginx/html 映射页面
#保存退出
```
```xml
upstream my-server{
ip_hash;
server ip:端口
server 139.4.104.39:8080 weight=10; #我自己的服务器
server 139.4.104.39:8081 weight=2;
}
server{
listen 80:
server_name localhost:
location /html{
root /data;
index index.html;
}
location /img{
root /data;
autoindex on;
}
}
```
## Nginx集群搭建
>为避免Nginx单点故障导致整个程序崩溃
>
>准备多个Nginx服务器
>
>我们需要准备keepalived监控每个Nginx的状况
>
>准备一个haproxy,提供一个虚拟的路径,统一接受用户的请求
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix